hack.worn.c revision 1.4 1 1.4 christos /* $NetBSD: hack.worn.c,v 1.4 1997/10/19 16:59:32 christos Exp $ */
2 1.4 christos
3 1.2 mycroft /*
4 1.2 mycroft * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
5 1.2 mycroft */
6 1.2 mycroft
7 1.4 christos #include <sys/cdefs.h>
8 1.2 mycroft #ifndef lint
9 1.4 christos __RCSID("$NetBSD: hack.worn.c,v 1.4 1997/10/19 16:59:32 christos Exp $");
10 1.4 christos #endif /* not lint */
11 1.1 cgd
12 1.1 cgd #include "hack.h"
13 1.4 christos #include "extern.h"
14 1.1 cgd
15 1.1 cgd struct worn {
16 1.4 christos long w_mask;
17 1.4 christos struct obj **w_obj;
18 1.4 christos } worn[] = {
19 1.4 christos {
20 1.4 christos W_ARM, &uarm
21 1.4 christos },
22 1.4 christos {
23 1.4 christos W_ARM2, &uarm2
24 1.4 christos },
25 1.4 christos {
26 1.4 christos W_ARMH, &uarmh
27 1.4 christos },
28 1.4 christos {
29 1.4 christos W_ARMS, &uarms
30 1.4 christos },
31 1.4 christos {
32 1.4 christos W_ARMG, &uarmg
33 1.4 christos },
34 1.4 christos {
35 1.4 christos W_RINGL, &uleft
36 1.4 christos },
37 1.4 christos {
38 1.4 christos W_RINGR, &uright
39 1.4 christos },
40 1.4 christos {
41 1.4 christos W_WEP, &uwep
42 1.4 christos },
43 1.4 christos {
44 1.4 christos W_BALL, &uball
45 1.4 christos },
46 1.4 christos {
47 1.4 christos W_CHAIN, &uchain
48 1.4 christos },
49 1.4 christos {
50 1.4 christos 0, 0
51 1.4 christos }
52 1.1 cgd };
53 1.1 cgd
54 1.4 christos void
55 1.1 cgd setworn(obj, mask)
56 1.4 christos struct obj *obj;
57 1.4 christos long mask;
58 1.1 cgd {
59 1.4 christos struct worn *wp;
60 1.4 christos struct obj *oobj;
61 1.1 cgd
62 1.4 christos for (wp = worn; wp->w_mask; wp++)
63 1.4 christos if (wp->w_mask & mask) {
64 1.4 christos oobj = *(wp->w_obj);
65 1.4 christos if (oobj && !(oobj->owornmask & wp->w_mask))
66 1.4 christos impossible("Setworn: mask = %ld.", wp->w_mask);
67 1.4 christos if (oobj)
68 1.4 christos oobj->owornmask &= ~wp->w_mask;
69 1.4 christos if (obj && oobj && wp->w_mask == W_ARM) {
70 1.4 christos if (uarm2) {
71 1.4 christos impossible("Setworn: uarm2 set?");
72 1.4 christos } else
73 1.4 christos setworn(uarm, W_ARM2);
74 1.4 christos }
75 1.4 christos *(wp->w_obj) = obj;
76 1.4 christos if (obj)
77 1.4 christos obj->owornmask |= wp->w_mask;
78 1.1 cgd }
79 1.4 christos if (uarm2 && !uarm) {
80 1.1 cgd uarm = uarm2;
81 1.1 cgd uarm2 = 0;
82 1.1 cgd uarm->owornmask ^= (W_ARM | W_ARM2);
83 1.1 cgd }
84 1.1 cgd }
85 1.1 cgd
86 1.1 cgd /* called e.g. when obj is destroyed */
87 1.4 christos void
88 1.4 christos setnotworn(obj)
89 1.4 christos struct obj *obj;
90 1.4 christos {
91 1.4 christos struct worn *wp;
92 1.1 cgd
93 1.4 christos for (wp = worn; wp->w_mask; wp++)
94 1.4 christos if (obj == *(wp->w_obj)) {
95 1.1 cgd *(wp->w_obj) = 0;
96 1.1 cgd obj->owornmask &= ~wp->w_mask;
97 1.1 cgd }
98 1.4 christos if (uarm2 && !uarm) {
99 1.1 cgd uarm = uarm2;
100 1.1 cgd uarm2 = 0;
101 1.1 cgd uarm->owornmask ^= (W_ARM | W_ARM2);
102 1.1 cgd }
103 1.1 cgd }
104