1 | ;; Copyright 1995 Crack dot Com, All Rights reserved |
---|
2 | ;; See licensing information for more details on usage rights |
---|
3 | |
---|
4 | |
---|
5 | (setq gun_tints (make-array 11 :initial-contents (list |
---|
6 | normal_tint |
---|
7 | (def_tint "art/tints/guns/orange.spe") ; orange |
---|
8 | (def_tint "art/tints/guns/green.spe") ; grenade |
---|
9 | (def_tint "art/tints/guns/redish.spe") ; rocket |
---|
10 | (def_tint "art/tints/guns/blue.spe") ; plasma |
---|
11 | normal_tint |
---|
12 | normal_tint |
---|
13 | normal_tint |
---|
14 | normal_tint |
---|
15 | normal_tint |
---|
16 | normal_tint))) |
---|
17 | |
---|
18 | |
---|
19 | (setq ai_ammo (make-array 9 :initial-contents (list MBULLET_ICON5 |
---|
20 | MBULLET_ICON5 |
---|
21 | GRENADE_ICON2 |
---|
22 | ROCKET_ICON2 |
---|
23 | PLASMA_ICON20 |
---|
24 | MBULLET_ICON5 |
---|
25 | MBULLET_ICON5 |
---|
26 | MBULLET_ICON5 |
---|
27 | MBULLET_ICON5))) |
---|
28 | |
---|
29 | (defun aitype_to_ammo (aitype) |
---|
30 | (aref ai_ammo aitype)) |
---|
31 | |
---|
32 | |
---|
33 | |
---|
34 | (defun fire_object (creator type x y angle target) |
---|
35 | (select type |
---|
36 | |
---|
37 | (0 (with_object (add_object SHOTGUN_BULLET x y) |
---|
38 | (progn |
---|
39 | (play_sound ZAP_SND 127 (x) (y)) |
---|
40 | (setq sgb_lifetime 6) |
---|
41 | (setq sgb_speed 15) |
---|
42 | (setq sgb_lastx (x)) |
---|
43 | (setq sgb_lasty (y)) |
---|
44 | (setq sgb_angle angle) |
---|
45 | (setq sgb_bright_color (find_rgb 255 255 200)) |
---|
46 | (setq sgb_medium_color (find_rgb 150 150 0)) |
---|
47 | (if creator |
---|
48 | (progn |
---|
49 | (setq sgb_speed (+ sgb_speed (/ (xvel) 2))) |
---|
50 | (link_object creator))) |
---|
51 | (sgun_ai) |
---|
52 | ))) |
---|
53 | (1 (with_object (add_object SHOTGUN_BULLET x y) |
---|
54 | (progn |
---|
55 | (play_sound ZAP_SND 127 (x) (y)) |
---|
56 | (setq sgb_lifetime 40) |
---|
57 | (setq sgb_speed 6) |
---|
58 | (setq sgb_lastx (x)) |
---|
59 | (setq sgb_lasty (y)) |
---|
60 | (setq sgb_angle angle) |
---|
61 | |
---|
62 | (setq sgb_bright_color (find_rgb 255 128 64)) |
---|
63 | (setq sgb_medium_color (find_rgb 255 0 0)) |
---|
64 | (if creator |
---|
65 | (progn |
---|
66 | (setq sgb_speed (+ sgb_speed (/ (xvel) 2))) |
---|
67 | (link_object creator))) |
---|
68 | (sgun_ai) |
---|
69 | ))) |
---|
70 | (2 (with_object (add_object GRENADE x y) |
---|
71 | (progn |
---|
72 | (play_sound GRENADE_THROW 127 x y) |
---|
73 | (set_course angle 20) |
---|
74 | (if creator |
---|
75 | (progn |
---|
76 | (link_object creator) |
---|
77 | (set_xvel (+ (xvel) (with_object creator (xvel)))) |
---|
78 | (set_yvel (+ (yvel) (with_object creator (yvel)))) |
---|
79 | )) |
---|
80 | |
---|
81 | (set_frame_angle 0 359 angle) |
---|
82 | ))) |
---|
83 | (3 (with_object (add_object ROCKET x y) |
---|
84 | (progn |
---|
85 | (play_sound ROCKET_LAUNCH_SND 127 x y) |
---|
86 | (set_aistate angle) |
---|
87 | (if creator (link_object creator)) |
---|
88 | |
---|
89 | (if (and target ;; don't link if not in line of site |
---|
90 | (can_see (x) (y) |
---|
91 | (with_object target (x)) |
---|
92 | (with_object target (y)) nil)) |
---|
93 | (link_object target)) |
---|
94 | |
---|
95 | (set_frame_angle 0 359 angle) |
---|
96 | (setq speed 5) |
---|
97 | (if (and creator (with_object creator (isa_player))) |
---|
98 | (setq max_speed 14) |
---|
99 | (setq max_speed 10)) |
---|
100 | (set_y (+ (y) (/ (picture_height) 2))) ;; move down to match frame/pos |
---|
101 | ))) |
---|
102 | |
---|
103 | (4 (with_object (add_object PLASMAGUN_BULLET x y) |
---|
104 | (progn |
---|
105 | (play_sound PLASMA_SND 127 (x) (y)) |
---|
106 | (setq sgb_lastx (x)) |
---|
107 | (setq sgb_lasty (y)) |
---|
108 | (if creator |
---|
109 | (link_object creator)) |
---|
110 | (set_course angle 200) |
---|
111 | (let ((old_x (x)) |
---|
112 | (old_y (y)) |
---|
113 | (bx (bmove (if (> (total_objects) 0) (get_object 0) nil)))) |
---|
114 | (if (not (eq bx T)) |
---|
115 | (if (eq bx nil) |
---|
116 | (add_object EXPLODE5 (- (x) (random 5)) |
---|
117 | (- (y) (random 5)) 0) |
---|
118 | (progn |
---|
119 | (add_object EXPLODE3 (- (x) (random 5)) |
---|
120 | (- (y) (random 5)) 0) |
---|
121 | (do_damage 10 bx (* (cos sgb_angle) 20) |
---|
122 | (* (sin sgb_angle) 10))))) |
---|
123 | (setq sgb_lastx (x)) |
---|
124 | (setq sgb_lasty (y)) |
---|
125 | (set_x old_x) |
---|
126 | (set_y old_y)) |
---|
127 | ))) |
---|
128 | |
---|
129 | |
---|
130 | (5 (with_object (add_object FIREBOMB x y) |
---|
131 | (progn |
---|
132 | (play_sound FIREBOMB_SND 127 (x) (y)) |
---|
133 | (set_course angle 20) |
---|
134 | (if creator |
---|
135 | (progn |
---|
136 | (link_object creator) |
---|
137 | (set_yvel (+ (yvel) (with_object creator (yvel)))) |
---|
138 | ))))) |
---|
139 | |
---|
140 | (6 (with_object (add_object DFRIS_BULLET x y) |
---|
141 | (progn |
---|
142 | (play_sound ROCKET_LAUNCH_SND 127 x y) |
---|
143 | (set_course angle 25) |
---|
144 | (set_aistate angle) |
---|
145 | (if creator |
---|
146 | (link_object creator)) |
---|
147 | (dfris_ai) |
---|
148 | ))) |
---|
149 | |
---|
150 | (7 (with_object (add_object LSABER_BULLET x y) |
---|
151 | (progn |
---|
152 | (play_sound LSABER_SND 127 (x) (y)) |
---|
153 | (setq sgb_lastx (x)) |
---|
154 | (setq sgb_lasty (y)) |
---|
155 | (if creator |
---|
156 | (link_object creator)) |
---|
157 | (set_course angle 45) |
---|
158 | (let ((bx (bmove (if (> (total_objects) 0) (get_object 0) nil)))) |
---|
159 | (if (not (eq bx T)) |
---|
160 | (if (not (eq bx nil)) |
---|
161 | (do_damage 30 bx (* (cos sgb_angle) 20) |
---|
162 | (* (sin sgb_angle) 10))))) |
---|
163 | ))) |
---|
164 | |
---|
165 | |
---|
166 | (9 (with_object (add_object STRAIT_ROCKET x y) |
---|
167 | (progn |
---|
168 | (play_sound MGUN_SND 127 (x) (y)) |
---|
169 | (if creator |
---|
170 | (link_object creator)) |
---|
171 | (set_aistate angle) |
---|
172 | (set_frame_angle 0 359 angle) |
---|
173 | (play_sound GRENADE_THROW 127 (x) (y))))) |
---|
174 | |
---|
175 | (10 (with_object (add_object SHOTGUN_BULLET x y) |
---|
176 | (progn |
---|
177 | (play_sound ZAP_SND 127 (x) (y)) |
---|
178 | (setq sgb_lifetime 6) |
---|
179 | (setq sgb_speed 15) |
---|
180 | (setq sgb_lastx (x)) |
---|
181 | (setq sgb_lasty (y)) |
---|
182 | (setq sgb_angle angle) |
---|
183 | (setq sgb_bright_color (find_rgb 255 0 0)) |
---|
184 | (setq sgb_medium_color (find_rgb 150 0 0)) |
---|
185 | (if creator |
---|
186 | (progn |
---|
187 | (setq sgb_speed (+ sgb_speed (/ (xvel) 2))) |
---|
188 | (link_object creator))) |
---|
189 | (sgun_ai) |
---|
190 | ))) |
---|
191 | |
---|
192 | ) |
---|
193 | ) |
---|
194 | |
---|
195 | |
---|
196 | (defun spray_fire () |
---|
197 | (fire_object (me) (aitype) |
---|
198 | (+ (x) (* (cos spray.angle) 20)) |
---|
199 | (- (- (y) 21) (* (sin spray.angle) 22)) |
---|
200 | spray.angle |
---|
201 | (bg))) |
---|
202 | |
---|
203 | |
---|
204 | (defun spray_gun_ai () |
---|
205 | (if (<= (hp) 0) |
---|
206 | nil |
---|
207 | (if (and (< (distx) 450) (< (disty) 400)) |
---|
208 | (progn |
---|
209 | (select (aistate) |
---|
210 | (0;; look at sensor |
---|
211 | (if (activated) |
---|
212 | (if (eq (state) stopped) |
---|
213 | (progn |
---|
214 | (set_targetable T) |
---|
215 | (set_state spray.appear) |
---|
216 | (go_state 1)) |
---|
217 | (go_state 3)) |
---|
218 | (progn |
---|
219 | (set_targetable nil) |
---|
220 | (set_state stopped)))) |
---|
221 | |
---|
222 | |
---|
223 | (1;; unfold |
---|
224 | (if (next_picture) T |
---|
225 | (progn (set_aistate 3) |
---|
226 | (set_state spray.aim) |
---|
227 | (setq spray.angle spray.start_angle) |
---|
228 | (set_frame_angle 0 359 spray.angle) |
---|
229 | ))) |
---|
230 | |
---|
231 | (2;; fold up |
---|
232 | (if (next_picture) T |
---|
233 | (progn (set_state stopped) |
---|
234 | (set_aistate 0)))) |
---|
235 | |
---|
236 | |
---|
237 | (3;; swivel down |
---|
238 | (if (> (state_time) spray.fire_delay) |
---|
239 | (progn |
---|
240 | (set_aistate 3);; reset state time |
---|
241 | (setq spray.angle (- spray.angle spray.angle_speed)) |
---|
242 | (if (<= spray.angle spray.start_angle) |
---|
243 | (progn |
---|
244 | (setq spray.angle spray.start_angle) |
---|
245 | (set_aistate 4))) |
---|
246 | (set_frame_angle 0 359 spray.angle) |
---|
247 | (spray_fire)))) |
---|
248 | |
---|
249 | (4;; swivel up |
---|
250 | (if (> (state_time) spray.fire_delay) |
---|
251 | (progn |
---|
252 | (set_aistate 4);; reset state time |
---|
253 | (setq spray.angle (+ spray.angle spray.angle_speed)) |
---|
254 | (if (>= spray.angle spray.end_angle) |
---|
255 | (progn |
---|
256 | (setq spray.angle spray.end_angle) |
---|
257 | (set_aistate 0))) |
---|
258 | (set_frame_angle 0 359 spray.angle) |
---|
259 | |
---|
260 | (spray_fire))))) |
---|
261 | T) |
---|
262 | (progn |
---|
263 | (set_state stopped) |
---|
264 | T)))) |
---|
265 | |
---|
266 | |
---|
267 | |
---|
268 | |
---|
269 | (defun spray_gun_cons () |
---|
270 | (setq spray.bullet_speed 20) |
---|
271 | (setq spray.angle_speed 10) |
---|
272 | (setq spray.start_angle 270) |
---|
273 | (setq spray.end_angle 350) |
---|
274 | (setq spray.fire_delay 4)) |
---|
275 | |
---|
276 | (def_char SPRAY_GUN |
---|
277 | (funs (ai_fun spray_gun_ai) |
---|
278 | (damage_fun guner_damage) |
---|
279 | (draw_fun gun_draw) |
---|
280 | (constructor spray_gun_cons)) |
---|
281 | |
---|
282 | (flags (can_block T) |
---|
283 | (hurtable T)) |
---|
284 | (abilities (start_hp 20) |
---|
285 | ) |
---|
286 | (vars spray.fire_delay |
---|
287 | spray.bullet_speed |
---|
288 | spray.start_angle |
---|
289 | spray.end_angle |
---|
290 | spray.angle_speed |
---|
291 | spray.angle) |
---|
292 | |
---|
293 | (fields ("hp" ai_health) |
---|
294 | ("aitype" ai_type) |
---|
295 | ("spray.fire_delay" spray_delay) |
---|
296 | ("spray.start_angle" spray_start) |
---|
297 | ("spray.end_angle" spray_end) |
---|
298 | ("spray.angle_speed" spray_speed) |
---|
299 | ("spray.angle" spray_cangle)) |
---|
300 | |
---|
301 | (states "art/gun2.spe" |
---|
302 | (stopped "stopped") |
---|
303 | (spray.aim (seq "cspn" 1 24)) |
---|
304 | (spray.appear '("csht0001.pcx" "csht0002.pcx")) |
---|
305 | (spray.disappear '("csht0002.pcx" "csht0001.pcx")) |
---|
306 | )) |
---|
307 | |
---|
308 | (defun gun_draw () |
---|
309 | (draw_tint (aref gun_tints (aitype)))) |
---|
310 | |
---|
311 | |
---|
312 | (def_char TRACK_GUN |
---|
313 | (vars |
---|
314 | fire_delay ; how long between each shot |
---|
315 | fire_delay_left |
---|
316 | track_speed ; how fast the gun can chage it's angle |
---|
317 | |
---|
318 | burst_total ; how many shots to fire with fire_delay in between each |
---|
319 | burst_total_left |
---|
320 | continue_time ; how much time to wait before continue tracking |
---|
321 | continue_time_left |
---|
322 | track_start_angle ; min angle gun will track |
---|
323 | track_end_angle ; max |
---|
324 | angle) |
---|
325 | |
---|
326 | |
---|
327 | (funs (ai_fun track_ai) |
---|
328 | (constructor track_cons) |
---|
329 | (draw_fun gun_draw) |
---|
330 | (damage_fun guner_damage)) |
---|
331 | |
---|
332 | (flags (can_block T) |
---|
333 | (hurtable T)) |
---|
334 | |
---|
335 | (abilities (start_hp 20)) |
---|
336 | |
---|
337 | (fields ("hp" ai_health) |
---|
338 | ("aitype" ai_type) |
---|
339 | ("track_speed" d_track_speed) |
---|
340 | ("fire_delay" track_fspeed) |
---|
341 | ("burst_total" track_burst) |
---|
342 | ("continue_time" track_cont) |
---|
343 | ("track_start_angle" track_sangle) |
---|
344 | ("track_end_angle" track_eangle) |
---|
345 | ("angle" track_cangle)) |
---|
346 | |
---|
347 | (states "art/gun2.spe" |
---|
348 | (stopped "stopped") |
---|
349 | (opening '("csht0001.pcx" "csht0002.pcx")) |
---|
350 | (shuting '("csht0002.pcx" "csht0001.pcx")) |
---|
351 | (spinning (seq "cspn" 1 24)) |
---|
352 | (firing (seq "cfr1" 1 24)))) |
---|
353 | |
---|
354 | (defun track_cons () |
---|
355 | (setq angle 270) |
---|
356 | (setq track_speed 1) |
---|
357 | (setq fire_delay 5) |
---|
358 | (setq burst_total 3) |
---|
359 | (setq continue_time 8) |
---|
360 | (setq track_start_angle 180) |
---|
361 | (setq track_end_angle 359)) |
---|
362 | |
---|
363 | (defun track_fire () |
---|
364 | (fire_object (me) (aitype) |
---|
365 | (+ (x) (* (cos angle) 18)) |
---|
366 | (- (- (y) 15) (* (sin angle) 15)) |
---|
367 | (mod (+ angle (- 2 (random 5))) 360) |
---|
368 | (bg)) |
---|
369 | (if (or (eq burst_total_left 0) (eq burst_total_left 1)) |
---|
370 | (setq continue_time_left continue_time) |
---|
371 | (progn |
---|
372 | (setq burst_total_left (- burst_total_left 1)) |
---|
373 | (setq fire_delay_left fire_delay))) |
---|
374 | |
---|
375 | |
---|
376 | (set_state firing) |
---|
377 | (set_frame_angle 0 359 angle)) |
---|
378 | |
---|
379 | (defun track_set_angle (new_angle) |
---|
380 | (if (> track_start_angle track_end_angle) |
---|
381 | (if (and (>= new_angle track_end_angle) (<= new_angle track_start_angle)) |
---|
382 | (setq angle new_angle)) |
---|
383 | (if (and (<= new_angle track_end_angle) (>= new_angle track_start_angle)) |
---|
384 | (setq angle new_angle)))) |
---|
385 | |
---|
386 | (defun track_ai () |
---|
387 | (if (eq (hp) 0) ;; are we dead? |
---|
388 | nil |
---|
389 | (if (activated) ;; see if we should be on |
---|
390 | (if (eq (state) stopped) |
---|
391 | (progn |
---|
392 | (set_targetable T) |
---|
393 | (set_state opening) |
---|
394 | T) |
---|
395 | (if (and (eq (state) opening) (next_picture)) |
---|
396 | T |
---|
397 | (progn |
---|
398 | (set_state spinning) |
---|
399 | (set_frame_angle 0 359 angle) |
---|
400 | |
---|
401 | (if (eq continue_time_left 0);; do we need to wait? |
---|
402 | (if (eq fire_delay_left 0) |
---|
403 | ;; get the angle to the player |
---|
404 | (let ((pangle (atan2 (- (- (y) (with_object (bg) (y))) -8) |
---|
405 | (- (with_object (bg) (x)) (x) )))) |
---|
406 | (let ((clock_dist (if (< pangle angle);; calculate clockwise angle distance |
---|
407 | (- angle pangle) |
---|
408 | (+ angle (- 360 pangle))))) |
---|
409 | (let ((closest_dist (if (> clock_dist 180) |
---|
410 | (- 360 clock_dist) |
---|
411 | clock_dist))) |
---|
412 | (let ((angle_add (if (>= closest_dist track_speed) |
---|
413 | track_speed |
---|
414 | closest_dist))) |
---|
415 | (if (> clock_dist 180);; should we steer clowck wise or counter? |
---|
416 | (track_set_angle (mod (+ angle angle_add) 360)) |
---|
417 | (track_set_angle (mod (+ (- angle angle_add) 360) 360))) |
---|
418 | (if (< angle_add 5);; pretty close to target, FIRE! |
---|
419 | (track_fire)))))) |
---|
420 | (setq fire_delay_left (- fire_delay_left 1))) |
---|
421 | (progn |
---|
422 | (setq continue_time_left (- continue_time_left 1)) |
---|
423 | (if (eq continue_time_left 0) |
---|
424 | (setq burst_total_left burst_total)))) |
---|
425 | T))) |
---|
426 | (progn |
---|
427 | (set_targetable nil) |
---|
428 | (set_state stopped) |
---|
429 | T)))) |
---|
430 | |
---|
431 | |
---|
432 | |
---|
433 | |
---|
434 | |
---|