worn.c (1366B)
1 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 2 /* worn.c - version 1.0.2 */ 3 4 #include "hack.h" 5 6 struct worn { 7 long w_mask; 8 struct obj **w_obj; 9 } worn[] = { 10 { W_ARM, &uarm }, 11 { W_ARM2, &uarm2 }, 12 { W_ARMH, &uarmh }, 13 { W_ARMS, &uarms }, 14 { W_ARMG, &uarmg }, 15 { W_RINGL, &uleft }, 16 { W_RINGR, &uright }, 17 { W_WEP, &uwep }, 18 { W_BALL, &uball }, 19 { W_CHAIN, &uchain }, 20 { 0, 0 } 21 }; 22 23 setworn(obj, mask) 24 register struct obj *obj; 25 long mask; 26 { 27 register struct worn *wp; 28 register struct obj *oobj; 29 30 for(wp = worn; wp->w_mask; wp++) if(wp->w_mask & mask) { 31 oobj = *(wp->w_obj); 32 if(oobj && !(oobj->owornmask & wp->w_mask)) 33 impossible("Setworn: mask = %ld.", wp->w_mask); 34 if(oobj) oobj->owornmask &= ~wp->w_mask; 35 if(obj && oobj && wp->w_mask == W_ARM){ 36 if(uarm2) { 37 impossible("Setworn: uarm2 set?"); 38 } else 39 setworn(uarm, W_ARM2); 40 } 41 *(wp->w_obj) = obj; 42 if(obj) obj->owornmask |= wp->w_mask; 43 } 44 if(uarm2 && !uarm) { 45 uarm = uarm2; 46 uarm2 = 0; 47 uarm->owornmask ^= (W_ARM | W_ARM2); 48 } 49 } 50 51 /* called e.g. when obj is destroyed */ 52 setnotworn(obj) register struct obj *obj; { 53 register struct worn *wp; 54 55 for(wp = worn; wp->w_mask; wp++) 56 if(obj == *(wp->w_obj)) { 57 *(wp->w_obj) = 0; 58 obj->owornmask &= ~wp->w_mask; 59 } 60 if(uarm2 && !uarm) { 61 uarm = uarm2; 62 uarm2 = 0; 63 uarm->owornmask ^= (W_ARM | W_ARM2); 64 } 65 }