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