;; Copyright 1995 Crack dot Com,  All Rights reserved
;; See licencing 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 (women maybe?)
      (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)









