Commit | Line | Data |
---|---|---|
15637ed4 RG |
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 | } |