]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - games/hack/hack.worn.c
This commit was generated by cvs2svn to compensate for changes in r41118,
[FreeBSD/FreeBSD.git] / games / hack / hack.worn.c
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 }