;; Copyright 1995 Crack dot Com, All Rights reserved ;; See licencing information for more details on usage rights (defun make_smart_plat (symbol off_frame on_frame snap_yoffset) (eval (list 'def_char symbol '(flags (can_block T)) `(abilities (start_accel ,snap_yoffset)) '(fields ("xacel" "speed") ("yacel" "2nd speed (0=same as 1st)") ("xvel" "current pos (0..speed)") ("yvel" "max wait time")) '(funs (ai_fun platform_ai) (constructor platform_cons)) '(range 50 500) '(draw_range 30 60) `(states "art/chars/platform.spe" (stopped ,off_frame) (running (list ,off_frame ,on_frame) ))))) (make_smart_plat 'SMART_PLAT_BIG "big_off" "big_on" 26) (make_smart_plat 'SMART_PLAT_SMALL "small_off" "small_on" 22) (make_smart_plat 'SMART_PLAT_RED "rplat_off" "rplat_on" 72) (defun platform_cons () (set_xacel 20) (set_yvel 50)) (defun plat_speed () (if (eq (aistate) 0) (xacel) (if (eq (yacel) 0) (xacel) (yacel)))) (defun platform_move (source dest) (let ((destx (with_object dest (x))) (desty (with_object dest (y))) (sourcex (with_object source (x))) (sourcey (with_object source (y)))) (if (equal (xvel) 0) ;; no more steps (progn (platform_push (- destx (x)) (- desty (y))) (set_x destx) (set_y desty) (set_aistate 0)) ;; stop (let ((speed (plat_speed))) (let ((newx (- destx (/ (* (- destx sourcex) (xvel)) speed))) (newy (- desty (/ (* (- desty sourcey) (xvel)) speed)))) (progn (platform_push (- newx (x)) (- newy (y))) (set_xvel (- (xvel) 1)) (set_x newx) (set_y newy))))))) (defun platform_ai () (if (or (eq (total_objects) 2) ;; no switch to listen to processed as normal (and (eq (total_objects) 3) (not (eq (with_object (get_object 2) (aistate)) 0)))) ;; see if switch is active (progn (if (eq (state) stopped) (set_state running) (next_picture)) (select (aistate) (0 ;; look for a player (if (or (not (eq (with_object (get_object (aitype)) (aistate)) 0)) (and (touching_bg) (with_object (bg) (pressing_action_key)))) (progn (if (and (touching_bg) (with_object (bg) (pressing_action_key))) (let ((mex (x)) (mey (- (y) (get_ability start_accel)))) (with_object (bg) (progn (set_y mey))))) (go_state 2)))) (2 ;; swap dest and source and go to new dest (play_sound PLAT_A_SND 127 (x) (y)) (set_aitype (- 1 (aitype))) (set_xvel (plat_speed));; steps to go (go_state 3)) (3 ;; go to dest (if (eq (xvel) 6) (play_sound PLAT_D_SND 127 (x) (y))) (platform_move (get_object (aitype)) (get_object (- 1 (aitype))))) )) (set_state stopped)) T)