(defun forceobj_ai ()
  (if (<= (total_objects) 0)
      nil
     (progn
	(let ((xfrc (xacel))
	      (yfrc (yacel)))
	(try_move xfrc yfrc))
	  T)))


(defun forceobj_cons ()
  (set_xacel 0)
  (set_yacel 10))


(defun do_fire_explo (radius amount)
      (play_sound GRENADE_SND 127 (x) (y))
      (add_object EXPFIRE (+ (x) (random 10)) (+ (+ (random 10) (y)) -20)     0)
      (if (not (frame_panic))
	  (progn
	    (add_object EXPFIRE (- (x) (random 10)) (+ (- (y) (random 10)) -20) 2)
	    (add_object EXP_LIGHT (x) (y) 100)))         ; add cool light if not too slow
      (hurt_radius (x) (y) radius amount (if (> (total_objects) 0)
					     (get_object 0)
					   nil) 20)
      nil)


(defun do_light_explo (radius amount)
      (play_sound GRENADE_SND 127 (x) (y))
;;      (add_object EXPFIRE (+ (x) (random 10)) (+ (+ (random 10) (y)) -20)     0)
      (if (not (frame_panic))
	  (progn
;;	    (add_object EXPFIRE (- (x) (random 10)) (+ (- (y) (random 10)) -20) 2)
	    (add_object EXP_LIGHT (x) (y) 100)))         ; add cool light if not too slow
      (hurt_radius (x) (y) radius amount (if (> (total_objects) 0)
					     (get_object 0)
					   nil) 20)
      nil)

(defun gsensor_ai ()
      (if (and (< (distx) (xvel)) (< (disty) (yvel)))
	   (progn
		(let ((xgvty (xacel))
		      (ygvty (yacel)))
			(with_object (bg) (try_move xgvty ygvty))))
		T)
	   T)


(defun gsensor_cons ()
  (set_xvel 50)
  (set_yvel 50)
  (set_xacel 0)
  (set_yacel -15))


(defun gravity_sensor_draw ()
  (if (edit_mode) 
      (progn
	(draw)
	(let ((x1 (- (x) (xvel)))
	      (y1 (- (y) (yvel)))
	      (x2 (+ (x) (xvel)))
	      (y2 (+ (y) (yvel)))
	      (c  (find_rgb 255 255 0)))
	  (draw_line x1 y1 x2 y1 c)
	  (draw_line x2 y1 x2 y2 c)
	  (draw_line x2 y2 x1 y2 c)
	  (draw_line x1 y2 x1 y1 c)))
    nil))


(defun hsensor_ai ()
      (if (and (< (distx) (xvel)) (< (disty) (yvel)))
	   (progn
		(select (aitype)
		   (0	(let ((phlth (xacel))) (if (eq (mod (state_time) 10) 0) (do_damage phlth (bg)))))
		   (1	(let ((phlth (xacel)) (hlthrad (/ (xvel) 2))) (hurt_radius (x) (y) hlthrad phlth nil 10)))
		   (2	(let ((phlth (xacel)) (hlthrad (/ (xvel) 2))) (do_explo hlthrad phlth)))
			)
		T)
	   T))


(defun hsensor_cons ()
  (set_xvel 50)
  (set_yvel 50)
  (set_aitype 0)
  (set_aistate 0)
  (set_xacel 10)
  (set_yacel 0))


(defun health_sensor_draw ()
  (if (edit_mode) 
      (progn
	(draw)
	(let ((x1 (- (x) (xvel)))
	      (y1 (- (y) (yvel)))
	      (x2 (+ (x) (xvel)))
	      (y2 (+ (y) (yvel)))
	      (c  (find_rgb 255 0 255)))
	  (draw_line x1 y1 x2 y1 c)
	  (draw_line x2 y1 x2 y2 c)
	  (draw_line x2 y2 x1 y2 c)
	  (draw_line x1 y2 x1 y1 c)))
    nil))


