Reverting back to version 1.1, the multicasting code needs to be looked at
[unix-history] / games / hack / hack.worn.c
CommitLineData
15637ed4
RG
1/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2/* hack.worn.c - version 1.0.2 */
3
4#include "hack.h"
5
6struct 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
23setworn(obj, mask)
24register struct obj *obj;
25long 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 */
52setnotworn(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}