source: abuse-mac/trunk/lisp/guns.lsp @ 122

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