[44] | 1 | ;; Copyright 1995 Crack dot Com, All Rights reserved |
---|
| 2 | ;; See licensing information for more details on usage rights |
---|
| 3 | |
---|
| 4 | (defun general_door_ai (push?) |
---|
| 5 | (select (aistate) |
---|
| 6 | (0 (if (> (total_objects) 0) ; are we linked to a key? |
---|
| 7 | (progn |
---|
| 8 | (set_state blocking) ; don't let play pass |
---|
| 9 | (if push? |
---|
| 10 | (push_char (+ (picture_width) 8) (picture_height))) |
---|
| 11 | ) |
---|
| 12 | (if (touching_bg) ; found key, wait till touching to open |
---|
| 13 | (progn (set_state running) ; start opening animation |
---|
| 14 | (play_sound SWISH 70 (x) (y)) |
---|
| 15 | (go_state 1)) |
---|
| 16 | nil))) |
---|
| 17 | (1 (if (not (next_picture)) ; wait till open animation finishes |
---|
| 18 | (progn |
---|
| 19 | (set_state stopped) ; set opened animation |
---|
| 20 | (go_state 2)))) |
---|
| 21 | |
---|
| 22 | (2 (if (> (total_objects) 0) ; wait till level editor links us to a key |
---|
| 23 | (progn |
---|
| 24 | (set_state blocking) |
---|
| 25 | (go_state 0)) |
---|
| 26 | (next_picture)))) |
---|
| 27 | T) |
---|
| 28 | |
---|
| 29 | (defun sdoor_ai () |
---|
| 30 | (general_sdoor_ai T)) |
---|
| 31 | |
---|
| 32 | (defun general_sdoor_ai (push?) |
---|
| 33 | (select (aistate) |
---|
| 34 | (0 ; closed, wait for signal |
---|
| 35 | (if (> (total_objects) 0) |
---|
| 36 | (if (not (eq (with_object (get_object 0) (aistate)) 0)) |
---|
| 37 | (progn (set_state running) |
---|
| 38 | (play_sound SWISH 70 (x) (y)) |
---|
| 39 | (go_state 1)) |
---|
| 40 | (progn |
---|
| 41 | (set_state stopped) |
---|
| 42 | (if push? |
---|
| 43 | (push_char (+ (picture_width) 8) (picture_height))))))) |
---|
| 44 | |
---|
| 45 | (1 ; opening |
---|
| 46 | (if (next_picture) nil |
---|
| 47 | (progn |
---|
| 48 | (set_state blocking) |
---|
| 49 | (set_aistate 2)))) |
---|
| 50 | (2 (if (> (total_objects) 0) |
---|
| 51 | (if (eq (with_object (get_object 0) (aistate)) 0) |
---|
| 52 | (progn (set_state walking) |
---|
| 53 | (play_sound SWISH 70 (x) (y)) |
---|
| 54 | (go_state 3))))) |
---|
| 55 | (3 ; closing |
---|
| 56 | (if (next_picture) nil |
---|
| 57 | (progn |
---|
| 58 | (set_state stopped) |
---|
| 59 | (set_aistate 0)))) |
---|
| 60 | ) |
---|
| 61 | |
---|
| 62 | |
---|
| 63 | T) |
---|
| 64 | |
---|
| 65 | |
---|
| 66 | (def_char SWITCH_DOOR |
---|
| 67 | (funs (ai_fun sdoor_ai) |
---|
| 68 | (reload_fun lower_reload)) |
---|
| 69 | (flags (can_block T)) |
---|
| 70 | (range 250 60) |
---|
| 71 | (draw_range 30 50) |
---|
| 72 | (abilities (push_xrange 1)) |
---|
| 73 | (states "art/chars/door.spe" |
---|
| 74 | (stopped "door0006.pcx") |
---|
| 75 | (running (seq "door" 6 1)) |
---|
| 76 | (walking (seq "door" 1 6)) |
---|
| 77 | (blocking "door0001.pcx"))) |
---|
| 78 | |
---|
| 79 | (defun ff_push (who xamount) |
---|
| 80 | (if who |
---|
| 81 | (progn |
---|
| 82 | (let ((bgx (with_object who (x)) (x)) |
---|
| 83 | (bgy (with_object who (y)) (y))) |
---|
| 84 | (if (and (>= bgy (y)) (<= bgy (+ end_y 20)) |
---|
| 85 | (< (abs (- bgx (x))) xamount)) |
---|
| 86 | (let ((amount (if (> bgx (x)) |
---|
| 87 | (- xamount (- bgx (x))) |
---|
| 88 | (- (- (x) bgx) xamount)))) |
---|
| 89 | (with_object who (try_move amount 0))))) |
---|
| 90 | (ff_push (next_focus who) xamount)))) |
---|
| 91 | |
---|
| 92 | |
---|
| 93 | (defun ff_ai () |
---|
| 94 | |
---|
| 95 | (shift_rand_table (random 80)) |
---|
| 96 | (if (activated) |
---|
| 97 | (let ((nowx (x)) |
---|
| 98 | (nowy (y))) |
---|
| 99 | |
---|
| 100 | (if (eq (mod (game_tick) 4) 0) |
---|
| 101 | (play_sound FF_SND 127 (x) (y))) |
---|
| 102 | (try_move 0 (+ (y) 200)) ;; find the floor |
---|
| 103 | (setq end_y (y)) ;; save the position |
---|
| 104 | (set_x nowx) |
---|
| 105 | (set_y nowy) |
---|
| 106 | (ff_push (first_focus) 35))) |
---|
| 107 | T) |
---|
| 108 | |
---|
| 109 | |
---|
| 110 | (defun ff_draw () |
---|
| 111 | (if (edit_mode) (draw)) |
---|
| 112 | (if (activated) |
---|
| 113 | (progn |
---|
| 114 | (ascatter_line (x) (y) (x) end_y (find_rgb 151 139 151) (find_rgb 75 69 75) 3) |
---|
| 115 | (ascatter_line (x) (y) (x) end_y (find_rgb 139 147 191) (find_rgb 69 73 95) 2) |
---|
| 116 | (ascatter_line (x) (y) (x) end_y (find_rgb 39 55 71) (find_rgb 19 27 35) 2) |
---|
| 117 | (ascatter_line (x) (y) (x) end_y (find_rgb 39 55 71) (find_rgb 20 26 35) 2)))) |
---|
| 118 | |
---|
| 119 | |
---|
| 120 | |
---|
| 121 | (def_char FORCE_FIELD |
---|
| 122 | (funs (ai_fun ff_ai) |
---|
| 123 | (draw_fun ff_draw)) |
---|
| 124 | (range 10 500) |
---|
| 125 | (vars end_y) |
---|
| 126 | (states "art/misc.spe" |
---|
| 127 | (stopped "force_field"))) |
---|
| 128 | |
---|
| 129 | |
---|
| 130 | (defun hwall_ai () |
---|
| 131 | (if (or (eq (hp) 0) |
---|
| 132 | (and (eq (total_objects) 1) |
---|
| 133 | (with_object (get_object 0) (not (eq (aistate) 0))))) |
---|
| 134 | (progn |
---|
| 135 | (add_object EXPLODE1 (+ (x) 15) (- (y) 7) 0) |
---|
| 136 | (play_sound HWALL_SND 127 (x) (y)) |
---|
| 137 | (hurt_radius (+ (x) (* 15 (direction))) (- (y) 7) 50 60 (bg) 20) |
---|
| 138 | nil) |
---|
| 139 | T)) |
---|
| 140 | |
---|
| 141 | (defun big_wall_ai () |
---|
| 142 | (if (or (eq (hp) 0) |
---|
| 143 | (and (eq (total_objects) 1) |
---|
| 144 | (with_object (get_object 0) (not (eq (aistate) 0))))) |
---|
| 145 | (progn |
---|
| 146 | (add_object EXPLODE1 (- (x) 15) (- (y) 7) 0) |
---|
| 147 | (add_object EXPLODE1 (+ (x) 15) (- (y) 22) 0) |
---|
| 148 | (add_object EXPLODE1 (+ (x) (random 5)) (+ (+ (random 5) (y)) -20) 0) |
---|
| 149 | (play_sound HWALL_SND 127 (x) (y)) |
---|
| 150 | (hurt_radius (x) (- (y) 15) 110 120 (bg) 20) |
---|
| 151 | nil) |
---|
| 152 | T)) |
---|
| 153 | |
---|
| 154 | |
---|
| 155 | (defun hwall_damage (amount from hitx hity push_xvel push_yvel) |
---|
| 156 | (if (activated) |
---|
| 157 | (progn |
---|
| 158 | (damage_fun amount from hitx hity push_xvel push_yvel) |
---|
| 159 | (let ((max_hp (get_ability start_hp))) |
---|
| 160 | (if (and (not (eq (hp) 0)) (not (> (hp) max_hp))) |
---|
| 161 | (set_current_frame (/ (* (total_frames) (- max_hp (hp))) max_hp))))))) |
---|
| 162 | |
---|
| 163 | (defun hwall_reload () ;; we changed this , make sure this is reflected in all of the levels |
---|
| 164 | (if (eq (hp) 60) |
---|
| 165 | (set_hp 25))) |
---|
| 166 | |
---|
| 167 | |
---|
| 168 | (defun make_hidden_wall_char (name start end ai) |
---|
| 169 | (eval `(def_char ,name |
---|
| 170 | (funs (ai_fun ,ai) |
---|
| 171 | (reload_fun hwall_reload) |
---|
| 172 | (damage_fun hwall_damage)) |
---|
| 173 | (abilities (start_hp 25)) |
---|
| 174 | (draw_range 80 80) |
---|
| 175 | (flags (can_block T) |
---|
| 176 | (unactive_shield T) |
---|
| 177 | (hurtable T)) |
---|
| 178 | (states "art/chars/sect.spe" |
---|
| 179 | (stopped (seq "sect" ,start ,end)))))) ; damn lisp is cool |
---|
| 180 | |
---|
| 181 | |
---|
| 182 | |
---|
| 183 | |
---|
| 184 | (make_hidden_wall_char 'HIDDEN_WALL1 1 3 'hwall_ai) |
---|
| 185 | (make_hidden_wall_char 'HIDDEN_WALL2 4 6 'hwall_ai) |
---|
| 186 | (make_hidden_wall_char 'HIDDEN_WALL3 7 9 'hwall_ai) |
---|
| 187 | (make_hidden_wall_char 'HIDDEN_WALL4 10 12 'hwall_ai) |
---|
| 188 | (make_hidden_wall_char 'HIDDEN_WALL5 13 15 'hwall_ai) |
---|
| 189 | |
---|
| 190 | (make_hidden_wall_char 'HIDDEN_WALL_2x2 16 18 'big_wall_ai) |
---|
| 191 | (make_hidden_wall_char 'HIDDEN_WALL_3WAL 19 21 'big_wall_ai) |
---|
| 192 | (make_hidden_wall_char 'HIDDEN_WALL_3FLR 22 24 'big_wall_ai) |
---|
| 193 | (make_hidden_wall_char 'HIDDEN_WALL_3TOP 25 27 'big_wall_ai) |
---|
| 194 | |
---|
| 195 | (make_hidden_wall_char 'HIDDEN_WALL_AFLR 28 30 'big_wall_ai) |
---|
| 196 | |
---|
| 197 | (make_hidden_wall_char 'HIDDEN_RAMP1 31 33 'hwall_ai) |
---|
| 198 | (make_hidden_wall_char 'HIDDEN_RAMP2 34 36 'hwall_ai) |
---|
| 199 | |
---|
| 200 | |
---|
| 201 | |
---|
| 202 | |
---|
| 203 | |
---|