mirror of
https://github.com/open-goal/jak-project
synced 2026-07-09 23:01:56 -04:00
637990314b
Closes #736 --------- Co-authored-by: Hat Kid <6624576+Hat-Kid@users.noreply.github.com>
1617 lines
57 KiB
Common Lisp
Vendored
Generated
1617 lines
57 KiB
Common Lisp
Vendored
Generated
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate idle (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
(stop-look-at! self)
|
|
(logclear! (-> self enemy-flags) (enemy-flag notice alert cam-attack-mode))
|
|
(logior! (-> self enemy-flags) (enemy-flag use-notice-distance))
|
|
(set! (-> self state-timeout) (seconds 0.5))
|
|
(if (-> self on-notice)
|
|
(logior! (-> self enemy-flags) (enemy-flag enable-on-notice))
|
|
)
|
|
(if (-> self on-active)
|
|
(logior! (-> self enemy-flags) (enemy-flag enable-on-active))
|
|
)
|
|
(if (-> self on-hostile)
|
|
(logior! (-> self enemy-flags) (enemy-flag enable-on-hostile))
|
|
)
|
|
(when (not (logtest? (enemy-flag chase-startup) (-> self enemy-flags)))
|
|
(if (logtest? (-> self enemy-flags) (enemy-flag actor-pause-backup))
|
|
(logior! (-> self mask) (process-mask actor-pause))
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
)
|
|
)
|
|
)
|
|
:trans (behavior ()
|
|
(when (time-elapsed? (-> self state-time) (-> self state-timeout))
|
|
(let ((v1-3 (-> self focus aware)))
|
|
(cond
|
|
((< 1 (the-as int v1-3))
|
|
(go-virtual notice)
|
|
)
|
|
((> (the-as int v1-3) 0)
|
|
(go-virtual active)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(ja-channel-push! 1 (seconds 0.1))
|
|
(sleep-code)
|
|
)
|
|
:post (behavior ()
|
|
(play-idle-frames! (-> self idle-anim-player) self)
|
|
(if (and (nonzero? (-> self draw)) (logtest? (-> self draw status) (draw-control-status on-screen)))
|
|
(set-time! (-> self last-draw-time))
|
|
)
|
|
(update-focus self)
|
|
(ja-post)
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate dormant (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
((-> (method-of-type enemy idle) enter))
|
|
(set! (-> self root nav-flags) (nav-flags))
|
|
(let ((v1-4 (-> self root root-prim)))
|
|
(set! (-> v1-4 prim-core collide-as) (collide-spec))
|
|
(set! (-> v1-4 prim-core collide-with) (collide-spec))
|
|
)
|
|
0
|
|
(logior! (-> self draw status) (draw-control-status no-draw))
|
|
(vector-copy! (-> self draw origin) (-> self root trans))
|
|
(if (logtest? (enemy-flag directed) (-> self enemy-flags))
|
|
(logior! (-> self enemy-flags) (enemy-flag directed-ready))
|
|
)
|
|
(logior! (-> self focus-status) (focus-status disable))
|
|
)
|
|
:exit (behavior ()
|
|
(logclear! (-> self focus-status) (focus-status disable))
|
|
(let ((v1-3 (-> self root root-prim)))
|
|
(set! (-> v1-3 prim-core collide-as) (-> self root backup-collide-as))
|
|
(set! (-> v1-3 prim-core collide-with) (-> self root backup-collide-with))
|
|
)
|
|
(logclear! (-> self draw status) (draw-control-status no-draw))
|
|
(logclear! (-> self enemy-flags) (enemy-flag directed-ready))
|
|
(logior! (-> self root nav-flags) (nav-flags has-root-sphere))
|
|
)
|
|
:code sleep-code
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate dormant-aware (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (-> (method-of-type enemy dormant) enter)
|
|
:exit (-> (method-of-type enemy dormant) exit)
|
|
:trans (behavior ()
|
|
(when (and (time-elapsed? (-> self state-time) (-> self state-timeout)) (> (the-as int (-> self focus aware)) 0))
|
|
(if (logtest? (enemy-option ambush) (-> self fact enemy-options))
|
|
(go-ambush self)
|
|
(go-virtual active)
|
|
)
|
|
)
|
|
)
|
|
:code sleep-code
|
|
:post (behavior ()
|
|
(if (and (nonzero? (-> self draw)) (logtest? (-> self draw status) (draw-control-status on-screen)))
|
|
(set-time! (-> self last-draw-time))
|
|
)
|
|
(update-focus self)
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate ambush-delay (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
(set! (-> self desired-angle) (fmax 0.0 (res-lump-float (-> self entity) 'ambush-delay)))
|
|
(logior! (-> self focus-status) (focus-status disable))
|
|
(let ((v1-6 (-> self root root-prim)))
|
|
(set! (-> v1-6 prim-core collide-as) (collide-spec))
|
|
(set! (-> v1-6 prim-core collide-with) (collide-spec))
|
|
)
|
|
0
|
|
(logior! (-> self draw status) (draw-control-status no-draw))
|
|
(logior! (-> self enemy-flags) (enemy-flag directed-ready))
|
|
(logclear! (-> self root nav-flags) (nav-flags has-root-sphere))
|
|
)
|
|
:exit (behavior ()
|
|
((-> (method-of-type enemy dormant) exit))
|
|
(logior! (-> self enemy-flags) (enemy-flag alert))
|
|
)
|
|
:trans (behavior ()
|
|
(if (time-elapsed? (-> self state-time) (the int (* 300.0 (-> self desired-angle))))
|
|
(go-virtual ambush)
|
|
)
|
|
)
|
|
:code sleep-code
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate ambush (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(logior! (-> self enemy-flags) (enemy-flag alert))
|
|
)
|
|
:code (behavior ()
|
|
(go-virtual notice)
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate active (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
(logclear! (-> self enemy-flags) (enemy-flag cam-attack-mode))
|
|
(when (logtest? (-> self enemy-flags) (enemy-flag enable-on-active))
|
|
(logclear! (-> self enemy-flags) (enemy-flag enable-on-active))
|
|
(let ((gp-0 (-> self on-active)))
|
|
(if gp-0
|
|
(script-eval gp-0 :vector (-> self root trans))
|
|
)
|
|
)
|
|
)
|
|
(when (not (logtest? (enemy-flag chase-startup) (-> self enemy-flags)))
|
|
(if (logtest? (-> self enemy-flags) (enemy-flag actor-pause-backup))
|
|
(logior! (-> self mask) (process-mask actor-pause))
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
)
|
|
)
|
|
)
|
|
:trans (behavior ()
|
|
(when (time-elapsed? (-> self state-time) (seconds 0.1))
|
|
(let ((v1-3 (-> self focus aware)))
|
|
(cond
|
|
((< (the-as int v1-3) 1)
|
|
(go-idle self)
|
|
)
|
|
((< 1 (the-as int v1-3))
|
|
(go-virtual notice)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(ja-channel-push! 1 (seconds 0.1))
|
|
(sleep-code)
|
|
)
|
|
:post (behavior ()
|
|
(play-idle-frames! (-> self idle-anim-player) self)
|
|
(enemy-simple-post)
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate notice (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
(let ((v1-3 (logior (-> self enemy-flags) (enemy-flag cam-attack-mode))))
|
|
(set! (-> self enemy-flags) (logclear v1-3 (enemy-flag use-trigger)))
|
|
)
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
(set-look-at-mode! self 1)
|
|
(when (logtest? (-> self enemy-flags) (enemy-flag enable-on-notice))
|
|
(logclear! (-> self enemy-flags) (enemy-flag enable-on-notice))
|
|
(let ((gp-0 (-> self on-notice)))
|
|
(if gp-0
|
|
(script-eval gp-0 :vector (-> self root trans))
|
|
)
|
|
)
|
|
)
|
|
(let ((gp-1 (-> self focus aware)))
|
|
(when (logtest? (-> self enemy-flags) (enemy-flag alert))
|
|
(cond
|
|
((and (= gp-1 (enemy-aware hostile)) (get-focus! self))
|
|
(go-hostile self)
|
|
)
|
|
((= gp-1 (enemy-aware flee))
|
|
(go-flee self)
|
|
)
|
|
(else
|
|
(go-stare self)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(logior! (-> self enemy-flags) (enemy-flag alert))
|
|
)
|
|
:code (behavior ()
|
|
(ja-channel-push! 1 (seconds 0.075))
|
|
(let ((f30-0 (rnd-float-range self 0.8 1.2))
|
|
(gp-0 (new 'stack-no-clear 'vector))
|
|
)
|
|
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info notice-anim))
|
|
:num! (seek! max f30-0)
|
|
:frame-num 0.0
|
|
)
|
|
(until (ja-done? 0)
|
|
(vector-! gp-0 (target-pos 0) (-> self root trans))
|
|
(seek-toward-heading-vec! (-> self root) gp-0 131072.0 (seconds 0.05))
|
|
(suspend)
|
|
(ja :num! (seek! max f30-0))
|
|
)
|
|
)
|
|
(go-state-for-focused self)
|
|
)
|
|
:post enemy-simple-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate hostile (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
(set-look-at-mode! self 1)
|
|
(logior! (-> self enemy-flags) (enemy-flag cam-attack-mode))
|
|
(logclear! (-> self enemy-flags) (enemy-flag chase-startup))
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
(when (logtest? (enemy-flag enable-on-hostile) (-> self enemy-flags))
|
|
(logclear! (-> self enemy-flags) (enemy-flag enable-on-hostile))
|
|
(let ((gp-0 (-> self on-hostile)))
|
|
(if gp-0
|
|
(script-eval gp-0 :vector (-> self root trans))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:trans (behavior ()
|
|
(if (and (logtest? (-> self enemy-flags) (enemy-flag victory)) (-> self enemy-info use-victory))
|
|
(go-virtual victory)
|
|
)
|
|
(let ((gp-0 (-> self focus aware)))
|
|
(when (time-elapsed? (-> self state-time) (-> self reaction-time))
|
|
(cond
|
|
((or (>= 2 (the-as int gp-0)) (not (get-focus! self)))
|
|
(go-stare self)
|
|
)
|
|
((= gp-0 (enemy-aware flee))
|
|
(go-flee self)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(ja-channel-push! 1 (seconds 0.2))
|
|
(ja :group! (-> self draw art-group data (-> self enemy-info hostile-anim)))
|
|
(ja :num-func num-func-identity :frame-num 0.0)
|
|
(let ((f30-0 (rnd-float-range self 0.9 1.1)))
|
|
(until #f
|
|
(suspend)
|
|
(ja :num! (loop! f30-0))
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
:post enemy-simple-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate stare (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
(logclear! (-> self enemy-flags) (enemy-flag chase-startup))
|
|
)
|
|
:trans (behavior ()
|
|
(when (time-elapsed? (-> self state-time) (seconds 0.1))
|
|
(let ((gp-0 (-> self focus aware)))
|
|
(cond
|
|
((>= 1 (the-as int gp-0))
|
|
(go-virtual active)
|
|
)
|
|
((and (= gp-0 (enemy-aware hostile)) (get-focus! self))
|
|
(go-hostile self)
|
|
)
|
|
((= gp-0 (enemy-aware flee))
|
|
(go-flee self)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(ja-channel-push! 1 (seconds 0.1))
|
|
(let ((f30-0 (rnd-float-range self 0.9 1.1))
|
|
(gp-0 (-> self draw art-group data (-> self enemy-info idle-anim)))
|
|
)
|
|
(until #f
|
|
(ja-no-eval :group! gp-0 :num! (seek! max f30-0) :frame-num 0.0)
|
|
(until (ja-done? 0)
|
|
(suspend)
|
|
(ja :num! (seek! max f30-0))
|
|
)
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
:post enemy-simple-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate victory (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(logclear! (-> self enemy-flags) (enemy-flag victory))
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
)
|
|
:code (behavior ()
|
|
(ja-channel-push! 1 (seconds 0.075))
|
|
(let ((f30-0 (rnd-float-range self 0.8 1.2)))
|
|
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info victory-anim))
|
|
:num! (seek! max f30-0)
|
|
:frame-num 0.0
|
|
)
|
|
(until (ja-done? 0)
|
|
(suspend)
|
|
(ja :num! (seek! max f30-0))
|
|
)
|
|
)
|
|
(go-state-for-focused self)
|
|
)
|
|
:post enemy-simple-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate flee (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
(set-look-at-mode! self 1)
|
|
(logclear! (-> self enemy-flags) (enemy-flag chase-startup))
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
)
|
|
:trans (behavior ()
|
|
(when (time-elapsed? (-> self state-time) (-> self reaction-time))
|
|
(if (!= (-> self focus aware) (enemy-aware flee))
|
|
(go-stare self)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(ja-channel-push! 1 (seconds 0.2))
|
|
(until #f
|
|
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info idle-anim)) :num! (seek!) :frame-num 0.0)
|
|
(until (ja-done? 0)
|
|
(suspend)
|
|
(ja :num! (seek!))
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
:post enemy-simple-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate jump (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
(logior! (-> self focus-status) (focus-status dangerous))
|
|
(let* ((v1-6 *game-info*)
|
|
(a0-2 (+ (-> v1-6 attack-id) 1))
|
|
)
|
|
(set! (-> v1-6 attack-id) a0-2)
|
|
(set! (-> self attack-id) a0-2)
|
|
)
|
|
(logclear! (-> self focus-status) (focus-status in-air))
|
|
)
|
|
:exit (behavior ()
|
|
(if (logtest? (-> self enemy-flags) (enemy-flag dangerous-backup))
|
|
(logior! (-> self focus-status) (focus-status dangerous))
|
|
(logclear! (-> self focus-status) (focus-status dangerous))
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(let ((gp-0 (new 'stack-no-clear 'enemy-jump-info)))
|
|
(let ((s5-0 0))
|
|
(init-jump-info! self gp-0)
|
|
(if (and (-> self enemy-info use-jump-blocked)
|
|
(logtest? (enemy-flag jump-check-blocked) (-> self enemy-flags))
|
|
(check-jump-blocked? self gp-0)
|
|
)
|
|
(go-virtual jump-blocked)
|
|
)
|
|
(when (logtest? (-> gp-0 flags) (enemy-jump-flags ejf0))
|
|
(until #f
|
|
(if (jump-anim-handler self (the-as jump-stage s5-0) gp-0)
|
|
(goto cfg-12)
|
|
)
|
|
(move-along-ballistic-trajectory-for-jump self (the-as jump-stage s5-0) gp-0)
|
|
(adjust-heading-for-jump self (the-as jump-stage s5-0) gp-0)
|
|
(suspend)
|
|
(set! s5-0 1)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
(label cfg-12)
|
|
(logclear! (-> self root status) (collide-status on-surface on-ground touch-surface))
|
|
(let ((s5-1 2))
|
|
(logior! (-> self focus-status) (focus-status in-air))
|
|
(until (landed-jump-yet? self gp-0)
|
|
(+! (-> gp-0 hang-time) (- (current-time) (-> self clock old-frame-counter)))
|
|
(jump-anim-handler self (the-as jump-stage s5-1) gp-0)
|
|
(move-along-ballistic-trajectory-for-jump self (the-as jump-stage s5-1) gp-0)
|
|
(adjust-heading-for-jump self (the-as jump-stage s5-1) gp-0)
|
|
(suspend)
|
|
(set! s5-1 3)
|
|
)
|
|
)
|
|
(logclear! (-> self focus-status) (focus-status in-air))
|
|
(move-to-gspot! self)
|
|
(let ((s5-2 4))
|
|
(until #f
|
|
(if (jump-anim-handler self (the-as jump-stage s5-2) gp-0)
|
|
(goto cfg-19)
|
|
)
|
|
(move-along-ballistic-trajectory-for-jump self (the-as jump-stage s5-2) gp-0)
|
|
(adjust-heading-for-jump self (the-as jump-stage s5-2) gp-0)
|
|
(suspend)
|
|
(set! s5-2 5)
|
|
)
|
|
)
|
|
)
|
|
#f
|
|
(label cfg-19)
|
|
(if (logtest? (enemy-flag directed) (-> self enemy-flags))
|
|
((lambda :behavior enemy () (send-event (ppointer->process (-> self parent)) 'child-jumped)))
|
|
)
|
|
(go-next-state-auto self)
|
|
)
|
|
:post (behavior ()
|
|
(let ((a1-0 (new 'stack-no-clear 'overlaps-others-params)))
|
|
(set! (-> a1-0 options) (overlaps-others-options))
|
|
(set! (-> a1-0 collide-with-filter) (-> self enemy-info overlaps-others-collide-with-filter))
|
|
(set! (-> a1-0 tlist) *touching-list*)
|
|
(find-overlapping-shapes (-> self root) a1-0)
|
|
)
|
|
(enemy-simple-post)
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate jump-blocked (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
)
|
|
:trans (behavior ()
|
|
(when (time-elapsed? (-> self state-time) (seconds 0.5))
|
|
(if (logtest? (enemy-flag directed) (-> self enemy-flags))
|
|
(go-virtual jump)
|
|
(go-next-state-auto self)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(let ((v1-2 (ja-group)))
|
|
(when (not (and v1-2 (= v1-2 (-> self draw art-group data (-> self enemy-info idle-anim)))))
|
|
(ja-channel-push! 1 (seconds 0.2))
|
|
(ja :group! (-> self draw art-group data (-> self enemy-info idle-anim))
|
|
:num! (identity (rand-vu-float-range 0.0 (the float (+ (-> (ja-group) frames num-frames) -1))))
|
|
)
|
|
)
|
|
)
|
|
(let ((f30-0 (rnd-float-range self 0.75 1.25)))
|
|
(until #f
|
|
(suspend)
|
|
(ja :num! (loop! f30-0))
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
:post enemy-simple-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate hit (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(stop-look-at! self)
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
(play-damage-or-death-sound self 0)
|
|
)
|
|
:code (behavior ()
|
|
(local-vars (v1-37 enemy-flag) (v1-39 enemy-flag) (v1-41 enemy-flag))
|
|
(ja-channel-push! 1 (seconds 0.2))
|
|
(let ((f30-0 (rnd-float-range self 0.9 1.1)))
|
|
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info hit-anim))
|
|
:num! (seek! max f30-0)
|
|
:frame-num 0.0
|
|
)
|
|
(until (ja-done? 0)
|
|
(suspend)
|
|
(ja :num! (seek! max f30-0))
|
|
)
|
|
)
|
|
(if (logtest? (-> self enemy-flags) (enemy-flag dangerous-backup))
|
|
(logior! (-> self focus-status) (focus-status dangerous))
|
|
(logclear! (-> self focus-status) (focus-status dangerous))
|
|
)
|
|
(let ((v1-36 (-> self enemy-flags)))
|
|
(if (logtest? v1-36 (enemy-flag vulnerable-backup))
|
|
(set! v1-37 (logior v1-36 (enemy-flag vulnerable)))
|
|
(set! v1-37 (logclear v1-36 (enemy-flag vulnerable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-37)
|
|
(let ((v1-38 (-> self enemy-flags)))
|
|
(if (logtest? v1-38 (enemy-flag attackable-backup))
|
|
(set! v1-39 (logior v1-38 (enemy-flag attackable)))
|
|
(set! v1-39 (logclear v1-38 (enemy-flag attackable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-39)
|
|
(let ((v1-40 (-> self enemy-flags)))
|
|
(if (logtest? (enemy-flag trackable-backup) v1-40)
|
|
(set! v1-41 (logior (enemy-flag trackable) v1-40))
|
|
(set! v1-41 (logclear v1-40 (enemy-flag trackable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-41)
|
|
(logclear! (-> self enemy-flags) (enemy-flag lock-focus))
|
|
(logclear! (-> self focus-status) (focus-status hit))
|
|
(go-hostile self)
|
|
)
|
|
:post enemy-simple-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate knocked (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(when (>= 0.0 (-> self hit-points))
|
|
(let ((v1-2 (handle->process (-> self incoming attacker-handle))))
|
|
(when (or (not (-> self draw))
|
|
(and (or (not v1-2) (!= (-> v1-2 type) target))
|
|
(or (not (logtest? (-> self draw status) (draw-control-status on-screen)))
|
|
(< (square 450560.0) (vector-vector-xz-distance-squared (-> self root trans) (math-camera-pos)))
|
|
)
|
|
)
|
|
)
|
|
(send-event (ppointer->process (-> self parent)) 'child-die)
|
|
(go-virtual die-fast)
|
|
)
|
|
)
|
|
)
|
|
(set-time! (-> self state-time))
|
|
(stop-look-at! self)
|
|
(logior! (-> self enemy-flags) (enemy-flag lock-focus))
|
|
(logclear! (-> self mask) (process-mask actor-pause))
|
|
(let* ((v1-30 *game-info*)
|
|
(a0-13 (+ (-> v1-30 attack-id) 1))
|
|
)
|
|
(set! (-> v1-30 attack-id) a0-13)
|
|
(set! (-> self attack-id) a0-13)
|
|
)
|
|
(if (logtest? (enemy-option knocked-into-water) (-> self fact enemy-options))
|
|
(logior! (-> self enemy-flags) (enemy-flag check-water))
|
|
)
|
|
(if (and (allow-ragdoll? self) (-> self enemy-info ragdoll-info))
|
|
(set! (-> self root transv y) 0.0)
|
|
)
|
|
(let ((v1-43 (-> self root)))
|
|
(logclear! (-> v1-43 status) (collide-status
|
|
on-surface
|
|
on-ground
|
|
touch-surface
|
|
touch-wall
|
|
touch-ceiling
|
|
touch-actor
|
|
on-special-surface
|
|
touch-edge
|
|
blocked
|
|
on-water
|
|
impact-surface
|
|
touch-background
|
|
stuck
|
|
glance
|
|
)
|
|
)
|
|
(when (not (logtest? (-> v1-43 root-prim prim-core action) (collide-action no-normal-reset)))
|
|
(let ((a0-25 (-> v1-43 dynam gravity-normal)))
|
|
(vector-copy! (-> v1-43 local-normal) a0-25)
|
|
(vector-copy! (-> v1-43 surface-normal) a0-25)
|
|
(vector-copy! (-> v1-43 poly-normal) a0-25)
|
|
)
|
|
(set! (-> v1-43 coverage) 0.0)
|
|
(set! (-> v1-43 touch-angle) 0.0)
|
|
)
|
|
(knocked-handler self (-> v1-43 transv))
|
|
)
|
|
(if (>= (-> self enemy-info knocked-seek-ry-clamp) 0.0)
|
|
(set! (-> self desired-angle) (get-knockback-angle self))
|
|
)
|
|
(if (or (= (-> self hit-points) 0.0) (nonzero? (-> self fated-time)))
|
|
(on-dying self)
|
|
(play-damage-or-death-sound self 0)
|
|
)
|
|
(logclear! (-> self focus-status) (focus-status dangerous))
|
|
(if (= (-> self incoming knocked-type) (knocked-type yellow-shot))
|
|
(logclear! (-> self enemy-flags) (enemy-flag trackable))
|
|
)
|
|
(set! (-> self root penetrate-using) (penetrate lunge vehicle knocked))
|
|
(reset-penetrate-later! self)
|
|
(update-collision-action self 1)
|
|
(ragdoll-spawn! self #t #f)
|
|
)
|
|
:exit (behavior ()
|
|
(disable-ragdoll self)
|
|
)
|
|
:trans (behavior ()
|
|
(if (>= (-> self enemy-info knocked-seek-ry-clamp) 0.0)
|
|
(seek-toward-yaw-angle! (-> self root) (-> self desired-angle) 138353.78 (seconds 0.1))
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(cond
|
|
((handle->process (-> self ragdoll-proc))
|
|
(suspend-for (seconds 0.2)
|
|
)
|
|
(until (ragdoll-settled? self)
|
|
(if (or (time-elapsed? (-> self state-time) (seconds 4)) (out-of-bounds? self))
|
|
(go-die self)
|
|
)
|
|
(suspend)
|
|
)
|
|
(if (invalid-height? self)
|
|
(go-die self)
|
|
)
|
|
)
|
|
(else
|
|
(let ((gp-1 (new 'stack-no-clear 'enemy-knocked-info)))
|
|
(let ((s5-0 0))
|
|
(set! (-> gp-1 anim-speed) (rnd-float-range self 0.9 1.1))
|
|
(set! (-> gp-1 on-surface-count) 0)
|
|
(set! (-> gp-1 move-count) 0)
|
|
(until (done-being-knocked? self gp-1)
|
|
(if (time-elapsed? (-> self state-time) (seconds 2))
|
|
(go-die self)
|
|
)
|
|
(if (logtest? (-> self root status) (collide-status on-surface))
|
|
(+! (-> gp-1 on-surface-count) 1)
|
|
)
|
|
(knocked-anim-handler self s5-0 gp-1)
|
|
(suspend)
|
|
(+! (-> gp-1 move-count) 1)
|
|
(set! s5-0 1)
|
|
)
|
|
)
|
|
(let ((s5-1 2))
|
|
(set-time! (-> gp-1 land-can-land-time))
|
|
(until #f
|
|
(if (logtest? (-> self root status) (collide-status on-surface))
|
|
(+! (-> gp-1 on-surface-count) 1)
|
|
)
|
|
(if (knocked-anim-handler self s5-1 gp-1)
|
|
(goto cfg-33)
|
|
)
|
|
(suspend)
|
|
(+! (-> gp-1 move-count) 1)
|
|
(set! s5-1 3)
|
|
(if (done-being-knocked? self gp-1)
|
|
(set-time! (-> gp-1 land-can-land-time))
|
|
)
|
|
)
|
|
)
|
|
#f
|
|
(label cfg-33)
|
|
(if (and (not (logtest? (enemy-flag death-start) (-> self enemy-flags)))
|
|
(or (invalid-height? self)
|
|
(out-of-bounds? self)
|
|
(time-elapsed? (-> gp-1 land-can-land-time) (-> self enemy-info knocked-can-land-timeout))
|
|
)
|
|
)
|
|
(go-die self)
|
|
)
|
|
(while (not (knocked-anim-handler self 4 gp-1))
|
|
(suspend)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(cond
|
|
((or (= (-> self hit-points) 0.0) (nonzero? (-> self fated-time)))
|
|
(cond
|
|
((logtest? (enemy-flag death-start) (-> self enemy-flags))
|
|
(set! (-> self hit-points) 0.0)
|
|
(let ((v1-90 (-> self root root-prim)))
|
|
(set! (-> v1-90 prim-core collide-as) (collide-spec))
|
|
(set! (-> v1-90 prim-core collide-with) (collide-spec))
|
|
)
|
|
0
|
|
(send-event self 'death-end)
|
|
(let ((gp-2 (-> self child)))
|
|
(while gp-2
|
|
(send-event (ppointer->process gp-2) 'notice 'die)
|
|
(set! gp-2 (-> gp-2 0 brother))
|
|
)
|
|
)
|
|
(while (-> self child)
|
|
(suspend)
|
|
)
|
|
(cleanup-for-death self)
|
|
)
|
|
(else
|
|
(when (and (-> self skel effect) (logtest? (enemy-flag auto-death-phase-out) (-> self enemy-flags)))
|
|
(do-effect (-> self skel effect) "death-default" 0.0 -1)
|
|
(suspend)
|
|
0
|
|
)
|
|
(go-die self)
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(go-virtual knocked-recover)
|
|
)
|
|
)
|
|
)
|
|
:post enemy-falling-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate knocked-recover (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(set-time! (-> self state-time))
|
|
)
|
|
:exit (behavior ()
|
|
(local-vars (v1-1 enemy-flag) (v1-13 enemy-flag) (v1-15 enemy-flag) (v1-17 enemy-flag))
|
|
(let ((v1-0 (-> self enemy-flags)))
|
|
(if (logtest? (enemy-flag check-water-backup) v1-0)
|
|
(set! v1-1 (logior (enemy-flag check-water) v1-0))
|
|
(set! v1-1 (logclear v1-0 (enemy-flag check-water)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-1)
|
|
(when (!= (-> self hit-points) 0.0)
|
|
(set! (-> self root penetrate-using)
|
|
(the-as penetrate (logclear (-> self root penetrate-using) (penetrate knocked)))
|
|
)
|
|
(update-collision-action self 2)
|
|
(if (logtest? (-> self enemy-flags) (enemy-flag dangerous-backup))
|
|
(logior! (-> self focus-status) (focus-status dangerous))
|
|
(logclear! (-> self focus-status) (focus-status dangerous))
|
|
)
|
|
(let ((v1-12 (-> self enemy-flags)))
|
|
(if (logtest? v1-12 (enemy-flag vulnerable-backup))
|
|
(set! v1-13 (logior v1-12 (enemy-flag vulnerable)))
|
|
(set! v1-13 (logclear v1-12 (enemy-flag vulnerable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-13)
|
|
(let ((v1-14 (-> self enemy-flags)))
|
|
(if (logtest? v1-14 (enemy-flag attackable-backup))
|
|
(set! v1-15 (logior v1-14 (enemy-flag attackable)))
|
|
(set! v1-15 (logclear v1-14 (enemy-flag attackable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-15)
|
|
(let ((v1-16 (-> self enemy-flags)))
|
|
(if (logtest? (enemy-flag trackable-backup) v1-16)
|
|
(set! v1-17 (logior (enemy-flag trackable) v1-16))
|
|
(set! v1-17 (logclear v1-16 (enemy-flag trackable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-17)
|
|
(logclear! (-> self enemy-flags) (enemy-flag lock-focus))
|
|
(logclear! (-> self focus-status) (focus-status hit))
|
|
)
|
|
)
|
|
:trans (behavior ()
|
|
(if (and (time-elapsed? (-> self state-time) (seconds 0.01))
|
|
(and (not (handle->process (-> self ragdoll-proc)))
|
|
(or (invalid-height? self) (time-elapsed? (-> self state-time) (-> self enemy-info knocked-recover-timeout)))
|
|
)
|
|
)
|
|
(go-die self)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(local-vars (v1-58 symbol))
|
|
(cond
|
|
((handle->process (-> self ragdoll-proc))
|
|
(ja-channel-push! 1 0)
|
|
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info idle-anim)) :num! (seek!) :frame-num 0.0)
|
|
(enable-ragdoll! (-> (the-as ragdoll-proc (handle->process (-> self ragdoll-proc))) ragdoll) self)
|
|
(until (ja-done? 0)
|
|
(suspend)
|
|
(ja :num! (seek!))
|
|
)
|
|
)
|
|
(else
|
|
(ja-channel-push! 1 (seconds 0.2))
|
|
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info idle-anim)) :num! (loop!) :frame-num 0.0)
|
|
(until v1-58
|
|
(suspend)
|
|
(ja :num! (loop!))
|
|
(set! v1-58 (and (logtest? (-> self root status) (collide-status on-surface))
|
|
(< (vector-length (-> self root transv)) 2048.0)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(if (out-of-bounds? self)
|
|
(go-die self)
|
|
(go-hostile self)
|
|
)
|
|
)
|
|
:post (behavior ()
|
|
(when (not (handle->process (-> self ragdoll-proc)))
|
|
(let ((gp-0 (-> self root)))
|
|
(if (focus-test? self under-water)
|
|
(adjust-transv-under-water! self (-> gp-0 transv))
|
|
(vector-v++!
|
|
(-> gp-0 transv)
|
|
(compute-acc-due-to-gravity gp-0 (new 'stack-no-clear 'vector) (-> self enemy-info slip-factor))
|
|
)
|
|
)
|
|
(let ((a2-1 (new 'stack-no-clear 'collide-query)))
|
|
(set! (-> a2-1 collide-with) (-> self enemy-info recover-gnd-collide-with))
|
|
(set! (-> a2-1 ignore-process0) self)
|
|
(set! (-> a2-1 ignore-process1) #f)
|
|
(set! (-> a2-1 ignore-pat) (logior (new 'static 'pat-surface :noendlessfall #x1) (-> gp-0 pat-ignore-mask)))
|
|
(set! (-> a2-1 action-mask) (collide-action solid))
|
|
(fill-cache-integrate-and-collide gp-0 (-> gp-0 transv) a2-1 (meters 0))
|
|
)
|
|
)
|
|
(apply-friction self)
|
|
)
|
|
(let ((gp-1 (-> self root))
|
|
(a1-5 (new 'stack-no-clear 'collide-query))
|
|
(s5-1 (new 'stack-no-clear 'vector))
|
|
)
|
|
(vector-copy! s5-1 (-> gp-1 gspot-pos))
|
|
(let ((s4-1 (new 'stack-no-clear 'vector)))
|
|
(vector-copy! s4-1 (-> gp-1 gspot-normal))
|
|
(when (not (find-ground gp-1 a1-5 (-> self enemy-info gnd-collide-with) 8192.0 81920.0 1024.0 (the-as process #f)))
|
|
(vector-copy! (-> gp-1 gspot-pos) s5-1)
|
|
(vector-copy! (-> gp-1 gspot-normal) s4-1)
|
|
)
|
|
)
|
|
)
|
|
(enemy-simple-post)
|
|
)
|
|
)
|
|
|
|
;; definition for method 154 of type enemy
|
|
;; WARN: Return type mismatch entity-perm-status vs none.
|
|
(defmethod mark-as-dead ((this enemy))
|
|
(cond
|
|
((logtest? (process-mask enemy) (-> this mask))
|
|
(+! (-> *game-info* enemies-killed) 1.0)
|
|
)
|
|
((logtest? (process-mask guard civilian) (-> this mask))
|
|
(+! (-> *game-info* civilians-killed) 1.0)
|
|
)
|
|
)
|
|
(logior! (-> this focus-status) (focus-status dead))
|
|
(process-entity-status! this (entity-perm-status subtask-complete) #t)
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 143 of type enemy
|
|
(defmethod on-dying ((this enemy))
|
|
(when (not (logtest? (enemy-flag called-dying) (-> this enemy-flags)))
|
|
(set! (-> this enemy-flags) (the-as enemy-flag (logior (enemy-flag called-dying) (-> this enemy-flags))))
|
|
(play-damage-or-death-sound this 1)
|
|
(when (and (logtest? (enemy-flag has-gem) (-> this enemy-flags))
|
|
(not (logtest? (enemy-flag spawn-gem) (-> this enemy-flags)))
|
|
)
|
|
(logior! (-> this enemy-flags) (enemy-flag spawn-gem))
|
|
(remove-from-process *part-engine* this)
|
|
(setup-masks
|
|
(-> this draw)
|
|
(the-as int (-> this enemy-info gem-no-seg))
|
|
(the-as int (-> this enemy-info gem-seg))
|
|
)
|
|
(let* ((a0-11
|
|
(vector<-cspace! (new 'stack-no-clear 'vector) (-> this node-list data (-> this enemy-info gem-joint)))
|
|
)
|
|
(s5-0
|
|
(as-type
|
|
(ppointer->process (birth-pickup-at-point a0-11 (pickup-type gem) 1.0 #t *entity-pool* (-> this fact)))
|
|
gem
|
|
)
|
|
)
|
|
)
|
|
(if s5-0
|
|
(set! (-> (the-as gem s5-0) gem-pool) (the-as uint (get-gem-pool-idx this)))
|
|
)
|
|
)
|
|
)
|
|
(logclear! (-> this enemy-flags) (enemy-flag vulnerable vulnerable-backup))
|
|
(logclear! (-> this focus-status) (focus-status dangerous))
|
|
(logclear! (-> this enemy-flags) (enemy-flag dangerous-backup))
|
|
(logclear! (-> this enemy-flags) (enemy-flag attackable attackable-backup))
|
|
(logclear! (-> this mask) (process-mask actor-pause))
|
|
(logclear! (-> this enemy-flags) (enemy-flag actor-pause-backup))
|
|
(mark-as-dead this)
|
|
(if (-> this skel effect)
|
|
(logior! (-> this skel effect flags) (effect-control-flag ecf1))
|
|
)
|
|
(stop-look-at! this)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate die (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(on-dying self)
|
|
(let ((v1-3 (-> self root root-prim)))
|
|
(set! (-> v1-3 prim-core collide-as) (collide-spec))
|
|
(set! (-> v1-3 prim-core collide-with) (collide-spec))
|
|
)
|
|
0
|
|
(set-time! (-> self state-time))
|
|
(set! (-> self hit-points) 0.0)
|
|
(ragdoll-spawn! self #f #t)
|
|
)
|
|
:code (behavior ()
|
|
(cond
|
|
((handle->process (-> self ragdoll-proc))
|
|
(suspend-for (seconds 0.2)
|
|
)
|
|
(if (-> self skel effect)
|
|
(do-effect (-> self skel effect) "death-default" 0.0 -1)
|
|
)
|
|
(suspend-for (seconds 0.8)
|
|
)
|
|
)
|
|
(else
|
|
(ja-channel-push! 1 (seconds 0.075))
|
|
(let ((f30-0 (rnd-float-range self 0.8 1.2)))
|
|
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info die-anim))
|
|
:num! (seek! max f30-0)
|
|
:frame-num 0.0
|
|
)
|
|
(until (ja-done? 0)
|
|
(suspend)
|
|
(ja :num! (seek! max f30-0))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(send-event self 'death-end)
|
|
(let ((gp-2 (-> self child)))
|
|
(while gp-2
|
|
(send-event (ppointer->process gp-2) 'notice 'die)
|
|
(set! gp-2 (-> gp-2 0 brother))
|
|
)
|
|
)
|
|
(while (-> self child)
|
|
(suspend)
|
|
)
|
|
(cleanup-for-death self)
|
|
)
|
|
:post enemy-simple-post
|
|
)
|
|
|
|
;; definition for method 144 of type enemy
|
|
(defmethod falling? ((this enemy))
|
|
(let ((s5-0 (-> this root))
|
|
(a1-0 (new 'stack-no-clear 'collide-query))
|
|
(gp-0 #t)
|
|
)
|
|
(when (find-ground
|
|
s5-0
|
|
a1-0
|
|
(-> this enemy-info recover-gnd-collide-with)
|
|
8192.0
|
|
81920.0
|
|
1024.0
|
|
(the-as process #f)
|
|
)
|
|
(if (< (- (-> s5-0 trans y) (-> s5-0 gspot-pos y)) 8192.0)
|
|
(set! gp-0 #f)
|
|
)
|
|
)
|
|
gp-0
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate die-falling (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(on-dying self)
|
|
(let ((v1-3 (-> self root root-prim)))
|
|
(set! (-> v1-3 prim-core collide-as) (collide-spec))
|
|
(set! (-> v1-3 prim-core collide-with) (collide-spec))
|
|
)
|
|
0
|
|
(set! (-> self hit-points) 0.0)
|
|
(if (logtest? (enemy-option knocked-into-water) (-> self fact enemy-options))
|
|
(logior! (-> self enemy-flags) (enemy-flag check-water))
|
|
)
|
|
(ragdoll-spawn! self #f #t)
|
|
)
|
|
:exit (behavior ()
|
|
(local-vars (v0-0 enemy-flag))
|
|
(let ((v1-0 (-> self enemy-flags)))
|
|
(if (logtest? (enemy-flag check-water-backup) v1-0)
|
|
(set! v0-0 (logior (enemy-flag check-water) v1-0))
|
|
(set! v0-0 (logclear v1-0 (enemy-flag check-water)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v0-0)
|
|
)
|
|
:code (behavior ()
|
|
(cond
|
|
((handle->process (-> self ragdoll-proc))
|
|
(suspend-for (seconds 1)
|
|
)
|
|
(if (-> self skel effect)
|
|
(do-effect (-> self skel effect) "death-default" 0.0 -1)
|
|
)
|
|
(suspend-for (seconds 1)
|
|
)
|
|
(deactivate-ragdoll! self)
|
|
)
|
|
(else
|
|
(ja-channel-push! 1 (seconds 0.1))
|
|
(let ((gp-2 (-> self draw art-group data (if (falling? self)
|
|
(-> self enemy-info die-falling-anim)
|
|
(-> self enemy-info die-anim)
|
|
)
|
|
)
|
|
)
|
|
(f30-0 (rnd-float-range self 0.8 1.2))
|
|
)
|
|
(ja-no-eval :group! gp-2 :num! (seek! max f30-0) :frame-num 0.0)
|
|
(until (ja-done? 0)
|
|
(suspend)
|
|
(ja :num! (seek! max f30-0))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(send-event self 'death-end)
|
|
(let ((gp-3 (-> self child)))
|
|
(while gp-3
|
|
(send-event (ppointer->process gp-3) 'notice 'die)
|
|
(set! gp-3 (-> gp-3 0 brother))
|
|
)
|
|
)
|
|
(while (-> self child)
|
|
(suspend)
|
|
)
|
|
(cleanup-for-death self)
|
|
)
|
|
:post enemy-die-falling-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate directed (enemy)
|
|
:virtual #t
|
|
:event enemy-event-handler
|
|
:enter (behavior ()
|
|
(logior! (-> self enemy-flags) (enemy-flag directed-ready))
|
|
((-> (method-of-type enemy idle) enter))
|
|
)
|
|
:exit (behavior ()
|
|
(logclear! (-> self enemy-flags) (enemy-flag directed-ready))
|
|
)
|
|
:code (-> (method-of-type enemy idle) code)
|
|
:post (-> (method-of-type enemy idle) post)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate die-fast (enemy)
|
|
:virtual #t
|
|
:code nothing
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate view-anims (enemy)
|
|
:virtual #t
|
|
:enter (behavior ()
|
|
'()
|
|
)
|
|
:trans (behavior ()
|
|
'()
|
|
)
|
|
:code (behavior ()
|
|
(let ((gp-0 (-> self draw art-group)))
|
|
(until #f
|
|
(dotimes (s5-0 (-> gp-0 length))
|
|
(let ((s4-0 (-> gp-0 data s5-0)))
|
|
(when (and s4-0 (= (-> s4-0 type) art-joint-anim))
|
|
(ja-channel-set! 1)
|
|
(ja-no-eval :group! s4-0 :num! (seek!) :frame-num 0.0)
|
|
(until (ja-done? 0)
|
|
(suspend)
|
|
(ja :num! (seek!))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
:post transform-post
|
|
)
|
|
|
|
;; definition for function gun-dark-2-anim-code
|
|
;; WARN: Return type mismatch symbol vs object.
|
|
;; WARN: new jak 2 until loop case, check carefully
|
|
(defbehavior gun-dark-2-anim-code enemy ()
|
|
0.0
|
|
(let ((f28-0 (the float (ja-num-frames 0))))
|
|
0.0
|
|
0.0
|
|
(let ((f30-0 1.0))
|
|
0.0
|
|
(let* ((f26-0 (/ (ja-frame-num 0) f28-0))
|
|
(f0-12 (cond
|
|
((< 0.5 f26-0)
|
|
(let* ((f24-0 0.3)
|
|
(v1-4 (/ (the-as int (rand-uint31-gen *random-generator*)) 256))
|
|
(v1-5 (the-as number (logior #x3f800000 v1-4)))
|
|
)
|
|
(- f26-0 (+ f24-0 (* (+ -1.0 (the-as float v1-5)) (+ -0.3 f26-0))))
|
|
)
|
|
)
|
|
(else
|
|
(let* ((f24-1 0.3)
|
|
(v1-11 (/ (the-as int (rand-uint31-gen *random-generator*)) 256))
|
|
(v1-12 (the-as number (logior #x3f800000 v1-11)))
|
|
)
|
|
(+ f24-1 (* (+ -1.0 (the-as float v1-12)) (- 0.7 f26-0)) f26-0)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(f26-1 (fmax 0.0 (fmin 1.0 f0-12)))
|
|
(f28-1 (* f28-0 f26-1))
|
|
)
|
|
(let* ((f1-8 (/ (-> self root root-prim local-sphere w) (meters 4)))
|
|
(f0-21 (fmax 0.0 (fmin 1.0 f1-8)))
|
|
)
|
|
(* f30-0 (lerp 2.0 1.0 f0-21))
|
|
)
|
|
(cond
|
|
((>= (-> self enemy-info idle-anim) 0)
|
|
(let ((s5-0 (ja-group))
|
|
(f30-1 (ja-frame-num 0))
|
|
(gp-0 (-> self draw art-group data (-> self enemy-info idle-anim)))
|
|
)
|
|
(ja-channel-push! 2 (seconds 1))
|
|
(ja :group! s5-0 :num! (identity f30-1))
|
|
(ja :chan 1
|
|
:group! gp-0
|
|
:num! (identity (* f26-1 (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1))))
|
|
)
|
|
)
|
|
(let* ((gp-1 (current-time))
|
|
(f30-2 18.0)
|
|
(f28-2 6.0)
|
|
(v1-45 (/ (the-as int (rand-uint31-gen *random-generator*)) 256))
|
|
(v1-46 (the-as number (logior #x3f800000 v1-45)))
|
|
(f30-3 (+ f30-2 (* f28-2 (+ -1.0 (the-as float v1-46)))))
|
|
)
|
|
(until #f
|
|
(let* ((f0-32 (* 0.0033333334 (the float (- (current-time) gp-1))))
|
|
(f0-34 (/ (- f0-32 (* (the float (the int (/ f0-32 f30-3))) f30-3)) f30-3))
|
|
(f0-36 (cos (* 65536.0 f0-34)))
|
|
(f0-37 (+ 1.0 f0-36))
|
|
(f28-3 (/ f0-37 2))
|
|
)
|
|
(ja :num! identity :frame-interp0 f28-3 :frame-interp1 f28-3)
|
|
(let ((a0-20 (-> self skel root-channel 1)))
|
|
(let ((f0-39 (- 1.0 f28-3)))
|
|
(set! (-> a0-20 frame-interp 1) f0-39)
|
|
(set! (-> a0-20 frame-interp 0) f0-39)
|
|
)
|
|
(joint-control-channel-group-eval! a0-20 (the-as art-joint-anim #f) num-func-identity)
|
|
)
|
|
)
|
|
(suspend)
|
|
0
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
(else
|
|
(until (time-elapsed? (-> self state-time) (seconds 2))
|
|
(let* ((f1-22 (* 0.0016666667 (the float (- (current-time) (-> self state-time)))))
|
|
(f0-42 (fmax 0.0 (fmin 1.0 f1-22)))
|
|
)
|
|
(ja :num! (seek! f28-1 (lerp 0.2 0.01 f0-42)))
|
|
)
|
|
(suspend)
|
|
0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(sleep-code)
|
|
)
|
|
|
|
;; definition for function gun-dark-2-ragdoll-start
|
|
;; INFO: Used lq/sq
|
|
(defun gun-dark-2-ragdoll-start ((arg0 enemy))
|
|
(local-vars (s4-0 process))
|
|
(when (-> arg0 enemy-info ragdoll-info)
|
|
(let ((s5-0 (handle->process (-> arg0 ragdoll-proc))))
|
|
(cond
|
|
(s5-0
|
|
(set! s4-0 s5-0)
|
|
)
|
|
(else
|
|
(set! (-> arg0 ragdoll-proc)
|
|
(ppointer->handle
|
|
(process-spawn
|
|
ragdoll-proc
|
|
(-> arg0 enemy-info ragdoll-info)
|
|
:name "ragdoll-proc"
|
|
:to arg0
|
|
:stack-size #x5000
|
|
)
|
|
)
|
|
)
|
|
(set! s4-0 (handle->process (-> arg0 ragdoll-proc)))
|
|
(if (not s4-0)
|
|
(return 0)
|
|
)
|
|
(set! (-> arg0 enemy-flags)
|
|
(the-as enemy-flag (logior (enemy-flag auto-death-phase-out) (-> arg0 enemy-flags)))
|
|
)
|
|
)
|
|
)
|
|
(if (-> (the-as ragdoll-proc s4-0) ragdoll)
|
|
(logior! (-> (the-as ragdoll-proc s4-0) ragdoll ragdoll-flags) (ragdoll-flag rf3 rf4))
|
|
)
|
|
(let ((s3-0 (new 'stack-no-clear 'vector)))
|
|
(vector-float*! s3-0 (-> arg0 root transv) (seconds-per-frame))
|
|
(if s5-0
|
|
(ragdoll-proc-method-15 (the-as ragdoll-proc s4-0) #f (the-as vector #f) #f)
|
|
(ragdoll-proc-method-15 (the-as ragdoll-proc s4-0) #f (the-as vector #f) #t)
|
|
)
|
|
(let ((v0-0 (the-as object (-> (the-as ragdoll-proc s4-0) ragdoll ragdoll-joints 0 velocity))))
|
|
(set! (-> (the-as vector v0-0) quad) (-> s3-0 quad))
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate gun-dark-2-stretch (enemy)
|
|
:virtual #t
|
|
:event (behavior ((proc process) (argc int) (message symbol) (block event-message-block))
|
|
(local-vars (v0-4 object))
|
|
(case message
|
|
(('attack)
|
|
(let* ((s5-0 (the-as object (-> block param 1)))
|
|
(s4-0 (new 'stack-no-clear 'vector))
|
|
(v1-1 (-> (the-as attack-info s5-0) mode))
|
|
)
|
|
(set! v0-4 (cond
|
|
((= v1-1 'gravity-end)
|
|
(set! (-> self root transv quad) (the-as uint128 0))
|
|
(gun-dark-2-ragdoll-start self)
|
|
(handle-incoming-attack!
|
|
self
|
|
(the-as process-drawable proc)
|
|
block
|
|
(get-penetrate-using-from-attack-event (the-as process-drawable proc) block)
|
|
(the-as attack-info s5-0)
|
|
(the-as touching-shapes-entry #f)
|
|
)
|
|
(damage-enemy-from-attack! self proc block)
|
|
(set! (-> self incoming penetrate-using) (penetrate vehicle))
|
|
(set! (-> self incoming knocked-type) (knocked-type vehicle))
|
|
(set! (-> self incoming attack-direction quad) (the-as uint128 0))
|
|
(set! (-> self starting-time) 0)
|
|
(let ((a1-4 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-4 from) (process->ppointer proc))
|
|
(set! (-> a1-4 num-params) argc)
|
|
(set! (-> a1-4 message) 'hit-knocked)
|
|
(set! (-> a1-4 param 0) (-> block param 0))
|
|
(set! (-> a1-4 param 1) (-> block param 1))
|
|
(set! (-> a1-4 param 2) (-> block param 2))
|
|
(set! (-> a1-4 param 3) (-> block param 3))
|
|
(set! (-> a1-4 param 4) (-> block param 4))
|
|
(set! (-> a1-4 param 5) (-> block param 5))
|
|
(send-event-function self a1-4)
|
|
)
|
|
)
|
|
(else
|
|
(when (!= (-> (the-as attack-info s5-0) id) (-> self incoming attack-id))
|
|
(handle-incoming-attack!
|
|
self
|
|
(the-as process-drawable proc)
|
|
block
|
|
(get-penetrate-using-from-attack-event (the-as process-drawable proc) block)
|
|
(the-as attack-info s5-0)
|
|
(the-as touching-shapes-entry (-> block param 0))
|
|
)
|
|
(knocked-handler self s4-0)
|
|
(let ((gp-1 (-> self child)))
|
|
(while gp-1
|
|
(when (send-event (-> gp-1 0) 'is-gravity)
|
|
(send-event
|
|
(-> gp-1 0)
|
|
'attack-forward
|
|
(-> self incoming attack-direction)
|
|
(-> self incoming attack-position)
|
|
(the-as uint s5-0)
|
|
(-> self incoming penetrate-using)
|
|
s4-0
|
|
(-> self incoming attack-position)
|
|
)
|
|
(set! v0-4 0)
|
|
(goto cfg-17)
|
|
)
|
|
(set! gp-1 (-> gp-1 0 brother))
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(label cfg-17)
|
|
v0-4
|
|
)
|
|
(else
|
|
(if (zero? (-> self starting-time))
|
|
(enemy-event-handler proc argc message block)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:enter (behavior ()
|
|
(local-vars (v1-7 enemy-flag) (v1-9 enemy-flag) (v1-11 enemy-flag) (v1-34 enemy-flag))
|
|
(if (logtest? (-> self enemy-flags) (enemy-flag dangerous-backup))
|
|
(logior! (-> self focus-status) (focus-status dangerous))
|
|
(logclear! (-> self focus-status) (focus-status dangerous))
|
|
)
|
|
(let ((v1-6 (-> self enemy-flags)))
|
|
(if (logtest? v1-6 (enemy-flag vulnerable-backup))
|
|
(set! v1-7 (logior v1-6 (enemy-flag vulnerable)))
|
|
(set! v1-7 (logclear v1-6 (enemy-flag vulnerable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-7)
|
|
(let ((v1-8 (-> self enemy-flags)))
|
|
(if (logtest? v1-8 (enemy-flag attackable-backup))
|
|
(set! v1-9 (logior v1-8 (enemy-flag attackable)))
|
|
(set! v1-9 (logclear v1-8 (enemy-flag attackable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-9)
|
|
(let ((v1-10 (-> self enemy-flags)))
|
|
(if (logtest? (enemy-flag trackable-backup) v1-10)
|
|
(set! v1-11 (logior (enemy-flag trackable) v1-10))
|
|
(set! v1-11 (logclear v1-10 (enemy-flag trackable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-11)
|
|
(logclear! (-> self enemy-flags) (enemy-flag lock-focus))
|
|
(logclear! (-> self focus-status) (focus-status hit))
|
|
(vector-float*! (-> self root transv) (-> self root transv) 0.5)
|
|
(set! (-> self root penetrated-by) (penetrate))
|
|
(+! (-> self root transv y) 2048.0)
|
|
(set-time! (-> self state-time))
|
|
(set! (-> self root penetrated-by) (logior (get-penetrated-by self) (penetrate vehicle)))
|
|
(set-time! (-> self starting-time))
|
|
(set! (-> self focus-status) (the-as focus-status (logior (focus-status no-gravity) (-> self focus-status))))
|
|
(let ((v1-33 (-> self enemy-flags)))
|
|
(if (logtest? (enemy-flag trackable-backup) v1-33)
|
|
(set! v1-34 (logior (enemy-flag trackable) v1-33))
|
|
(set! v1-34 (logclear v1-33 (enemy-flag trackable)))
|
|
)
|
|
)
|
|
(set! (-> self enemy-flags) v1-34)
|
|
(stop-look-at! self)
|
|
(when (and (-> self draw) (-> self draw shadow-ctrl))
|
|
(let ((v1-41 (-> self draw shadow-ctrl)))
|
|
(logior! (-> v1-41 settings flags) (shadow-flags disable-draw))
|
|
)
|
|
0
|
|
)
|
|
)
|
|
:exit (behavior ()
|
|
(set! (-> self focus-status)
|
|
(the-as focus-status (logclear (-> self focus-status) (focus-status no-gravity)))
|
|
)
|
|
(when (and (-> self draw) (-> self draw shadow-ctrl))
|
|
(let ((v1-6 (-> self draw shadow-ctrl)))
|
|
(logclear! (-> v1-6 settings flags) (shadow-flags disable-draw))
|
|
)
|
|
0
|
|
)
|
|
)
|
|
:trans (behavior ()
|
|
(let ((gp-0 (-> self child)))
|
|
(while gp-0
|
|
(when (send-event (-> gp-0 0) 'is-gravity)
|
|
(let ((a1-1 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-1 from) (process->ppointer self))
|
|
(set! (-> a1-1 num-params) 0)
|
|
(set! (-> a1-1 message) 'get-float-speed)
|
|
(let ((f0-0 (the-as float (send-event-function (-> gp-0 0) a1-1))))
|
|
(+! (-> self root transv y) (* f0-0 (seconds-per-frame)))
|
|
)
|
|
)
|
|
0
|
|
(goto cfg-11)
|
|
)
|
|
(set! gp-0 (-> gp-0 0 brother))
|
|
)
|
|
)
|
|
(label cfg-11)
|
|
(vector-float*! (-> self root transv) (-> self root transv) (- 1.0 (* 0.5 (seconds-per-frame))))
|
|
(let ((s3-0 (new 'stack 'collide-query))
|
|
(gp-2 (vector-float*! (new 'stack-no-clear 'vector) (-> self root transv) (seconds-per-frame)))
|
|
)
|
|
(vector-copy! (-> s3-0 start-pos) (get-trans self 3))
|
|
(vector-copy! (-> s3-0 move-dist) gp-2)
|
|
(let ((v1-26 s3-0))
|
|
(set! (-> v1-26 radius) (* 0.7 (-> self root root-prim prim-core world-sphere w)))
|
|
(set! (-> v1-26 collide-with)
|
|
(collide-spec backgnd civilian enemy obstacle hit-by-others-list pusher vehicle-mesh)
|
|
)
|
|
(set! (-> v1-26 ignore-process0) self)
|
|
(set! (-> v1-26 ignore-process1) #f)
|
|
(set! (-> v1-26 ignore-pat)
|
|
(new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1 :board #x1)
|
|
)
|
|
(set! (-> v1-26 action-mask) (collide-action solid))
|
|
)
|
|
(let ((f30-0 (fill-and-probe-using-line-sphere *collide-cache* s3-0)))
|
|
(set! f30-0
|
|
(cond
|
|
((>= f30-0 0.0)
|
|
(vector-float*! gp-2 gp-2 f30-0)
|
|
(let ((s5-1 (new 'stack-no-clear 'vector))
|
|
(s4-0 (new 'stack-no-clear 'vector))
|
|
(v1-31 (-> s3-0 best-other-tri))
|
|
(f28-0 0.9)
|
|
)
|
|
(vector-copy! s5-1 (-> v1-31 normal))
|
|
(vector-copy! s4-0 (-> v1-31 intersect))
|
|
(let ((v1-32 (and (-> v1-31 collide-ptr) (as-type (-> v1-31 collide-ptr) collide-shape-prim-sphere))))
|
|
(when v1-32
|
|
(let ((s2-1 (-> (the-as collide-shape-prim-sphere v1-32) cshape process)))
|
|
(let ((s1-0 (new 'stack-no-clear 'vector)))
|
|
(vector-copy! s1-0 (-> self root transv))
|
|
(let ((v1-37 (as-type s2-1 process-focusable)))
|
|
(when v1-37
|
|
(when (focus-test? (the-as process-focusable v1-37) no-gravity)
|
|
(vector-float*! s1-0 s1-0 0.5)
|
|
(set! f28-0 0.5)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((f1-6 (fmax 0.0 (fmin 1.0 (* 0.000008138021 (vector-length (-> self root transv))))))
|
|
(f0-12 0.0)
|
|
)
|
|
(if (< 0.1 f1-6)
|
|
(set! f0-12 (lerp 3.0 12.0 f1-6))
|
|
)
|
|
(send-event
|
|
s2-1
|
|
'attack
|
|
#f
|
|
(static-attack-info :mask (vehicle-impulse-factor) ((id (-> self attack-id))
|
|
(damage f0-12)
|
|
(vehicle-damage-factor 1.0)
|
|
(vehicle-impulse-factor 1.0)
|
|
(penetrate-using (penetrate vehicle))
|
|
(vector (-> self root transv))
|
|
(attacker-velocity (-> self root transv))
|
|
(intersection s4-0)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((s2-3 (vector-! (new 'stack-no-clear 'vector) (-> s3-0 start-pos) s4-0)))
|
|
0.0
|
|
(let* ((f0-16 (vector-normalize-ret-len! s2-3 1.0))
|
|
(f0-18 (* 1.3 (- (* 0.7 (-> self root root-prim prim-core world-sphere w)) f0-16)))
|
|
)
|
|
(vector-normalize! s2-3 f0-18)
|
|
)
|
|
(vector+! (-> self root trans) (-> self root trans) s2-3)
|
|
)
|
|
(let ((f26-0 (vector-dot (-> self root transv) s5-1)))
|
|
(vector+float*! (-> self root transv) (-> self root transv) s5-1 (* -2.0 f26-0))
|
|
(vector-float*! (-> self root transv) (-> self root transv) f28-0)
|
|
(let ((s3-1 (-> self child)))
|
|
(while s3-1
|
|
(when (send-event (-> s3-1 0) 'is-gravity)
|
|
(send-event (-> s3-1 0) 'impact s4-0 (vector-float*! (new 'stack-no-clear 'vector) s5-1 (- f26-0)))
|
|
0
|
|
(goto cfg-38)
|
|
)
|
|
(set! s3-1 (-> s3-1 0 brother))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(label cfg-38)
|
|
f30-0
|
|
)
|
|
(else
|
|
1.0
|
|
)
|
|
)
|
|
)
|
|
(vector+! (-> self root trans) (-> self root trans) gp-2)
|
|
(if (< f30-0 1.0)
|
|
(vector+float*! (-> self root trans) (-> self root trans) (-> self root transv) (* f30-0 (seconds-per-frame)))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(gun-dark-2-anim-code)
|
|
)
|
|
:post (behavior ()
|
|
(let ((gp-0 (-> self skel status)))
|
|
(logior! (-> self skel status) (joint-control-status sync-math))
|
|
(ja-post)
|
|
(update-transforms (-> self root))
|
|
(set! (-> self skel status) gp-0)
|
|
)
|
|
(let ((gp-1 (-> self child)))
|
|
(while gp-1
|
|
(when (send-event (-> gp-1 0) 'is-gravity)
|
|
(send-event (-> gp-1 0) 'update-rotation)
|
|
(return 0)
|
|
)
|
|
(set! gp-1 (-> gp-1 0 brother))
|
|
)
|
|
)
|
|
)
|
|
)
|