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