home *** CD-ROM | disk | FTP | other *** search
/ PC/CD Gamer UK 28 / PCGAMER28.bin / dos / abuse / lisp / people.lsp < prev    next >
Lisp/Scheme  |  1995-09-13  |  23KB  |  881 lines

  1. ;; Copyright 1995 Crack dot Com,  All Rights reserved
  2. ;; See licensing information for more details on usage rights
  3.  
  4. (setq bright_tint (def_tint "art/tints/cop/bright.spe"))  ;; used when the player fires a weapon
  5. (setq player_tints (make-array 6 :initial-contents (list 
  6.                             (def_tint "art/tints/cop/blue.spe")
  7.                             (def_tint "art/tints/cop/africa.spe")
  8.                             (def_tint "art/tints/cop/fire.spe")
  9.  
  10.                             (def_tint "art/tints/cop/olive.spe")
  11.                             (def_tint "art/tints/cop/land.spe")
  12.                             (def_tint "art/tints/cop/gold.spe")
  13.  
  14. )))
  15.  
  16.  
  17.  
  18. (setq cop_dead_parts (make-array (* 4 3) :initial-contents 
  19.                    ;       head           arm            leg
  20.                  '((CP_1  "4dha") (CP_2  "4daa") (CP_3  "4dba")     ; disapear
  21.                    (CP_4  "4dhf") (CP_5  "4daf") (CP_6  "4dbf")     ; flaming
  22.                    (CP_7  "4dae") (CP_8  "4dle") (CP_9  "4dbe")     ; electrical
  23.                    (CP_10 "4dhn") (CP_11 "4dan") (CP_12 "4dbn"))))  ; normal
  24.  
  25.  
  26. (do ((i 0 (setq i (+ i 1))))
  27.        ((>= i 12) nil)
  28.        (setq (aref cop_dead_parts i) 
  29.          (make_dead_part (car (aref cop_dead_parts i))          
  30.                  (car (cdr (aref cop_dead_parts i))) 4 "art/cop.spe" 'dead_cop_part_draw)))
  31.  
  32.  
  33.  
  34.  
  35.  
  36. (setf fast_image (def_image "art/misc.spe" "fast_image"))
  37. (setf fly_image (def_image "art/misc.spe" "fly_image"))
  38. (setf sneaky_image (def_image "art/misc.spe" "sneaky_image"))
  39. (setf health_image (def_image "art/misc.spe" "b_check_image"))
  40.  
  41.  
  42. (defun give_player_health (amount)
  43.   (let ((h_amount  (select difficulty
  44.                ('easy    amount)
  45.                ('medium  (/ (* amount 3) 4))
  46.                ('hard    (/ amount 2))
  47.                ('extreme (/ amount 4))))
  48.     (h_max (if (eq special_power HEALTH_POWER)
  49.            200
  50.          100)))
  51.     (if (eq (hp) h_max)
  52.     nil
  53.       (progn
  54.     (if (<= (+ (hp) h_amount) h_max)
  55.         (add_hp h_amount)
  56.       (add_hp (- h_max (hp))))
  57.     (setq b_ramp (+ b_ramp (* h_amount 2)))
  58.  
  59.     T)))
  60. )
  61.     
  62.  
  63.  
  64. (defun pressing_action_key ()
  65.   (> (player_y_suggest) 0))
  66.  
  67.  
  68. ; signals for user function
  69. (enum 'SET_SNEAKY_TIME
  70.       'SET_VISOR_TIME
  71.       'SET_FAST_TIME
  72.       'SET_FADE_COUNT
  73. )
  74.  
  75.  
  76. ; states for cop
  77. (enum 'JUST_START
  78.       'NORMAL_PLAY)
  79.  
  80.  
  81. (enum 'NO_POWER
  82.       'FAST_POWER
  83.       'FLY_POWER
  84.       'SNEAKY_POWER
  85.       'HEALTH_POWER)
  86.  
  87.  
  88. (defun cop_ufun (signal value)
  89.   (if (< (total_objects) 1)    ; make sure upper body is there
  90.       nil
  91.     (select signal
  92.         (SET_SNEAKY_TIME 
  93.          (progn 
  94.            (set_sneaky_time value)
  95.            (with_obj0 (set_sneaky_time value))))
  96.         (SET_VISOR_TIME (set_visor_time value))
  97.         (SET_FAST_TIME 
  98.          (progn 
  99.            (set_fast_time value)
  100.            (with_obj0 (set_fast_time value))))
  101.         (SET_FADE_COUNT (set_fade_count value) 
  102.                 (with_obj0 (set_fade_count value)))
  103.          
  104.         )))
  105.             
  106.  
  107. (defun cop_adjust_top (return)
  108.   (if (< (total_objects) 1)        ;; should be here
  109.       (let ((me (me)))
  110.     (link_object (add_object_after MGUN_TOP (x) (y)))
  111.     (with_obj0 (link_object me))
  112.     ))
  113.   return
  114. )
  115.  
  116. (defun climb_off_handler ()
  117.   (if (next_picture)
  118.       (progn
  119.     (view_push_down 4)
  120.     0)
  121.     (progn
  122.       (set_y (- (y) 28))
  123.       (set_state stopped)
  124.       0)))
  125.  
  126. (defun climb_handler (xm ym but)
  127.   (let ((yd in_climbing_area))
  128.     (setq in_climbing_area 0)
  129.     (if (eq (state) climb_off)
  130.     (climb_off_handler)
  131.       (if (eq (state) climbing)
  132.       (progn
  133.         (if (> ym 0)
  134.         (progn
  135.           (if (eq (current_frame) 0) (set_current_frame 9) 
  136.             (set_current_frame (- (current_frame) 1)))
  137.           (set_y (+ (y) 3)))
  138.           (if (< ym 0)
  139.           (progn
  140.             (if (< yd 32)
  141.             (set_state climb_off)
  142.               (progn
  143.             (if (not (next_picture)) (set_state climbing))
  144.             (set_y (- (y) 3)))))))
  145.         (if (not (eq xm 0))
  146.         (if (can_see (x) (- (y) 20) (x) (y) nil)
  147.             (if (eq ym 0)
  148.             (progn
  149.               (set_state run_jump_fall)
  150.               (set_gravity 1))
  151.               (progn
  152.             (set_state run_jump)
  153.             (set_yvel (get_ability jump_yvel))
  154.             (set_gravity 1)
  155.             ))))
  156.  
  157.         0)
  158.     (if (and (>= (yvel) 0) (or (> ym 0) 
  159.                    (and (< ym 0) (> yd 8))))
  160.         (progn
  161.           (set_state climbing)
  162.           (set_gravity 0)
  163.           (set_xvel 0)
  164.           (set_yvel 0)
  165.           (set_xacel 0)
  166.           (set_yacel 0)
  167.           0)
  168.       (progn
  169.         (next_picture)
  170.         (cop_adjust_top (mover xm ym but))))
  171.     ))))
  172.       
  173.       
  174. (defun undo_special_power (xm ym but)
  175.   (select special_power
  176.       (FAST_POWER   (setq used_special_power 0))
  177.       (SNEAKY_POWER (if (> used_special_power 0)
  178.                 (setq used_special_power (- used_special_power 1))))))
  179.  
  180. (defun do_special_power (xm ym but)
  181.   (select special_power
  182.       (FLY_POWER
  183.        (add_object CLOUD (+ (+ (x) (* (direction) -10)) (random 5)) (+ (y) (random 5)))
  184.        (set_state run_jump)
  185.        (set_gravity 1)
  186.        (set_yacel 0)
  187.        (if (> (yvel) 0) (set_yvel (/ (yvel) 2)))
  188.        (set_yvel (- (yvel) 2))
  189.        (if (< ym 0)
  190.            (set_yvel (- (yvel) 1)))
  191.        )
  192.       
  193.  
  194.       (FAST_POWER 
  195.        (setq used_special_power 1)
  196.        (setq last1_x (x))
  197.        (setq last1_y (y))
  198.        (if (> (total_objects) 0)
  199.            (with_obj0
  200.                 (if (> fire_delay1 0) 
  201.                 (setq fire_delay1 (- fire_delay1 1)))))
  202.  
  203.        
  204.        (let ((in_area in_climbing_area)
  205.          (old_yvel (yvel)))
  206.          (player_move xm ym but)
  207.          (setq in_climbing_area in_area)
  208.          (if (and (< ym 0) (eq old_yvel 0) (< (yvel) 0))
  209.          (set_yvel (+ (yvel) (/ (yvel) 3))))
  210.          
  211.          )
  212.  
  213.        (setq last2_x (x))
  214.        (setq last2_y (y)))
  215.  
  216.       (SNEAKY_POWER (if (<= used_special_power 15)               
  217.                 (setq used_special_power (+ used_special_power 1))))
  218.       ))
  219.  
  220. (defun player_move (xm ym but)
  221.   (if (eq in_climbing_area 0)
  222.       (progn
  223.     (if (eq (state) climbing)
  224.         (progn
  225.           (set_gravity 1)
  226.           (set_state run_jump_fall)))
  227.     (next_picture)
  228.     (cop_adjust_top (mover xm ym but)))
  229.     (climb_handler xm ym but)))
  230.  
  231. /*(defun cop_mover (xm ym but) 
  232.   (if (> (yvel) 10) 
  233.       (progn 
  234.     (set_yacel 0)
  235.     (set_yvel (- (yvel) 1))))  ;; terminal velocity
  236.   (select (aistate)
  237.       (JUST_START 
  238.        (if (eq but 0)              ; wait till user lets go of button before moving           
  239.            (progn
  240.          (set_aistate NORMAL_PLAY)
  241.          (mover xm ym but))
  242.          (cop_adjust_top (tick))))
  243.       (NORMAL_PLAY
  244.        (if (or (<= (hp) 0) (eq (state) dieing) (eq (state) dead))    ; are we dead?
  245.            (progn
  246.          (if (not (eq (state) dead))
  247.              (if (not (eq (state) dieing))
  248.              (progn
  249.                (set_state dieing)
  250.                (set_xvel 0)
  251.                (set_yvel 0)
  252.                (set_xacel 0)
  253.                (set_yacel 0))
  254.                (if (not (next_picture))
  255.                (set_state dead) nil))
  256.            (if (not (eq but 0)) ; wait till dead and pressing but, then reset
  257.                (progn
  258.              (restart_player)
  259.              (set_aistate JUST_START))
  260.              (cop_adjust_top (tick))))
  261.          0)
  262.  
  263.          ; normal play code
  264.          (progn
  265.            ; check to see if player is firing
  266.            (if (equal (bit-and but 1) 1)
  267.            (do_special_power xm ym but)
  268.          (undo_special_power xm ym but))
  269.            
  270.            (let ((ret (player_move xm ym but))
  271.              (other (me)))
  272.          (with_obj0 
  273.                   (progn
  274.                 (set_x (with_object other (x)))
  275.                 (set_y (- (- (with_object other (y)) -29) 
  276.                       (with_object other (picture_height))))
  277.                 ))
  278.          (if (and (equal (bit-and but 2) 2)
  279.               (not (eq (state) dead)) (not (eq (state) dieing)))
  280.              (let ((ammo (ammo_total (current_weapon_type))))
  281.                (add_ammo (current_weapon_type) (with_obj0 
  282.                                     (user_fun 'FIRE ammo)))
  283.                nil))
  284.          ret)
  285.            )))))
  286.  
  287. )*/
  288.  
  289. ;;(defun normal_bottom_mover ()  ;; just runs around
  290.  
  291. (defun dead_cop_part_draw ()
  292.   (if (eq (aitype) 0)
  293.       (draw)
  294.     (draw_tint (aref player_tints (aitype)))))
  295.  
  296. (defun bottom_damage (amount from hitx hity push_xvel push_yvel)  ; transfer damage to lower half
  297.   (if (eq is_teleporting 1)
  298.       nil
  299.     (let ((amount (select difficulty;; reduce damage according to difficulty
  300.               ('easy   (/ amount 2))
  301.               ('medium (/ (* amount 3) 4))
  302.               ('hard    amount)
  303.               ('extreme (* amount 2))
  304.               )))
  305.  
  306.  
  307.       (select (aistate)
  308.           (NORMAL_PLAY (if (and (not (eq (state) dieing)) (not (eq (state) dead)))
  309.                    (progn
  310.                  (if (eq (random 2) 0)
  311.                      (set_state flinch_up)
  312.                    (set_state flinch_down))                   
  313.                  (setq r_ramp (+ r_ramp (* amount 7)))
  314.                  (setq g_ramp (- g_ramp (* amount 14)))
  315.                  (setq b_ramp (- b_ramp (* amount 14)))
  316.                  (if (> r_ramp 120) (setq r_ramp 120))
  317.                  (if (< g_ramp 0) (setq g_ramp 0))
  318.                  (if (< b_ramp 0) (setq b_ramp 0))
  319.                  (damage_fun amount from hitx hity (/ push_xvel 2) (/ push_yvel 2))
  320.                  (if (eq (hp) 0)
  321.                      (progn
  322.                        (create_dead_parts cop_dead_parts (* (get_dead_part from) 3) (player_number))
  323.                        (play_sound (aref PLAYER_DEATH (random 4)) 127 (x) (y)))
  324.                    (if (> amount 8)
  325.                        (play_sound (aref PLAYER_PAIN (random 4)) 127 (x) (y)))))))
  326.  
  327.  
  328.           )))
  329.   )
  330.  
  331. (defun should_draw_top? (mode)
  332.   (select mode
  333.       (JUST_START T)
  334.       (NORMAL_PLAY T)))
  335.          
  336. (defun change_mode (new_mode)
  337.   (setq disable_top_draw (if (should_draw_top? new_mode) 0 1))
  338.   (set_aistate new_mode))
  339.  
  340. (defun draw_fast ()
  341.   (put_image (- (view_x2) 20) (+ (view_y1) 5) fast_image)
  342.                (if (eq used_special_power 1)
  343.                (if (> (total_objects) 0)            
  344.                    (let ((nowx (x))
  345.                      (nowy (y))
  346.                      (l2x last2_x)
  347.                      (l2y last2_y)
  348.                      (l1x last1_x)
  349.                      (l1y last1_y)
  350.                      (td (top_draw_state (state)))
  351.                      (h   (picture_height)))
  352.  
  353.                  (set_x l2x)
  354.                  (set_y l2y)
  355.                  (draw_transparent 5 16)
  356.                  (if td (with_obj0 (progn (set_x l2x)
  357.                                     (set_y (- (- l2y -29) h))
  358.                                     (draw_transparent 5 16))))
  359.                  (set_x last1_x)
  360.                  (set_y last1_y)
  361.                  (draw_transparent 10 16)
  362.  
  363.                  (if td (with_obj0 (progn (set_x l1x)
  364.                                     (set_y (- (- l1y -29) h))
  365.                                     (draw_transparent 10 16)
  366.                                     (set_x nowx)
  367.                                     (set_y nowy)
  368.                                     )))
  369.  
  370.                  (set_x nowx)
  371.                  (set_y nowy)))))
  372.  
  373. (defun sneaky_draw (count num)
  374.   (if (eq count 0)
  375.       (player_draw num)
  376.     (if (> count 15)
  377.     (draw_predator)
  378.       (draw_transparent count 16))))
  379.  
  380. (defun player_draw (num)
  381.   (if (eq num 0) 
  382.       (if (eq just_fired 1)           ;; if they just fired a weapon, draw them lite up.. use the bright tint
  383.       (progn
  384.         (draw_tint bright_tint)
  385.         (setq just_fired 0))      ;; ok to change this in the draw function only if it is not accessed anywhere else!
  386.     (draw))
  387.     (if (eq just_fired 1)    
  388.     (progn
  389.       (draw_double_tint (aref player_tints num) bright_tint)
  390.       (setq just_fired 0))      ;; ok to change this in the draw function only if it is not accessed anywhere else!      
  391.       (draw_tint (aref player_tints num)))))
  392.  
  393. /*(defun bottom_draw ()
  394.   (if (not (and (eq r_ramp 0)    ;; need to draw red palette
  395.         (eq g_ramp 0)
  396.         (eq b_ramp 0)))
  397.       (progn
  398.     (if (> r_ramp 7)
  399.         (setq r_ramp (- r_ramp 7))
  400.       (if (< r_ramp -7)
  401.           (setq r_ramp (+ r_ramp 7))
  402.         (setq r_ramp 0)))
  403.  
  404.     (if (> g_ramp 7)
  405.         (setq g_ramp (- g_ramp 7))
  406.       (if (< g_ramp -7)
  407.           (setq g_ramp (+ g_ramp 7))
  408.         (setq g_ramp 0)))
  409.  
  410.     (if (> b_ramp 7)
  411.         (setq b_ramp (- b_ramp 7))
  412.       (if (< b_ramp -7)
  413.           (setq b_ramp (+ b_ramp 7))
  414.         (setq b_ramp 0)))
  415.  
  416.     (if (local_player)    
  417.         (tint_palette r_ramp g_ramp b_ramp))))
  418.  
  419.  
  420.   (select (aistate)
  421.       (JUST_START (player_draw (player_number)))
  422.       (NORMAL_PLAY 
  423.        (select special_power
  424.            (NO_POWER (player_draw (player_number)))
  425.            (HEALTH_POWER (player_draw (player_number)) 
  426.                 (put_image (- (view_x2) 20) (+ (view_y1) 5) health_image))
  427.            (FAST_POWER (draw_fast) (player_draw (player_number)))
  428.            (FLY_POWER   (player_draw (player_number)) 
  429.                 (put_image (- (view_x2) 20) (+ (view_y1) 5) fly_image))
  430.            (SNEAKY_POWER (put_image (- (view_x2) 20) (+ (view_y1) 5) sneaky_image)
  431.                  (sneaky_draw used_special_power (player_number)))
  432.       ))))*/
  433.  
  434. (defun restart_player ()
  435.   (setq special_power 0)
  436.   (if (and (local_player) (not (and (eq r_ramp 0)
  437.                     (eq g_ramp 0)
  438.                     (eq b_ramp 0))))
  439.       (progn
  440.     (setq r_ramp 0)
  441.     (setq g_ramp 0)
  442.     (setq b_ramp 0)
  443.     (tint_palette 0 0 0)))
  444.  
  445.   (if (eq (total_players) 1)     ;; is this a single player game?
  446.       (request_level_load  (if (eq has_saved_this_level 0) 
  447.                    (progn
  448.                  (set_hp 100)
  449.                  (level_name))
  450.                  (concatenate 'string "save" (digstr has_saved_this_level 4) ".spe")))
  451.     (reset_player)
  452.  
  453.     ))
  454.  
  455.  
  456.  
  457. (defun start_cache (type) 
  458.   `((,DARNEL) nil))
  459.  
  460. (def_char START
  461.   (funs (ai_fun   do_nothing)
  462.     (get_cache_list_fun start_cache)
  463.     (draw_fun dev_draw))
  464.   (range 0 0)
  465.   (states "art/misc.spe" (stopped "start_image")))
  466.  
  467.  
  468. (defun cop_cache (type)
  469.   `(() (,bright_tint)))
  470.  
  471. (def_char DARNEL
  472.   (vars in_climbing_area
  473.     disable_top_draw
  474.     just_hit
  475.     ship_pan_x
  476.     special_power
  477.     used_special_power
  478.     last1_x last1_y
  479.     last2_x last2_y
  480.     has_saved_this_level
  481.     r_ramp g_ramp b_ramp
  482.     is_teleporting
  483.     just_fired
  484.     )
  485.   (range 50 50)
  486.   (abilities (walk_top_speed    3)
  487.          (jump_yvel       -15)
  488.          (run_top_speed     9)
  489.          (jump_top_speed   10)
  490.          (jump_xvel         9)
  491.          (stop_accel        9)
  492.          (start_accel       8)
  493.          (start_hp        100)
  494.          (hamper_xrange    80)
  495.          (push_xrange       9))
  496.  
  497.   (flags     (hurtable          T)
  498.          (unlistable        T))
  499.  
  500.   (funs (move_fun    cop_mover)
  501.     (damage_fun  bottom_damage)
  502.     (draw_fun    bottom_draw)
  503.     (get_cache_list_fun cop_cache)
  504.     (user_fun    cop_ufun))
  505.  
  506.   (states "art/cop.spe"
  507.           (stopped            (seq "stopped" 1 6))
  508.       (running            (seq "4wlk" 1 10))
  509.  
  510.       (fast_running       (seq "4fst" 1 10))
  511.       (fly_running        (seq "4fly" 1 10))
  512.  
  513.       (fast_stopped        (seq "bot2" 7 12))
  514.       (fly_stopped       (seq "bot2" 1 6))
  515.  
  516.       (dead               "dead")
  517.  
  518.       (start_run_jump     "jump_up")
  519.       (run_jump           "jump_up")
  520.       (run_jump_fall      "jump_down")
  521.       (end_run_jump       (seq "4jmp" 3 5))
  522.  
  523.       (fly_start_run_jump     "4flj0002.pcx")
  524.       (fly_run_jump           "4flj0002.pcx")
  525.       (fly_run_jump_fall      "4flj0003.pcx")
  526.       (fly_end_run_jump       (seq "4flj" 4 6))
  527.  
  528.       (fast_start_run_jump     "4fjp0002.pcx")
  529.       (fast_run_jump           "4fjp0002.pcx")
  530.       (fast_run_jump_fall      "4fjp0003.pcx")
  531.       (fast_end_run_jump       (seq "4fjp" 4 6))
  532.  
  533.  
  534.       (flinch_up           (rep "4flh0002.pcx" 4))
  535.       (flinch_down         (rep "4flh0003.pcx" 4))
  536.  
  537.       (climbing             (seq "4lad" 1 10))
  538.       (climb_off            (seq "4off" 1 8))
  539.       (climb_on            (seq "4off" 8 1))
  540.       ))
  541.  
  542.   
  543. (defun clone_ai ()
  544.   (if (and (< (state_time) 200) (not (eq (state) dead)))
  545.       (progn
  546.     (select (direction)
  547.         (1 (if (blocked_right (move 1 0 0))
  548.                (set_direction -1)
  549.              nil))
  550.         (-1 (if (blocked_left (move -1 0 0))
  551.             (set_direction 1)
  552.               nil)))        
  553.         (if (or (> (state_time) 185) (eq (state) dieing))
  554.         (set_fade_count (+ (fade_count) 1))
  555.           nil)        
  556.         T)
  557.     nil))
  558.  
  559.  
  560.  
  561.  
  562. (defun top_draw_state (state)
  563.  
  564.   (or (eq state stopped) (eq state running)
  565.             (eq state run_jump) (eq state run_jump_fall) 
  566.             (eq state end_run_jump)))
  567.  
  568. /*(defun top_draw ()
  569.   (if (> (total_objects) 0)
  570.       (let ((other  (get_object 0)))
  571.     (if (or (with_object other (morphing)) 
  572.         (eq (with_object other disable_top_draw) 1)
  573.         (not (top_draw_state (with_object other (state)))))
  574.         nil
  575.       (progn
  576.         (if (eq (with_object other special_power) SNEAKY_POWER)
  577.         (sneaky_draw (with_object other used_special_power)
  578.                  (with_object other (player_number)))
  579.           (let ((nowx (x))
  580.             (nowy (y)))                
  581.         (set_x (with_object other (if (> (direction) 0) (x) (+ (x) 2))))
  582.         (set_y (- (- (with_object other (y)) -29) (with_object other (picture_height))))
  583.         (player_draw  (with_object other (player_number)))
  584.         (set_x nowx)
  585.         (set_y nowy))
  586.           ))))))
  587. */
  588.  
  589. (defun ammo_type ()
  590.   (select (otype)
  591.       (GRENADE_TOP  2)
  592.       (MGUN_TOP     10)
  593.       (FIREBOMB_TOP 5)
  594.       (ROCKET_TOP   3)
  595.       (PGUN_TOP     4)
  596.       (LSABER_TOP   5)
  597.       (DFIRS_TOP    6)
  598.       ))
  599.  
  600. (defun ammo_delay ()
  601.   0)
  602.  
  603.  
  604. (defun player_angle_suggestion ()
  605.   (atan2 (- (y) (player_pointer_y) 16)
  606.      (- (player_pointer_x) (x))))
  607.  
  608.  
  609. (defun player_fire_weapon (type target)
  610.   (let ((angle (with_obj0 (player_angle_suggestion))))
  611.                 
  612.     (let ((firex (+ (x) (* (cos angle) 17) (xvel)))
  613.       (firey (+ (- (y) (* (sin angle) 16) 20) (yvel))))
  614.       (if (can_see (x) (- (y) 16) firex firey nil)    
  615.       (progn
  616.         (fire_object  (get_object 0) type firex firey angle target)
  617.         T)
  618.     nil))))
  619.  
  620. /* (defun top_ai () 
  621.   (if (> (total_objects) 0)
  622.       (let ((myself (get_object 0)))
  623.       
  624.     (set_state rotate)
  625.     (let ((angle (with_object myself 
  626.                         (if (> (direction) 0)
  627.                         (player_angle_suggestion)
  628.                           (if (> (player_angle_suggestion) 180)
  629.                           (- (player_angle_suggestion) 180)
  630.                         (+ 180 (player_angle_suggestion)))))))
  631.       (setq point_angle angle)
  632.       (set_frame_angle 0 359 angle))
  633.     (if (not (eq fire_delay1 0))
  634.         (setq fire_delay1 (- fire_delay1 1)))
  635.     (if (eq (with_object myself (weapon_to_type (current_weapon_type))) (otype))
  636.         (select (aistate)
  637.             (2            ; start fire up
  638.              (progn 
  639.                (set_state rotate_fire)
  640.                (set_frame_angle 0 359 (with_object myself 
  641.                         (if (> (direction) 0)
  642.                         (player_angle_suggestion)
  643.                           (if (> (player_angle_suggestion) 180)
  644.                           (- (player_angle_suggestion) 180)
  645.                           (+ 180 (player_angle_suggestion))))))
  646.                ;; (set_state weapon_fire)
  647. ;;               (set_fire_delay1 3)
  648.  
  649. ;;                (let ((otype (otype)))
  650. ;;                  (with_object myself (add_ammo otype -1)))
  651. ;;                (with_object (add_object (ammo_type) (x) (- (y) 16) 1) 
  652. ;;                     (user_fun myself))
  653.               (set_aistate 3)))
  654.             (1            ; special power
  655.              (progn (set_state weapon_fire_up)
  656.                 (let ((otype (otype)))
  657.                   (with_object myself (add_ammo weapon_type -1)))
  658.                 (with_object (add_object (ammo_type) (x) (- (y) 20) 2)
  659.                      (user_fun myself))
  660.                 (set_aistate 3)))
  661.             (3 (if (eq fire_delay1 0) ;; (user_fun 'RESET_FIRE_OK nil)
  662.                (set_aistate 0)
  663.              (progn
  664.                (user_fun 'CONTINUE_FIRE nil)
  665.                (setq fire_delay1 (- fire_delay1 1)))
  666.              )))
  667.       (set_otype (with_object myself (weapon_to_type (current_weapon_type)))))))
  668.   (move 0 0 0) 
  669.   T)
  670.  
  671. ;(defun top_damage (amount from hitx hity push_xvel push_yvel)  ; transfer damage to lower half
  672. ;  (with_obj0 (damage_fun amount from hitx hity push_xvel push_yvel)))
  673.  
  674.  
  675. (defun laser_ufun (signal value)
  676.   (select signal
  677.       ('FIRE (if (eq (aistate) 0)  ;;  not already firing
  678.              (if (> value 0)   ;; have ammo         
  679.              (progn               
  680.                (setq fire_delay1 3)
  681.                (set_aistate 2)
  682.                (if (player_fire_weapon (ammo_type) nil)
  683.                    -1
  684.                  0))
  685.                (progn               
  686.              (setq fire_delay1 7)
  687.              (set_aistate 2)
  688.              (player_fire_weapon (ammo_type) nil)
  689.  
  690.              0))
  691.            0))      
  692.       ('RESET_FIRE_OK (>= (state_time) fire_delay1))))
  693.  
  694. (defun top_ufun (signal value)
  695.   (select signal
  696.       ('FIRE (if (and (> value 0) (eq (aistate) 0))  ;; have ammo and not already firing
  697.              (progn
  698.                (setq fire_delay1 12)
  699.                (set_aistate 2)
  700.                (if (player_fire_weapon (ammo_type) nil)
  701.                -1
  702.              0))
  703.            0))
  704.       ('RESET_FIRE_OK (>= (state_time) fire_delay1))))
  705.  
  706.  
  707.  
  708. (defun plaser_ufun (signal value)
  709.   (select signal
  710.       ('FIRE (if (and (> value 0) (eq (aistate) 0))  ;; have ammo and not already firing
  711.              (progn
  712.                (setq fire_delay1 2)
  713.                (set_aistate 2)
  714.                (if (player_fire_weapon (ammo_type) nil)
  715.                -1 0))
  716.            0))
  717.  
  718.       ('RESET_FIRE_OK (>= (state_time) fire_delay1))))
  719.  
  720.  
  721.  
  722. (defun player_rocket_ufun (signal value)
  723.   (select signal
  724.       ('FIRE (if (and (> value 0) (eq (aistate) 0))  ;; have ammo and not already firing
  725.              (progn
  726.                (setq fire_delay1 12)
  727.                (set_aistate 2)
  728.                (if (player_fire_weapon (ammo_type) 
  729.                        (with_obj0 (find_object_in_area 
  730.                                     (- (x) 160) (- (y) 160)
  731.                                     (+ (x) 160) (+ (y) 160) 
  732.                                     bad_guy_list)))
  733.                -1 0))
  734.            0))
  735.       ('RESET_FIRE_OK (>= (state_time) fire_delay1)))) */
  736.  
  737.  
  738.  
  739.  
  740. (defun top_cache (type)
  741.   (list
  742.    (select type
  743.        (MGUN_TOP      (list SHOTGUN_BULLET))
  744.        (GRENADE_TOP   (list GRENADE))
  745.        (ROCKET_TOP    (list ROCKET))
  746.        (FIREBOMB_TOP  (list FIREBOMB))
  747.        (PGUN_TOP      (list PLASMAGUN_BULLET))
  748.        (LIGHT_SABER   (list LSABER_BULLET))
  749.        (DFRIS_TOP     (list DFRIS_BULLET))
  750.    nil)))
  751.         
  752.  
  753. (defun make_top_char (symbol base ufun dfun)
  754.   (eval (list 'def_char symbol
  755.           `(funs (ai_fun    top_ai)
  756.              (get_cache_list_fun top_cache)
  757.              (draw_fun  ,dfun)
  758.              (user_fun  ,ufun))
  759.           '(flags (add_front  T)
  760.               (is_weapon  T)
  761.               (unlistable T))
  762.           '(vars point_angle fire_delay1 just_fired)
  763.           `(states "art/coptop.spe"
  764.                (stopped        (seq ,base 1 24))))))
  765.  
  766.           
  767.  
  768. (make_top_char 'MGUN_TOP     "4gma" 'laser_ufun         'top_draw)
  769. (make_top_char 'GRENADE_TOP  "4gre" 'top_ufun           'top_draw)
  770. (make_top_char 'ROCKET_TOP   "4gro" 'player_rocket_ufun 'top_draw)
  771. (make_top_char 'FIREBOMB_TOP "4gfi" 'top_ufun           'top_draw)
  772.  
  773.  
  774.  
  775.  
  776. (defun restart_ai ()
  777.   (select (aistate)
  778.       (0 (next_picture)
  779.          (if (and (touching_bg) (with_object (bg) (pressing_action_key)))
  780.          (set_aistate 2)))
  781.       (1 (next_picture)   ;; wait for save (actived state)
  782.          (if (and (touching_bg) (with_object (bg) (pressing_action_key)))
  783.          (set_aistate 2)))
  784.       (2 (set_state running)       
  785.          (set_aistate 3))
  786.       (3 (set_aistate 4))        
  787.       (4 
  788.        (let ((spot (get_save_slot)))
  789.          (set_state stopped)
  790.          (set_aistate 1)
  791.          (if (not (eq spot 0))          ;; did they escape ?
  792.          (progn
  793.            (show_help (concatenate 'string "Station #" (num2str (xvel)) " secured!"))
  794.            (with_object (bg)
  795.                 (progn
  796.                   (let ((old_hp (hp)))
  797.                     (if (not (eq difficulty 'extreme))
  798.                     (set_hp 100))                    ;; save the player with 100 health, unless on extreme
  799.                     (play_sound SAVE_SND 127 (x) (y))
  800.                     (setq has_saved_this_level spot)
  801.                     (save_game (concatenate 'string "save" (digstr spot 4) ".spe"))
  802.                     (set_hp old_hp)
  803.                     ))))))
  804.  
  805.          ))
  806.   T)
  807.       
  808.  
  809. (def_char RESTART_POSITION
  810.   (funs (ai_fun restart_ai)
  811.     (reload_fun lower_reload))
  812.   (fields ("xvel" "station number"))
  813.   (states "art/misc.spe"
  814.       (stopped (app (rep "console" 3) (rep "console2" 3)))
  815.       (running (rep "console_on" 2))))
  816.  
  817. (defun next_level_ai ()
  818.   (if (and (touching_bg) (with_object (bg) (pressing_action_key)))
  819.       (if (eq (aistate) end_level)
  820.       (request_end_game)
  821.     (request_level_load (concatenate 'string "levels/level" (digstr (aistate) 2) ".spe"))))
  822.   T)
  823.     
  824.  
  825. (def_char NEXT_LEVEL
  826.   (funs (ai_fun next_level_ai)) 
  827.   (flags (can_block T))
  828.   (fields ("aistate" "next_level"))
  829.   (states "art/misc.spe"
  830.       (stopped "end_port2")))
  831.  
  832. (defun next_level_top_ai ()
  833.   (shift_rand_table 80)
  834.   (let ((oldy (y)))
  835.     (try_move 0 100)
  836.     (setq floor_yoff (- (y) oldy))
  837.     (set_y oldy))
  838.   T)
  839.  
  840. (def_char NEXT_LEVEL_TOP
  841.   (funs (ai_fun next_level_top_ai))
  842.   (vars floor_yoff)
  843.   (draw_range 50 100)
  844.   (fields ("aistate" "next_level"))
  845.   (states "art/misc.spe"
  846.       (stopped "end_port1")))
  847.  
  848. (defun tele_beam_ai ()
  849.   (next_picture)
  850.   (if (> (direction) 0)
  851.       (if (eq (fade_count) 12)
  852.       (progn
  853.         (play_sound APPEAR_SND 100 (x) (y))
  854.         (set_direction -1))
  855.     (set_fade_count (+ (fade_count) 1)))
  856.     (if (eq (fade_count) 5)
  857.     (progn
  858.       (play_sound APPEAR_SND 100 (x) (y))
  859.       (set_direction 1))
  860.       (set_fade_count (- (fade_count) 1)))))
  861.     
  862.              
  863. (def_char TELE_BEAM
  864.   (funs (ai_fun tele_beam_ai))
  865.   (states "art/chars/teleport.spe" (stopped (seq "beam" 1 5))))
  866.  
  867. (def_char END_OF_S
  868.   (funs (ai_fun do_nothing))
  869.   (states "art/misc.spe" (stopped "eos")))
  870.  
  871. (setq load_warn nil)
  872. (if (load "register/people.lsp")
  873.     (setq end_level 19)
  874.   (setq end_level 5))
  875. (setq load_warn T)
  876.  
  877.  
  878.  
  879.  
  880.  
  881.