-
Notifications
You must be signed in to change notification settings - Fork 1
/
item.fs
102 lines (89 loc) · 2.38 KB
/
item.fs
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
: item! { _item _use -- }
_use _item item-use !
;
: add-item { _en _use -- }
_en ['] entity-item item% add-component
_use item!
;
: item-heal { _en _amount -- flag }
_en entity-hp@max@ < if
_en _amount heal
_en announce-healed
true
else
_en announce-cannot-heal-more
false
then
;
0 value distance-from-x
0 value distance-from-y
: distance-from-entity { _en -- distance }
distance-from-x distance-from-y _en entity-xy@ distance
;
0 value lightning-ignore
0 value lightning-target
0 value lightning-target-distance
:noname { _en -- }
_en lightning-ignore = if exit then
_en entity-fighter @ 0= if exit then
_en entity-xy@ is-in-fov 0= if exit then
_en distance-from-entity dup lightning-target-distance <= if
to lightning-target-distance
_en to lightning-target
else drop then
; constant 'get-lightning-target
: get-lightning-target { _en _range -- target }
_en entity-xy@ to distance-from-y to distance-from-x
_en to lightning-ignore
0 to lightning-target
1000 to lightning-target-distance
'get-lightning-target for-each-entity
lightning-target
;
: item-lightning { _en _damage _range -- flag }
_en _range get-lightning-target ?dup-if
dup _damage announce-lightning-damage
_damage damage
true
else
announce-no-nearby-target
false
then
;
0 value fireball-damage
0 value fireball-radius
:noname { _en -- }
_en entity-fighter @ 0= if exit then
_en distance-from-entity fireball-radius <= if
_en fireball-damage announce-fire-damage
_en fireball-damage damage
then
; constant 'apply-fireball
: item-fireball { _en _x _y _damage _radius -- flag }
_x _y is-in-fov 0= if
announce-must-target-in-fov false exit
then
announce-fireball
_x _y to distance-from-y to distance-from-x
_damage to fireball-damage
_radius to fireball-radius
'apply-fireball for-each-entity true
;
: item-confusion { _en _x _y _duration -- flag }
_x _y is-in-fov 0= if
announce-must-target-in-fov false exit
then
_x _y get-blocker ?dup-if
dup announce-confused
_duration apply-confused-ai
true
else
announce-no-target false
then
;
: item-use@ ( en -- use|0 )
dup entity-item @ ?dup-if ( en item )
nip item-use @
else drop false
then
;