(defun lsensor_ai ()
      (if (and (< (distx) (xvel)) (< (disty) (yvel)))
	   (progn
		(if (eq (aistate) 1) (request_end_game))
		(if (eq (aitype) 1) (show_stats))
		(request_level_load (concatenate 'string "levels/level" (digstr (xacel) 2)".spe"))
	   )
		T)
	   T)


(defun lsensor_cons ()
  (set_xvel 50)
  (set_yvel 50)
  (set_xacel 1)
  (set_yacel 1)
  (set_aistate 0)
  (set_aitype 1))


(defun level_sensor_draw ()
  (if (edit_mode) 
      (progn
	(draw)
	(let ((x1 (- (x) (xvel)))
	      (y1 (- (y) (yvel)))
	      (x2 (+ (x) (xvel)))
	      (y2 (+ (y) (yvel)))
	      (c  (find_rgb 255 128 0)))
	  (draw_line x1 y1 x2 y1 c)
	  (draw_line x2 y1 x2 y2 c)
	  (draw_line x2 y2 x1 y2 c)
	  (draw_line x1 y2 x1 y1 c)))
    nil))

(defun burst_fire (firex firey angle)
  (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)
	(progn
	  (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)))))


(defun wrob2_cons ()	  
  (setq fire_delay 4)
  (setq burst_delay 1)
  (setq max_xvel 10)
  (setq max_yvel 5)
  (set_aitype 0)
  (setq burst_total 5))


(defun wrob2_ai ()
  (if (eq (hp) 0)
	(with_object (add_object WALK_ROBHEAD (x) (- (y) 24) 1)
      nil)
    (progn
	(try_move 0 10)
      (select (aistate)
	      (0;; walk toward player
	       (if (or (> (distx) 120) (not (eq (direction) (toward))))
		   (progn
		     (move (toward) 0 0)
		     (next_picture))
		 (progn
		   (set_aistate 1))))
	      (1;; stop and fire
	       (burst_fire  (+ (x) (* (direction) 28)) (- (y) 35)		      
			    (if (> (direction) 0)
				(mod (- 375 (/ (* burst_left 30) burst_total)) 360)
			      (+ 165 (/ (* burst_left 30) burst_total))))
	       (if (not (eq fire_time 0))
		   (set_aistate 0))))
      T)))


(defun telesensor_ai ()
  (if (> (total_objects) 0)
      (select (aistate)
	      (0 ;; wait for player to activate
	       (if (and (< (distx) (xvel)) (< (disty) (yvel)))
		   (progn
		(if (eq (aitype) 0)
			 (progn
			   (link_object (bg))
			   (set_state running)
			   (set_aistate 1))
		
		     (if (with_object (bg) (pressing_action_key))
			 (progn
			   (link_object (bg))
			   (set_state running)
			   (set_aistate 1))
			 )))) )
	      (1 ;; wait for animation
	       (if (next_picture)
		   (let ((x (x))
			 (y (- (y) 16))
			 (fade (if (< (current_frame) 16) (current_frame) 15)))
		     (with_object (get_object 1) 
				  (progn
				    (set_x x) 
				    (set_y y) 
				    (user_fun SET_FADE_COUNT fade)
				    (setq is_teleporting 1)
				    )))
				  
		 (let ((x (with_object (get_object 0) (x)))
		       (y (with_object (get_object 0) (- (y) 16))))		   
		   (with_object (get_object 1)
				(progn 
				  (set_x x)
				  (set_y y)
				  (setq is_teleporting 0)
				  (user_fun SET_FADE_COUNT 0)
				  ))
		   (remove_object (get_object 1))
		   (set_aistate 0))))))
  T)


(defun telesensor_cons ()
  (set_xvel 50)
  (set_yvel 50))


(defun teleport_sensor_draw ()
  (if (edit_mode) 
      (progn
	(draw)
	(let ((x1 (- (x) (xvel)))
	      (y1 (- (y) (yvel)))
	      (x2 (+ (x) (xvel)))
	      (y2 (+ (y) (yvel)))
	      (c  (find_rgb 128 255 0)))
	  (draw_line x1 y1 x2 y1 c)
	  (draw_line x2 y1 x2 y2 c)
	  (draw_line x2 y2 x1 y2 c)
	  (draw_line x1 y2 x1 y1 c)))
    nil))
