Files
jak-project/goal_src/jak2/levels/common/enemy/fodder/fodder.gc
T
Hat Kid 459d83f755 decomp: tomb-* files, target-indax, grunt-mech, breakable-wall, pillar-collapse, mechtest-obs, ruins-obs (#2114)
Manual patches in:

- `tomb-boulder`: a few `ppointer->handle`s (I think) were not being
decompiled properly (all used in combination with `clone-anim-once`)
- `ruins-obs`, `pillar-collapse`: `art-joint-anim` casts
- `tomb-beetle`: commented out a call to `shadow-control-method-14` that
was crashing the game when spawning the beetles
- `grunt-mech`: commented out `(.mula.s)` instruction

Notes:
- `enemy-info`'s `idle-anim-script` is most likely a `(pointer
idle-control-frame)`, however, some `nav-enemy-info` labels set it to
`#f` (first encountered in `tomb-beetle`, but also present in `hal`,
`roboguard` and `metalkor-setup`), which crashes the decompiler. This
may become a problem in the future when we eventually get to these
files. For this PR, I made `tomb-beetle` decompile with
`idle-anim-script` set to `#f` and have not noticed any issues/crashes
with that.
- `tomb-boulder` compiles and doesn't crash, but when trying to play the
Daxter chase sequence, the boulder sometimes either spawns at the origin
or spawns in the correct place, but doesn't move.

Co-authored-by: water <awaterford111445@gmail.com>
2023-01-14 13:53:31 -05:00

