home *** CD-ROM | disk | FTP | other *** search
/ PC Gamer 13 / 1995-12_Disc_13.iso / abuse / lisp / people.lsp < prev    next >
Lisp/Scheme  |  1995-08-31  |  22KB  |  834 lines

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