2 (define spider-melee-weapon t_hands)
4 ;; Remapped display and newline to local procs so they can be disabled/enabled
5 ;; for debug more conveniently
6 ; (define (spider-display . args)
7 ; (display (kern-get-ticks))
9 ; (apply display args))
10 ; (define (spider-newline) (newline))
12 (define (spider-display . args) )
13 (define (spider-newline) )
15 ;; ----------------------------------------------------------------------------
18 ;; ----------------------------------------------------------------------------
20 (define spider-egg-hatch-time 10)
21 (define (spider-egg-gob-mk) (list spider-egg-hatch-time))
22 (define (spider-egg-hatch-timer gob) (car gob))
23 (define (spider-egg-set-hatch-timer! gob val) (set-car! gob val))
24 (define (spider-egg-hatch-timer-expired? gob) (= 0 (spider-egg-hatch-timer gob)))
25 (define (spider-egg-dec-hatch-timer! gob)
26 (spider-egg-set-hatch-timer! gob
27 (- (spider-egg-hatch-timer gob)
30 ;; spider-egg-disturbed - obsolete function that would return true if any
31 ;; neighboring tiles contained non-spiders. I discontinued it because it made
32 ;; eggs run too slowly (about 30ms per). Replaced it with a simple egg timer.
33 (define (spider-egg-disturbed kegg)
34 (spider-display "spider-egg-disturbed")(spider-newline)
35 (define (check val loc)
36 ;;(display "loc:")(display loc)(newline)
38 (foldr (lambda (a b) (or a
40 (not (is-spider? b)))))
42 (kern-get-objects-at loc))))
43 (let ((loc (kern-obj-get-location kegg)))
44 (kern-fold-rect (loc-place loc)
52 (define (spider-egg-hatch kegg)
53 (spider-display "spider-egg-hatch")(spider-newline)
54 (kern-log-msg "¥¯¥â¤¬Õۤä¿¡ª")
55 (kern-obj-put-at (mk-npc 'giant-spider (calc-level)) (kern-obj-get-location kegg))
56 (kern-obj-remove kegg))
58 (define (spider-egg-exec kegg)
59 (let ((gob (kobj-gob-data kegg)))
60 (if (spider-egg-hatch-timer-expired? gob)
61 (spider-egg-hatch kegg)
62 (spider-egg-dec-hatch-timer! gob))))
64 (define spider-egg-ifc
66 (method 'exec spider-egg-exec)))
68 (mk-obj-type 'spider-egg-type
74 (define (mk-spider-egg)
75 (bind (kern-mk-obj spider-egg-type 1)
78 ;; ----------------------------------------------------------------------------
80 ;; ----------------------------------------------------------------------------
82 (define (suck-hp kspider ktarg amount)
83 (kern-log-msg (kern-obj-get-name kspider)
85 (kern-obj-get-name ktarg)
87 (let ((amount (min amount (kern-char-get-hp ktarg))))
88 (kern-obj-apply-damage ktarg nil amount)
89 (kern-obj-heal kspider amount)))
91 (define (spider-paralyze ktarg)
92 (spider-display "spider-paralyze")(spider-newline)
95 (define (ensnare-loc loc)
96 (spider-display "ensnare-loc")(spider-newline)
97 (kern-obj-put-at (kern-mk-obj web-type 1) loc))
101 ;; ----------------------------------------------------------------------------
103 ;; ----------------------------------------------------------------------------
104 (define (spider-is-aggressive? kspider)
105 (> (kern-char-get-hp kspider)
106 (/ (* 4 (kern-char-get-max-hp kspider)) 5)))
108 (define (is-queen-spider? kspider)
109 (eqv? (kern-char-get-species kspider) sp_queen_spider))
111 (define (spider-try-to-lay-egg kspider)
112 (spider-display "spider-try-to-lay-egg")(spider-newline)
113 (let ((loc (kern-obj-get-location kspider)))
114 (if (and (not (is-object-type-at? loc spider-egg-type))
115 (> (kern-dice-roll "1d20") 18))
116 (kern-obj-put-at (mk-spider-egg) loc))))
118 (define (spider-no-hostiles kspider)
119 (spider-display "spider-no-hostiles")(spider-newline)
120 (let ((loc (kern-obj-get-location kspider)))
121 (if (not (is-object-type-at? loc web-type))
123 (if (is-queen-spider? kspider)
124 (spider-try-to-lay-egg kspider)))
127 (define (is-helpless? kchar)
128 (or (kern-char-is-asleep? kchar)
130 (is-paralyzed? kchar)))
132 (define (spider-attack-helpless-foe kspider kfoe)
133 (define (attack kspider coords)
134 (spider-display "spider-attack")(spider-newline)
135 (if (is-paralyzed? kfoe)
136 (suck-hp kspider kfoe (kern-dice-roll "1d6"))
137 (spider-paralyze kfoe)))
138 (spider-display "spider-attack-helpless-foe")(spider-newline)
139 (do-or-goto kspider (kern-obj-get-location kfoe) attack))
141 (define (spider-foe-in-range-of-web-spew? kspider kfoe)
142 (spider-display "spider-foe-in-range-of-web-spew?")(spider-newline)
143 (< (kern-get-distance (kern-obj-get-location kspider)
144 (kern-obj-get-location kfoe))
145 (/ (kern-char-get-level kspider) 2)))
147 (define (spider-pathfind-to-foe kspider kfoe)
148 (spider-display "spider-pathfind-to-foe")(spider-newline)
149 (pathfind kspider (kern-obj-get-location kfoe)))
151 (define (spider-try-to-spew-web kspider foe)
152 (spider-display "spider-try-to-spew-web")(spider-newline)
153 (if (and (can-use-ability? web-spew kspider)
154 (spider-foe-in-range-of-web-spew? kspider foe))
155 (use-ability web-spew kspider foe)
156 (spider-attack-helpless-foe kspider foe)))
158 (define (spider-no-helpless-foes kspider foes)
159 (spider-display "spider-no-helpless-foes")(spider-newline)
160 (if (is-queen-spider? kspider)
161 (spider-try-to-spew-web kspider (closest-obj
162 (kern-obj-get-location kspider)
164 (if (spider-is-aggressive? kspider)
165 (spider-attack-helpless-foe kspider
167 (kern-obj-get-location kspider)
169 (evade kspider foes))))
171 (define (spider-hostiles kspider foes)
172 (spider-display "spider-hostiles")(spider-newline)
173 (let ((helpless-foes (filter is-helpless? foes)))
174 (if (null? helpless-foes)
175 (spider-no-helpless-foes kspider foes)
176 (spider-attack-helpless-foe kspider
178 (kern-obj-get-location kspider)
181 (define spider-bad-fields
182 (filter (lambda (x) (and (not (eqv? x web-type))
183 (not (eqv? x F_web_perm))))
186 (define (spider-ai kspider)
187 (spider-display "spider-ai")(spider-newline)
188 (or (get-off-bad-tile? kspider)
189 (let ((foes (all-visible-hostiles kspider)))
191 (spider-no-hostiles kspider)
192 (spider-hostiles kspider foes))