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

  1. ;; Copyright 1995 Crack dot Com,  All Rights reserved
  2. ;; See licencing information for more details on usage rights
  3.  
  4.  
  5. (setq gun_tints (make-array 11 :initial-contents (list 
  6.                           normal_tint
  7.                           (def_tint "art/tints/guns/orange.spe") ; orange
  8.                           (def_tint "art/tints/guns/green.spe")  ; grenade
  9.                           (def_tint "art/tints/guns/redish.spe") ; rocket
  10.                           (def_tint "art/tints/guns/blue.spe")   ; plasma
  11.                           normal_tint
  12.                           normal_tint
  13.                           normal_tint
  14.                           normal_tint
  15.                           normal_tint
  16.                           normal_tint)))
  17.  
  18.  
  19. (setq ai_ammo (make-array 9 :initial-contents (list MBULLET_ICON5 
  20.                         MBULLET_ICON5 
  21.                         GRENADE_ICON2
  22.                         ROCKET_ICON2 
  23.                         PLASMA_ICON20
  24.                         MBULLET_ICON5 
  25.                         MBULLET_ICON5 
  26.                         MBULLET_ICON5 
  27.                         MBULLET_ICON5)))
  28.  
  29. (defun aitype_to_ammo (aitype)
  30.   (aref ai_ammo aitype))
  31.  
  32.  
  33.  
  34. (defun fire_object (creator type x y angle target)
  35.   (select type
  36.  
  37.       (0 (with_object (add_object SHOTGUN_BULLET x y)
  38.                       (progn
  39.                     (play_sound ZAP_SND 127 (x) (y))
  40.                     (setq sgb_lifetime 6)
  41.                     (setq sgb_speed 15)
  42.                     (setq sgb_lastx (x))
  43.                     (setq sgb_lasty (y))
  44.                     (setq sgb_angle angle)
  45.                     (setq sgb_bright_color (find_rgb 255 255 200))
  46.                     (setq sgb_medium_color (find_rgb 150 150 0))
  47.                     (if creator 
  48.                         (progn
  49.                           (setq sgb_speed (+ sgb_speed (/ (xvel) 2)))
  50.                           (link_object creator)))
  51.                     (sgun_ai)
  52.                     )))
  53.       (1 (with_object (add_object SHOTGUN_BULLET x y)
  54.                       (progn
  55.                     (play_sound ZAP_SND 127 (x) (y))
  56.                     (setq sgb_lifetime 40)
  57.                     (setq sgb_speed 6)
  58.                     (setq sgb_lastx (x))
  59.                     (setq sgb_lasty (y))
  60.                     (setq sgb_angle angle)
  61.                     
  62.                     (setq sgb_bright_color (find_rgb 255 128 64))
  63.                     (setq sgb_medium_color (find_rgb 255 0 0))
  64.                     (if creator 
  65.                         (progn
  66.                           (setq sgb_speed (+ sgb_speed (/ (xvel) 2)))
  67.                           (link_object creator)))
  68.                     (sgun_ai)
  69.                     )))
  70.       (2 (with_object (add_object GRENADE x y)
  71.               (progn
  72.                 (play_sound GRENADE_THROW 127 x y)
  73.                 (set_course angle 20)
  74.                 (if creator    
  75.                 (progn
  76.                   (link_object creator)
  77.                   (set_xvel (+ (xvel) (with_object creator (xvel))))
  78.                   (set_yvel (+ (yvel) (with_object creator (yvel))))
  79.                   ))
  80.                 
  81.                 (set_frame_angle 0 359 angle)
  82.                 )))
  83.       (3 (with_object (add_object ROCKET x y)
  84.               (progn
  85.                 (play_sound ROCKET_LAUNCH_SND 127 x y)
  86.                 (set_aistate angle)
  87.                 (if creator    (link_object creator))
  88.  
  89.                 (if (and target   ;; don't link if not in line of site
  90.                      (can_see (x) (y) 
  91.                           (with_object target (x))
  92.                           (with_object target (y)) nil))
  93.                           (link_object target))
  94.  
  95.                 (set_frame_angle 0 359 angle)
  96.                 (setq speed 5)
  97.                 (if (and creator (with_object creator (isa_player)))
  98.                 (setq max_speed 14)
  99.                   (setq max_speed 10))
  100.                 (set_y (+ (y) (/ (picture_height) 2)))  ;; move down to match frame/pos
  101.                 )))
  102.  
  103.       (4 (with_object (add_object PLASMAGUN_BULLET x y)
  104.                       (progn
  105.                     (play_sound PLASMA_SND 127 (x) (y))
  106.                     (setq sgb_lastx (x))
  107.                     (setq sgb_lasty (y))
  108.                     (if creator 
  109.                           (link_object creator))
  110.                     (set_course angle 200)
  111.                     (let ((old_x (x))
  112.                           (old_y (y))
  113.                           (bx (bmove (if (> (total_objects) 0) (get_object 0) nil))))
  114.                       (if (not (eq bx T))
  115.                           (if (eq bx nil)
  116.                           (add_object EXPLODE5 (- (x) (random 5)) 
  117.                                   (- (y) (random 5)) 0)
  118.                         (progn
  119.                           (add_object EXPLODE3 (- (x) (random 5)) 
  120.                                   (- (y) (random 5)) 0)
  121.                           (do_damage 10 bx (* (cos sgb_angle) 20) 
  122.                                  (* (sin sgb_angle) 10)))))
  123.                       (setq sgb_lastx (x))
  124.                       (setq sgb_lasty (y))
  125.                       (set_x old_x)
  126.                       (set_y old_y))
  127.                     )))
  128.  
  129.  
  130.       (5 (with_object (add_object FIREBOMB x y)
  131.               (progn
  132.                 (play_sound FIREBOMB_SND 127 (x) (y))
  133.                 (set_course angle 20)
  134.                 (if creator    
  135.                 (progn
  136.                   (link_object creator)
  137.                   (set_yvel (+ (yvel) (with_object creator (yvel))))
  138.                   )))))
  139.  
  140.       (6 (with_object (add_object DFRIS_BULLET x y)
  141.                       (progn
  142.                     (play_sound ROCKET_LAUNCH_SND 127 x y)
  143.                     (set_course angle 25)
  144.                     (set_aistate angle)
  145.                     (if creator 
  146.                           (link_object creator))
  147.                     (dfris_ai)
  148.                     )))
  149.  
  150.       (7 (with_object (add_object LSABER_BULLET x y)
  151.                       (progn
  152.                     (play_sound LSABER_SND 127 (x) (y))
  153.                     (setq sgb_lastx (x))
  154.                     (setq sgb_lasty (y))
  155.                     (if creator 
  156.                           (link_object creator))
  157.                     (set_course angle 30)
  158.                     (let ((bx (bmove (if (> (total_objects) 0) (get_object 0) nil))))
  159.                       (if (not (eq bx T))
  160.                           (if (not (eq bx nil))
  161.                           (do_damage 30 bx (* (cos sgb_angle) 20) 
  162.                                  (* (sin sgb_angle) 10)))))
  163.                     )))
  164.                
  165.  
  166.       (9 (with_object (add_object STRAIT_ROCKET x y)
  167.                       (progn
  168.                     (play_sound MGUN_SND 127 (x) (y))
  169.                     (if creator 
  170.                           (link_object creator))
  171.                     (set_aistate angle)
  172.                     (set_frame_angle 0 359 angle)
  173.                     (play_sound GRENADE_THROW 127 (x) (y)))))
  174.  
  175.       (10 (with_object (add_object SHOTGUN_BULLET x y)
  176.                       (progn
  177.                     (play_sound ZAP_SND 127 (x) (y))
  178.                     (setq sgb_lifetime 6)
  179.                     (setq sgb_speed 15)
  180.                     (setq sgb_lastx (x))
  181.                     (setq sgb_lasty (y))
  182.                     (setq sgb_angle angle)
  183.                     (setq sgb_bright_color (find_rgb 255 0 0))
  184.                     (setq sgb_medium_color (find_rgb 150 0 0))
  185.                     (if creator 
  186.                         (progn
  187.                           (setq sgb_speed (+ sgb_speed (/ (xvel) 2)))
  188.                           (link_object creator)))
  189.                     (sgun_ai)
  190.                     )))
  191.  
  192.       ))
  193.  
  194.  
  195. (defun spray_fire ()
  196.   (fire_object (me) (aitype)
  197.            (+ (x) (* (cos spray.angle) 20))
  198.            (- (- (y) 21) (* (sin spray.angle) 22))
  199.            spray.angle
  200.            (bg)))
  201.  
  202.  
  203. (defun spray_gun_ai ()
  204.   (if (<= (hp) 0)
  205.       nil
  206.     (if (and (< (distx) 450) (< (disty) 400))
  207.     (progn
  208.       (select (aistate)
  209.           (0;; look at sensor
  210.            (if (activated)
  211.                (if (eq (state) stopped)
  212.                (progn
  213.                  (set_targetable T)
  214.                  (set_state spray.appear)
  215.                  (go_state 1))
  216.              (go_state 3))
  217.              (progn
  218.                (set_targetable nil)
  219.                (set_state stopped))))
  220.  
  221.  
  222.           (1;; unfold
  223.            (if (next_picture) T 
  224.              (progn (set_aistate 3)
  225.                 (set_state spray.aim)
  226.                 (setq spray.angle spray.start_angle)
  227.                 (set_frame_angle 0 359 spray.angle)
  228.                 )))
  229.  
  230.           (2;; fold up
  231.            (if (next_picture) T 
  232.              (progn (set_state stopped)
  233.                 (set_aistate 0))))
  234.  
  235.          
  236.           (3;; swivel down
  237.            (if (> (state_time) spray.fire_delay)
  238.                (progn
  239.              (set_aistate 3);; reset state time
  240.              (setq spray.angle (- spray.angle spray.angle_speed))
  241.              (if (<= spray.angle spray.start_angle)
  242.                  (progn
  243.                    (setq spray.angle spray.start_angle)
  244.                    (set_aistate 4)))
  245.              (set_frame_angle 0 359 spray.angle)
  246.              (spray_fire))))
  247.  
  248.           (4;; swivel up
  249.            (if (> (state_time) spray.fire_delay)
  250.                (progn
  251.              (set_aistate 4);; reset state time
  252.              (setq spray.angle (+ spray.angle spray.angle_speed))
  253.              (if (>= spray.angle spray.end_angle)
  254.                  (progn
  255.                    (setq spray.angle spray.end_angle)
  256.                    (set_aistate 0)))
  257.              (set_frame_angle 0 359 spray.angle)
  258.  
  259.              (spray_fire)))))
  260.       T)
  261.       (progn
  262.     (set_state stopped)
  263.     T))))
  264.         
  265.  
  266.           
  267.           
  268.     (defun spray_gun_cons () 
  269.       (setq spray.bullet_speed 20)
  270.       (setq spray.angle_speed  10)
  271.       (setq spray.start_angle  270)
  272.       (setq spray.end_angle    350)
  273.       (setq spray.fire_delay 4))
  274.  
  275. (def_char SPRAY_GUN
  276.   (funs (ai_fun       spray_gun_ai)
  277.     (damage_fun   guner_damage)
  278.     (draw_fun     gun_draw)
  279.     (constructor spray_gun_cons))
  280.  
  281.   (flags (can_block  T)
  282.      (hurtable   T))
  283.   (abilities (start_hp 20)
  284.          )
  285.   (vars spray.fire_delay
  286.     spray.bullet_speed
  287.     spray.start_angle
  288.     spray.end_angle
  289.     spray.angle_speed
  290.     spray.angle)     
  291.  
  292.   (fields ("hp"                "health")
  293.       ("spray.fire_delay"  "delay")
  294.       ("spray.start_angle" "start angle")
  295.       ("spray.end_angle"   "end angle")
  296.       ("spray.angle_speed" "angle speed")
  297.       ("spray.angle"       "current angle"))
  298.  
  299.   (states "art/gun2.spe"
  300.       (stopped           "stopped")
  301.       (spray.aim         (seq "cspn" 1 24))
  302.       (spray.appear      '("csht0001.pcx" "csht0002.pcx"))
  303.       (spray.disappear   '("csht0002.pcx" "csht0001.pcx"))
  304.       ))
  305.  
  306. (defun gun_draw ()
  307.   (draw_tint (aref gun_tints (aitype))))
  308.  
  309.  
  310. (def_char TRACK_GUN
  311.   (vars 
  312.     fire_delay            ; how long between each shot
  313.     fire_delay_left
  314.         track_speed           ; how fast the gun can chage it's angle
  315.  
  316.     burst_total           ; how many shots to fire with fire_delay in between each
  317.     burst_total_left
  318.     continue_time         ; how much time to wait before continue tracking
  319.     continue_time_left
  320.     track_start_angle     ; min angle gun will track
  321.     track_end_angle       ; max
  322.     angle)
  323.  
  324.  
  325.   (funs (ai_fun      track_ai)
  326.     (constructor track_cons)
  327.     (draw_fun    gun_draw)
  328.     (damage_fun   guner_damage))    
  329.  
  330.   (flags (can_block  T)
  331.      (hurtable   T))
  332.  
  333.   (abilities (start_hp 20))
  334.  
  335.   (fields ("hp"                "health")
  336.       ("track_speed"       "tracking speed")
  337.       ("fire_delay"        "fire speed")
  338.       ("burst_total"       "burst total")
  339.       ("continue_time"     "continue delay")
  340.       ("track_start_angle" "start angle")
  341.       ("track_end_angle"   "end   angle")
  342.       ("angle"             "current angle"))
  343.  
  344.   (states "art/gun2.spe"
  345.       (stopped  "stopped")
  346.       (opening  '("csht0001.pcx" "csht0002.pcx"))
  347.       (shuting  '("csht0002.pcx" "csht0001.pcx"))
  348.       (spinning (seq "cspn" 1 24))
  349.       (firing   (seq "cfr1" 1 24))))
  350.  
  351. (defun track_cons ()
  352.   (setq angle 270)
  353.   (setq track_speed 1)
  354.   (setq fire_delay  5)
  355.   (setq burst_total 3)
  356.   (setq continue_time 8)
  357.   (setq track_start_angle 180)
  358.   (setq track_end_angle   359))
  359.  
  360. (defun track_fire ()
  361.   (fire_object (me) (aitype)
  362.            (+ (x) (* (cos angle) 18))
  363.            (- (- (y) 15) (* (sin angle) 15))
  364.            (mod (+ angle (- 2 (random 5))) 360)
  365.            (bg))
  366.   (if (or (eq burst_total_left 0) (eq burst_total_left 1))
  367.       (setq continue_time_left continue_time)
  368.     (progn
  369.       (setq burst_total_left (- burst_total_left 1))
  370.       (setq fire_delay_left fire_delay)))
  371.  
  372.  
  373.   (set_state firing)
  374.   (set_frame_angle 0 359 angle))
  375.  
  376. (defun track_set_angle (new_angle)
  377.   (if (> track_start_angle track_end_angle)
  378.       (if (and (>= new_angle track_end_angle) (<= new_angle track_start_angle))
  379.       (setq angle new_angle))
  380.     (if (and (<= new_angle track_end_angle) (>= new_angle track_start_angle))
  381.     (setq angle new_angle))))
  382.  
  383. (defun track_ai ()   
  384.   (if (eq (hp) 0)                                                  ;; are we dead?
  385.       nil
  386.     (if (activated)                                   ;; see if we should be on
  387.     (if (eq (state) stopped)
  388.         (progn
  389.           (set_targetable T)
  390.           (set_state opening)
  391.           T)
  392.       (if (and (eq (state) opening) (next_picture))
  393.           T
  394.         (progn
  395.           (set_state spinning)
  396.           (set_frame_angle 0 359 angle)
  397.  
  398.           (if (eq continue_time_left 0);; do we need to wait?
  399.           (if (eq fire_delay_left 0)
  400.               ;; get the angle to the player
  401.               (let ((pangle (atan2 (- (- (y) (with_object (bg) (y))) -8)
  402.                        (- (with_object (bg) (x)) (x) ))))
  403.             (let ((clock_dist (if (< pangle angle);; calculate clockwise angle distance
  404.                           (- angle pangle)
  405.                         (+ angle (- 360 pangle)))))
  406.               (let ((closest_dist (if (> clock_dist 180) 
  407.                           (- 360 clock_dist)
  408.                         clock_dist)))
  409.                 (let ((angle_add (if (>= closest_dist track_speed)
  410.                          track_speed
  411.                            closest_dist)))
  412.                   (if (> clock_dist 180);; should we steer clowck wise or counter?
  413.                   (track_set_angle (mod (+ angle angle_add) 360))
  414.                 (track_set_angle (mod (+ (- angle angle_add) 360) 360)))
  415.                   (if (< angle_add 5);; pretty close to target, FIRE!                
  416.                   (track_fire))))))
  417.             (setq fire_delay_left (- fire_delay_left 1)))
  418.         (progn
  419.           (setq continue_time_left (- continue_time_left 1))
  420.           (if (eq continue_time_left 0)
  421.               (setq burst_total_left burst_total))))
  422.           T)))
  423.       (progn
  424.     (set_targetable nil)
  425.     (set_state stopped)
  426.     T))))  
  427.       
  428.     
  429.  
  430.  
  431.  
  432.