xref: /original-bsd/games/hack/hack.worn.c (revision da818fbb)
1 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2 /* hack.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 }
66