source: abuse-mac/trunk/lisp/ant.lsp @ 102

Last change on this file since 102 was 102, checked in by Sam Hocevar, 11 years ago
File size: 16.4 KB
Line 
1;; Copyright 1995 Crack dot Com,  All Rights reserved
2;; See licensing information for more details on usage rights
3
4(setq ant_tints (make-array 11 :initial-contents (list
5                                                (def_tint "art/tints/ant/green.spe")
6                                                (def_tint "art/tints/ant/blue.spe")
7                                                (def_tint "art/tints/ant/brown.spe")
8                                                (def_tint "art/tints/ant/egg.spe")
9                                                (def_tint "art/tints/ant/yellow.spe")
10                                                (def_tint "art/tints/ant/mustard.spe")
11                                                (def_tint "art/tints/ant/orange.spe")
12                                                (def_tint "art/tints/ant/gray.spe")
13                                                normal_tint
14                                                normal_tint
15                                                normal_tint
16                                                )))
17
18/*
19------ this code has been compiled --------
20(defun no_fall_move (xm ym but)
21  (move xm ym but))
22  (if (not (eq (gravity) 0))         ;; if we are in the air don't check for no fall
23      (move xm ym but)
24    (let ((oldx (x))
25          (oldy (y))
26          (ret (move xm ym but)))
27      (if (try_move 0 5)
28          (progn
29            (set_x oldx)
30            (set_y oldy)
31            (set_xacel 0)
32            (set_state stopped)
33            (set_xv 0)
34            (set_gravity 0)
35            0)
36        ret))))
37           
38     
39(defun will_fall_if_jump ()
40  nil)
41  (let ((dist (* (abs (get_ability jump_yvel)) (get_ability jump_xvel)))
42        (oldx (x))
43        (oldy (y))
44        )
45    (if (> (direction) 0)
46        (set_x (+ (x) dist))
47      (set_x (- (x) dist)))
48    (if (try_move 0 5)
49        (progn
50          (set_x oldx)
51          (set_y oldy)
52          T)
53      (progn
54        (set_x oldx)
55          (set_y oldy)
56        nil))))
57^^^^^^ this code has been compiled ^^^^^^^^
58*/
59
60
61(defun strait_rocket_ai ()
62  (set_course (aistate)
63              (select difficulty
64                      ('easy    12)
65                      ('medium  15)
66                      ('hard    17)
67                      ('extreme 22) ))
68  (set_frame_angle 0 359 (aistate))
69  (let ((stat (bmove nil)))
70    (if (eq stat T)
71        T
72    (progn
73      (if (not (eq stat nil))
74          (progn
75            (add_object EXPLODE3 (+ (x) (random 5)) (+ (y) (random 5)) 0)
76            (add_object EXPLODE2 (+ (x) (random 5)) (+ (y) (random 5)) 2)
77            (add_object EXPLODE3 (- (x) (random 5)) (- (y) (random 5)) 1)
78            (add_object EXPLODE3 (- (x) (random 5)) (- (y) (random 5)) 2)
79            (hurt_radius (x) (+ (y) 20) 25 15 nil 10)
80            )
81        (let ((myself (me)))
82          (with_object (add_object EG_EXPLO (x) (y)) (user_fun myself (car stat)))))
83      nil))))
84   
85
86(def_char STRAIT_ROCKET
87  (funs (ai_fun strait_rocket_ai))
88  (range 10000 10000)
89  (flags (unlistable T))
90  (states "art/missle.spe" (stopped    (seq "b32r" 1 32))))
91
92(defun animate_ai () (next_picture))
93
94(defun eg_explo_ufun (creator block_flags)
95  (set_direction (with_object creator (direction)))
96  (if block_flags
97      (if (or (blocked_left block_flags) (blocked_right block_flags))
98          (set_state blocking))))
99         
100(def_char EG_EXPLO
101  (funs (ai_fun   animate_ai)
102        (user_fun eg_explo_ufun))
103  (range 10000 10000)
104  (flags (unlistable T))
105  (states "art/missle.spe"
106          (stopped  (seq "bifl" 1 4))
107          (blocking (seq "bilw" 1 4))))
108
109/*
110------ this code has been compiled --------
111(defun alien_wait_time ()
112  (select difficulty
113          ('easy    6)
114          ('medium  4)
115          ('hard    2)
116          ('extreme 1)))
117
118(defun can_hit_player ()
119  (let ((firex (+ (x) (* (direction) 15)) )
120        (firey (- (y) 15))
121        (playerx (with_object (bg) (x)))
122        (playery (- (with_object (bg) (y)) 15)))
123    (can_see firex firey playerx playery nil)))
124
125(defun not_ant_congestion ()
126  (if (> (direction) 0)
127      (if (find_object_in_area (+ (x) 23) (- (y) 20) (+ (x) 30) (+ (y) 20) (list ANT_ROOF))
128          nil
129        T)
130    (if (find_object_in_area (- (x) 30) (- (y) 20) (- (x) 23) (+ (y) 20) (list ANT_ROOF))
131        nil
132      T)))
133     
134     
135(defun roof_above () (not (can_see (x) (y) (x) (- (y) 120) nil)))
136
137(defun fire_at_player ()
138  (let ((firex (+ (x) (* (direction) 15)) )
139        (firey (- (y) 15))
140        (playerx (+ (with_object (bg) (x)) (with_object (bg) (* (xvel) 8))))
141        (playery (+ (- (with_object (bg) (y)) 15) (with_object (bg) (* (yvel) 2)))))
142   
143    (if (and (can_see (x) (y) firex firey nil) (can_see firex firey playerx playery nil))
144        (progn
145          (let ((angle (atan2 (- firey playery)
146                              (- playerx firex))))
147            (fire_object (me) (aitype) firex firey angle (bg))
148            (set_state weapon_fire))
149
150          ))))
151
152(defun ant_dodge ()
153  (if (eq need_to_dodge 1)
154      (progn
155        (setq need_to_dodge 0)
156        (if (eq (random 2) 1)
157            (progn
158              (set_state stopped)
159              (go_state 6))         ;; jump at player
160          (if (roof_above)
161              (progn                   
162                (set_yvel -17)  ;; jump up 
163                (set_xvel 0)
164                (go_state 12))
165            (progn
166              (set_yvel -12)  ;; long jump
167              (set_xvel (* (direction) 20))
168              (set_aistate 6))))
169        T
170    nil)))
171
172(defun scream_check ()
173  (if (can_see (x) (y) (with_object (bg) (x)) (with_object (bg) (y)) nil)
174      (progn
175        (if (or (eq no_see_time 0) (> no_see_time 20))
176          (play_sound ASCREAM_SND 127 (x) (y)))
177        (setq no_see_time 1))
178    (setq no_see_time (+ no_see_time 1))))
179
180(defun ant_ai ()
181      (push_char 30 20)
182      (if (or (eq (state) flinch_up) (eq (state) flinch_down))
183          (progn (next_picture) T)
184        (progn
185
186          (select (aistate)
187                  (0   (set_state hanging)
188                       (if (eq hide_flag 0)
189                           (set_aistate 15)
190                         (set_aistate 16)))
191
192                  (15 ;; hanging on the roof waiting for the main character               
193                   (if (next_picture) T (set_state hanging))
194                   (if (if (eq (total_objects) 0);; no sensor, wait for guy
195                           (and (< (distx) 130) (< (y) (with_object (bg) (y))))
196                         (not (eq (with_object (get_object 0) (aistate)) 0)))
197                       (progn
198                         (set_state fall_start)                  (set_direction (toward))
199                         (set_aistate 1))))
200
201                  (16 ;; hiding
202                   (set_state hiding)
203                   (if (if (eq (total_objects) 0);; no sensor, wait for guy
204                           (and (< (distx) 130) (< (y) (with_object (bg) (y))))
205                         (not (eq (with_object (get_object 0) (aistate)) 0)))
206                       (progn
207                         (set_state fall_start)                  (set_direction (toward))
208                         (set_aistate 1))))
209
210                  (1 ;; falling down
211                   (set_state falling)
212                   (scream_check)
213                   (if (blocked_down (move 0 0 0))
214                       (progn
215                         (set_state landing)
216                         (play_sound ALAND_SND 127 (x) (y))
217                         (set_aistate 9))))
218
219                  (9 ;; landing / turn around (gerneal finish animation state)
220                   (if (next_picture) T
221                     (if (try_move 0 2)
222                         (progn
223                           (set_gravity 1)
224                           (set_aistate 1))
225                       (progn (set_state stopped)                         
226                              (go_state 2)))))  ;; running
227
228                  (2 ;; running
229                   (scream_check)
230                   (if (eq (random 20) 0) (setq need_to_dodge 1))
231                   (if (not (ant_dodge))
232                     (if (eq (facing) (toward))
233                         (progn
234                           (next_picture)
235                           (if (and (eq (random 5) 0) (< (distx) 180) (< (disty) 100) (can_hit_player))
236                               (progn
237                                 (set_state weapon_fire)
238                                 (set_aistate 8))  ;; fire at player
239                             (if (and (< (distx) 100) (> (distx) 10) (eq (random 5) 0))
240                                 (set_aistate 4)  ;; wait for pounce
241
242                               (if (and (> (distx) 140)
243                                        (not_ant_congestion)
244                                        (not (will_fall_if_jump)))
245                                   (set_aistate 6)
246
247                                 (if (> (direction) 0)
248                                     (if (and (not_ant_congestion) (blocked_right (no_fall_move 1 0 0)))
249                                         (set_direction -1))
250                                   (if (and (not_ant_congestion) (blocked_left (no_fall_move -1 0 0)))
251                                       (set_direction 1)))))))
252                           (progn
253                             (set_direction (toward))
254                             (set_state turn_around)
255                             (set_aistate 9)))))
256             
257                  (4 ;; wait for pounce
258                   (if (ant_dodge) T
259                     (progn
260                       (set_state pounce_wait)
261                       (move 0 0 0)
262                       (if (> (state_time) (alien_wait_time))
263                           (progn
264                             (play_sound ASLASH_SND 127 (x) (y))
265                             (set_state stopped)
266                             (go_state 6))))))
267
268                  (6 ;; jump             
269                   (setq need_to_dodge 0)
270                   (if (blocked_down (move (direction) -1 0))
271                       (progn
272                         (set_aistate 2))))
273
274                  (8 ;; fire at player
275                   (if (ant_dodge) T                 
276                     (if (eq (state) fire_wait)
277                         (if (next_picture)
278                             T
279                           (progn
280                             (fire_at_player)
281                             (set_state stopped)
282                             (set_aistate 2)))
283                       (set_state fire_wait))))
284
285                  (12 ;; jump to roof
286                   (setq need_to_dodge 0)
287                   (set_state jump_up)
288                   (set_yvel (+ (yvel) 1))
289                   (set_xacel 0)
290                   (let ((top (- (y) 31))
291                         (old_yvel (yvel))
292                         (new_top (+ (- (y) 31) (yvel))))
293                     (let ((y2 (car (cdr (see_dist (x) top (x) new_top)))))
294                       (try_move 0 (- y2 top) nil)
295                       (if (not (eq y2 new_top))
296                           (if (> old_yvel 0)
297                             (progn
298                               (set_state stopped)
299                               (set_aistate 2))
300                           (progn
301                             (set_state top_walk)
302                             (set_aistate 13)))))))
303
304                  (13 ;; roof walking
305                   (scream_check)
306                   (if (or (and (< (y) (with_object (bg) (y)))
307                                (< (distx) 10) (eq (random 8) 0))
308                           (eq need_to_dodge 1))  ;; shooting at us, fall down
309                       (progn
310                         (set_gravity 1)
311                         (set_state run_jump)
312                         (go_state 6))
313                     (progn
314                       (if (not (eq (facing) (toward)))        ;; run toward player
315                           (set_direction (- 0 (direction))))
316                       (if (and (< (distx) 120) (eq (random 5) 0))
317                           (progn
318                             (set_state ceil_fire)
319                             (go_state 14))
320                         (let ((xspeed (if (> (direction) 0) (get_ability run_top_speed)
321                                         (- 0 (get_ability run_top_speed)))))
322                           (if (and (can_see (x) (- (y) 31) (+ (x) xspeed) (- (y) 31) nil)
323                                    (not (can_see (+ (x) xspeed) (- (y) 31)
324                                                  (+ (x) xspeed) (- (y) 32) nil)))
325                               (progn
326                                 (set_x (+ (x) xspeed))
327                                 (if (not (next_picture))
328                                     (set_state top_walk)))
329                             (set_aistate 1)))))))
330
331       
332                  (14 ;; cieling shoot
333                   (if (next_picture)
334                       T
335                     (progn
336                       (fire_at_player)
337                       (set_state top_walk)
338                       (set_aistate 13))))
339
340                  )))
341     
342      T)
343*/   
344
345
346(defun create_dead_parts (array part_num type)
347  (let ((dir  (direction))
348        (rand (rand_on)))
349    (with_object (add_object (aref array part_num) (x) (y))
350               (progn (set_aitype type)
351                      (set_xvel (* dir (random 10)))
352                      (set_yvel (- 0 (random 25)))))
353    (with_object (add_object (aref array (+ part_num 1)) (x) (y))
354               (progn (set_aitype type)
355                      (set_xvel (* dir (random 10)))
356                      (set_yvel (- 0 (random 25)))))
357    (with_object (add_object (aref array (+ part_num 2)) (x) (y))
358               (progn (set_aitype type)
359                      (next_picture)                        ;; unsync the animations
360                      (set_xvel (* dir (random 10)))
361                      (set_yvel (- 0 (random 25)))))
362    (with_object (add_object (aref array (+ part_num 2)) (x) (y))
363               (progn (set_aitype type)
364                      (next_picture)
365                      (next_picture)
366                      (set_xvel (* dir (random 10)))
367                      (set_yvel (- 0 (random 25)))))
368    (with_object (add_object (aref array (+ part_num 2)) (x) (y))
369               (progn (set_aitype type)
370                      (next_picture)
371                      (next_picture)
372                      (next_picture)
373                      (set_xvel (* dir (random 10)))
374                      (set_yvel (- 0 (random 25)))))
375    (set_rand_on rand)))   ;; restore random table, in case this didn't get called because of frame panic
376
377
378(enum 'decay_part
379      'flaming_part
380      'electric_part
381      'normal_part)
382     
383(defun get_dead_part (from)
384  (if from
385      (let ((type (with_object from (otype))))
386        (if (or (eq type GRENADE) (eq type ROCKET) (eq type FIREBOMB))
387            flaming_part
388          (if (or (eq type PLASMAGUN_BULLET) (eq type LSABER_BULLET))
389              electric_part
390            normal_part)))
391    normal_part)
392
393)
394
395
396(defun ant_damage (amount from hitx hity push_xvel push_yvel)  ; transfer damage to lower half
397
398  (if (and (not (eq (state) dead))
399           (or (not from)
400               (with_object from (if (eq (total_objects) 0)
401                                     (not (eq (otype) ANT_ROOF))
402                                   (with_object (get_object 0) (not (eq (otype) ANT_ROOF)))))))
403      (if (not (eq (aistate) 15))
404          (progn
405            (if (eq (random 2) 0)
406                (set_state flinch_up)
407              (set_state flinch_down))
408            (damage_fun amount from hitx hity push_xvel push_yvel)
409            (play_sound APAIN_SND 127 (x) (y))
410            (setq need_to_dodge 1)         
411            (if (<= (hp) 0)
412                (progn
413                  (if (eq (aitype) 0)
414                      (play_sound (aref ASML_DEATH (random 2)) 127 (x) (y))
415                    (play_sound (aref ALRG_DEATH (random 3)) 127 (x) (y)))
416
417                  (set_state dead)
418                  (if (eq (random (select difficulty
419                                          ('easy 2)
420                                          ('medium 5)
421                                          ('hard   8)
422                                          ('extreme 20))) 0)
423                      (if (eq (random 4) 0)
424                          (add_object (aitype_to_ammo (+ (aitype) 1)) (x) (y)))
425                    (add_object (aitype_to_ammo (aitype)) (x) (y)))
426                  (create_dead_parts ant_dead_parts (* (get_dead_part from) 3) (aitype)))
427                  )))))
428
429(defun ant_cons ()
430  (set_state hanging)
431  (setq no_see_time 300))
432
433(defun ant_ct ()
434  (select (aitype)
435          (0 (set_hp 15))
436          (1 (set_hp 50))
437          (2 (set_hp 25))
438          (3 (set_hp 35))
439          (4 (set_hp 35))
440          (5 (set_hp 20))
441
442          ))
443
444/*
445(defun ant_draw ()
446  (if (eq 0 (aitype))
447      (draw)
448    (draw_tint (aref ant_tints (aitype)))))
449*/
450
451(def_char ANT_ROOF
452  (vars need_to_dodge
453        no_see_time
454        hide_flag)
455  (fields
456          ("hide_flag"    ant_hide)
457          ("fade_count"   ai_fade)
458          ("aitype"       ai_type)
459          ("hp"           ai_health)
460          ("aistate"      ai_state))
461  (range 250 20)
462  (draw_range 40 40)
463  (funs (ai_fun     ant_ai)     
464        (draw_fun   ant_draw)
465        (constructor ant_cons)
466        (type_change_fun ant_ct)
467        (get_cache_list_fun ant_cache)
468        (damage_fun ant_damage))
469
470  (abilities (run_top_speed   7)
471             (start_hp       20)
472             (stop_acel      20)
473             (start_acel     20)
474             (jump_yvel      -4)
475             (jump_xvel      20)
476             (push_xrange     1)
477             (jump_top_speed 20))
478 
479  (flags (hurtable  T)
480         (force_health T))
481
482  (states "art/ant.spe"
483          (hanging (rep "ant" 2))
484
485          (fall_start "affc0001.pcx")
486          (falling    "affc0002.pcx")
487         
488          (stopped "awlk0001.pcx")
489          (running (seq "awlk" 1 10))
490          (landing (seq "acff" 1 4))
491          (pounce_wait "acff0001.pcx")
492          (turn_around (seq "atrn" 1 5))
493
494          (run_jump "dive")
495          (run_jump_fall "dive")
496          (start_run_jump "dive")
497          (fire_wait (seq "wait" 1 3))
498
499          (ceil_fire (seq "cfire" 1 3))
500          (top_walk  (seq "awkc" 1 10))
501          (flinch_up (rep "afh10001.pcx" 2))
502          (flinch_down (rep "afh20001.pcx" 2))
503          (blown_back_dead     "adib0009.pcx")
504          (jump_up            "ajmp.pcx")
505          (hiding             "hidden")
506          (dead             "hidden")
507          (weapon_fire  (seq "asht" 2 5))))
508
509
510(def_char HIDDEN_ANT
511  (funs (ai_fun     ant_ai)
512        (draw_fun   dev_draw))
513  (flags (unlistable T))
514  (vars need_to_dodge
515        no_see_time
516        hide_flag)
517  (states "art/ant.spe" (stopped "hidden")))
518
519 
520
521
522(defun crack_ai ()
523  (if (eq (aistate) 0)
524      (if (if (eq (total_objects) 0)
525              (and (< (distx) 50) (< (disty) 70))
526            (with_object (get_object 0) (not (eq (aistate) 0))))
527          (set_aistate 1))
528    (select (current_frame)
529            (4 nil)
530            (3
531             (let ((d (direction))
532                   (type (aitype)))
533               (if (or (eq create_total 0) (eq create_total 1))           
534                   (set_current_frame 4)
535                 (progn
536                   (setq create_total (- create_total 1))
537                   (set_current_frame 0)))
538               (with_object (add_object_after ANT_ROOF (+ (x) (* (direction) 20)) (y))
539                            (progn
540                              (set_aitype type)
541                              (set_direction d)
542                              (set_xvel (* d 20))
543                              (set_state run_jump)
544                              (set_aistate 6)))
545               ))
546            (0 (next_picture))
547            (1 (next_picture))
548            (2 (next_picture))))
549  T)
550           
551
552(defun crack_cons ()
553  (setq create_total 1)
554  (set_aitype 1))
555
556
557(def_char ANT_CRACK
558  (funs (ai_fun crack_ai)
559        (draw_fun ant_draw)
560        (get_cache_list_fun ant_cache)
561        (constructor crack_cons))
562  (range 250 0)
563  (vars create_total)
564  (fields ("create_total"  ant_total)
565          ("aitype"        ant_type))
566  (states "art/ant.spe"
567          (stopped (seq "aisw" 2 6))))
568
569
570(defun head_ai ()
571  (select (aistate)
572          (0 ;; falling
573           (next_picture)
574           (set_yvel (+ (yvel) 3))
575           (bounce_move T T T '(progn (set_state dieing) (set_aistate 1)) T)
576           (or (< (state_time) 15)
577               (not (frame_panic))))         
578          (1 ;; hit the ground
579           nil)
580          ))
581
582(setq ant_dead_parts (make-array (* 3 4) :initial-contents
583                             '((AD_1  "adbn") (AD_2  "adha") (AD_3  "adla")     ; disapear
584                               (AD_4  "adaf") (AD_5  "adah") (AD_6  "adlf")     ; flaming
585                               (AD_7  "adbe") (AD_8  "adhe") (AD_9  "adle")     ; electrical
586                               (AD_10 "adan") (AD_11 "adhn") (AD_12 "adln"))))  ; normal
587
588
589(defun ant_cache (type)  ;; cache in the ant (from crack) and the dead body parts and the ant tints
590  (list
591   (list ANT_ROOF AD_1 AD_2 AD_3 AD_4 AD_5 AD_6 AD_7 AD_8 AD_9 AD_10 AD_11 AD_12)
592   (list (aref ant_tints 0) (aref ant_tints 1) (aref ant_tints 2) (aref ant_tints 3)
593         (aref ant_tints 4) (aref ant_tints 5) (aref ant_tints 6) (aref ant_tints 7))))
594
595
596
597(defun make_dead_part (sym base frames filename draw)
598  (eval `(def_char ,sym
599           (range 100 100)
600           (funs (ai_fun    head_ai)
601                 (draw_fun  ,draw))
602           (flags (unlistable T)
603                  (add_front T))
604           (states filename
605                  (stopped (seq base 1 ,frames))))))
606
607
608(do ((i 0 (setq i (+ i 1))))
609           ((>= i 12) nil)
610           (setq (aref ant_dead_parts i)
611                 (make_dead_part (car (aref ant_dead_parts i))
612                                 (car (cdr (aref ant_dead_parts i))) 4 "art/ant.spe" 'ant_draw)))
613
614
615(setq load_warn nil)
616(if (not (load "register/ant.lsp"))
617    (setq BOSS_ANT ANT_ROOF))
618(setq load_warn T)
619
620
621
Note: See TracBrowser for help on using the repository browser.