
1: /* $NetBSD: hack.worn.c,v 1.5 2003/04/02 18:36:42 jsm Exp $ */ 2: 3: /* 4: * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, 5: * Amsterdam 6: * All rights reserved. 7: * 8: * Redistribution and use in source and binary forms, with or without 9: * modification, are permitted provided that the following conditions are 10: * met: 11: * 12: * - Redistributions of source code must retain the above copyright notice, 13: * this list of conditions and the following disclaimer. 14: * 15: * - Redistributions in binary form must reproduce the above copyright 16: * notice, this list of conditions and the following disclaimer in the 17: * documentation and/or other materials provided with the distribution. 18: * 19: * - Neither the name of the Stichting Centrum voor Wiskunde en 20: * Informatica, nor the names of its contributors may be used to endorse or 21: * promote products derived from this software without specific prior 22: * written permission. 23: * 24: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 25: * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 26: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 27: * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 28: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 29: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 30: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 31: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 32: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 33: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 34: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35: */ 36: 37: /* 38: * Copyright (c) 1982 Jay Fenlason <hack@gnu.org> 39: * All rights reserved. 40: * 41: * Redistribution and use in source and binary forms, with or without 42: * modification, are permitted provided that the following conditions 43: * are met: 44: * 1. Redistributions of source code must retain the above copyright 45: * notice, this list of conditions and the following disclaimer. 46: * 2. Redistributions in binary form must reproduce the above copyright 47: * notice, this list of conditions and the following disclaimer in the 48: * documentation and/or other materials provided with the distribution. 49: * 3. The name of the author may not be used to endorse or promote products 50: * derived from this software without specific prior written permission. 51: * 52: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 53: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 54: * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 55: * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 56: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 57: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 58: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 59: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 60: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 61: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62: */ 63: 64: #include <sys/cdefs.h> 65: #ifndef lint 66: __RCSID("$NetBSD: hack.worn.c,v 1.5 2003/04/02 18:36:42 jsm Exp $"); 67: #endif /* not lint */ 68: 69: #include "hack.h" 70: #include "extern.h" 71: 72: struct worn { 73: long w_mask; 74: struct obj **w_obj; 75: } worn[] = { 76: { 77: W_ARM, &uarm 78: }, 79: { 80: W_ARM2, &uarm2 81: }, 82: { 83: W_ARMH, &uarmh 84: }, 85: { 86: W_ARMS, &uarms 87: }, 88: { 89: W_ARMG, &uarmg 90: }, 91: { 92: W_RINGL, &uleft 93: }, 94: { 95: W_RINGR, &uright 96: }, 97: { 98: W_WEP, &uwep 99: }, 100: { 101: W_BALL, &uball 102: }, 103: { 104: W_CHAIN, &uchain 105: }, 106: { 107: 0, 0 108: } 109: }; 110: 111: void 112: setworn(obj, mask) 113: struct obj *obj; 114: long mask; 115: { 116: struct worn *wp; 117: struct obj *oobj; 118: 119: for (wp = worn; wp->w_mask; wp++) 120: if (wp->w_mask & mask) { 121: oobj = *(wp->w_obj); 122: if (oobj && !(oobj->owornmask & wp->w_mask)) 123: impossible("Setworn: mask = %ld.", wp->w_mask); 124: if (oobj) 125: oobj->owornmask &= ~wp->w_mask; 126: if (obj && oobj && wp->w_mask == W_ARM) { 127: if (uarm2) { 128: impossible("Setworn: uarm2 set?"); 129: } else 130: setworn(uarm, W_ARM2); 131: } 132: *(wp->w_obj) = obj; 133: if (obj) 134: obj->owornmask |= wp->w_mask; 135: } 136: if (uarm2 && !uarm) { 137: uarm = uarm2; 138: uarm2 = 0; 139: uarm->owornmask ^= (W_ARM | W_ARM2); 140: } 141: } 142: 143: /* called e.g. when obj is destroyed */ 144: void 145: setnotworn(obj) 146: struct obj *obj; 147: { 148: struct worn *wp; 149: 150: for (wp = worn; wp->w_mask; wp++) 151: if (obj == *(wp->w_obj)) { 152: *(wp->w_obj) = 0; 153: obj->owornmask &= ~wp->w_mask; 154: } 155: if (uarm2 && !uarm) { 156: uarm = uarm2; 157: uarm2 = 0; 158: uarm->owornmask ^= (W_ARM | W_ARM2); 159: } 160: }