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