1128 lines
41 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: fodder.gc
;; name in dgo: fodder
;; dgos: ATO, SEB, SWB, RUI
;; DECOMP BEGINS
(defskelgroup skel-fodder fodder fodder-lod0-jg -1
((fodder-lod0-mg (meters 20)) (fodder-lod1-mg (meters 999999)))
:bounds (static-spherem 0 0 0 2)
:shadow fodder-shadow-mg
:origin-joint-index 12
)
(deftype fodder-anim-info (structure)
((anim-index int32 :offset-assert 0)
)
:pack-me
:method-count-assert 9
:size-assert #x4
:flag-assert #x900000004
)
(deftype fodder-global-info (basic)
((prev-blue-hit int8 :offset-assert 4)
(blue-hit-anim fodder-anim-info 3 :inline :offset-assert 8)
)
:method-count-assert 9
:size-assert #x14
:flag-assert #x900000014
)
(deftype fodder (nav-enemy)
((left-eye joint-mod :offset-assert 604)
(right-eye joint-mod :offset-assert 608)
(look-at-other handle :offset-assert 616)
(neck-away-from basic :offset-assert 624)
(look-at-other-time time-frame :offset-assert 632)
(pad-iuj1n23i1 uint32 3 :offset-assert 640)
(slow-timer time-frame :offset-assert 656)
(fast-timer time-frame :offset-assert 664)
(attack-type uint64 :offset-assert 672)
(test-vec vector :inline :offset-assert 688)
)
:heap-base #x240
:method-count-assert 183
:size-assert #x2c0
:flag-assert #xb7024002c0
(:methods
(fodder-method-178 (_type_) none 178)
(fodder-method-179 (_type_ vector) float 179)
(fodder-method-180 (_type_) symbol 180)
(fodder-method-181 (_type_ symbol) none 181)
(fodder-method-182 (_type_) float 182)
)
)
(define *fodder-global-info*
(new 'static 'fodder-global-info :blue-hit-anim (new 'static 'inline-array fodder-anim-info 3
(new 'static 'fodder-anim-info :anim-index 18)
(new 'static 'fodder-anim-info :anim-index 19)
(new 'static 'fodder-anim-info :anim-index 20)
)
)
)
(define *fodder-nav-enemy-info*
(new 'static 'nav-enemy-info
:use-die-falling #t
:use-victory #f
:use-jump-blocked #t
:debug-draw-neck #f
:jump-debug-draw #f
:move-to-ground #t
:hover-if-no-ground #f
:idle-anim-script (new 'static 'array idle-control-frame 4
(new 'static 'idle-control-frame :command #x1 :anim #x4 :param0 #x1 :param1 #x1)
(new 'static 'idle-control-frame)
(new 'static 'idle-control-frame)
(new 'static 'idle-control-frame)
)
:idle-anim 6
:notice-anim 13
:hostile-anim 7
:hit-anim 13
:knocked-anim 16
:knocked-land-anim 17
:die-anim 14
:die-falling-anim 21
:victory-anim 6
:jump-wind-up-anim 7
:jump-in-air-anim 7
:jump-land-anim 7
:neck-joint 5
:look-at-joint 5
:bullseye-joint 4
:sound-hit (static-sound-name "fodder-hit")
:sound-die (static-sound-name "fodder-die")
:notice-distance (meters 40)
:notice-distance-delta (meters 10)
:proximity-notice-distance (meters 40)
:default-hit-points 1
:gnd-collide-with (collide-spec backgnd)
:overlaps-others-collide-with-filter (collide-spec jak bot player-list)
:penetrate-knocked #x11fffdffa
:movement-gravity (meters -100)
:friction 0.8
:attack-shove-back (meters 3)
:attack-shove-up (meters 2)
:attack-mode 'generic
:attack-damage 1
:recover-gnd-collide-with (collide-spec backgnd crate obstacle hit-by-others-list pusher)
:jump-height-min (meters 3)
:jump-height-factor 0.5
:knocked-seek-ry-clamp 4551.1113
:knocked-soft-vxz-lo 72089.6
:knocked-soft-vxz-hi 108134.4
:knocked-soft-vy-lo 81920.0
:knocked-soft-vy-hi 122880.0
:knocked-medium-vxz-lo 147456.0
:knocked-medium-vxz-hi 196608.0
:knocked-medium-vy-lo 135168.0
:knocked-medium-vy-hi 151552.0
:knocked-hard-vxz-lo 78643.2
:knocked-hard-vxz-hi 117964.8
:knocked-hard-vy-lo 183500.8
:knocked-hard-vy-hi 209715.2
:knocked-huge-vxz-lo 164659.2
:knocked-huge-vxz-hi 249036.8
:knocked-huge-vy-lo 183500.8
:knocked-huge-vy-hi 217907.2
:knocked-yellow-vxz-lo 40960.0
:knocked-yellow-vxz-hi 49152.0
:knocked-yellow-vy-lo 57344.0
:knocked-yellow-vy-hi 81920.0
:knocked-red-vxz-lo 24576.0
:knocked-red-vxz-hi 196608.0
:knocked-red-vy-lo 94208.0
:knocked-red-vy-hi 151552.0
:knocked-blue-vxz-lo 40960.0
:knocked-blue-vxz-hi 49152.0
:knocked-blue-vy-lo 24576.0
:knocked-blue-vy-hi 81920.0
:shadow-size (meters 2)
:shadow-max-y (meters 1)
:shadow-min-y (meters -1)
:shadow-locus-dist (meters 150)
:gem-joint -1
:gem-offset (new 'static 'sphere :r 163840.0)
:callback-info #f
:use-momentum #f
:use-frustration #t
:use-stop-chase #f
:use-circling #t
:use-pacing #t
:walk-anim 12
:turn-anim 7
:run-anim 7
:taunt-anim -1
:run-travel-speed (meters 7.5)
:run-acceleration (meters 1)
:run-turning-acceleration (meters 100)
:walk-travel-speed (meters 4)
:walk-acceleration (meters 1)
:walk-turning-acceleration (meters 3)
:maximum-rotation-rate (degrees 360.0)
:notice-nav-radius (meters 1.5)
:frustration-distance (meters 8)
:frustration-time (seconds 4)
:blocked-time (seconds 0.3)
:circle-dist-lo 20480.0
:circle-dist-hi 61440.0
:nav-mesh #f
)
)
(set! (-> *fodder-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*)
(defmethod enemy-method-109 fodder ((obj fodder) (arg0 int))
(let ((t9-0 (method-of-type nav-enemy enemy-method-109)))
(t9-0 obj arg0)
)
(if (nonzero? (-> obj left-eye))
(mode-set! (-> obj left-eye) (joint-mod-mode polar-look-at))
)
(if (nonzero? (-> obj right-eye))
(mode-set! (-> obj right-eye) (joint-mod-mode polar-look-at))
)
0
(none)
)
(defmethod enemy-method-110 fodder ((obj fodder))
(let ((t9-0 (method-of-type nav-enemy enemy-method-110)))
(t9-0 obj)
)
(if (nonzero? (-> obj left-eye))
(shut-down (-> obj left-eye))
)
(if (nonzero? (-> obj right-eye))
(shut-down (-> obj right-eye))
)
0
(none)
)
(defmethod fodder-method-179 fodder ((obj fodder) (arg0 vector))
(when (not arg0)
(let ((a0-2 (handle->process (-> obj focus handle))))
(if a0-2
(set! arg0 (get-trans (the-as process-focusable a0-2) 2))
(return 0.0)
)
)
)
(when (nonzero? (-> obj left-eye))
(target-set! (-> obj left-eye) arg0)
(when (nonzero? (-> obj left-eye))
(set! (-> obj left-eye polar-external-tilt-max) (-> obj right-eye polar-internal-tilt-max))
(set! (-> obj left-eye polar-external-radius) (-> obj right-eye polar-internal-radius))
)
)
(when (nonzero? (-> obj right-eye))
(target-set! (-> obj right-eye) arg0)
(when (nonzero? (-> obj right-eye))
(set! (-> obj right-eye polar-external-tilt-max) (-> obj left-eye polar-internal-tilt-max))
(set! (-> obj right-eye polar-external-radius) (-> obj left-eye polar-internal-radius))
)
)
)
(defmethod fodder-method-180 fodder ((obj fodder))
(with-pp
(when (>= (- (-> pp clock frame-counter) (-> obj look-at-other-time)) (seconds 0.25))
(dotimes (s5-0 (-> obj actor-group-count))
(let ((s4-0 (-> obj actor-group s5-0)))
(dotimes (s3-0 (-> s4-0 length))
(let* ((s1-0 (-> s4-0 data s3-0 actor extra process))
(s2-0 (if (type? s1-0 fodder)
(the-as fodder s1-0)
)
)
)
(when (and s2-0 (!= s2-0 obj) (>= (- (-> pp clock frame-counter) (-> s2-0 look-at-other-time)) (seconds 0.25)))
(let* ((s1-2 (vector-! (new 'stack-no-clear 'vector) (-> s2-0 root-override2 trans) (-> obj root-override2 trans)))
(f0-0 (vector-length s1-2))
)
(when (< f0-0 8192.0)
(vector-float*! s1-2 s1-2 (/ 1.0 f0-0))
(let ((f30-0 (vector-dot
s1-2
(-> (quaternion->matrix (new 'stack-no-clear 'matrix) (-> obj root-override2 quat)) vector 2)
)
)
)
(when (< (cos 14563.556) f30-0)
(let ((v1-29 (ja-channel-float! (the-as art-joint-anim (-> obj draw art-group data 15)) 0.0 0.0 0.0)))
(when v1-29
(set! (-> obj skel interp-select 0) #xe00010)
(set! (-> obj skel interp-select 1) 0)
(set! (-> v1-29 param 0) 1.0)
(set! (-> v1-29 param 1) 1.0)
(set! (-> v1-29 param 2) 1.0)
(set! (-> v1-29 num-func) num-func-interp1-play!)
)
)
(set! (-> obj look-at-other-time) (-> pp clock frame-counter))
(set! (-> obj look-at-other) (process->handle s2-0))
(set! (-> obj neck-away-from) #f)
(set! (-> s2-0 look-at-other-time) (-> pp clock frame-counter))
(set! (-> s2-0 look-at-other) (process->handle obj))
(set! (-> s2-0 neck-away-from) (the-as basic #t))
)
)
)
)
)
)
)
)
)
#f
)
)
)
(defmethod enemy-method-55 fodder ((obj fodder))
(with-pp
(let ((t9-0 (method-of-type nav-enemy enemy-method-55)))
(t9-0 obj)
)
(let ((v1-1 (the-as process-drawable #f)))
(cond
((and (< (- (-> pp clock frame-counter) (-> obj look-at-other-time)) (seconds 0.5))
(begin
(let ((s5-0 (handle->process (-> obj look-at-other))))
(set! v1-1 (if (type? s5-0 process-drawable)
(the-as process-drawable s5-0)
)
)
)
v1-1
)
)
(let ((s5-1 (vector<-cspace! (new 'static 'vector) (-> v1-1 node-list data 5))))
(fodder-method-179 obj s5-1)
(cond
((zero? (-> obj neck))
)
((-> obj neck-away-from)
(let ((s4-0 (new 'static 'vector)))
(let ((v1-11 (vector<-cspace! (new 'static 'vector) (-> obj node-list data 5))))
(vector-! s4-0 v1-11 s5-1)
(vector+! s4-0 s4-0 v1-11)
)
(target-set! (-> obj neck) s4-0)
)
)
(else
(target-set! (-> obj neck) s5-1)
)
)
)
)
((logtest? (-> obj enemy-flags) (enemy-flag lock-focus))
(fodder-method-179 obj (the-as vector #f))
)
)
)
(none)
)
)
(defstate idle (fodder)
:virtual #t
:post (behavior ()
(let ((t9-0 (-> (method-of-type nav-enemy idle) post)))
(if t9-0
((the-as (function none) t9-0))
)
)
(update-transforms (-> self root-override2))
(none)
)
)
(defstate active (fodder)
:virtual #t
:enter (behavior ()
(let ((t9-0 (-> (method-of-type nav-enemy active) enter)))
(if t9-0
(t9-0)
)
)
(logclear! (-> self enemy-flags) (enemy-flag spawn-gem chase-startup use-notice-distance))
(none)
)
:code (behavior ()
(let ((f30-0 (get-rand-float-range self 0.9 1.1)))
(until #f
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override walk-anim))
:num! (seek!
(the float
(+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override walk-anim)))
frames
num-frames
)
-1
)
)
f30-0
)
:frame-num 0.0
)
(until (ja-done? 0)
(suspend)
(ja :num! (seek! max f30-0))
)
(when (enemy-method-123 self 0.8)
(let ((v1-33 self))
(set! (-> v1-33 enemy-flags) (the-as enemy-flag (logclear (-> v1-33 enemy-flags) (enemy-flag enemy-flag36))))
(set! (-> v1-33 nav callback-info) *nav-enemy-null-callback-info*)
)
0
(set! (-> self state-time) (-> self clock frame-counter))
(until (not #f)
(ja-no-eval :num! (loop!))
(ja-channel-push! 1 (seconds 0.25))
(ja-no-eval :group! fodder-idle-ja
:num! (seek! (the float (+ (-> (the-as art-joint-anim fodder-idle-ja) frames num-frames) -1)) f30-0)
:frame-num 0.0
)
(until (ja-done? 0)
(ja-blend-eval)
(suspend)
(ja :num! (seek! max f30-0))
)
(ja-no-eval :num! (loop!))
(ja-channel-push! 1 (seconds 0.25))
(dotimes (gp-0 (rand-vu-int-range 4 7))
(ja-no-eval :group! fodder-chew-ja
:num! (seek! (the float (+ (-> (the-as art-joint-anim fodder-chew-ja) frames num-frames) -1)) f30-0)
:frame-num 0.0
)
(until (ja-done? 0)
(ja-blend-eval)
(suspend)
(ja :num! (seek! max f30-0))
)
)
)
(let ((v1-93 self))
(if (not (logtest? (enemy-flag enemy-flag36) (-> v1-93 enemy-flags)))
(set! (-> v1-93 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-93 enemy-flags))))
)
(set! (-> v1-93 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-93 enemy-flags))))
(set! (-> v1-93 nav callback-info) (-> v1-93 enemy-info-override callback-info))
)
0
(ja-no-eval :num! (loop!))
(ja-channel-push! 1 (seconds 0.25))
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override walk-anim))
:num! (seek!
(the float
(+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override walk-anim)))
frames
num-frames
)
-1
)
)
f30-0
)
:frame-num 0.0
)
(until (ja-done? 0)
(ja-blend-eval)
(suspend)
(ja :num! (seek! max f30-0))
)
)
)
)
#f
(none)
)
)
(defstate notice (fodder)
:virtual #t
:code (behavior ()
(ja-channel-push! 1 (seconds 0.075))
(let ((f30-0 (get-rand-float-range self 0.8 1.2))
(gp-0 (new 'stack-no-clear 'vector))
)
(enemy-method-110 self)
(if (nonzero? (-> self neck))
(mode-set! (-> self neck) (joint-mod-mode look-at))
)
(if (nonzero? (-> self left-eye))
(mode-set! (-> self left-eye) (joint-mod-mode polar-look-at))
)
(if (nonzero? (-> self right-eye))
(mode-set! (-> self right-eye) (joint-mod-mode polar-look-at))
)
(let* ((s5-0 0)
(f28-0 0.5)
(v1-18 (/ (the-as int (rand-uint31-gen *random-generator*)) 256))
(v1-19 (the-as number (logior #x3f800000 v1-18)))
(s4-0 (< f28-0 (+ -1.0 (the-as float v1-19))))
)
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override notice-anim))
:num! (seek!
(the float
(+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override notice-anim)))
frames
num-frames
)
-1
)
)
(* 2.0 f30-0)
)
:frame-num 0.0
)
(until (ja-done? 0)
(if (< (vector-length (vector-! (new 'stack-no-clear 'vector) (target-pos 0) (-> self root-override2 trans)))
12288.0
)
(goto cfg-22)
)
(set! s5-0 (- (the-as time-frame s5-0) (- (-> self clock frame-counter) (-> self clock old-frame-counter))))
(when (<= s5-0 0)
(set! s5-0 (rand-vu-int-range 75 150))
(set! s4-0 (not s4-0))
(let ((s3-2 (new 'stack-no-clear 'matrix)))
(quaternion->matrix s3-2 (-> self root-override2 quat))
(let* ((f28-1 0.5)
(f26-0 8.0)
(v1-56 (/ (the-as int (rand-uint31-gen *random-generator*)) 256))
(v1-57 (the-as number (logior #x3f800000 v1-56)))
(v1-59 (+ f28-1 (* f26-0 (+ -1.0 (the-as float v1-57)))))
)
(if s4-0
(set! v1-59 (- v1-59))
)
(vector+float*! gp-0 (-> s3-2 vector 2) (the-as vector (-> s3-2 vector)) v1-59)
)
(vector-normalize! gp-0 16384.0)
(vector+float*! gp-0 gp-0 (-> s3-2 vector 1) (rand-vu-float-range 5079.04 7168.0))
)
(vector+! gp-0 gp-0 (-> self root-override2 trans))
)
(if (nonzero? (-> self neck))
(target-set! (-> self neck) gp-0)
)
(fodder-method-179 self gp-0)
(suspend)
(ja :num! (seek! max (* 2.0 f30-0)))
)
)
)
(label cfg-22)
(get-rand-float-range self 0.8 1.2)
(new 'stack-no-clear 'vector)
(enemy-method-109 self 1)
(enemy-method-110 self)
(if (nonzero? (-> self left-eye))
(shut-down (-> self left-eye))
)
(if (nonzero? (-> self right-eye))
(shut-down (-> self right-eye))
)
(let ((gp-1 (-> self focus aware)))
(cond
((and (= gp-1 (enemy-aware enemy-aware-3)) (enemy-method-107 self))
(go-hostile self)
)
((>= 1 (the-as int gp-1))
(go-virtual active)
)
(else
(go-stare self)
)
)
)
(none)
)
)
(defmethod fodder-method-182 fodder ((obj fodder))
(ja-channel-push! 2 (seconds 0.2))
(let ((s5-0 (-> obj skel root-channel 0)))
(joint-control-channel-group-eval!
s5-0
(the-as art-joint-anim (-> obj draw art-group data (-> obj enemy-info-override hostile-anim)))
num-func-identity
)
(set! (-> s5-0 frame-num) 0.0)
)
(let ((s5-1 (-> obj skel root-channel 1)))
(let* ((v1-10 (/ (the-as int (rand-uint31-gen *random-generator*)) 256))
(v1-11 (the-as number (logior #x3f800000 v1-10)))
(f0-3 (+ -1.0 (the-as float v1-11)))
)
(set! (-> s5-1 frame-interp 1) f0-3)
(set! (-> s5-1 frame-interp 0) f0-3)
)
(joint-control-channel-group-eval!
s5-1
(the-as art-joint-anim (-> obj draw art-group data 8))
num-func-identity
)
(set! (-> s5-1 frame-num) 0.0)
)
)
(defstate hostile (fodder)
:virtual #t
:enter (behavior ()
(let ((t9-0 (-> (method-of-type nav-enemy hostile) enter)))
(if t9-0
(t9-0)
)
)
(fodder-method-181 self #t)
(set! (-> self slow-timer) 0)
(set! (-> self fast-timer) 0)
0
(none)
)
:exit (behavior ()
(let ((v1-0 (-> self nav)))
(set! (-> v1-0 target-speed) (-> self enemy-info-override run-travel-speed))
)
0
(let ((v1-2 (-> self nav)))
(set! (-> v1-2 turning-acceleration) (-> self enemy-info-override run-turning-acceleration))
)
0
(fodder-method-181 self #f)
(if (logtest? (-> self enemy-flags) (enemy-flag check-water))
(logior! (-> self focus-status) (focus-status dangerous))
(logclear! (-> self focus-status) (focus-status dangerous))
)
(none)
)
:trans (behavior ()
(let ((t9-0 (-> (method-of-type nav-enemy hostile) trans)))
(if t9-0
(t9-0)
)
)
(fodder-method-180 self)
(let ((a0-2 (handle->process (-> self focus handle))))
(when a0-2
(set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable a0-2) 0) quad))
(let ((f30-0 (vector-vector-xz-distance-squared (-> self focus-pos) (-> self root-override2 trans))))
(let ((f0-0 24576.0))
(when (and (< f30-0 (* f0-0 f0-0)) (zero? (-> self slow-timer)))
(let ((v1-20 (-> self nav)))
(set! (-> v1-20 target-speed) 0.0)
)
0
(let ((v1-22 (-> self nav)))
(set! (-> v1-22 turning-acceleration) 0.0)
)
0
(set! (-> self slow-timer) (-> self clock frame-counter))
(ja-channel-push! 1 (seconds 0.08))
(ja :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)))
(ja :num-func num-func-identity :frame-num 0.0)
(if (logtest? (-> self enemy-flags) (enemy-flag check-water))
(logior! (-> self focus-status) (focus-status dangerous))
(logclear! (-> self focus-status) (focus-status dangerous))
)
(let* ((v1-40 (/ (the-as int (rand-uint31-gen *random-generator*)) 256))
(v1-41 (the-as number (logior #x3f800000 v1-40)))
)
(if (< (+ -1.0 (the-as float v1-41)) 0.5)
(set! (-> self attack-type) (the-as uint 1))
(set! (-> self attack-type) (the-as uint 2))
)
)
)
)
(when (and (nonzero? (-> self slow-timer))
(zero? (-> self fast-timer))
(>= (- (-> self clock frame-counter) (-> self slow-timer)) (seconds 0.35))
)
(set! (-> self fast-timer) (-> self clock frame-counter))
(ja-channel-push! 1 (seconds 0.02))
(let ((v1-55 (-> self attack-type)))
(cond
((zero? v1-55)
(ja :group! (-> self draw art-group data (-> self enemy-info-override hostile-anim)))
)
((= v1-55 1)
(ja :group! fodder-jump-chomp-ja)
(logior! (-> self focus-status) (focus-status dangerous))
(let* ((v1-64 *game-info*)
(a0-30 (+ (-> v1-64 attack-id) 1))
)
(set! (-> v1-64 attack-id) a0-30)
(set! (-> self attack-id) a0-30)
)
)
(else
(ja :group! fodder-jump-kick-ja)
(logior! (-> self focus-status) (focus-status dangerous))
(let* ((v1-70 *game-info*)
(a0-35 (+ (-> v1-70 attack-id) 1))
)
(set! (-> v1-70 attack-id) a0-35)
(set! (-> self attack-id) a0-35)
)
)
)
)
(ja :num-func num-func-identity :frame-num 0.0)
)
(when (nonzero? (-> self fast-timer))
(let ((s5-0
(vector-normalize!
(vector-! (new 'stack-no-clear 'vector) (-> self focus-pos) (-> self root-override2 trans))
1.0
)
)
(gp-1 (new 'stack-no-clear 'vector))
)
(set! (-> gp-1 quad)
(-> (quaternion->matrix (new 'stack-no-clear 'matrix) (-> self root-override2 quat)) vector 2 quad)
)
(let* ((f0-11 (acos (vector-dot s5-0 gp-1)))
(v1-81 (-> self attack-type))
(v1-82 (cond
((zero? v1-81)
300
)
((= v1-81 1)
120
)
(else
120
)
)
)
)
(cond
((>= (- (-> self clock frame-counter) (-> self fast-timer)) v1-82)
(set! (-> self slow-timer) 0)
(set! (-> self fast-timer) 0)
(let ((v1-83 (-> self nav)))
(set! (-> v1-83 target-speed) (-> self enemy-info-override run-travel-speed))
)
0
(let ((v1-85 (-> self nav)))
(set! (-> v1-85 turning-acceleration) (-> self enemy-info-override run-turning-acceleration))
)
0
(let ((v1-89 (ja-group)))
(if (not (and v1-89 (= v1-89 (-> self draw art-group data (-> self enemy-info-override hostile-anim)))))
(fodder-method-182 self)
)
)
(go-virtual circling)
)
((< f0-11 3640.889)
(let ((v1-99 (-> self nav)))
(set! (-> v1-99 target-speed) (* 2.5 (-> self enemy-info-override run-travel-speed)))
)
0
(let ((v1-101 (-> self nav)))
(set! (-> v1-101 turning-acceleration) (* 2.5 (-> self enemy-info-override run-turning-acceleration)))
)
0
)
(else
(let ((v1-103 (-> self nav)))
(set! (-> v1-103 target-speed) (-> self enemy-info-override run-travel-speed))
)
0
(let ((v1-105 (-> self nav)))
(set! (-> v1-105 turning-acceleration) (-> self enemy-info-override run-turning-acceleration))
)
0
)
)
)
)
)
(when (zero? (-> self attack-type))
(let ((f0-20 20480.0))
(when (and (< f30-0 (* f0-20 f0-20))
(>= (- (-> self clock frame-counter) (-> self look-at-other-time)) (seconds 0.125))
)
(let ((v1-117 (ja-channel-float! (the-as art-joint-anim fodder-snap-ja) 0.0 0.0 0.0)))
(when v1-117
(set! (-> self skel interp-select 0) #xe00010)
(set! (-> self skel interp-select 1) 0)
(set! (-> v1-117 param 0) 1.0)
(set! (-> v1-117 param 1) 1.0)
(set! (-> v1-117 param 2) 1.0)
(set! (-> v1-117 num-func) num-func-interp1-play!)
)
)
(set! (-> self look-at-other-time) (-> self clock frame-counter))
)
)
)
)
)
)
(none)
)
:code (behavior ()
(fodder-method-182 self)
(let ((f30-0 (get-rand-float-range self 0.9 1.1)))
(until #f
(suspend)
(ja :num! (loop! f30-0))
(let ((v1-9 (ja-group)))
(if (and v1-9 (= v1-9 (-> self draw art-group data (-> self enemy-info-override hostile-anim))))
(ja :chan 1 :num! (chan 0))
)
)
)
)
#f
(none)
)
)
(defstate victory (fodder)
:virtual #t
:enter (behavior ()
(let ((t9-0 (-> (method-of-type nav-enemy victory) enter)))
(if t9-0
(t9-0)
)
)
(sound-play "fodder-bite" :position (-> self root-override2 trans))
(none)
)
)
(defstate circling (fodder)
:virtual #t
:code (behavior ()
(let ((v1-2 (ja-group)))
(when (and v1-2 (= v1-2 (-> self draw art-group data (-> self enemy-info-override walk-anim))))
(ja-no-eval :num! (seek!))
(while (not (ja-done? 0))
(suspend)
(ja-eval)
)
)
)
(until #f
(let ((v1-15 self))
(if (not (logtest? (enemy-flag enemy-flag36) (-> v1-15 enemy-flags)))
(set! (-> v1-15 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-15 enemy-flags))))
)
(set! (-> v1-15 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-15 enemy-flags))))
(set! (-> v1-15 nav callback-info) (-> v1-15 enemy-info-override callback-info))
)
0
(let ((v1-18 self))
(set! (-> v1-18 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-18 enemy-flags))))
)
0
(let ((v1-20 (-> self nav)))
(set! (-> v1-20 target-speed) 16384.0)
)
0
(let ((v1-22 (-> self nav)))
(set! (-> v1-22 acceleration) (-> self enemy-info-override run-acceleration))
)
0
(let ((v1-24 (-> self nav)))
(set! (-> v1-24 turning-acceleration) (-> self enemy-info-override run-turning-acceleration))
)
0
(let ((gp-0 (-> self draw art-group data (-> self enemy-info-override walk-anim))))
(let ((v1-32 (ja-group)))
(if (not (and v1-32 (= v1-32 gp-0)))
(ja-channel-push! 1 (seconds 0.1))
)
)
(let ((s5-0 (get-rand-int self 8))
(f30-0 (get-rand-float-range self 0.9 1.1))
)
(while (nonzero? s5-0)
(+! s5-0 -1)
(ja-no-eval :group! gp-0
:num! (seek! (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1)) f30-0)
:frame-num 0.0
)
(until (ja-done? 0)
(suspend)
(ja :num! (seek! max f30-0))
)
)
)
)
(when (< 20480.0 (vector-vector-xz-distance (-> self focus-pos) (-> self root-override2 trans)))
(let ((v1-59 self))
(set! (-> v1-59 enemy-flags) (the-as enemy-flag (logclear (-> v1-59 enemy-flags) (enemy-flag enemy-flag36))))
(set! (-> v1-59 nav callback-info) *nav-enemy-null-callback-info*)
)
0
(let ((v1-62 self))
(set! (-> v1-62 enemy-flags) (the-as enemy-flag (logclear (-> v1-62 enemy-flags) (enemy-flag enemy-flag37))))
)
0
(vector-reset! (-> self root-override2 transv))
(let ((v1-68 (ja-group)))
(if (not (and v1-68 (= v1-68 (-> self draw art-group data (-> self enemy-info-override victory-anim)))))
(ja-channel-push! 1 (seconds 0.1))
)
)
(let ((f30-2 (get-rand-float-range self 0.9 1.1)))
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override victory-anim))
:num! (seek!
(the float
(+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override victory-anim)))
frames
num-frames
)
-1
)
)
f30-2
)
:frame-num 0.0
)
(until (ja-done? 0)
(suspend)
(ja :num! (seek! max f30-2))
)
)
)
)
#f
(none)
)
)
(defmethod enemy-method-77 fodder ((obj fodder) (arg0 (pointer float)))
(case (-> obj incoming knocked-type)
(((knocked-type knocked-type-6))
(let* ((a2-0 (ash 1 (-> *fodder-global-info* prev-blue-hit)))
(v1-3 (enemy-method-120 obj 3 a2-0))
(s5-1 (-> obj draw art-group data (-> *fodder-global-info* blue-hit-anim v1-3 anim-index)))
)
(set! (-> *fodder-global-info* prev-blue-hit) v1-3)
(let ((v1-6 (if (> (-> obj skel active-channels) 0)
(-> obj skel root-channel 0 frame-group)
)
)
)
(if (and v1-6 (= v1-6 (-> obj draw art-group data 17)))
(ja-channel-push! 1 (seconds 0.17))
(ja-channel-push! 1 (seconds 0.02))
)
)
(let ((a0-18 (-> obj skel root-channel 0)))
(set! (-> a0-18 frame-group) (the-as art-joint-anim s5-1))
(set! (-> a0-18 param 0) (the float (+ (-> (the-as art-joint-anim s5-1) frames num-frames) -1)))
(set! (-> a0-18 param 1) 1.0)
(set! (-> a0-18 frame-num) 0.0)
(joint-control-channel-group! a0-18 (the-as art-joint-anim s5-1) num-func-seek!)
)
)
)
(else
(let ((s4-0 (-> obj draw art-group data 16)))
(ja-channel-push! 1 (seconds 0.17))
(let ((a0-20 (-> obj skel root-channel 0)))
(set! (-> a0-20 frame-group) (the-as art-joint-anim s4-0))
(set! (-> a0-20 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1)))
(set! (-> a0-20 param 1) (-> arg0 0))
(set! (-> a0-20 frame-num) 0.0)
(joint-control-channel-group! a0-20 (the-as art-joint-anim s4-0) num-func-seek!)
)
)
)
)
#t
)
(defmethod enemy-method-78 fodder ((obj fodder) (arg0 (pointer float)))
(case (-> obj incoming knocked-type)
(((knocked-type knocked-type-6))
#f
)
(else
(let ((v1-5 (-> obj draw art-group data (-> obj enemy-info-override knocked-land-anim)))
(a0-3 (-> obj skel root-channel 0))
)
(set! (-> a0-3 frame-group) (the-as art-joint-anim v1-5))
(set! (-> a0-3 param 0) (the float (+ (-> (the-as art-joint-anim v1-5) frames num-frames) -1)))
(set! (-> a0-3 param 1) (-> arg0 0))
(set! (-> a0-3 frame-num) 0.0)
(joint-control-channel-group! a0-3 (the-as art-joint-anim v1-5) num-func-seek!)
)
#t
)
)
)
(defmethod fodder-method-181 fodder ((obj fodder) (arg0 symbol))
(let ((v1-3 (-> (the-as collide-shape-prim-group (-> obj root-override2 root-prim)) child 1)))
(cond
(arg0
(set! (-> v1-3 prim-core collide-as) (collide-spec enemy))
(set! (-> v1-3 prim-core collide-with) (collide-spec jak bot player-list))
)
(else
(set! (-> v1-3 prim-core collide-as) (collide-spec))
(set! (-> v1-3 prim-core collide-with) (collide-spec))
0
)
)
)
(none)
)
(defmethod coin-flip? fodder ((obj fodder))
"@returns The result of a 50/50 RNG roll"
#f
)
(defmethod enemy-method-114 fodder ((obj fodder))
"@abstract"
(let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player))))
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s5-0 reaction) cshape-reaction-default)
(set! (-> s5-0 no-reaction)
(the-as (function collide-shape-moving collide-query vector vector object) nothing)
)
(set! (-> s5-0 penetrated-by) (penetrate
generic-attack
lunge
flop
punch
spin
roll
uppercut
bonk
tube
vehicle
flut-attack
board
mech-punch
dark-punch
dark-giant
)
)
(let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0)))
(set! (-> s5-0 total-prims) (the-as uint 3))
(set! (-> s4-0 prim-core collide-as) (collide-spec enemy))
(set! (-> s4-0 prim-core collide-with)
(collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list)
)
(set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon))
(set! (-> s4-0 transform-index) 12)
(set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 9216.0)
(set! (-> s5-0 root-prim) s4-0)
)
(let ((v1-14 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> v1-14 prim-core collide-as) (collide-spec enemy))
(set! (-> v1-14 prim-core collide-with)
(collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list)
)
(set! (-> v1-14 prim-core action) (collide-action solid no-standon))
(set-vector! (-> v1-14 local-sphere) 0.0 4915.2 0.0 4915.2)
)
(let ((v1-16 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> v1-16 prim-core collide-as) (collide-spec enemy))
(set! (-> v1-16 prim-core collide-with) (collide-spec jak bot player-list))
(set! (-> v1-16 prim-core action) (collide-action deadly))
(set! (-> v1-16 transform-index) 5)
(set-vector! (-> v1-16 local-sphere) 0.0 0.0 0.0 2662.4)
)
(set! (-> s5-0 nav-radius) 4505.6)
(let ((v1-18 (-> s5-0 root-prim)))
(set! (-> s5-0 backup-collide-as) (-> v1-18 prim-core collide-as))
(set! (-> s5-0 backup-collide-with) (-> v1-18 prim-core collide-with))
)
(set! (-> s5-0 max-iteration-count) (the-as uint 3))
(set! (-> obj root-override2) s5-0)
)
0
(none)
)
;; WARN: Return type mismatch nav-enemy vs fodder.
(defmethod relocate fodder ((obj fodder) (arg0 int))
(if (nonzero? (-> obj left-eye))
(&+! (-> obj left-eye) arg0)
)
(if (nonzero? (-> obj right-eye))
(&+! (-> obj right-eye) arg0)
)
(the-as fodder ((the-as (function nav-enemy int nav-enemy) (find-parent-method fodder 7)) obj arg0))
)
(defun fodder-setup-eye-control ((arg0 joint-mod))
(set-vector! (-> arg0 twist-max) 16384.0 16384.0 0.0 1.0)
(set! (-> arg0 twist-min-x) 16384.0)
(set! (-> arg0 twist-min-y) 16384.0)
(set! (-> arg0 twist-speed-x) 0.2)
(set! (-> arg0 twist-speed-y) 0.2)
(set! (-> arg0 up) (the-as uint 1))
(set! (-> arg0 nose) (the-as uint 2))
(set! (-> arg0 ear) (the-as uint 0))
(set! (-> arg0 max-dist) 102400.0)
(set! (-> arg0 ignore-angle) 30947.555)
)
(defmethod enemy-method-115 fodder ((obj fodder))
"@abstract"
(stack-size-set! (-> obj main-thread) 256)
(initialize-skeleton
obj
(the-as skeleton-group (art-group-get-by-name *level* "skel-fodder" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
(set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame)
(enemy-method-113 obj *fodder-nav-enemy-info*)
(when (zero? (-> obj left-eye))
(set! (-> obj left-eye) (new 'process 'joint-mod (joint-mod-mode flex-blend) obj 23))
(fodder-setup-eye-control (-> obj left-eye))
)
(when (zero? (-> obj right-eye))
(set! (-> obj right-eye) (new 'process 'joint-mod (joint-mod-mode flex-blend) obj 24))
(fodder-setup-eye-control (-> obj right-eye))
)
(let ((v1-16 (-> obj neck)))
(set! (-> v1-16 up) (the-as uint 1))
(set! (-> v1-16 nose) (the-as uint 2))
(set! (-> v1-16 ear) (the-as uint 0))
(set-vector! (-> v1-16 twist-max) 10922.667 7281.778 0.0 1.0)
(set! (-> v1-16 ignore-angle) 18204.445)
)
(set! (-> obj look-at-other) (the-as handle #f))
(set! (-> obj look-at-other-time) 0)
(set! (-> obj neck-away-from) #f)
(let ((v1-18 (-> obj nav)))
(set! (-> v1-18 speed-scale) 1.0)
)
0
(set-gravity-length (-> obj root-override2 dynam) 573440.0)
(fodder-method-181 obj #f)
0
(none)
)
(defmethod enemy-method-99 fodder ((obj fodder) (arg0 process-focusable))
(logtest? (focus-status mech) (-> arg0 focus-status))
)