home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC/CD Gamer UK 28
/
PCGAMER28.bin
/
dos
/
abuse
/
lisp
/
flyer.lsp
< prev
next >
Wrap
Lisp/Scheme
|
1995-09-13
|
4KB
|
138 lines
;; Copyright 1995 Crack dot Com, All Rights reserved
;; See licensing information for more details on usage rights
(defun flyer_ai ()
(if (not (eq smoke_time 0)) ;; if we just got hit, put out some smoke
(progn
(setq smoke_time (- smoke_time 1))
(if (eq (mod smoke_time 2) 0)
(add_object SMALL_DARK_CLOUD (x) (y)))))
(if (eq (aistate) 0) ;; wait for something to turn us on
(if (or (eq (total_objects) 0) (not (eq (with_object (get_object 0) (aistate)) 0)))
(if (next_picture) T
(progn
(set_targetable T)
(set_state running)
(set_aistate 1)))
(progn
(set_targetable nil)
(set_state stopped)
T))
(if (eq (hp) 0) ;; if dead, make an explosion
(progn
(add_object EXPLODE1 (+ (x) (random 10)) (+ (+ (random 10) (y)) -20) 0)
(add_object EXPLODE1 (- (x) (random 10)) (+ (- (y) (random 10)) -20) 2)
(add_object EXPLODE1 (x) (+ (- (y) (random 20)) -20) 4)
nil)
(progn
(if (eq (mod (state_time) 5) 0) ;; make flyer noise every 5 ticks
(play_sound FLYER_SND 127 (x) (y)))
(if (> (with_object (bg) (x)) (x)) ;; start going right if player is to the right
(progn
(set_xvel (+ (xvel) 1))
(if (> (xvel) max_xvel) (set_xvel max_xvel))
(if (eq (direction) -1)
(progn
(set_direction 1)
(set_state turn_around))))
(if (< (with_object (bg) (x)) (x)) ;; start going left if the player is to the left
(progn
(set_xvel (- (xvel) 1))
(if (< (xvel) (- 0 max_xvel)) (set_xvel (- 0 max_xvel)))
(if (eq (direction) 1)
(progn
(set_direction -1)
(set_state turn_around))))))
(if (> (with_object (bg) (- (y) 70)) (y))
(if (> (yvel) max_yvel)
(set_yvel (- (yvel) 1))
(set_yvel (+ (yvel) 1)))
(if (< (with_object (bg) (- (y) 50)) (y))
(if (< (yvel) (- 0 max_yvel))
(set_yvel (+ (yvel) 1))
(set_yvel (- (yvel) 1)))))
(if (eq (random 5) 0) ;; add some randomness to the movement
(set_xvel (+ (xvel) 1))
(if (eq (random 5) 0)
(set_xvel (- (xvel) 1))))
(if (eq (random 5) 0)
(set_yvel (+ (yvel) 1))
(if (eq (random 5) 0)
(set_yvel (- (yvel) 1))))
(if (next_picture) T (set_state running)) ;; reset animation when done
(bounce_move '(set_xvel (/ (xvel) 2)) '(set_xvel (/ (xvel) 2))
'(set_yvel (/ (yvel) 2)) '(set_yvel (/ (yvel) 2)) nil)
(if (> fire_time 0) ;; if we need to wait till next burst
(progn
(setq fire_time (- fire_time 1))
(if (eq fire_time 0)
(progn
(setq burst_left burst_total)
(setq burst_wait 0))))
(if (eq burst_wait 0)
(if (and (< (distx) 150) (eq (direction) (facing)))
(let ((firex (+ (x) (* (direction) 10)) )
(firey (y))
(playerx (+ (with_object (bg) (x)) (with_object (bg) (* (xvel) 4))))
(playery (+ (- (with_object (bg) (y)) 15) (with_object (bg) (* (yvel) 2)))))
(if (and (can_see (x) (y) firex firey nil) (can_see firex firey playerx playery nil))
(progn
(let ((angle (atan2 (- firey playery)
(- playerx firex))))
(if (or (eq burst_left 1) (eq burst_left 0))
(setq fire_time fire_delay)
(setq burst_left (- burst_left 1)))
(setq burst_wait burst_delay)
(fire_object (me) (aitype) firex firey angle (bg)))))))
(setq burst_wait (- burst_wait 1))))
T))))
(defun flyer_cons ()
(setq fire_delay 20)
(setq burst_delay 3)
(setq max_xvel 10)
(setq max_yvel 5)
(set_aitype 9)
(setq burst_total 2))
(defun flyer_damage (amount from hitx hity push_xvel push_yvel)
(if (and from (with_object from (and (> (total_objects) 0)
(with_object (get_object 0)
(or (eq (otype) FLYER)
(eq (otype) GREEN_FLYER))
))))
nil
(if (eq (state) stopped) nil
(progn
(setq smoke_time 30)
(set_yvel (- (yvel) 14))
(set_state flinch_up)
(damage_fun amount from hitx hity push_xvel push_yvel)))))
(setq load_warn nil)
(if (not (load "register/flyer.lsp"))
(progn
(setq FLYER WHO)
(setq GREEN_FLYER WHO)))
(setq load_warn T)