-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathhack.worn.c
More file actions
64 lines (58 loc) · 1.52 KB
/
Copy pathhack.worn.c
File metadata and controls
64 lines (58 loc) · 1.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* hack.worn.c - version 1.0.2 */
/* $FreeBSD$ */
#include "hack.h"
struct worn {
long w_mask;
struct obj **w_obj;
} worn[] = {{W_ARM, &uarm},
{W_ARM2, &uarm2},
{W_ARMH, &uarmh},
{W_ARMS, &uarms},
{W_ARMG, &uarmg},
{W_RINGL, &uleft},
{W_RINGR, &uright},
{W_WEP, &uwep},
{W_BALL, &uball},
{W_CHAIN, &uchain},
{0, 0}};
void setworn(struct obj *obj, long mask) {
struct worn *wp;
struct obj *oobj;
for (wp = worn; wp->w_mask; wp++)
if (wp->w_mask & mask) {
oobj = *(wp->w_obj);
if (oobj && !(oobj->owornmask & wp->w_mask))
impossible("Setworn: mask = %ld.", (int)wp->w_mask, 0);
if (oobj)
oobj->owornmask &= ~wp->w_mask;
if (obj && oobj && wp->w_mask == W_ARM) {
if (uarm2) {
impossible("Setworn: uarm2 set?", 0, 0);
} else
setworn(uarm, W_ARM2);
}
*(wp->w_obj) = obj;
if (obj)
obj->owornmask |= wp->w_mask;
}
if (uarm2 && !uarm) {
uarm = uarm2;
uarm2 = 0;
uarm->owornmask ^= (W_ARM | W_ARM2);
}
}
/* called e.g. when obj is destroyed */
void setnotworn(struct obj *obj) {
struct worn *wp;
for (wp = worn; wp->w_mask; wp++)
if (obj == *(wp->w_obj)) {
*(wp->w_obj) = 0;
obj->owornmask &= ~wp->w_mask;
}
if (uarm2 && !uarm) {
uarm = uarm2;
uarm2 = 0;
uarm->owornmask ^= (W_ARM | W_ARM2);
}
}