diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index e63f941c14..4ffbca9f01 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -18049,7 +18049,7 @@ (stretch-vel-parallel float :offset-assert 1348) (compress-vel float :offset-assert 1352) (compress-vel-parallel float :offset-assert 1356) - (negate-y basic :offset-assert 1360) + (negate-y symbol :offset-assert 1360) (axial-slop float :offset-assert 1364) (maximum-stretch float :offset-assert 1368) (turn-off-start time-frame :offset-assert 1376) @@ -18062,12 +18062,12 @@ (initialize-chain-joints (_type_) symbol 9) (turn-off (_type_ time-frame) none :behavior process 10) (update (_type_ process-drawable) none :behavior process 11) - (gravity-update (_type_) none 12) + (gravity-update (_type_ process-drawable) none 12) (apply-gravity (_type_ vector int process-drawable) none :behavior process 13) (chain-physics-method-14 (_type_ vector int) none 14) (clamp-length (_type_ vector vector object process-drawable) vector 15) (chain-physics-method-16 (_type_ int) float 16) - (chain-physics-method-17 (_type_ vector) none 17) + (chain-physics-method-17 (_type_ vector int) none 17) ) ) @@ -18185,7 +18185,7 @@ (ignore-handle handle :offset-assert 40) (pos vector :inline :offset-assert 48) (vel vector :inline :offset-assert 64) - (timeout handle :offset-assert 80) + (timeout time-frame :offset-assert 80) ) :method-count-assert 9 :size-assert #x58 @@ -18218,9 +18218,6 @@ ;; target-h ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; missing ref test - there's a useless array defintion with a list of not-yet-defined types -;; and this doesn't work in goalc. - (declare-type shadow-geo basic) (declare-type sidekick basic) (declare-type racer-info basic) @@ -18232,6 +18229,7 @@ (declare-type darkjak-info basic) (declare-type mech-info basic) (declare-type indax-info basic) +(declare-type turret-info basic) (deftype target (process-focusable) ((self-override target :offset 32 :score 100) (control control-info :offset 128 :score 200) ;; guessed by decompiler @@ -18297,7 +18295,7 @@ (pilot pilot-info :offset-assert 2208) (gun gun-info :offset-assert 2212) (mech mech-info :offset-assert 2216) - (turret basic :offset-assert 2220) + (turret turret-info :offset-assert 2220) (darkjak darkjak-info :offset-assert 2224) (indax indax-info :offset-assert 2228) ) @@ -18448,6 +18446,8 @@ (target-tube-start handle) target-turn-around (target-turret-get-on handle) + target-turret-get-off + (target-turret-stance handle) target-wade-stance target-wade-walk target-walk @@ -21139,7 +21139,8 @@ cam-free-floating cam-remote cam-launcher-longfall - cam-launcher-shortfall)) + cam-launcher-shortfall + cam-turret)) (deftype camera-master (process) ((master-options cam-master-options-u32 :offset-assert 128) @@ -35359,7 +35360,7 @@ ) (deftype hover-actor (structure) - ((handle uint64 :offset-assert 0) + ((handle handle :offset-assert 0) (offset vector :inline :offset-assert 16) ) :method-count-assert 9 @@ -35425,7 +35426,7 @@ :flag-assert #x1000100090 (:methods (idle () _type_ :state 14) - (hover-formation-method-15 (_type_) int 15) + (hover-formation-method-15 (_type_ vector vector) int 15) ) ) @@ -35502,8 +35503,8 @@ (deftype hover-nav-sphere (list-node) ((sphere sphere :inline :offset-assert 16) - (handle uint64 :offset-assert 32) - (timer uint64 :offset-assert 40) + (handle handle :offset-assert 32) + (timer time-frame :offset-assert 40) ) :method-count-assert 9 :size-assert #x30 @@ -35512,7 +35513,7 @@ (deftype hover-nav-path-segment (list-node) ((curve-matrix matrix :inline :offset-assert 16) - (pos-index int32 2 :offset-assert 80) + (pos-index float 2 :offset-assert 80) (dist float :offset-assert 88) (du float :offset-assert 92) ;; TODO stands for...? ) @@ -35534,7 +35535,7 @@ :size-assert #x10 :flag-assert #xa00000010 (:methods - (hover-nav-path-info-method-9 () none 9) + (hover-nav-path-info-method-9 (_type_) none 9) ) ) @@ -35547,7 +35548,7 @@ ) (deftype nav-network (basic) - ((network basic :offset-assert 4) + ((network (array nav-network-info) :offset-assert 4) (dummy nav-network-info :inline :offset-assert 16) (control-handle handle :offset-assert 88) (list-table list-node 5 :offset-assert 96) @@ -35556,37 +35557,38 @@ (sphere-list hover-nav-sphere :offset 108) (free-segment-list hover-nav-path-segment :offset 104) (free-sphere-list hover-nav-sphere :offset 112) - (segment-pool uint32 :offset-assert 116) - (sphere-pool uint32 :offset-assert 120) + (segment-pool (pointer hover-nav-path-segment) :offset-assert 116) + (sphere-pool (pointer hover-nav-sphere) :offset-assert 120) ) :method-count-assert 33 :size-assert #x7c :flag-assert #x210000007c (:methods + (new (symbol type) _type_ 0) (nav-network-method-9 (_type_) none 9) (nav-network-method-10 (_type_ level (array nav-network-info)) none 10) (nav-network-method-11 (_type_) none 11) (nav-network-method-12 (_type_) none 12) - (nav-network-method-13 (_type_) none 13) - (nav-network-method-14 (_type_ int) none 14) - (nav-network-method-15 (_type_) none 15) - (nav-network-method-16 (_type_) none 16) + (nav-network-method-13 (_type_ int nav-network-path-node) none 13) + (nav-network-method-14 (_type_ int nav-network-path-node) object 14) + (nav-network-method-15 (_type_ nav-network-path-node) object 15) + (nav-network-method-16 (_type_ nav-network-path-node) none 16) (nav-network-method-17 (_type_) nav-network-path-node 17) - (nav-network-method-18 (_type_) none 18) - (nav-network-method-19 (_type_) none 19) - (nav-network-method-20 (_type_) none 20) - (nav-network-method-21 (_type_) none 21) - (nav-network-method-22 (_type_) none 22) - (nav-network-method-23 (_type_) none 23) - (nav-network-method-24 (_type_) none 24) - (nav-network-method-25 (_type_) none 25) - (nav-network-method-26 (_type_) none 26) + (nav-network-method-18 (_type_ nav-network-path-node) none 18) + (nav-network-method-19 (_type_ nav-network-path-node) none 19) + (nav-network-method-20 (_type_ nav-network-path-node vector) none 20) + (nav-network-method-21 (_type_ object int int) none 21) + (nav-network-method-22 (_type_ hover-nav-path-info vector vector int int) hover-nav-path-segment 22) + (nav-network-method-23 (_type_ hover-nav-path-info) none 23) + (nav-network-method-24 (_type_ hover-nav-path-info int int int) symbol 24) + (nav-network-method-25 (_type_ process collide-prim-core) none 25) + (nav-network-method-26 (_type_ vector process vector vector float) vector 26) (nav-network-method-27 (_type_) none 27) (nav-network-method-28 (_type_) none 28) (nav-network-method-29 (_type_) symbol 29) - (get-network (_type_) basic 30) - (nav-network-method-31 () none 31) - (nav-network-method-32 () none 32) + (get-network (_type_) (array nav-network-info) 30) + (nav-network-method-31 (_type_ bounding-box) none 31) + (nav-network-method-32 (_type_ string) none 32) ) ) @@ -35602,11 +35604,11 @@ ) (deftype hover-nav-control (basic) - ((root basic :offset-assert 4) - (nav basic :offset-assert 8) + ((root collide-shape-moving :offset-assert 4) + (nav nav-network :offset-assert 8) (flags uint16 :offset-assert 12) (params hover-nav-params :offset-assert 16) - (path-timer uint64 :offset-assert 24) + (path-timer time-frame :offset-assert 24) (transvv vector :inline :offset-assert 32) (dest-pos vector :inline :offset-assert 48) (dest-vel vector :inline :offset-assert 64) @@ -35625,7 +35627,7 @@ (path-info hover-nav-path-info :inline :offset-assert 176) (curr-dest-pt int32 :offset-assert 192) (los-obstruction-distance float :offset-assert 196) - (los-last-clear-time time-frame :offset-assert 200) + (los-last-clear-time time-frame :offset-assert 200) (max-speed-multiplier float :offset-assert 208) (max-acceleration-multiplier float :offset-assert 212) ) @@ -35633,27 +35635,28 @@ :size-assert #xd8 :flag-assert #x20000000d8 (:methods + (new (symbol type process collide-shape-moving hover-nav-params) _type_ 0) (hover-nav-control-method-9 (_type_) none 9) - (hover-nav-control-method-10 (_type_) none 10) - (hover-nav-control-method-11 (_type_) none 11) + (hover-nav-control-method-10 (_type_ vector vector vector) none 10) + (hover-nav-control-method-11 (_type_ vector) none 11) (hover-nav-control-method-12 (_type_) none 12) (hover-nav-control-method-13 (_type_) none 13) (hover-nav-control-method-14 (_type_ float float) none 14) - (hover-nav-control-method-15 (_type_) none 15) - (hover-nav-control-method-16 (_type_) none 16) - (hover-nav-control-method-17 (_type_) none 17) - (hover-nav-control-method-18 (_type_) none 18) - (hover-nav-control-method-19 (_type_) none 19) + (hover-nav-control-method-15 (_type_ vector) none 15) + (hover-nav-control-method-16 (_type_ vector) vector 16) + (hover-nav-control-method-17 (_type_) collide-prim-core 17) + (hover-nav-control-method-18 (_type_ path-control int int) none 18) + (hover-nav-control-method-19 (_type_ (inline-array vector) int) none 19) (hover-nav-control-method-20 (_type_) none 20) (hover-nav-control-method-21 (_type_) none 21) (hover-nav-control-method-22 (_type_) hover-nav-path-segment 22) (hover-nav-control-method-23 (_type_) object 23) (hover-nav-control-method-24 (_type_) none 24) (hover-nav-control-method-25 (_type_) none 25) - (hover-nav-control-method-26 (_type_) none 26) - (hover-nav-control-method-27 (_type_) none 27) - (hover-nav-control-method-28 (_type_) none 28) - (hover-nav-control-method-29 (_type_) none 29) + (hover-nav-control-method-26 (_type_ vector vector float) symbol 26) + (hover-nav-control-method-27 (_type_ vector vector) int 27) + (hover-nav-control-method-28 (_type_ vector vector) none 28) + (hover-nav-control-method-29 (_type_ vector) none 29) (hover-nav-control-method-30 (_type_) float 30) (hover-nav-control-method-31 (_type_) float 31) ) @@ -35684,15 +35687,15 @@ ) (deftype hover-enemy (enemy) - ((hover basic :offset-assert 532) + ((hover hover-nav-control :offset-assert 532) (hover-info hover-enemy-info :offset-assert 536) - (formation-entity basic :offset-assert 540) + (formation-entity entity :offset-assert 540) (fly-anim-speed float :offset-assert 544) - (restart-fly-anims basic :offset-assert 548) + (restart-fly-anims symbol :offset-assert 548) (main-joint-acc vector :inline :offset-assert 560) (main-joint-vel vector :inline :offset-assert 576) (main-joint-pos vector :inline :offset-assert 592) - (thrust int64 2 :offset-assert 608) + (thrust float 2 :offset-assert 608) (rotation-vec vector :inline :offset-assert 624) (dest-pos vector :inline :offset-assert 640) (offset vector :inline :offset-assert 656) @@ -35700,7 +35703,7 @@ (local-dir vector :inline :offset-assert 688) (scale float :offset-assert 704) (scale-timer uint64 :offset-assert 712) - (hit-surface? basic :offset-assert 720) + (hit-surface? symbol :offset-assert 720) (knocked-start-level float :offset-assert 724) (knocked-fall-dist float :offset-assert 728) (flying-death-anim int32 :offset-assert 732) @@ -35715,25 +35718,25 @@ :size-assert #x310 :flag-assert #x9c02900310 (:methods - (hover-enemy-method-137 () none 137) - (hover-enemy-method-138 () none 138) - (hover-enemy-method-139 () none 139) - (hover-enemy-method-140 () none 140) - (hover-enemy-method-141 () none 141) - (hover-enemy-method-142 () none 142) - (hover-enemy-method-143 () none 143) - (hover-enemy-method-144 () none 144) - (hover-enemy-method-145 () none 145) - (hover-enemy-method-146 () none 146) - (hover-enemy-method-147 () none 147) - (hover-enemy-method-148 () none 148) - (hover-enemy-method-149 () none 149) - (hover-enemy-method-150 () none 150) - (hover-enemy-method-151 () none 151) - (hover-enemy-method-152 () none 152) - (hover-enemy-method-153 () none 153) - (hover-enemy-method-154 () none 154) - (hover-enemy-method-155 () none 155) + (knocked-recover () _type_ :state 137) + (flying-death () _type_ :state 138) + (flying-death-explode () _type_ :state 139) + (hover-enemy-method-140 (_type_ symbol) none 140) + (hover-enemy-method-141 (_type_ float) none 141) + (hover-enemy-method-142 (_type_) none 142) + (hover-enemy-method-143 (_type_ int float) none 143) + (hover-enemy-method-144 (_type_) none 144) + (hover-enemy-method-145 (_type_ int float int int) none 145) + (hover-enemy-method-146 (_type_) none 146) + (hover-enemy-method-147 (_type_) none 147) + (hover-enemy-method-148 (_type_) none 148) + (hover-enemy-method-149 (_type_) none 149) + (hover-enemy-method-150 (_type_) enemy-info 150) + (hover-enemy-method-151 (_type_) hover-enemy-info 151) + (hover-enemy-method-152 (_type_) hover-nav-params 152) + (hover-enemy-method-153 (_type_) none 153) + (hover-enemy-method-154 (_type_) none 154) + (hover-enemy-method-155 (_type_) none 155) ) ) @@ -35768,66 +35771,63 @@ ;; (define-extern detect-loop function) ;; (define-extern list-contains function) (define-extern *nav-network* nav-network) -;; (define-extern hover-bounce-reaction function) +(define-extern hover-bounce-reaction (function control-info collide-query vector vector collide-status)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; hover-enemy ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype wasp (hover-enemy) - ((gun-jmod basic :offset-assert 780) - (entity-group basic :offset-assert 784) - (smoke-part basic :offset-assert 788) - (engine-part basic :offset-assert 792) - (old-gravity float :offset-assert 800) - (knocked-anim int32 :offset-assert 804) - (knocked-recover-anim int32 :offset-assert 808) - (last-fire-time time-frame :offset-assert 812) - (bridge-index int32 :offset-assert 820) - (gun-x-angle float :offset-assert 824) - (gun-x-angle-final float :offset-assert 828) - (path-u float :offset-assert 832) - (path-du float :offset-assert 836) - (path-du-final float :offset-assert 840) - (path-dest float :offset-assert 844) - (plat-pos vector :inline :offset-assert 860) - (sound-id uint32 :offset-assert 876) - (attack-wait-min float :offset-assert 880) - (attack-wait-max float :offset-assert 884) - (attack-miss-dist-min float :offset-assert 888) - (attack-miss-dist-max float :offset-assert 892) - (attack-miss-dist-curr float :offset-assert 896) + ((gun-jmod joint-mod :offset-assert 784) + (entity-group actor-group :offset-assert 788) + (smoke-part sparticle-launch-control :offset-assert 792) + (engine-part sparticle-launch-control :offset-assert 796) + (old-gravity float :offset 804) + (knocked-anim int32 :offset-assert 808) + (knocked-recover-anim int32 :offset-assert 812) + (last-fire-time time-frame :offset-assert 816) + (bridge-index int32 :offset-assert 824) + (gun-x-angle float :offset-assert 828) + (gun-x-angle-final float :offset-assert 832) + (path-u float :offset-assert 836) + (path-du float :offset-assert 840) + (path-du-final float :offset-assert 844) + (path-dest float :offset-assert 848) + (plat-pos vector :inline :offset-assert 864) + (sound-id sound-id :offset-assert 880) + (attack-wait-min float :offset-assert 884) + (attack-wait-max float :offset-assert 888) + (attack-miss-dist-min float :offset-assert 892) + (attack-miss-dist-max float :offset-assert 896) + (attack-miss-dist-curr float :offset-assert 900) ) :method-count-assert 166 :size-assert #x388 :flag-assert #xa603100388 (:methods - (wasp-method-156 () none 156) - (wasp-method-157 () none 157) - (wasp-method-158 () none 158) - (wasp-method-159 () none 159) - (wasp-method-160 () none 160) - (wasp-method-161 () none 161) - (wasp-method-162 () none 162) - (wasp-method-163 () none 163) - (wasp-method-164 () none 164) - (wasp-method-165 () none 165) + (shoot-bridge-wait () _type_ :state 156) + (shoot-bridge-intro () _type_ :state 157) + (shoot-bridge-hold () _type_ :state 158) + (shoot-bridge-hostile () _type_ :state 159) + (shoot-bridge-attack () _type_ :state 160) + (shoot-bridge-outro () _type_ :state 161) + (attack () _type_ :state 162) + (die-now () _type_ :state 163) + (die-explode () _type_ :state 164) + (spawn-wasp-shot (_type_ projectile-init-by-other-params int float float) none 165) ) ) -|# -;; (define-extern hover-enemy-dest-post function) -;; (define-extern hover-enemy-hostile-post function) -;; (define-extern hover-enemy-fly-code function) +(define-extern hover-enemy-dest-post (function none :behavior hover-enemy)) +(define-extern hover-enemy-hostile-post (function none :behavior hover-enemy)) +(define-extern hover-enemy-fly-code (function none :behavior hover-enemy)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; hover-enemy-battle ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype hover-enemy-battle-command (structure) - ((command basic :offset-assert 0) + ((command symbol :offset-assert 0) (wave uint16 :offset-assert 4) (time time-frame :offset-assert 8) (alive-count int32 :offset-assert 16) @@ -35836,34 +35836,37 @@ :size-assert #x14 :flag-assert #x900000014 ) -|# -#| (deftype hover-enemy-manager (process) - () + ((command-table (array hover-enemy-battle-command) :offset-assert 128) + (path path-control :offset-assert 132) + (formation hover-formation-control :offset-assert 136) + (actor-group (pointer actor-group) :offset-assert 140) + (actor-group-count int32 :offset-assert 144) + (total-to-spawn int32 :offset-assert 148) + (num-spawned int32 :offset-assert 152) + (alive-count int32 :offset-assert 156) + (formation-timer time-frame :offset-assert 160) + ) :method-count-assert 19 :size-assert #xa8 :flag-assert #x13003000a8 - ;; Failed to read fields. (:methods - (hover-enemy-manager-method-9 () none 9) - (hover-enemy-manager-method-10 () none 10) - (hover-enemy-manager-method-11 () none 11) - (hover-enemy-manager-method-12 () none 12) - (hover-enemy-manager-method-13 () none 13) (idle () _type_ :state 14) - (spawning () _type_ :state 15) + (spawning (object object process pointer) _type_ :state 15) (die () _type_ :state 16) - (hover-enemy-manager-method-17 () none 17) - (hover-enemy-manager-method-18 () none 18) + (hover-enemy-manager-init! "Initialize this [[hover-enemy-manager]]." (_type_ (array hover-enemy-battle-command)) none 17) + (spawn-enemy (_type_ uint) none 18) ) ) -|# -;; (define-extern hover-enemy-manager-handler function) -;; (define-extern hover-enemy-manager-post function) -;; (define-extern hover-enemy-manager-init-by-other function) -;; (define-extern hover-manager-spawn function) +(declare-type base-turret process-focusable) +(declare-type turret base-turret) + +(define-extern hover-enemy-manager-handler (function process int symbol event-message-block object :behavior hover-enemy-manager)) +(define-extern hover-enemy-manager-post (function none :behavior hover-enemy-manager)) +(define-extern hover-enemy-manager-init-by-other (function entity-actor (array hover-enemy-battle-command) none :behavior hover-enemy-manager)) +(define-extern hover-manager-spawn (function turret entity-actor (array hover-enemy-battle-command) process)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; hover-formation ;; @@ -35944,7 +35947,6 @@ ;; wasp ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype wasp-shot (metalhead-shot) () :method-count-assert 40 @@ -35953,17 +35955,15 @@ (:methods ) ) -|# -;; (define-extern *wasp-exploder-params* joint-exploder-static-params) -;; (define-extern *wasp-enemy-info* enemy-info) -;; (define-extern shoot-bridge-post function) +(define-extern *wasp-exploder-params* joint-exploder-static-params) +(define-extern *wasp-enemy-info* enemy-info) +(define-extern shoot-bridge-post (function none :behavior wasp)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; crimson-guard-hover ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype crimson-guard-hover-shot (guard-shot) () :method-count-assert 40 @@ -35972,31 +35972,29 @@ (:methods ) ) -|# -#| (deftype crimson-guard-hover (hover-enemy) - ((gun-jmod basic :offset-assert 780) - (hips-jmod basic :offset-assert 784) - (entity-group basic :offset-assert 788) - (los los-control :inline :offset-assert 796) - (smoke-part basic :offset-assert 944) - (engine-part basic :offset-assert 948) - (last-fire-time time-frame :offset-assert 956) - (gun-x-angle float :offset-assert 964) - (gun-x-angle-final float :offset-assert 968) - (path-u float :offset-assert 972) - (path-du float :offset-assert 976) - (path-du-final float :offset-assert 980) - (path-dest float :offset-assert 984) - (sound-id uint32 :offset-assert 988) - (knocked-recover-anim int32 :offset-assert 992) - (attack-wait-min float :offset-assert 996) - (attack-wait-max float :offset-assert 1000) - (attack-miss-dist-min float :offset-assert 1004) - (attack-miss-dist-max float :offset-assert 1008) - (attack-miss-dist-curr float :offset-assert 1012) - (shots-fired int32 :offset-assert 1016) + ((gun-jmod joint-mod :offset-assert 784) + (hips-jmod joint-mod :offset-assert 788) + (entity-group actor-group :offset-assert 792) + (los los-control :inline :offset-assert 800) + (smoke-part sparticle-launch-control :offset-assert 948) + (engine-part sparticle-launch-control :offset-assert 952) + (last-fire-time time-frame :offset-assert 960) + (gun-x-angle float :offset-assert 968) + (gun-x-angle-final float :offset-assert 972) + (path-u float :offset-assert 976) + (path-du float :offset-assert 980) + (path-du-final float :offset-assert 984) + (path-dest float :offset-assert 988) + (sound-id sound-id :offset-assert 992) + (knocked-recover-anim int32 :offset-assert 996) + (attack-wait-min float :offset-assert 1000) + (attack-wait-max float :offset-assert 1004) + (attack-miss-dist-min float :offset-assert 1008) + (attack-miss-dist-max float :offset-assert 1012) + (attack-miss-dist-curr float :offset-assert 1016) + (shots-fired int32 :offset-assert 1020) ) :method-count-assert 163 :size-assert #x400 @@ -36007,20 +36005,18 @@ (kick-attack () _type_ :state 158) (attack () _type_ :state 159) (die-now () _type_ :state 160) - (crimson-guard-hover-method-161 () none 161) - (crimson-guard-hover-method-162 () none 162) + (shoot (_type_ vector projectile-init-by-other-params int float float) none 161) + (crimson-guard-hover-method-162 (_type_ process-focusable) symbol 162) ) ) -|# -;; (define-extern *crimson-guard-hover-enemy-info* enemy-info) -;; (define-extern *crimson-guard-hover-exploder-params* joint-exploder-static-params) +(define-extern *crimson-guard-hover-enemy-info* enemy-info) +(define-extern *crimson-guard-hover-exploder-params* joint-exploder-static-params) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; flamer ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype flying-formation (hover-formation) () :method-count-assert 16 @@ -36029,35 +36025,33 @@ (:methods ) ) -|# -#| (deftype flamer (nav-enemy) - ((shot-trajectory trajectory :inline :offset-assert 604) - (last-fire-time time-frame :offset-assert 644) - (sync-off uint32 :offset-assert 652) - (base-pos vector :inline :offset-assert 668) - (idle-pos vector :inline :offset-assert 684) - (offset vector :inline :offset-assert 700) - (dest-pos vector :inline :offset-assert 716) - (zone-to-world matrix :inline :offset-assert 732) - (world-to-zone matrix :inline :offset-assert 796) - (formation-entity basic :offset-assert 860) - (flit-joint basic :offset-assert 864) - (flit-angle float :offset-assert 868) - (flit-timer uint64 :offset-assert 876) - (path-pos float :offset-assert 884) - (sound-volume float :offset-assert 888) - (scale float :offset-assert 892) - (hit-surface? basic :offset-assert 896) - (ground-mode int8 :offset-assert 900) - (init-quat quaternion :inline :offset-assert 908) - (surface-normal vector :inline :offset-assert 924) - (main-joint-pos vector :inline :offset-assert 940) - (main-joint-vel vector :inline :offset-assert 956) - (main-joint-acc vector :inline :offset-assert 972) - (main-acceleration float :offset-assert 988) - (fly-dir vector :inline :offset-assert 1004) + ((shot-trajectory trajectory :inline :offset-assert 608) + (last-fire-time time-frame :offset-assert 648) + (sync-off uint32 :offset-assert 656) + (base-pos vector :inline :offset-assert 672) + (idle-pos vector :inline :offset-assert 688) + (offset vector :inline :offset-assert 704) + (dest-pos vector :inline :offset-assert 720) + (zone-to-world matrix :inline :offset-assert 736) + (world-to-zone matrix :inline :offset-assert 800) + (formation-entity entity-actor :offset-assert 864) + (flit-joint joint-mod :offset-assert 868) + (flit-angle float :offset-assert 872) + (flit-timer time-frame :offset-assert 880) + (path-pos float :offset-assert 888) + (sound-volume float :offset-assert 892) + (scale float :offset-assert 896) + (hit-surface? symbol :offset-assert 900) + (ground-mode int8 :offset-assert 904) + (init-quat quaternion :inline :offset-assert 912) + (surface-normal vector :inline :offset-assert 928) + (main-joint-pos vector :inline :offset-assert 944) + (main-joint-vel vector :inline :offset-assert 960) + (main-joint-acc vector :inline :offset-assert 976) + (main-acceleration float :offset-assert 992) + (fly-dir vector :inline :offset-assert 1008) ) :method-count-assert 192 :size-assert #x400 @@ -36067,27 +36061,26 @@ (wait-for-formation () _type_ :state 179) (exit-ambush () _type_ :state 180) (exit-ambush-path () _type_ :state 181) - (flamer-method-182 () none 182) - (flamer-method-183 () none 183) - (flamer-method-184 () none 184) - (flamer-method-185 () none 185) - (flamer-method-186 () none 186) - (flamer-method-187 () none 187) - (flamer-method-188 () none 188) - (flamer-method-189 () none 189) - (flamer-method-190 () none 190) - (flamer-method-191 () none 191) + (flamer-method-182 (_type_ vector process-focusable) none 182) + (flamer-method-183 (_type_) symbol 183) + (flamer-method-184 (_type_) none 184) + (flamer-method-185 (_type_) none 185) + (flamer-method-186 (_type_ float) vector 186) + (flamer-method-187 (_type_) none 187) + (flamer-method-188 (_type_ int float int int) none 188) + (flamer-method-189 (_type_) none 189) + (flamer-method-190 (_type_) none 190) + (flamer-method-191 (_type_) none 191) ) ) -|# -;; (define-extern *flamer-exploder-params* joint-exploder-static-params) -;; (define-extern *flamer-fact-defaults* fact-info-enemy-defaults) -;; (define-extern *flamer-nav-enemy-info* nav-enemy-info) -;; (define-extern flamer-attack-post function) -;; (define-extern flamer-flit-post function) -;; (define-extern flamer-fly-code function) -;; (define-extern vector-square! function) +(define-extern *flamer-exploder-params* joint-exploder-static-params) +(define-extern *flamer-fact-defaults* fact-info-enemy-defaults) +(define-extern *flamer-nav-enemy-info* nav-enemy-info) +(define-extern flamer-attack-post (function none :behavior flamer)) +(define-extern flamer-flit-post (function none :behavior flamer)) +(define-extern flamer-fly-code (function symbol :behavior flamer)) +(define-extern vector-square! (function vector vector vector)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; forest-part ;; @@ -37278,9 +37271,8 @@ ;; target-turret ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype hud-turret-health (hud) - ((fade-interp float :offset-assert 2976) + ((fade-interp float :offset-assert 2980) ) :method-count-assert 27 :size-assert #xba8 @@ -37288,9 +37280,7 @@ (:methods ) ) -|# -#| (deftype hud-drill-turret-health (hud-turret-health) () :method-count-assert 27 @@ -37299,9 +37289,7 @@ (:methods ) ) -|# -#| (deftype hud-port-turret-health (hud-turret-health) () :method-count-assert 27 @@ -37310,13 +37298,15 @@ (:methods ) ) -|# + +(declare-type base-turret process-focusable) +(declare-type turret base-turret) (deftype turret-info (basic) - ((process uint32 :offset-assert 4) - (handle uint64 :offset-assert 8) - (turret uint32 :offset-assert 16) - (grabbed? basic :offset-assert 20) + ((process (pointer process) :offset-assert 4) + (handle handle :offset-assert 8) + (turret (pointer base-turret) :offset-assert 16) + (grabbed? symbol :offset-assert 20) (quat quaternion :inline :offset-assert 32) (trans vector :inline :offset-assert 48) ) @@ -37325,37 +37315,80 @@ :flag-assert #x900000040 ) -#| (deftype turret-path-event (structure) ((pos float :offset-assert 0) - (event-type basic :offset-assert 4) - (param basic :offset-assert 8) + (event-type symbol :offset-assert 4) + (param object :offset-assert 8) ) :method-count-assert 9 :size-assert #xc :flag-assert #x90000000c ;; field param uses ~A with a signed load ) -|# -#| (deftype turret-path (structure) - ((event-count int32 :offset-assert 0) - (event-tbl uint32 :offset-assert 4) + ((event-count int32 :offset-assert 0) + (event-tbl (inline-array turret-path-event) :offset-assert 4) ) :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 ) -|# -#| (deftype base-turret (process-focusable) - () + ((hud handle :offset-assert 208) + (condition int32 :offset-assert 216) + (shadow-backup symbol :offset-assert 220) + (rider handle :offset-assert 224) + (actor-group (pointer actor-group) :offset-assert 232) + (actor-group-count int32 :offset-assert 236) + (alt-actor symbol :offset-assert 240) + (smush-control smush-control :inline :offset-assert 248) + (sound-id sound-id 3 :offset-assert 280) ;; elt size: 4 + (sound-playing symbol 3 :offset-assert 292) ;; elt size: 4 + (cam-string-vector vector :inline :offset-assert 304) + (path-event turret-path :offset-assert 320) + (path-u float :offset-assert 324) + (path-u-prev float :offset-assert 328) + (path-mode uint16 :offset-assert 332) + (path-speed float :offset-assert 336) + (path-speed-mult float :offset-assert 340) + (path-speed-mult-final float :offset-assert 344) + (path-old-pos vector :inline :offset-assert 352) + (path-direction symbol :offset-assert 368) + (pause-proc (function base-turret symbol) :offset-assert 372) + (gun-recoil-jmod joint-mod-add-local 4 :offset-assert 376) ;; elt size: 4 + (gun-index int32 :offset-assert 392) + (shot-timeout time-frame :offset-assert 400) + (fire-time time-frame :offset-assert 408) + (fire-time-interval time-frame :offset-assert 416) + (enable-controls symbol :offset-assert 424) + (available-for-pickup symbol :offset-assert 428) + (roty degrees :offset-assert 432) + (rotyv degrees :offset-assert 436) + (rotyvv degrees :offset-assert 440) + (roty-min degrees :offset-assert 444) + (roty-max degrees :offset-assert 448) + (rotx degrees :offset-assert 452) + (rotxv degrees :offset-assert 456) + (rotxvv degrees :offset-assert 460) + (rotx-min degrees :offset-assert 464) + (rotx-max degrees :offset-assert 468) + (target-quat quaternion :inline :offset-assert 480) + (init-quat quaternion :inline :offset-assert 496) + (health float :offset-assert 512) + (track-handle handle :offset-assert 520) + (heat float :offset-assert 528) + (heat-target float :offset-assert 532) + (arrow-angle degrees :offset-assert 536) + (arrow-alpha float :offset-assert 540) + (arrow-red float :offset-assert 544) + (red-filter-timer time-frame :offset-assert 552) + (ride-height float :offset-assert 560) + ) :method-count-assert 49 :size-assert #x234 :flag-assert #x3101c00234 - ;; Failed to read fields. (:methods (idle () _type_ :state 27) (setup () _type_ :state 28) @@ -37363,51 +37396,49 @@ (shutdown () _type_ :state 30) (dormant () _type_ :state 31) (die () _type_ :state 32) - (base-turret-method-33 () none 33) - (base-turret-method-34 () none 34) - (base-turret-method-35 () none 35) - (base-turret-method-36 () none 36) - (base-turret-method-37 () none 37) - (base-turret-method-38 () none 38) - (base-turret-method-39 () none 39) - (base-turret-method-40 () none 40) - (base-turret-method-41 () none 41) - (base-turret-method-42 () none 42) - (base-turret-method-43 () none 43) - (base-turret-method-44 () none 44) - (base-turret-method-45 () none 45) - (base-turret-method-46 () none 46) - (base-turret-method-47 () none 47) - (base-turret-method-48 () none 48) + (turret-init! (_type_ entity-actor matrix) none 33) + (base-turret-method-34 (_type_ process) none 34) + (base-turret-method-35 (_type_) none 35) + (base-turret-method-36 (_type_) none 36) + (base-turret-method-37 (_type_) none 37) + (base-turret-method-38 (_type_) none 38) + (base-turret-method-39 (_type_ turret-path-event) none 39) + (base-turret-method-40 (_type_) none 40) + (base-turret-method-41 (_type_ vector) symbol 41) + (base-turret-method-42 (_type_ vector vector float) float 42) + (base-turret-method-43 (_type_) none 43) + (base-turret-method-44 (_type_ vector vector) none 44) + (base-turret-method-45 (_type_ object symbol) none 45) + (base-turret-method-46 (_type_ process) process 46) + (base-turret-method-47 (_type_) none 47) + (turret-event-handler (_type_ process int symbol event-message-block) object 48) ) ) -|# -;; (define-extern init-turret-hud function) -;; (define-extern *turret-exploder-params* joint-exploder-static-params) -;; (define-extern turret-handler function) -;; (define-extern set-recoil function) -;; (define-extern cam-turret state) -;; (define-extern target-turret-post function) -;; (define-extern target-turret-stance state) -;; (define-extern *turret-get-on-mods* object) -;; (define-extern target-turret-get-off state) +(define-extern init-turret-hud (function hud-turret-health string none)) +(define-extern *turret-exploder-params* joint-exploder-static-params) +(define-extern turret-handler (function process int symbol event-message-block object :behavior base-turret)) +(define-extern set-recoil (function joint-mod float symbol none)) +(define-extern cam-turret (state camera-slave)) +(define-extern target-turret-post (function none :behavior target)) +(define-extern target-turret-stance (state handle target)) +(define-extern *turret-get-on-mods* surface) +(define-extern target-turret-get-off (state target)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; drill-turret ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype turret (base-turret) - ((hover-battle uint64 :offset-assert 564) - (hover-formation basic :offset-assert 572) - (use-egg-hud basic :offset-assert 576) - (hud-egg uint64 :offset-assert 580) - (use-cgh-hud basic :offset-assert 588) - (hud-cgh uint64 :offset-assert 596) - (hud-cgh-event basic :offset-assert 604) - (egg-timer uint64 :offset-assert 612) - (cgh-timer uint64 :offset-assert 620) + ((hover-battle handle :offset-assert 568) + (hover-formation hover-formation :offset-assert 576) + (use-egg-hud symbol :offset-assert 580) + (hud-egg handle :offset-assert 584) + (use-cgh-hud symbol :offset-assert 592) + (hud-cgh handle :offset-assert 600) + (hud-cgh-event symbol :offset-assert 608) + (egg-timer time-frame :offset-assert 616) + (cgh-timer time-frame :offset-assert 624) ) :method-count-assert 49 :size-assert #x278 @@ -37415,15 +37446,14 @@ (:methods ) ) -|# -;; (define-extern *drill-turret-10-battle* array) -;; (define-extern *drill-turret-11-battle* array) -;; (define-extern *drill-turret-12-battle* array) -;; (define-extern *turret-13-path* object) -;; (define-extern *drill-turret-13-battle* array) -;; (define-extern *turret-14-path* object) -;; (define-extern *turret-15-path* object) +(define-extern *drill-turret-10-battle* (array hover-enemy-battle-command)) +(define-extern *drill-turret-11-battle* (array hover-enemy-battle-command)) +(define-extern *drill-turret-12-battle* (array hover-enemy-battle-command)) +(define-extern *turret-13-path* turret-path) +(define-extern *drill-turret-13-battle* (array hover-enemy-battle-command)) +(define-extern *turret-14-path* turret-path) +(define-extern *turret-15-path* turret-path) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; drillmid-obs ;; @@ -37855,19 +37885,19 @@ ;; drill-baron ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype drill-barons-ship (process-drawable) - ((init-quat quaternion :inline :offset-assert 204) - (next-to-shoot-idx int32 :offset-assert 220) - (current-y-position float :offset-assert 224) - (from-y float :offset-assert 228) - (inc-y float :offset-assert 232) - (ease-y float :offset-assert 236) - (x-offset-angle float :offset-assert 240) - (pass int32 :offset-assert 244) - (end-of-pass basic :offset-assert 248) - (rock-angle float :offset-assert 252) - (soundid uint32 :offset-assert 256) + ((root-override collide-shape-moving :offset 128 :score 1) + (init-quat quaternion :inline :offset-assert 208) + (next-to-shoot-idx int32 :offset-assert 224) + (current-y-position float :offset-assert 228) + (from-y float :offset-assert 232) + (inc-y float :offset-assert 236) + (ease-y float :offset-assert 240) + (x-offset-angle float :offset-assert 244) + (pass int32 :offset-assert 248) + (end-of-pass symbol :offset-assert 252) + (rock-angle float :offset-assert 256) + (soundid uint32 :offset-assert 260) ) :method-count-assert 23 :size-assert #x108 @@ -37875,12 +37905,10 @@ (:methods (idle () _type_ :state 20) (hidden () _type_ :state 21) - (drill-barons-ship-method-22 () none 22) + (drill-barons-ship-method-22 (_type_) none 22) ) ) -|# -#| (deftype drill-barons-ship-explode (process-drawable) () :method-count-assert 21 @@ -37890,37 +37918,34 @@ (idle () _type_ :state 20) ) ) -|# -#| (deftype barons-ship-turret-info (structure) ((init-y-angle float :offset-assert 0) (twist-y-max float :offset-assert 4) (joint-idx int32 :offset-assert 8) (mesh int32 :offset-assert 12) (ship-y-offset float :offset-assert 16) - (alive basic :offset-assert 20) + (alive symbol :offset-assert 20) (next-to-shoot basic :offset-assert 24) ) :method-count-assert 9 :size-assert #x1c :flag-assert #x90000001c ) -|# -#| (deftype drill-barons-ship-turret (process-drawable) - ((info barons-ship-turret-info :offset-assert 196) - (shot-timer uint64 :offset-assert 204) - (shot-counter int32 :offset-assert 212) - (jmod basic :offset-assert 216) - (jmod-left basic :offset-assert 220) - (jmod-right basic :offset-assert 224) - (anim-frame float :offset-assert 228) - (error-y-angle float :offset-assert 232) - (error-y-angle-dest float :offset-assert 236) - (hit-count int32 :offset-assert 240) - (soundid uint32 :offset-assert 244) + ((root-override collide-shape-moving :offset 128 :score 1) + (info barons-ship-turret-info :offset-assert 200) + (shot-timer time-frame :offset-assert 208) + (shot-counter int32 :offset-assert 216) + (jmod joint-mod :offset-assert 220) + (jmod-left joint-mod :offset-assert 224) + (jmod-right joint-mod :offset-assert 228) + (anim-frame float :offset-assert 232) + (error-y-angle float :offset-assert 236) + (error-y-angle-dest float :offset-assert 240) + (hit-count int32 :offset-assert 244) + (soundid sound-id :offset-assert 248) ) :method-count-assert 25 :size-assert #xfc @@ -37930,12 +37955,10 @@ (attack () _type_ :state 21) (dead () _type_ :state 22) (going-down () _type_ :state 23) - (drill-barons-ship-turret-method-24 () none 24) + (drill-barons-ship-turret-method-24 (_type_) none 24) ) ) -|# -#| (deftype drill-ship-shot (guard-shot) () :method-count-assert 40 @@ -37944,16 +37967,15 @@ (:methods ) ) -|# -;; (define-extern *ship-turrets-first-pass* array) -;; (define-extern *ship-turrets-second-pass* array) -;; (define-extern *barons-ship-turrets* array) -;; (define-extern drill-barons-ship-turret-init-by-other function) -;; (define-extern drill-barons-ship-explode-init-by-other function) -;; (define-extern drill-ship-shot-move function) -;; (define-extern *drill-ship-turret-speed-event* object) -;; (define-extern calculate-ship-projectile-velocity function) +(define-extern *ship-turrets-first-pass* (array int32)) +(define-extern *ship-turrets-second-pass* (array int32)) +(define-extern *barons-ship-turrets* (array barons-ship-turret-info)) +(define-extern drill-barons-ship-turret-init-by-other (function entity-actor none :behavior drill-barons-ship-turret)) +(define-extern drill-barons-ship-explode-init-by-other (function entity-actor none :behavior drill-barons-ship-explode)) +(define-extern drill-ship-shot-move (function drill-ship-shot none)) +(define-extern *drill-ship-turret-speed-event* turret-path-event) +(define-extern calculate-ship-projectile-velocity (function projectile-init-by-other-params float none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; drill-scenes ;; @@ -48148,7 +48170,6 @@ ;; jellyfish ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype jellyfish-formation (hover-formation) () :method-count-assert 16 @@ -48157,9 +48178,7 @@ (:methods ) ) -|# -#| (deftype jellyfish-chain-physics (chain-physics) () :method-count-assert 18 @@ -48168,32 +48187,30 @@ (:methods ) ) -|# -#| (deftype jellyfish (hover-enemy) - ((los los-control :inline :offset-assert 780) - (sync sync-eased :inline :offset-assert 932) - (sound-id uint32 :offset-assert 976) - (path-player-u float :offset-assert 980) - (path-my-u float :offset-assert 984) - (path-y-offset float :offset-assert 988) - (path-stare-u float :offset-assert 992) - (tentacle-clock float :offset-assert 996) - (tentacle-blend float :offset-assert 1000) - (last-attack-time time-frame :offset-assert 1004) - (last-fire-time time-frame :offset-assert 1012) - (charge-path-timer uint64 :offset-assert 1020) - (tentacles UNKNOWN 5 :offset-assert 1028) - (tentacles-initialized basic :offset-assert 1048) - (stare-pos vector :inline :offset-assert 1052) - (charge-pos vector :inline :offset-assert 1068) - (grab-front basic :offset-assert 1084) - (grab-offset vector :inline :offset-assert 1100) - (grab-start-pos vector :inline :offset-assert 1116) - (grab-start-quat quaternion :inline :offset-assert 1132) - (focus-rot quaternion :inline :offset-assert 1148) - (attach-lerp float :offset-assert 1164) + ((los los-control :inline :offset-assert 784) + (sync sync-eased :inline :offset-assert 936) + (sound-id uint32 :offset-assert 980) + (path-player-u float :offset-assert 984) + (path-my-u float :offset-assert 988) + (path-y-offset float :offset-assert 992) + (path-stare-u float :offset-assert 996) + (tentacle-clock float :offset-assert 1000) + (tentacle-blend float :offset-assert 1004) + (last-attack-time time-frame :offset-assert 1008) + (last-fire-time time-frame :offset-assert 1016) + (charge-path-timer time-frame :offset-assert 1024) + (tentacles jellyfish-chain-physics 5 :offset-assert 1032) + (tentacles-initialized symbol :offset-assert 1052) + (stare-pos vector :inline :offset-assert 1056) + (charge-pos vector :inline :offset-assert 1072) + (grab-front symbol :offset-assert 1088) + (grab-offset vector :inline :offset-assert 1104) + (grab-start-pos vector :inline :offset-assert 1120) + (grab-start-quat quaternion :inline :offset-assert 1136) + (focus-rot quaternion :inline :offset-assert 1152) + (attach-lerp float :offset-assert 1168) ) :method-count-assert 165 :size-assert #x494 @@ -48204,15 +48221,13 @@ (charge-attack () _type_ :state 158) (grab-mech () _type_ :state 159) (die-now () _type_ :state 160) - (jellyfish-method-161 () none 161) - (jellyfish-method-162 () none 162) - (jellyfish-method-163 () none 163) - (jellyfish-method-164 () none 164) + (jellyfish-method-161 (_type_ vector float) vector 161) + (jellyfish-method-162 (_type_) symbol 162) + (jellyfish-method-163 (_type_ process-focusable) symbol 163) + (jellyfish-method-164 (_type_ process-focusable) symbol 164) ) ) -|# -#| (deftype jellyfish-joint-mod-tentacle-info (structure) ((axis vector :inline :offset-assert 0) (angle float :offset-assert 16) @@ -48223,16 +48238,15 @@ :size-assert #x1c :flag-assert #x90000001c ) -|# -;; (define-extern *jellyfish-mech-reserved* object) -;; (define-extern *jellyfish-mainvein-chain-setup* array) -;; (define-extern *jellyfish-lfront-chain-setup* array) -;; (define-extern *jellyfish-rfront-chain-setup* array) -;; (define-extern *jellyfish-lrear-chain-setup* array) -;; (define-extern *jellyfish-rrear-chain-setup* array) -;; (define-extern *jellyfish-enemy-info* enemy-info) -;; (define-extern jellyfish-joint-mod-tentacle function) +(define-extern *jellyfish-mech-reserved* symbol) +(define-extern *jellyfish-mainvein-chain-setup* (array chain-physics-setup)) +(define-extern *jellyfish-lfront-chain-setup* (array chain-physics-setup)) +(define-extern *jellyfish-rfront-chain-setup* (array chain-physics-setup)) +(define-extern *jellyfish-lrear-chain-setup* (array chain-physics-setup)) +(define-extern *jellyfish-rrear-chain-setup* (array chain-physics-setup)) +(define-extern *jellyfish-enemy-info* enemy-info) +(define-extern jellyfish-joint-mod-tentacle (function cspace transformq none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; under-part ;; diff --git a/decompiler/config/jak2/anonymous_function_types.jsonc b/decompiler/config/jak2/anonymous_function_types.jsonc index 181b9747a6..242435f8a1 100644 --- a/decompiler/config/jak2/anonymous_function_types.jsonc +++ b/decompiler/config/jak2/anonymous_function_types.jsonc @@ -1175,5 +1175,18 @@ "guard": [ [19, "(function collide-shape-prim none)"], [39, "(function crimson-guard collide-shape-moving vector symbol)"] + ], + "drill-turret": [ + [9, "(function object)"], + [10, "(function object)"], + [11, "(function turret object)"], + [12, "(function symbol)"] + ], + "wasp": [[9, "(function wasp cspace float float vector vector int none)"]], + "crimson-guard-hover": [ + [ + 13, + "(function crimson-guard-hover cspace float float vector vector int none)" + ] ] } diff --git a/decompiler/config/jak2/hacks.jsonc b/decompiler/config/jak2/hacks.jsonc index 465865b48e..71679c02b1 100644 --- a/decompiler/config/jak2/hacks.jsonc +++ b/decompiler/config/jak2/hacks.jsonc @@ -36,7 +36,6 @@ "asm_functions_by_name": [ // checking boxed type is different now - these make the cfg stuff sad "name=", - "(method 77 flamer)", "(method 77 grenadier)", // until loop without nop: "target-history-print", @@ -46,8 +45,6 @@ "anim-tester-get-playing-item", "start-pilot-recorder", "(anon-function 10 pilot-recorder)", - "(method 0 hover-nav-control)", - "(method 24 nav-network)", "(anon-function 10 sig-recorder)", // actual asm "quad-copy!", diff --git a/decompiler/config/jak2/label_types.jsonc b/decompiler/config/jak2/label_types.jsonc index d4e4a62276..9c5a9f3a8f 100644 --- a/decompiler/config/jak2/label_types.jsonc +++ b/decompiler/config/jak2/label_types.jsonc @@ -1560,5 +1560,49 @@ "metalhead-flitter": [ ["L161", "vector"], ["L160", "vector"] - ] + ], + "target-turret": [ + ["L408", "attack-info"], + ["L391", "vector"], + ["L395", "(pointer int32)", 4], + ["L399", "attack-info"], + ["L401", "attack-info"] + ], + "wasp": [ + ["L160", "vector"], + ["L159", "vector"], + ["L158", "vector"] + ], + "crimson-guard-hover": [ + ["L178", "vector"], + ["L177", "vector"], + ["L176", "vector"] + ], + "flamer": [ + ["L187", "vector"], + ["L186", "vector"], + ["L185", "vector"], + ["L192", "(pointer int32)", 4], + ["L193", "(pointer uint64)", 3] + ], + "jellyfish": [ + ["L187", "attack-info"], + ["L186", "attack-info"], + ["L178", "jellyfish-joint-mod-tentacle-info"], + ["L177", "jellyfish-joint-mod-tentacle-info"], + ["L176", "jellyfish-joint-mod-tentacle-info"], + ["L175", "jellyfish-joint-mod-tentacle-info"], + ["L174", "jellyfish-joint-mod-tentacle-info"], + ["L181", "vector"], + ["L180", "vector"], + ["L179", "vector"], + ["L173", "vector"], + ["L172", "vector"] + ], + "drill-turret": [ + ["L172", "turret-path", true], + ["L138", "turret-path", true], + ["L119", "turret-path", true] + ], + "drill-baron": [["L183", "turret-path-event", true]] } diff --git a/decompiler/config/jak2/stack_structures.jsonc b/decompiler/config/jak2/stack_structures.jsonc index 5a5bd413b1..3c2dabba2c 100644 --- a/decompiler/config/jak2/stack_structures.jsonc +++ b/decompiler/config/jak2/stack_structures.jsonc @@ -2013,5 +2013,74 @@ [128, "vector"], [144, "vector"], [176, "vector"] + ], + "(code die base-turret)": [[192, "vector"]], + "(method 47 base-turret)": [ + [16, ["array", "collide-shape", 32]], + [144, "vector"], + [160, "vector"], + [176, "vector"], + [192, "vector"] + ], + "(method 155 hover-enemy)": [[16, "vector"]], + "(method 15 hover-nav-control)": [[16, "vector"]], + "(method 13 hover-nav-control)": [[64, "vector"]], + "(method 25 hover-nav-control)": [[16, "hover-nav-path-segment"]], + "(method 16 hover-nav-control)": [[16, "vector"]], + "(method 11 hover-nav-control)": [ + [128, "vector"], + [144, "vector"], + [160, "vector"], + [176, "vector"] + ], + "(method 26 nav-network)": [[16, "vector"]], + "hover-enemy-hostile-post": [[16, "event-message-block"]], + "(method 148 hover-enemy)": [ + [16, "vector"], + [32, "vector"] + ], + "(method 18 hover-enemy-manager)": [[16, "transformq"]], + "(anon-function 9 wasp)": [[112, "quaternion"]], + "(method 107 wasp)": [[48, "vector"]], + "(event attack wasp)": [[16, "projectile-init-by-other-params"]], + "(anon-function 13 crimson-guard-hover)": [[112, "quaternion"]], + "(event attack crimson-guard-hover)": [ + [16, "projectile-init-by-other-params"] + ], + "(event ambush-attack crimson-guard-hover)": [ + [16, "projectile-init-by-other-params"] + ], + "(method 187 flamer)": [[64, "vector"]], + "(method 191 flamer)": [ + [16, "vector"], + [32, "vector"] + ], + "(method 163 jellyfish)": [[16, "vector"]], + "(enter active jellyfish)": [ + [16, "vector"], + [32, "vector"] + ], + "(trans active jellyfish)": [ + [16, "vector"], + [32, "vector"], + [48, "vector"] + ], + "(method 12 jellyfish-chain-physics)": [ + [16, "collide-query"], + [560, "bounding-box"], + [592, "sphere"] + ], + "(trans stare jellyfish)": [[16, "vector"]], + "jellyfish-joint-mod-tentacle": [ + [32, "quaternion"], + [16, "quaternion"] + ], + "(method 164 jellyfish)": [ + [16, "vector"], + [32, "vector"] + ], + "(event attack drill-barons-ship-turret)": [[16, "vector"]], + "(post attack drill-barons-ship-turret)": [ + [16, "projectile-init-by-other-params"] ] } diff --git a/decompiler/config/jak2/type_casts.jsonc b/decompiler/config/jak2/type_casts.jsonc index 688eb77a46..79e1f6cbcd 100644 --- a/decompiler/config/jak2/type_casts.jsonc +++ b/decompiler/config/jak2/type_casts.jsonc @@ -9466,5 +9466,360 @@ "(trans fire metalhead-predator)": [ [14, "v1", "process-focusable"], [19, "v1", "process-focusable"] + ], + "(method 18 hud-turret-health)": [ + [11, "v1", "float"], + [22, "v1", "float"], + [31, "v1", "float"], + [50, "v1", "float"] + ], + "(method 48 base-turret)": [[7, "v0", "vector"]], + "(code target-turret-get-off)": [[73, "v1", "art-joint-anim"]], + "(code target-turret-get-on)": [ + [73, "s5", "process-focusable"], + [79, "s5", "process-focusable"], + [98, "v1", "art-joint-anim"], + [167, "a0", "process-focusable"] + ], + "(code cam-turret)": [ + [19, "gp", "process-focusable"], + [28, "gp", "target"], + [43, "v1", "process-focusable"] + ], + "(event target-turret-stance)": [[65, "gp", "attack-info"]], + "(code target-turret-stance)": [[17, "v1", "process-focusable"]], + "(exit active base-turret)": [[7, "v1", "collide-shape-prim-group"]], + "(method 33 base-turret)": [ + [197, "a0", "collide-shape-moving"], + ["_stack_", 16, "res-tag"], + [203, "a0", "collide-shape-moving"] + ], + "(enter active base-turret)": [[46, "v1", "collide-shape-prim-group"]], + "(event active base-turret)": [[93, "s5", "attack-info"]], + "(method 47 base-turret)": [ + [115, "s4", "process-focusable"], + [51, "s2", "process-focusable"] + ], + "(method 155 hover-enemy)": [[79, "v1", "vector"]], + "(method 140 hover-enemy)": [ + [6, "a0", "collide-shape-prim-group"], + [8, "a0", "collide-shape-prim-group"], + [10, "a0", "collide-shape-prim-group"] + ], + "hover-enemy-fly-code": [ + [17, "gp", "art-joint-anim"], + [39, "gp", "art-joint-anim"], + [61, "gp", "art-joint-anim"] + ], + "(method 17 hover-nav-control)": [[7, "a0", "collide-shape-prim-group"]], + "(method 15 nav-network)": [ + [64, "a2", "nav-network-path-node"], + [71, "a2", "nav-network-path-node"], + [111, "a2", "nav-network-path-node"], + [117, "a2", "nav-network-path-node"], + [38, "v1", "nav-network-path-node"], + [39, "v1", "nav-network-path-node"] + ], + "(method 27 nav-network)": [ + [81, "v1", "hover-nav-sphere"], + [5, "v1", "hover-nav-sphere"], + [13, "v1", "hover-nav-sphere"], + [12, "v1", "hover-nav-sphere"] + ], + "(method 26 nav-network)": [ + [21, "v1", "hover-nav-sphere"], + [23, "v1", "hover-nav-sphere"] + ], + "(method 24 nav-network)": [ + [93, "s3", "nav-network-path-node"], + [72, "s3", "nav-network-path-node"], + [85, "s3", "nav-network-path-node"], + [87, "s3", "nav-network-path-node"], + [90, "s3", "nav-network-path-node"] + ], + "(method 25 nav-network)": [ + [14, "v1", "hover-nav-sphere"], + [16, "v1", "hover-nav-sphere"], + [19, "a3", "hover-nav-sphere"] + ], + "(method 29 hover-nav-control)": [ + [7, "a0", "hover-nav-path-segment"], + [8, "a0", "vector"], + [34, "a0", "hover-nav-path-segment"], + [6, "s4", "hover-nav-path-segment"], + [33, "s4", "hover-nav-path-segment"], + [37, "s4", "hover-nav-path-segment"], + [38, "s4", "hover-nav-path-segment"], + [43, "s4", "hover-nav-path-segment"], + [12, "s4", "hover-nav-path-segment"], + [18, "s4", "hover-nav-path-segment"], + [19, "s4", "hover-nav-path-segment"], + [20, "s4", "hover-nav-path-segment"] + ], + "hover-enemy-hostile-post": [ + [14, "v0", "hover-formation"], + [42, "a0", "process-focusable"], + [45, "a0", "process-focusable"] + ], + "(method 74 hover-enemy)": [ + [126, "s5", "vector"], + [151, "a0", "collide-shape-prim-group"] + ], + "(enter ambush hover-enemy)": [[80, "a0", "collide-shape-prim-group"]], + "(code flying-death hover-enemy)": [[20, "v1", "art-joint-anim"]], + "(enter flying-death hover-enemy)": [[46, "a1", "process-focusable"]], + "(code knocked-recover hover-enemy)": [[22, "v1", "art-joint-anim"]], + "(exit knocked hover-enemy)": [[4, "v0", "state"]], + "(enter knocked hover-enemy)": [ + [4, "v0", "state"], + [6, "t9", "(function enemy none)"] + ], + "(method 129 hover-enemy)": [ + [19, "a0", "process-focusable"], + [22, "a0", "process-focusable"] + ], + "(method 17 hover-enemy-manager)": [["_stack_", 16, "res-tag"]], + "(method 18 hover-enemy-manager)": [ + [13, "s1", "entity-actor"], + [22, "s1", "entity-actor"] + ], + "hover-enemy-manager-post": [ + [6, "t9", "(function hover-formation-control none)"] + ], + "(method 7 hover-enemy-manager)": [ + [21, "t9", "(function process int process)"] + ], + "(method 35 turret)": [[55, "t9", "(function base-turret none)"]], + "(enter die turret)": [[11, "v0", "(state base-turret)"]], + "(exit active turret)": [[4, "v0", "(state base-turret)"]], + "(post active turret)": [ + [4, "v0", "(state base-turret)"], + [6, "t9", "(function none)"], + [112, "v0", "int"], + [134, "v0", "int"], + [157, "v0", "int"] + ], + "(method 115 wasp)": [ + ["_stack_", 16, "res-tag"], + ["_stack_", 32, "res-tag"], + ["_stack_", 48, "res-tag"], + ["_stack_", 64, "res-tag"], + [91, "v0", "(pointer actor-group)"], + [117, "v0", "(pointer float)"], + [153, "v0", "(pointer float)"], + [182, "v0", "(pointer float)"] + ], + "(code knocked-recover wasp)": [[20, "v1", "art-joint-anim"]], + "(code attack wasp)": [[38, "v1", "art-joint-anim"]], + "(post notice wasp)": [[4, "t9", "(function none)"]], + "(post ambush wasp)": [[4, "t9", "(function none)"]], + "(code shoot-bridge-attack wasp)": [[38, "v1", "art-joint-anim"]], + "(method 77 wasp)": [[32, "a1", "art-joint-anim"]], + "(method 107 wasp)": [ + [25, "s5", "process-focusable"], + [44, "s5", "process-focusable"] + ], + "(method 78 wasp)": [[11, "v1", "art-joint-anim"]], + "(trans hostile wasp)": [[36, "v1", "art-joint-anim"]], + "(method 52 wasp)": [ + [21, "a1", "process-focusable"], + [99, "t9", "(function enemy vector none)"] + ], + "(method 115 crimson-guard-hover)": [ + ["_stack_", 16, "res-tag"], + ["_stack_", 32, "res-tag"], + ["_stack_", 48, "res-tag"], + ["_stack_", 64, "res-tag"], + [102, "v0", "(pointer actor-group)"], + [128, "v0", "(pointer float)"], + [162, "v0", "(pointer float)"], + [188, "v0", "(pointer float)"] + ], + "(enter flying-death crimson-guard-hover)": [ + [4, "v0", "(state hover-enemy)"] + ], + "(code knocked-recover crimson-guard-hover)": [[20, "v1", "art-joint-anim"]], + "(code attack crimson-guard-hover)": [[56, "v1", "art-joint-anim"]], + "(trans hostile crimson-guard-hover)": [[22, "gp", "process-focusable"]], + "(enter flying-death-explode crimson-guard-hover)": [ + [4, "v0", "(state hover-enemy)"] + ], + "(code flying-death crimson-guard-hover)": [ + [17, "v1", "art-joint-anim"], + [70, "v1", "art-joint-anim"] + ], + "(enter knocked crimson-guard-hover)": [[4, "v0", "(state hover-enemy)"]], + "(post kick-attack crimson-guard-hover)": [ + [34, "a0", "process-focusable"], + [37, "a0", "process-focusable"] + ], + "(post notice crimson-guard-hover)": [[4, "t9", "(function none)"]], + "(post ambush-attack crimson-guard-hover)": [[66, "t9", "(function none)"]], + "(code ambush-attack crimson-guard-hover)": [[37, "v1", "art-joint-anim"]], + "(trans ambush-fly crimson-guard-hover)": [[47, "gp", "process-focusable"]], + "(method 74 crimson-guard-hover)": [ + [9, "v1", "attack-info"], + [ + 124, + "t9", + "(function enemy process int symbol event-message-block object)" + ], + [131, "a0", "symbol"], + [132, "v1", "process-focusable"], + [135, "v1", "process-focusable"], + [ + 170, + "t9", + "(function enemy process int symbol event-message-block object)" + ], + [ + 182, + "t9", + "(function enemy process int symbol event-message-block object)" + ] + ], + "(method 162 crimson-guard-hover)": [ + [31, "a0", "process-focusable"], + [34, "a0", "process-focusable"] + ], + "(method 52 crimson-guard-hover)": [ + [21, "a1", "process-focusable"], + [99, "t9", "(function hover-enemy vector none)"] + ], + "(method 135 crimson-guard-hover)": [ + [34, "t9", "(function enemy int sound-id)"] + ], + "(method 77 crimson-guard-hover)": [ + [19, "v1", "art-joint-anim"], + [49, "v1", "art-joint-anim"] + ], + "(method 78 crimson-guard-hover)": [[18, "v1", "art-joint-anim"]], + "flamer-fly-code": [ + [33, "v1", "art-joint-anim"], + [64, "v1", "art-joint-anim"], + [95, "v1", "art-joint-anim"] + ], + "(method 7 flamer)": [ + [14, "t9", "(function process-drawable int process-drawable)"] + ], + "(method 74 flamer)": [[78, "v1", "vector"]], + "(trans hostile flamer)": [ + [20, "a0", "process-focusable"], + [23, "a0", "process-focusable"] + ], + "(event attack flamer)": [ + [22, "s5", "process-focusable"], + [25, "s5", "process-focusable"] + ], + "(post knocked flamer)": [[22, "t9", "(function none)"]], + "(method 77 flamer)": [ + [100, "a1", "art-joint-anim"], + [70, "s4", "art-joint-anim"] + ], + "(method 46 flamer)": [ + [10, "v1", "collide-shape-prim-group"], + [30, "v1", "collide-shape-prim-group"] + ], + "(method 183 flamer)": [[15, "v0", "hover-formation-control"]], + "(code attack flamer)": [ + [19, "v1", "art-joint-anim"], + [72, "v1", "art-joint-anim"] + ], + "(method 182 flamer)": [[36, "v0", "hover-formation-control"]], + "(method 25 hover-nav-control)": [ + [74, "v1", "vector"], + [100, "a0", "vector"] + ], + "(method 14 nav-network)": [ + [4, "a3", "list-node"], + [7, "a3", "list-node"] + ], + "(method 13 nav-network)": [ + [44, "a0", "list-node"], + [47, "a0", "list-node"] + ], + "(method 13 hover-nav-control)": [["_stack_", 144, "float"]], + "(method 10 jellyfish)": [[10, "t9", "(function process-drawable none)"]], + "(code grab-mech jellyfish)": [ + [48, "v1", "art-joint-anim"], + [155, "v1", "art-joint-anim"], + [403, "v1", "art-joint-anim"], + [262, "v1", "art-joint-anim"] + ], + "(code charge-attack jellyfish)": [ + [10, "v1", "art-joint-anim"], + [62, "v1", "art-joint-anim"] + ], + "(trans charge-attack jellyfish)": [ + [42, "s5", "process-focusable"], + [45, "s5", "process-focusable"] + ], + "(code threaten jellyfish)": [ + [16, "v1", "art-joint-anim"], + [86, "gp", "process-focusable"], + [89, "gp", "process-focusable"] + ], + "(method 55 jellyfish)": [ + [98, "a0", "process-focusable"], + [103, "a0", "process-focusable"], + [108, "a0", "process-focusable"], + [111, "a0", "process-focusable"] + ], + "(method 162 jellyfish)": [[63, "a0", "collide-shape-prim-group"]], + "(method 163 jellyfish)": [ + [46, "a0", "process-focusable"], + [65, "s4", "process-focusable"] + ], + "(code die jellyfish)": [[28, "v1", "art-joint-anim"]], + "(method 12 jellyfish-chain-physics)": [[9, "v1", "collide-shape-moving"]], + "(enter stare jellyfish)": [[4, "v0", "(state enemy)"]], + "(code die-now jellyfish)": [[25, "v1", "art-joint-anim"]], + "jellyfish-joint-mod-tentacle": [ + [9, "s4", "jellyfish"], + [10, "s3", "jellyfish-joint-mod-tentacle-info"], + [22, "s3", "jellyfish-joint-mod-tentacle-info"], + [27, "s3", "jellyfish-joint-mod-tentacle-info"], + [43, "s4", "jellyfish"] + ], + "(method 164 jellyfish)": [ + [61, "a0", "process-focusable"], + [80, "s4", "process-focusable"] + ], + "(enter hidden drill-barons-ship)": [[19, "v0", "turret"]], + "(method 24 drill-barons-ship-turret)": [ + [10, "a1", "drill-barons-ship"], + [28, "v1", "drill-barons-ship"] + ], + "drill-barons-ship-explode-init-by-other": [[25, "a0", "process-drawable"]], + "(method 31 drill-ship-shot)": [[7, "t9", "(function guard-shot none)"]], + "drill-barons-ship-turret-init-by-other": [ + [117, "a0", "drill-barons-ship"], + [126, "v1", "drill-barons-ship"] + ], + "(method 7 drill-barons-ship-turret)": [ + [30, "t9", "(function process-drawable int process-drawable)"] + ], + "(trans going-down drill-barons-ship-turret)": [ + [9, "a1", "drill-barons-ship"], + [14, "v1", "drill-barons-ship"], + [19, "v1", "drill-barons-ship"] + ], + "(event attack drill-barons-ship-turret)": [[241, "v1", "drill-barons-ship"]], + "(post attack drill-barons-ship-turret)": [ + [7, "v1", "drill-barons-ship"], + [12, "v1", "drill-barons-ship"] + ], + "(trans dead drill-barons-ship-turret)": [ + [9, "a1", "drill-barons-ship"], + [27, "v1", "drill-barons-ship"], + [33, "v1", "drill-barons-ship"], + [38, "v1", "drill-barons-ship"] + ], + "(enter going-down drill-barons-ship-turret)": [ + [2, "v1", "drill-barons-ship"] + ], + "(method 37 drill-ship-shot)": [ + [2, "v1", "drill-barons-ship"], + [7, "v1", "drill-barons-ship"] ] } diff --git a/decompiler/util/data_decompile.cpp b/decompiler/util/data_decompile.cpp index c4532b6041..135e74104d 100644 --- a/decompiler/util/data_decompile.cpp +++ b/decompiler/util/data_decompile.cpp @@ -512,6 +512,9 @@ goos::Object decomp_ref_to_inline_array_guess_size( } else { const auto& end_label = labels.at(end_label_idx); end_offset = end_label.offset; + // if misaligned, round down - labels may point 2 bytes into the first word if the data is a + // pair, and we should not treat those 2 bytes as padding for this check + end_offset &= ~3; } // lg::print("Data is from {} to {}\n", start_label.name, end_label.name); @@ -896,10 +899,11 @@ const std::unordered_map< {{"cells", ArrayFieldDecompMeta(TypeSpec("int32"), 4, ArrayFieldDecompMeta::Kind::REF_TO_INTEGER_ARR)}, - {"pulse-ops", - ArrayFieldDecompMeta(TypeSpec("int8"), - 1, - ArrayFieldDecompMeta::Kind::REF_TO_INTEGER_ARR)}}}}}}; + {"pulse-ops", ArrayFieldDecompMeta(TypeSpec("int8"), + 1, + ArrayFieldDecompMeta::Kind::REF_TO_INTEGER_ARR)}}}, + {"turret-path", + {{"event-tbl", ArrayFieldDecompMeta(TypeSpec("turret-path-event"), 16)}}}}}}; goos::Object decompile_structure(const TypeSpec& type, const DecompilerLabel& label, diff --git a/goal_src/jak2/characters/ashelin/ash.gc b/goal_src/jak2/characters/ashelin/ash.gc index 3a04692e80..d633b498f1 100644 --- a/goal_src/jak2/characters/ashelin/ash.gc +++ b/goal_src/jak2/characters/ashelin/ash.gc @@ -70,7 +70,72 @@ :default-hit-points 10 :gnd-collide-with (collide-spec backgnd) :overlaps-others-collide-with-filter (collide-spec jak civilian enemy vehicle-sphere hit-by-others-list player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.7 :attack-shove-back (meters 3) @@ -686,7 +751,7 @@ (set! (-> v1-13 attack-id) a0-10) (set! (-> s4-0 attack-id) a0-10) ) - (set! (-> s4-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-0 timeout) (seconds 4)) (vector<-cspace! (-> s4-0 pos) (-> obj node-list data 22)) (set! (-> s4-0 vel quad) (-> arg0 quad)) (vector-! (-> s4-0 vel) (-> s4-0 vel) (-> s4-0 pos)) @@ -1291,7 +1356,9 @@ ) ) (when (>= s5-0 0) - (set! (-> obj victory-speech-time) (+ (get-rand-int-range obj 1200 2100) (-> pp clock frame-counter))) + (set! (-> obj victory-speech-time) + (the-as time-frame (+ (get-rand-int-range obj 1200 2100) (-> pp clock frame-counter))) + ) (play-speech obj s5-0) ) ) diff --git a/goal_src/jak2/characters/sig/sig.gc b/goal_src/jak2/characters/sig/sig.gc index 3b78501893..4b7b98d5c2 100644 --- a/goal_src/jak2/characters/sig/sig.gc +++ b/goal_src/jak2/characters/sig/sig.gc @@ -73,7 +73,72 @@ :default-hit-points 20 :gnd-collide-with (collide-spec backgnd obstacle hit-by-others-list) :overlaps-others-collide-with-filter (collide-spec jak civilian enemy vehicle-sphere hit-by-others-list player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.7 :attack-shove-back (meters 3) @@ -717,7 +782,7 @@ (set! (-> v1-11 attack-id) a0-10) (set! (-> s5-0 attack-id) a0-10) ) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) (vector<-cspace! (-> s5-0 pos) (-> obj node-list data 24)) (set! (-> s5-0 vel quad) (-> arg0 quad)) (vector-! (-> s5-0 vel) (-> s5-0 vel) (-> s5-0 pos)) diff --git a/goal_src/jak2/engine/camera/camera-h.gc b/goal_src/jak2/engine/camera/camera-h.gc index 8aaccd84e5..1f003da17f 100644 --- a/goal_src/jak2/engine/camera/camera-h.gc +++ b/goal_src/jak2/engine/camera/camera-h.gc @@ -407,6 +407,7 @@ cam-standoff-read-entity cam-stick cam-string + cam-turret ) ) diff --git a/goal_src/jak2/engine/common_objs/projectile-h.gc b/goal_src/jak2/engine/common_objs/projectile-h.gc index c6198f5d82..05a3773e57 100644 --- a/goal_src/jak2/engine/common_objs/projectile-h.gc +++ b/goal_src/jak2/engine/common_objs/projectile-h.gc @@ -97,7 +97,7 @@ (ignore-handle handle :offset-assert 40) (pos vector :inline :offset-assert 48) (vel vector :inline :offset-assert 64) - (timeout handle :offset-assert 80) + (timeout time-frame :offset-assert 80) ) :method-count-assert 9 :size-assert #x58 diff --git a/goal_src/jak2/engine/common_objs/projectile.gc b/goal_src/jak2/engine/common_objs/projectile.gc index 9e511ef05b..0ed50d4edb 100644 --- a/goal_src/jak2/engine/common_objs/projectile.gc +++ b/goal_src/jak2/engine/common_objs/projectile.gc @@ -21,8 +21,7 @@ ;; WARN: Return type mismatch int vs sound-id. (defmethod play-impact-sound! projectile ((obj projectile)) - "Plays impact sound -:virtual" + "Plays impact sound" (the-as sound-id 0) ) @@ -118,8 +117,7 @@ If we've met or exceeded the projectiles maximum allowed hits, switch to the [[p ) (defmethod draw-laser-sight projectile ((obj projectile)) - "TODO - confirm If applicable, draw the laser sight particles -:virtual" + "TODO - confirm If applicable, draw the laser sight particles" 0 (none) ) @@ -395,8 +393,7 @@ If we've met or exceeded the projectiles maximum allowed hits, switch to the [[p ) (defmethod init-proj-settings! projectile ((obj projectile)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" 0 (none) ) @@ -470,7 +467,7 @@ If we've met or exceeded the projectiles maximum allowed hits, switch to the [[p (set! (-> self max-speed) 40960.0) (set! (-> self tween) 1.0) (set! (-> self last-target) (the-as handle #f)) - (set! (-> self timeout) (the-as time-frame (-> arg0 timeout))) + (set! (-> self timeout) (-> arg0 timeout)) (set! (-> self max-hits) 1) (set! (-> self spawn-time) (-> self clock frame-counter)) (set! (-> self update-velocity) #f) @@ -609,8 +606,7 @@ If we've met or exceeded the projectiles maximum allowed hits, switch to the [[p ) (defmethod play-impact-sound! projectile-bounce ((obj projectile-bounce)) - "Plays impact sound -:virtual" + "Plays impact sound" (let* ((a2-0 (-> obj root-override)) (v1-0 (-> a2-0 status)) ) @@ -662,8 +658,7 @@ If we've met or exceeded the projectiles maximum allowed hits, switch to the [[p ) (defmethod init-proj-settings! projectile-bounce ((obj projectile-bounce)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj max-speed) 450560.0) (set! (-> obj timeout) (seconds 1.6)) (set! (-> obj update-velocity) projectile-bounce-update-velocity) diff --git a/goal_src/jak2/engine/draw/drawable.gc b/goal_src/jak2/engine/draw/drawable.gc index 221a4ba7b6..55dfd401da 100644 --- a/goal_src/jak2/engine/draw/drawable.gc +++ b/goal_src/jak2/engine/draw/drawable.gc @@ -2079,9 +2079,9 @@ ) ;; more texture mapping. - ; (if (-> *texture-pool* update-flag) - ; (update-warp-and-hud *texture-pool*) - ; ) + (if (-> *texture-pool* update-flag) + (update-warp-and-hud *texture-pool*) + ) ;; unclear why eyes are here... maybe they rely on textures that were just remapped. ; (-> *display* frames (-> *display* on-screen) global-buf) diff --git a/goal_src/jak2/engine/entity/entity-table.gc b/goal_src/jak2/engine/entity/entity-table.gc index 2733c17b1c..cc964d9fcd 100644 --- a/goal_src/jak2/engine/entity/entity-table.gc +++ b/goal_src/jak2/engine/entity/entity-table.gc @@ -58,7 +58,7 @@ :heap-size #x4000 ) (new 'static 'entity-info - :ptype (type-ref jellyfish :method-count 167) + :ptype (type-ref jellyfish :method-count 165) :package "game" :art-group '() :pool '*16k-dead-pool* diff --git a/goal_src/jak2/engine/physics/chain-physics-h.gc b/goal_src/jak2/engine/physics/chain-physics-h.gc index 8d94cd439d..80aecb4e9f 100644 --- a/goal_src/jak2/engine/physics/chain-physics-h.gc +++ b/goal_src/jak2/engine/physics/chain-physics-h.gc @@ -39,7 +39,7 @@ (stretch-vel-parallel float :offset-assert 1348) (compress-vel float :offset-assert 1352) (compress-vel-parallel float :offset-assert 1356) - (negate-y basic :offset-assert 1360) + (negate-y symbol :offset-assert 1360) (axial-slop float :offset-assert 1364) (maximum-stretch float :offset-assert 1368) (turn-off-start time-frame :offset-assert 1376) @@ -52,11 +52,11 @@ (initialize-chain-joints (_type_) symbol 9) (turn-off (_type_ time-frame) none :behavior process 10) (update (_type_ process-drawable) none :behavior process 11) - (gravity-update (_type_) none 12) + (gravity-update (_type_ process-drawable) none 12) (apply-gravity (_type_ vector int process-drawable) none :behavior process 13) (chain-physics-method-14 (_type_ vector int) none 14) (clamp-length (_type_ vector vector object process-drawable) vector 15) (chain-physics-method-16 (_type_ int) float 16) - (chain-physics-method-17 (_type_ vector) none 17) + (chain-physics-method-17 (_type_ vector int) none 17) ) ) diff --git a/goal_src/jak2/engine/physics/chain-physics.gc b/goal_src/jak2/engine/physics/chain-physics.gc index d6281b73f6..de6651f779 100644 --- a/goal_src/jak2/engine/physics/chain-physics.gc +++ b/goal_src/jak2/engine/physics/chain-physics.gc @@ -7,7 +7,7 @@ ;; DECOMP BEGINS -(defmethod gravity-update chain-physics ((obj chain-physics)) +(defmethod gravity-update chain-physics ((obj chain-physics) (arg0 process-drawable)) (vector-seek-3d-smooth! (-> obj gravity) (-> obj gravity-target) 0.05 0.1) 0 (none) @@ -45,7 +45,7 @@ (lerp-scale 5461.3335 10922.667 (the float arg0) 0.0 8.0) ) -(defmethod chain-physics-method-17 chain-physics ((obj chain-physics) (arg0 vector)) +(defmethod chain-physics-method-17 chain-physics ((obj chain-physics) (arg0 vector) (arg1 int)) 0 (none) ) @@ -101,7 +101,7 @@ (vf6 :class vf) ) (init-vf0-vector) - (gravity-update obj) + (gravity-update obj arg0) (let ((s4-0 (new 'stack-no-clear 'matrix)) (s3-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> arg0 node-list data (-> obj root-joint-index)))) (s2-0 (vector-normalize-copy! @@ -207,7 +207,7 @@ (vector+float*! sv-528 s3-0 sv-400 f28-1) ) ) - (chain-physics-method-17 obj sv-528) + (chain-physics-method-17 obj sv-528 s0-0) (set! sv-432 (new 'stack-no-clear 'vector)) (let ((v1-61 s3-0) (a0-27 sv-528) diff --git a/goal_src/jak2/engine/target/board/board-states.gc b/goal_src/jak2/engine/target/board/board-states.gc index ec3ac89568..d11aff906b 100644 --- a/goal_src/jak2/engine/target/board/board-states.gc +++ b/goal_src/jak2/engine/target/board/board-states.gc @@ -2534,7 +2534,7 @@ (set! (-> v1-24 attack-id) a0-13) (set! (-> s5-2 attack-id) a0-13) ) - (set! (-> s5-2 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-2 timeout) (seconds 4)) (vector<-cspace! (-> s5-2 pos) a1-5) (set! (-> s5-2 vel quad) (-> *zero-vector* quad)) (spawn-projectile grenade s5-2 self *default-dead-pool*) diff --git a/goal_src/jak2/engine/target/gun/gun-blue-shot.gc b/goal_src/jak2/engine/target/gun/gun-blue-shot.gc index e583eabae0..e1826730e8 100644 --- a/goal_src/jak2/engine/target/gun/gun-blue-shot.gc +++ b/goal_src/jak2/engine/target/gun/gun-blue-shot.gc @@ -32,7 +32,7 @@ (set! (-> v1-13 attack-id) a0-15) (set! (-> s4-1 attack-id) a0-15) ) - (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 timeout) (seconds 4)) (spawn-projectile gun-blue-shot s4-1 (ppointer->process (-> gp-0 gun)) *default-dead-pool*) ) ) @@ -51,8 +51,7 @@ (defmethod draw-laser-sight gun-blue-shot ((obj gun-blue-shot)) - "TODO - confirm If applicable, draw the laser sight particles -:virtual" + "TODO - confirm If applicable, draw the laser sight particles" (let* ((s5-0 (ppointer->process (-> obj parent))) (s4-0 (-> *part-id-table* 196)) (s3-0 (get-field-spec-by-id s4-0 (sp-field-id spt-omega))) @@ -312,8 +311,7 @@ ) (defmethod init-proj-settings! gun-blue-shot ((obj gun-blue-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (with-pp (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 204 (seconds 0.1)) (set! (-> obj init-pos quad) (-> obj root-override trans quad)) diff --git a/goal_src/jak2/engine/target/gun/gun-dark-shot.gc b/goal_src/jak2/engine/target/gun/gun-dark-shot.gc index 3a01504797..18aa299621 100644 --- a/goal_src/jak2/engine/target/gun/gun-dark-shot.gc +++ b/goal_src/jak2/engine/target/gun/gun-dark-shot.gc @@ -131,7 +131,7 @@ (set! (-> v1-8 attack-id) a0-11) (set! (-> gp-0 attack-id) a0-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (let ((v0-1 (spawn-projectile gun-dark-shot gp-0 (ppointer->process (-> s5-0 gun)) *default-dead-pool*))) (when v0-1 (set! (-> (the-as gun-dark-shot (-> v0-1 0)) track-target) (-> self gun track-target 0 handle)) @@ -143,8 +143,7 @@ ) (defmethod init-proj-settings! gun-dark-shot ((obj gun-dark-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj attack-mode) 'eco-dark) (vector-normalize! (-> obj root-override transv) (+ 225280.0 (* 225280.0 (-> obj charge-level)))) (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 72) obj)) diff --git a/goal_src/jak2/engine/target/gun/gun-util.gc b/goal_src/jak2/engine/target/gun/gun-util.gc index f18821a48d..fabed53bb6 100644 --- a/goal_src/jak2/engine/target/gun/gun-util.gc +++ b/goal_src/jak2/engine/target/gun/gun-util.gc @@ -17,8 +17,7 @@ (defmethod init-proj-settings! gun-eject ((obj gun-eject)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (initialize-skeleton obj (the-as skeleton-group (art-group-get-by-name *level* "skel-gun" (the-as (pointer uint32) #f))) @@ -49,8 +48,7 @@ (defmethod init-proj-settings! gun-mag-yellow ((obj gun-mag-yellow)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (initialize-skeleton obj (the-as skeleton-group (art-group-get-by-name *level* "skel-ammo-yellow" (the-as (pointer uint32) #f))) @@ -75,8 +73,7 @@ (defmethod init-proj-settings! gun-mag-red ((obj gun-mag-red)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (initialize-skeleton obj (the-as skeleton-group (art-group-get-by-name *level* "skel-ammo-red" (the-as (pointer uint32) #f))) @@ -101,8 +98,7 @@ (defmethod init-proj-settings! gun-mag-blue ((obj gun-mag-blue)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (initialize-skeleton obj (the-as skeleton-group (art-group-get-by-name *level* "skel-ammo-blue" (the-as (pointer uint32) #f))) @@ -127,8 +123,7 @@ (defmethod init-proj-settings! gun-mag-dark ((obj gun-mag-dark)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (initialize-skeleton obj (the-as skeleton-group (art-group-get-by-name *level* "skel-ammo-dark" (the-as (pointer uint32) #f))) @@ -361,7 +356,7 @@ (set! (-> v1-98 attack-id) a0-44) (set! (-> s5-2 attack-id) a0-44) ) - (set! (-> s5-2 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-2 timeout) (seconds 4)) (let ((t9-7 spawn-projectile) (v1-100 gp-1) ) @@ -897,7 +892,7 @@ (set! (-> v1-13 attack-id) a0-12) (set! (-> gp-0 attack-id) a0-12) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (spawn-projectile gun-eject gp-0 self *default-dead-pool*) ) (ja-channel-set! 0) diff --git a/goal_src/jak2/engine/target/gun/gun-yellow-shot.gc b/goal_src/jak2/engine/target/gun/gun-yellow-shot.gc index cb69f5e3fc..38b628dee1 100644 --- a/goal_src/jak2/engine/target/gun/gun-yellow-shot.gc +++ b/goal_src/jak2/engine/target/gun/gun-yellow-shot.gc @@ -24,7 +24,7 @@ (set! (-> v1-9 attack-id) a0-9) (set! (-> gp-0 attack-id) a0-9) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (vector-float*! (-> gp-0 vel) (-> s5-0 fire-dir-out) 819200.0) (spawn-projectile gun-yellow-shot gp-0 (ppointer->process (-> s5-0 gun)) *default-dead-pool*) ) @@ -45,7 +45,7 @@ (set! (-> v1-7 attack-id) a0-8) (set! (-> gp-0 attack-id) a0-8) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (vector-normalize-copy! (-> gp-0 vel) arg2 819200.0) (spawn-projectile gun-yellow-shot gp-0 arg0 *default-dead-pool*) ) @@ -64,8 +64,7 @@ (defmethod draw-laser-sight gun-yellow-shot ((obj gun-yellow-shot)) - "TODO - confirm If applicable, draw the laser sight particles -:virtual" + "TODO - confirm If applicable, draw the laser sight particles" (draw-beam (-> *part-id-table* 227) (-> obj tail-pos) (-> obj starting-dir) #f #t) 0 (none) @@ -376,8 +375,7 @@ ) (defmethod init-proj-settings! gun-yellow-shot ((obj gun-yellow-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj hit-actor?) #f) (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 204 (seconds 0.1)) diff --git a/goal_src/jak2/engine/target/target-h.gc b/goal_src/jak2/engine/target/target-h.gc index 82ce21b615..98daa8b129 100644 --- a/goal_src/jak2/engine/target/target-h.gc +++ b/goal_src/jak2/engine/target/target-h.gc @@ -16,6 +16,7 @@ (declare-type darkjak-info basic) (declare-type mech-info basic) (declare-type indax-info basic) +(declare-type turret-info basic) (declare-type sparticle-launcher basic) ;; NOTE - for level-info, defined in `logic-target` @@ -242,7 +243,7 @@ (pilot pilot-info :offset-assert 2208) (gun gun-info :offset-assert 2212) (mech mech-info :offset-assert 2216) - (turret basic :offset-assert 2220) + (turret turret-info :offset-assert 2220) (darkjak darkjak-info :offset-assert 2224) (indax indax-info :offset-assert 2228) ) @@ -400,7 +401,9 @@ (target-tube-jump float float) (target-tube-start handle) target-turn-around + target-turret-get-off (target-turret-get-on handle) + (target-turret-stance handle) target-wade-stance target-wade-walk target-walk diff --git a/goal_src/jak2/engine/target/target-turret.gc b/goal_src/jak2/engine/target/target-turret.gc index cf8bdb039b..7d43897e61 100644 --- a/goal_src/jak2/engine/target/target-turret.gc +++ b/goal_src/jak2/engine/target/target-turret.gc @@ -5,5 +5,2596 @@ ;; name in dgo: target-turret ;; dgos: DMI +(define-extern *turret-get-on-mods* surface) + ;; DECOMP BEGINS +(defpartgroup group-turret-explode + :id 201 + :duration (seconds 0.5) + :linger-duration (seconds 1) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 15) + :parts ((sp-item 924 :period 1500 :length 25 :offset -10) + (sp-item 925 :fade-after (meters 60) :period 1500 :length 30) + (sp-item 926 :fade-after (meters 60) :falloff-to (meters 60) :period 1500 :length 100) + (sp-item 927 :fade-after (meters 200) :falloff-to (meters 200) :period 1500 :length 50) + (sp-item 928 :period 1500 :length 5 :offset -10) + (sp-item 929 :fade-after (meters 150) :falloff-to (meters 150) :period 1500 :length 50) + ) + ) + +(defpart 927 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x34 :page #xc)) + (sp-rnd-flt spt-num 1.0 1.0 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-rot-z) + :flags (sp-flag spflag7) + :random-rangef 65536.0 + :random-multf 1.0 + ) + (sp-rnd-flt spt-scale-y (meters 0.8) (meters 0.2) 1.0) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.02) (meters 0.01) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-func spt-func 'sparticle-motion-blur) + (sp-int-plain-rnd spt-next-time 25 4 1) + (sp-launcher-by-id spt-next-launcher 930) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-conerot-x) + :flags (sp-flag from-pointer) + :func '*sp-temp* + ) + ) + ) + +(defpart 929 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x33 :page #xc)) + (sp-rnd-flt spt-num 1.0 1.0 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (sp-flt spt-rot-z (degrees 0.0)) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 0.0) + (sp-rnd-flt spt-vel-y (meters 0.02) (meters 0.01) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a 0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int-plain-rnd spt-next-time 25 4 1) + (sp-launcher-by-id spt-next-launcher 930) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +(defpart 930 + :init-specs ((sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.0) + (sp-flt spt-fade-b 0.0) + (sp-int-plain-rnd spt-next-time 5 19 1) + (sp-launcher-by-id spt-next-launcher 931) + ) + ) + +(defpart 931 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.016666668) (meters 0.016666668) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.44) + (sp-flt spt-fade-g -2.36) + (sp-flt spt-fade-b -2.64) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 932) + ) + ) + +(defpart 932 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.008333334) (meters 0.008333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -1.2944444) + (sp-flt spt-fade-g -0.7111111) + (sp-flt spt-fade-b -0.094444446) + (sp-rnd-flt spt-fade-a -0.06545454 -0.06545454 1.0) + (sp-int-plain-rnd spt-next-time 150 29 1) + (sp-launcher-by-id spt-next-launcher 933) + ) + ) + +(defpart 933 + :init-specs ((sp-flt spt-fade-r 0.0) (sp-flt spt-fade-g 0.0) (sp-flt spt-fade-b 0.0)) + ) + +(defpart 928 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x47 :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 5)) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 96.0) + (sp-flt spt-scalevel-x (meters 0.5)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -1.28) + (sp-flt spt-fade-b -5.1) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 100) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-int spt-next-time 50) + (sp-launcher-by-id spt-next-launcher 934) + ) + ) + +(defpart 934 + :init-specs ((sp-flt spt-scalevel-x (meters -0.2)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -2.56) + (sp-flt spt-fade-b 0.0) + (sp-flt spt-fade-a -1.92) + ) + ) + +(defpart 926 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x32 :page #xc)) + (sp-rnd-flt spt-num 5.0 3.0 1.0) + (sp-flt spt-x (meters 0.25)) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.25) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 16.0 48.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.083333336) (meters 0.083333336) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.006666667) (meters 0.0016666667) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.18) + (sp-flt spt-fade-b -2.12) + (sp-rnd-flt spt-accel-y -0.68266666 -1.3653333 1.0) + (sp-flt spt-friction 0.87) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 935) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +(defpart 935 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0016666667)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.02) + (sp-flt spt-fade-b 0.23555556) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 936) + ) + ) + +(defpart 936 + :init-specs ((sp-flt spt-fade-r -0.5543478) (sp-flt spt-fade-g -0.5543478) (sp-flt spt-fade-a -0.13913043)) + ) + +(defpart 924 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 3.0 1.0 1.0) + (sp-rnd-flt spt-x (meters 0) (meters 0.6) 1.0) + (sp-rnd-flt spt-scale-x (meters 2) (meters 1.5) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 70.0 20.0 1.0) + (sp-rnd-flt spt-g 70.0 20.0 1.0) + (sp-rnd-flt spt-b 70.0 20.0 1.0) + (sp-rnd-flt spt-a 0.0 40.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0) (meters 0.1) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.033333335) (meters 0.016666668) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 3.3) + (sp-flt spt-fade-g 3.12) + (sp-flt spt-fade-b 1.18) + (sp-flt spt-fade-a 1.76) + (sp-flt spt-friction 0.88) + (sp-int spt-timer 710) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 937) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +(defpart 937 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.53333336) + (sp-flt spt-fade-g -1.9666667) + (sp-flt spt-fade-b -2.2) + (sp-flt spt-fade-a -0.41666666) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 938) + ) + ) + +(defpart 938 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.38833332) + (sp-flt spt-fade-g -0.21333334) + (sp-flt spt-fade-b -0.028333334) + (sp-flt spt-fade-a -0.38833332) + ) + ) + +(defpart 925 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x31 :page #xc)) + (sp-rnd-flt spt-num 4.0 2.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.1) (meters 0.25) 1.0) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.2) (meters 0.1) 1.0) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-flt spt-g 96.0) + (sp-flt spt-b 64.0) + (sp-rnd-flt spt-a 64.0 64.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.13333334) (meters 0.02) 1.0) + (sp-flt spt-fade-g 1.6) + (sp-flt spt-fade-b 3.2) + (sp-flt spt-fade-a -1.6) + (sp-int spt-timer 80) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + ) + ) + +(deftype hud-turret-health (hud) + ((fade-interp float :offset-assert 2980) + ) + :heap-base #xb30 + :method-count-assert 27 + :size-assert #xba8 + :flag-assert #x1b0b300ba8 + ) + + +(defmethod draw hud-turret-health ((obj hud-turret-health)) + (with-pp + (seek! + (-> obj fade-interp) + (if (>= (-> *camera-combiner* interp-val) 1.0) + 80.0 + 0.0 + ) + (-> pp clock time-adjust-ratio) + ) + (dotimes (v1-3 30) + (set! (-> obj sprites v1-3 color w) (the int (* (-> obj fade-interp) (- 1.0 (-> obj offset))))) + ) + (set-as-offset-from! (-> obj sprites 1) (the-as vector4w (-> obj sprites)) 44 0) + (set-as-offset-from! (-> obj sprites 2) (the-as vector4w (-> obj sprites)) 0 44) + (set-as-offset-from! (-> obj sprites 3) (the-as vector4w (-> obj sprites)) 44 44) + (dotimes (v1-6 16) + (set! (-> obj sprites (- 19 v1-6) scale-x) (if (< v1-6 (-> obj values 0 current)) + 0.7 + 0.0 + ) + ) + ) + (set-as-offset-from! (-> obj sprites 4) (the-as vector4w (-> obj sprites)) 13 6) + (set-as-offset-from! (-> obj sprites 5) (the-as vector4w (-> obj sprites)) 25 10) + (set-as-offset-from! (-> obj sprites 6) (the-as vector4w (-> obj sprites)) 34 19) + (set-as-offset-from! (-> obj sprites 7) (the-as vector4w (-> obj sprites)) 39 32) + (set-as-offset-from! (-> obj sprites 8) (the-as vector4w (-> obj sprites)) 39 47) + (set-as-offset-from! (-> obj sprites 9) (the-as vector4w (-> obj sprites)) 34 59) + (set-as-offset-from! (-> obj sprites 10) (the-as vector4w (-> obj sprites)) 25 67) + (set-as-offset-from! (-> obj sprites 11) (the-as vector4w (-> obj sprites)) 13 71) + (set-as-offset-from! (-> obj sprites 12) (the-as vector4w (-> obj sprites)) -1 71) + (set-as-offset-from! (-> obj sprites 13) (the-as vector4w (-> obj sprites)) -14 67) + (set-as-offset-from! (-> obj sprites 14) (the-as vector4w (-> obj sprites)) -22 59) + (set-as-offset-from! (-> obj sprites 15) (the-as vector4w (-> obj sprites)) -27 47) + (set-as-offset-from! (-> obj sprites 16) (the-as vector4w (-> obj sprites)) -27 32) + (set-as-offset-from! (-> obj sprites 17) (the-as vector4w (-> obj sprites)) -22 19) + (set-as-offset-from! (-> obj sprites 18) (the-as vector4w (-> obj sprites)) -14 10) + (set-as-offset-from! (-> obj sprites 19) (the-as vector4w (-> obj sprites)) -1 6) + (let ((f0-9 (the float (-> obj values 1 current)))) + (cond + ((>= f0-9 100.0) + (let ((f0-10 (if (< 100 (mod (-> *display* game-clock frame-counter) 200)) + 0.0 + 90.0 + ) + ) + ) + (set! (-> obj sprites 26 angle) (* 182.04445 (- 270.0 f0-10))) + (set! (-> obj sprites 24 angle) (* 182.04445 (- f0-10))) + (set! (-> obj sprites 22 angle) (* 182.04445 (- 90.0 f0-10))) + (set! (-> obj sprites 20 angle) (* 182.04445 (- 180.0 f0-10))) + ) + ) + ((< 75.0 f0-9) + (set! (-> obj sprites 26 angle) (* 182.04445 (- 180.0 (* 3.6 (+ -75.0 f0-9))))) + (set! (-> obj sprites 24 angle) 32768.0) + (set! (-> obj sprites 22 angle) 49152.0) + (set! (-> obj sprites 20 angle) 0.0) + ) + ((< 50.0 f0-9) + (set! (-> obj sprites 26 angle) 32768.0) + (set! (-> obj sprites 24 angle) (* 182.04445 (- 270.0 (* 3.6 (+ -50.0 f0-9))))) + (set! (-> obj sprites 22 angle) 49152.0) + (set! (-> obj sprites 20 angle) 0.0) + ) + ((< 25.0 f0-9) + (set! (-> obj sprites 26 angle) 32768.0) + (set! (-> obj sprites 24 angle) 49152.0) + (set! (-> obj sprites 22 angle) (* 182.04445 (- (* 3.6 (+ -25.0 f0-9))))) + (set! (-> obj sprites 20 angle) 0.0) + ) + (else + (set! (-> obj sprites 26 angle) 32768.0) + (set! (-> obj sprites 24 angle) 49152.0) + (set! (-> obj sprites 22 angle) 0.0) + (set! (-> obj sprites 20 angle) (* 182.04445 (- 90.0 (* 3.6 f0-9)))) + ) + ) + ) + (set-as-offset-from! (-> obj sprites 20) (the-as vector4w (-> obj sprites)) 0 45) + (set-as-offset-from! (-> obj sprites 22) (the-as vector4w (-> obj sprites)) 0 44) + (set-as-offset-from! (-> obj sprites 24) (the-as vector4w (-> obj sprites)) 2 44) + (set-as-offset-from! (-> obj sprites 26) (the-as vector4w (-> obj sprites)) 2 45) + (set-as-offset-from! (-> obj sprites 21) (the-as vector4w (-> obj sprites)) 0 14) + (set-as-offset-from! (-> obj sprites 23) (the-as vector4w (-> obj sprites)) 0 44) + (set-as-offset-from! (-> obj sprites 25) (the-as vector4w (-> obj sprites)) -30 44) + (set-as-offset-from! (-> obj sprites 27) (the-as vector4w (-> obj sprites)) -30 14) + (set-as-offset-from! (-> obj sprites 29) (the-as vector4w (-> obj sprites)) -10 36) + (let ((f0-34 (if (and (= (-> obj values 4 current) 1) (< 25 (mod (-> *display* game-clock frame-counter) 50))) + 250.0 + 100.0 + ) + ) + ) + (set! (-> obj sprites 29 color x) (the int f0-34)) + (set! (-> obj sprites 29 color y) (the int (if (>= (-> obj values 1 current) 100) + 0.0 + f0-34 + ) + ) + ) + ) + (set! (-> obj sprites 29 color z) (-> obj sprites 29 color y)) + (let ((f30-0 (- (the float (-> obj values 3 current))))) + (let ((a1-31 (new 'stack-no-clear 'vector))) + (set! (-> a1-31 x) 128.0) + (set! (-> a1-31 y) 128.0) + (set! (-> a1-31 z) 128.0) + (set! (-> a1-31 w) 0.0) + (let ((a2-29 (new 'stack-no-clear 'vector))) + (set! (-> a2-29 x) 255.0) + (set! (-> a2-29 y) 24.0) + (set! (-> a2-29 z) 32.0) + (set! (-> a2-29 w) 0.0) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (vector-lerp! s5-0 a1-31 a2-29 (* 0.01 (the float (-> obj values 5 current)))) + (vector-cvt.w.s! (the-as vector (-> obj sprites 28 color2)) s5-0) + ) + ) + ) + (set! (-> obj sprites 28 color w) + (the int (* 0.00390625 (-> obj fade-interp) (the float (-> obj values 2 current)))) + ) + (set-as-offset-from! + (-> obj sprites 28) + (the-as vector4w (-> obj sprites)) + (the int (* -70.0 (sin f30-0))) + (+ (the int (* -70.0 (cos f30-0))) 44) + ) + (set! (-> obj sprites 28 angle) (+ -8192.0 f30-0)) + ) + ((method-of-type hud draw) obj) + 0 + (none) + ) + ) + +(defmethod update-values hud-turret-health ((obj hud-turret-health)) + (set! (-> obj values 0 target) (the int (-> *game-info* score))) + ((method-of-type hud update-values) obj) + 0 + (none) + ) + +(defmethod event-callback hud-turret-health ((obj hud-turret-health) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('set-heat) + (set! (-> obj values 1 target) (the int (* 100.0 (the-as float (-> arg3 param 0))))) + ) + (('set-arrow-alpha) + (set! (-> obj values 2 target) (the int (* 256.0 (the-as float (-> arg3 param 0))))) + ) + (('set-arrow-angle) + (set! (-> obj values 3 target) (the int (the-as float (-> arg3 param 0)))) + ) + (('set-target-flash) + (set! (-> obj values 4 target) (if (-> arg3 param 0) + 1 + 0 + ) + ) + ) + (('set-arrow-red) + (set! (-> obj values 5 target) (the int (* 100.0 (the-as float (-> arg3 param 0))))) + ) + (('set-hud-pos) + (set-hud-piece-position! + (the-as hud-sprite (-> obj sprites)) + (the-as int (-> arg3 param 0)) + (the-as int (+ (-> arg3 param 1) -4)) + ) + ) + ) + ((method-of-type hud event-callback) obj arg0 arg1 arg2 arg3) + ) + +(defun init-turret-hud ((arg0 hud-turret-health) (arg1 string)) + (set! (-> arg0 gui-id) + (add-process *gui-control* arg0 (gui-channel hud-middle-right) (gui-action hidden) (-> arg0 name) 81920.0 0) + ) + (logior! (-> arg0 flags) (hud-flags show)) + (set! (-> arg0 fade-interp) 0.0) + (dotimes (v1-4 30) + (set! (-> arg0 sprites v1-4 scale-x) 0.7) + (set! (-> arg0 sprites v1-4 scale-y) 0.7) + (set! (-> arg0 sprites v1-4 pos z) #xfffff0) + ) + (set! (-> arg0 sprites 0 tex) + (lookup-texture-by-name "drill-turret-hud-ring-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 0 flags) (the-as uint 4)) + (set! (-> arg0 sprites 1 tex) (-> arg0 sprites 0 tex)) + (set! (-> arg0 sprites 1 flags) (the-as uint 5)) + (set! (-> arg0 sprites 2 tex) (-> arg0 sprites 0 tex)) + (set! (-> arg0 sprites 2 flags) (the-as uint 6)) + (set! (-> arg0 sprites 3 tex) (-> arg0 sprites 0 tex)) + (set! (-> arg0 sprites 3 flags) (the-as uint 7)) + (set! (-> arg0 sprites 4 tex) + (lookup-texture-by-name "drill-turret-hud-health-04" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 4 flags) (the-as uint 5)) + (set! (-> arg0 sprites 5 tex) + (lookup-texture-by-name "drill-turret-hud-health-03" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 5 flags) (the-as uint 5)) + (set! (-> arg0 sprites 6 tex) + (lookup-texture-by-name "drill-turret-hud-health-02" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 6 flags) (the-as uint 5)) + (set! (-> arg0 sprites 7 tex) + (lookup-texture-by-name "drill-turret-hud-health-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 7 flags) (the-as uint 5)) + (set! (-> arg0 sprites 8 tex) (-> arg0 sprites 7 tex)) + (set! (-> arg0 sprites 8 flags) (the-as uint 7)) + (set! (-> arg0 sprites 9 tex) (-> arg0 sprites 6 tex)) + (set! (-> arg0 sprites 9 flags) (the-as uint 7)) + (set! (-> arg0 sprites 10 tex) (-> arg0 sprites 5 tex)) + (set! (-> arg0 sprites 10 flags) (the-as uint 7)) + (set! (-> arg0 sprites 11 tex) (-> arg0 sprites 4 tex)) + (set! (-> arg0 sprites 11 flags) (the-as uint 7)) + (set! (-> arg0 sprites 12 tex) (-> arg0 sprites 4 tex)) + (set! (-> arg0 sprites 12 flags) (the-as uint 6)) + (set! (-> arg0 sprites 13 tex) (-> arg0 sprites 5 tex)) + (set! (-> arg0 sprites 13 flags) (the-as uint 6)) + (set! (-> arg0 sprites 14 tex) (-> arg0 sprites 6 tex)) + (set! (-> arg0 sprites 14 flags) (the-as uint 6)) + (set! (-> arg0 sprites 15 tex) (-> arg0 sprites 7 tex)) + (set! (-> arg0 sprites 15 flags) (the-as uint 6)) + (set! (-> arg0 sprites 16 tex) (-> arg0 sprites 7 tex)) + (set! (-> arg0 sprites 16 flags) (the-as uint 4)) + (set! (-> arg0 sprites 17 tex) (-> arg0 sprites 6 tex)) + (set! (-> arg0 sprites 17 flags) (the-as uint 4)) + (set! (-> arg0 sprites 18 tex) (-> arg0 sprites 5 tex)) + (set! (-> arg0 sprites 18 flags) (the-as uint 4)) + (set! (-> arg0 sprites 19 tex) (-> arg0 sprites 4 tex)) + (set! (-> arg0 sprites 19 flags) (the-as uint 4)) + (set! (-> arg0 sprites 20 tex) + (lookup-texture-by-name "hud-transparent-01" (the-as string #f) (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 20 pos z) #xfffff1) + (set! (-> arg0 sprites 21 tex) + (lookup-texture-by-name "drill-turret-hud-heat-ring-02" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 21 pos z) #xfffff0) + (set! (-> arg0 sprites 22 tex) (-> arg0 sprites 20 tex)) + (set! (-> arg0 sprites 22 pos z) #xfffff3) + (set! (-> arg0 sprites 23 tex) + (lookup-texture-by-name "drill-turret-hud-heat-ring-04" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 23 pos z) #xfffff2) + (set! (-> arg0 sprites 24 tex) (-> arg0 sprites 20 tex)) + (set! (-> arg0 sprites 24 pos z) #xfffff5) + (set! (-> arg0 sprites 25 tex) + (lookup-texture-by-name "drill-turret-hud-heat-ring-03" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 25 pos z) #xfffff4) + (set! (-> arg0 sprites 26 tex) (-> arg0 sprites 20 tex)) + (set! (-> arg0 sprites 26 pos z) #xfffff7) + (set! (-> arg0 sprites 27 tex) + (lookup-texture-by-name "drill-turret-hud-heat-ring-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 27 pos z) #xfffff6) + (set! (-> arg0 sprites 28 tex) + (lookup-texture-by-name "drill-turret-hud-arrow-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 28 pos z) #xffffff) + (set! (-> arg0 sprites 29 tex) + (lookup-texture-by-name "drill-turret-hud-centre-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 29 pos z) #xffffff) + (set! (-> arg0 sprites 20 scale-x) 8.0) + (set! (-> arg0 sprites 20 scale-y) 8.0) + (set! (-> arg0 sprites 22 scale-x) 8.0) + (set! (-> arg0 sprites 22 scale-y) 8.0) + (set! (-> arg0 sprites 24 scale-x) 8.0) + (set! (-> arg0 sprites 24 scale-y) 8.0) + (set! (-> arg0 sprites 26 scale-x) 8.0) + (set! (-> arg0 sprites 26 scale-y) 8.0) + 0 + (none) + ) + +(deftype hud-drill-turret-health (hud-turret-health) + () + :heap-base #xb30 + :method-count-assert 27 + :size-assert #xba8 + :flag-assert #x1b0b300ba8 + ) + + +(defmethod init-callback hud-drill-turret-health ((obj hud-drill-turret-health)) + (set! (-> obj level) (level-get *level* 'drillmid)) + (init-turret-hud obj "drillmid-minimap") + ((method-of-type hud init-callback) obj) + 0 + (none) + ) + +(deftype hud-port-turret-health (hud-turret-health) + () + :heap-base #xb30 + :method-count-assert 27 + :size-assert #xba8 + :flag-assert #x1b0b300ba8 + ) + + +(defmethod init-callback hud-port-turret-health ((obj hud-port-turret-health)) + (set! (-> obj level) (level-get *level* 'portblmp)) + (init-turret-hud obj "portblmp-minimap") + ((method-of-type hud init-callback) obj) + 0 + (none) + ) + +(deftype turret-info (basic) + ((process (pointer process) :offset-assert 4) + (handle handle :offset-assert 8) + (turret (pointer base-turret) :offset-assert 16) + (grabbed? symbol :offset-assert 20) + (quat quaternion :inline :offset-assert 32) + (trans vector :inline :offset-assert 48) + ) + :method-count-assert 9 + :size-assert #x40 + :flag-assert #x900000040 + ) + + +(defskelgroup skel-turret drill-turret-ext drill-turret-ext-lod0-jg drill-turret-ext-idle-ja + ((drill-turret-ext-lod0-mg (meters 999999))) + :bounds (static-spherem 0 1.8 0 3.8) + :origin-joint-index 3 + ) + +(defskelgroup skel-turret-explode drill-turret-ext drill-turret-ext-explode-lod0-jg drill-turret-ext-explode-idle-ja + ((drill-turret-ext-explode-lod0-mg (meters 999999))) + :bounds (static-spherem 0 1.8 0 3.8) + :origin-joint-index 3 + ) + +(define *turret-exploder-params* + (new 'static 'joint-exploder-static-params + :joints (new 'static 'boxed-array :type joint-exploder-static-joint-params + (new 'static 'joint-exploder-static-joint-params :joint-index 3 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 4 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 5 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 6 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 7 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 8 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 9 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 10 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 11 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 12 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 13 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 14 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 15 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 16 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 17 :parent-joint-index -1) + ) + :collide-spec #x1 + ) + ) + +(deftype turret-path-event (structure) + ((pos float :offset-assert 0) + (event-type symbol :offset-assert 4) + (param object :offset-assert 8) + ) + :method-count-assert 9 + :size-assert #xc + :flag-assert #x90000000c + ) + + +(deftype turret-path (structure) + ((event-count int32 :offset-assert 0) + (event-tbl (inline-array turret-path-event) :offset-assert 4) + ) + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + + +(deftype base-turret (process-focusable) + ((hud handle :offset-assert 208) + (condition int32 :offset-assert 216) + (shadow-backup symbol :offset-assert 220) + (rider handle :offset-assert 224) + (actor-group (pointer actor-group) :offset-assert 232) + (actor-group-count int32 :offset-assert 236) + (alt-actor symbol :offset-assert 240) + (smush-control smush-control :inline :offset-assert 248) + (sound-id sound-id 3 :offset-assert 280) + (sound-playing symbol 3 :offset-assert 292) + (cam-string-vector vector :inline :offset-assert 304) + (path-event turret-path :offset-assert 320) + (path-u float :offset-assert 324) + (path-u-prev float :offset-assert 328) + (path-mode uint16 :offset-assert 332) + (path-speed float :offset-assert 336) + (path-speed-mult float :offset-assert 340) + (path-speed-mult-final float :offset-assert 344) + (path-old-pos vector :inline :offset-assert 352) + (path-direction symbol :offset-assert 368) + (pause-proc (function base-turret symbol) :offset-assert 372) + (gun-recoil-jmod joint-mod-add-local 4 :offset-assert 376) + (gun-index int32 :offset-assert 392) + (shot-timeout time-frame :offset-assert 400) + (fire-time time-frame :offset-assert 408) + (fire-time-interval time-frame :offset-assert 416) + (enable-controls symbol :offset-assert 424) + (available-for-pickup symbol :offset-assert 428) + (roty degrees :offset-assert 432) + (rotyv degrees :offset-assert 436) + (rotyvv degrees :offset-assert 440) + (roty-min degrees :offset-assert 444) + (roty-max degrees :offset-assert 448) + (rotx degrees :offset-assert 452) + (rotxv degrees :offset-assert 456) + (rotxvv degrees :offset-assert 460) + (rotx-min degrees :offset-assert 464) + (rotx-max degrees :offset-assert 468) + (target-quat quaternion :inline :offset-assert 480) + (init-quat quaternion :inline :offset-assert 496) + (health float :offset-assert 512) + (track-handle handle :offset-assert 520) + (heat float :offset-assert 528) + (heat-target float :offset-assert 532) + (arrow-angle degrees :offset-assert 536) + (arrow-alpha float :offset-assert 540) + (arrow-red float :offset-assert 544) + (red-filter-timer time-frame :offset-assert 552) + (ride-height float :offset-assert 560) + ) + :heap-base #x1c0 + :method-count-assert 49 + :size-assert #x234 + :flag-assert #x3101c00234 + (:methods + (idle () _type_ :state 27) + (setup () _type_ :state 28) + (active () _type_ :state 29) + (shutdown () _type_ :state 30) + (dormant () _type_ :state 31) + (die () _type_ :state 32) + (turret-init! (_type_ entity-actor matrix) none 33) + (base-turret-method-34 (_type_ process) none 34) + (base-turret-method-35 (_type_) none 35) + (base-turret-method-36 (_type_) none 36) + (base-turret-method-37 (_type_) none 37) + (base-turret-method-38 (_type_) none 38) + (base-turret-method-39 (_type_ turret-path-event) none 39) + (base-turret-method-40 (_type_) none 40) + (base-turret-method-41 (_type_ vector) symbol 41) + (base-turret-method-42 (_type_ vector vector float) float 42) + (base-turret-method-43 (_type_) none 43) + (base-turret-method-44 (_type_ vector vector) none 44) + (base-turret-method-45 (_type_ object symbol) none 45) + (base-turret-method-46 (_type_ process) process 46) + (base-turret-method-47 (_type_) none 47) + (turret-event-handler (_type_ process int symbol event-message-block) object 48) + ) + ) + + +;; WARN: Return type mismatch process-drawable vs base-turret. +(defmethod relocate base-turret ((obj base-turret) (arg0 int)) + (countdown (v1-0 4) + (if (-> obj gun-recoil-jmod v1-0) + (&+! (-> obj gun-recoil-jmod v1-0) arg0) + ) + ) + (the-as base-turret ((method-of-type process-drawable relocate) obj arg0)) + ) + +(defmethod base-turret-method-34 base-turret ((obj base-turret) (arg0 process)) + 0 + (none) + ) + +(defmethod base-turret-method-35 base-turret ((obj base-turret)) + (send-event (handle->process (-> obj hud)) 'force-show) + 0 + (none) + ) + +(defmethod base-turret-method-36 base-turret ((obj base-turret)) + (if (nonzero? (-> obj part)) + (spawn (-> obj part) (-> obj root-override trans)) + ) + 0 + (none) + ) + +(defmethod base-turret-method-40 base-turret ((obj base-turret)) + (let ((s3-0 (new 'stack-no-clear 'matrix)) + (s4-0 (new 'stack-no-clear 'matrix)) + (gp-0 (new 'stack-no-clear 'quaternion)) + ) + (matrix-rotate-y! s3-0 (-> obj roty)) + (matrix-rotate-x! s4-0 (-> obj rotx)) + (matrix*! s3-0 s4-0 s3-0) + (matrix->quaternion gp-0 s3-0) + (quaternion-smooth-seek! (-> obj target-quat) (-> obj target-quat) gp-0 0.33) + (let ((f0-2 (update! (-> obj smush-control)))) + (quaternion-rotate-local-x! (-> obj root-override quat) gp-0 (* -910.2222 f0-2)) + ) + ) + 0 + (none) + ) + +(defmethod base-turret-method-37 base-turret ((obj base-turret)) + (let ((f30-0 (fabs (* 0.00006866455 (-> obj rotyv)))) + (f28-0 (fabs (* 0.00010986328 (-> obj rotxv)))) + (f26-0 0.33333334) + (f24-0 0.5) + (s5-0 (-> obj sound-playing 0)) + (s4-0 (-> obj sound-playing 1)) + ) + (cond + ((and (-> obj sound-playing 0) (< f30-0 f26-0)) + (sound-stop (-> obj sound-id 0)) + (set! (-> obj sound-playing 0) #f) + ) + ((< (* 1.2 f26-0) f30-0) + (sound-play "drill-turret-lp" :id (-> obj sound-id 0) :position (-> obj root-override trans)) + (set! (-> obj sound-playing 0) #t) + ) + ) + (cond + ((and (-> obj sound-playing 1) (< f28-0 f24-0)) + (sound-stop (-> obj sound-id 1)) + (set! (-> obj sound-playing 1) #f) + ) + ((< (* 1.2 f24-0) f28-0) + (sound-play "drill-turret-l2" :id (-> obj sound-id 1) :position (-> obj root-override trans)) + (set! (-> obj sound-playing 1) #t) + ) + ) + (if (and (or s5-0 s4-0) (< f30-0 f26-0) (< f28-0 f24-0)) + (sound-play "drill-tur-stop" :position (-> obj root-override trans)) + ) + ) + (case (-> obj path-mode) + ((2 3 4) + (sound-play-by-name + (static-sound-name "turret-track") + (-> obj sound-id 2) + (the int (* 1024.0 (lerp-clamp 0.0 1.0 (-> obj path-speed-mult)))) + (the int (* 1524.0 (lerp-scale -0.3 0.3 (-> obj path-speed-mult) 0.0 4.0))) + 0 + (sound-group sfx) + (-> obj root-override trans) + ) + (set! (-> obj sound-playing 2) #t) + ) + (else + (when (-> obj sound-playing 2) + (sound-stop (-> obj sound-id 2)) + (set! (-> obj sound-playing 2) #f) + ) + ) + ) + 0 + (none) + ) + +(defmethod turret-event-handler base-turret ((obj base-turret) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (local-vars (v0-0 object)) + (case arg2 + (('trans) + (set! v0-0 (-> arg3 param 0)) + (set! (-> (the-as vector v0-0) quad) (-> obj root-override trans quad)) + v0-0 + ) + (('quat) + (quaternion-copy! (the-as quaternion (-> arg3 param 0)) (-> obj target-quat)) + ) + (('path) + (if (not (logtest? (-> obj path flags) (path-control-flag not-found))) + (-> obj path) + #f + ) + ) + (('shadow) + (cond + ((-> arg3 param 0) + (set! v0-0 (-> obj shadow-backup)) + (set! (-> obj draw shadow) (the-as shadow-geo v0-0)) + v0-0 + ) + (else + (set! (-> obj draw shadow) #f) + #f + ) + ) + ) + ) + ) + +(defbehavior turret-handler base-turret ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (turret-event-handler self arg0 arg1 arg2 arg3) + ) + +(defmethod get-trans base-turret ((obj base-turret) (arg0 int)) + "@returns the `trans` [[vector]] from the process's `root` (typically either a [[trsqv]] or a [[collide-shape]])" + (if (= arg0 1) + (-> obj root-override trans) + ((method-of-type process-focusable get-trans) obj arg0) + ) + ) + +(defstate idle (base-turret) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('attack 'bonk) + (send-event proc 'target-turret-get-off 90) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer self)) + (set! (-> a1-2 num-params) 2) + (set! (-> a1-2 message) 'shove) + (set! (-> a1-2 param 0) (the-as uint #f)) + (let ((v1-9 (new 'static 'attack-info :mask (attack-info-mask shove-back shove-up id)))) + (let* ((a0-7 *game-info*) + (a2-2 (+ (-> a0-7 attack-id) 1)) + ) + (set! (-> a0-7 attack-id) a2-2) + (set! (-> v1-9 id) a2-2) + ) + (set! (-> v1-9 shove-back) 12288.0) + (set! (-> v1-9 shove-up) 4096.0) + (set! (-> a1-2 param 1) (the-as uint v1-9)) + ) + (send-event-function proc a1-2) + ) + #f + ) + (('touch) + (send-event proc 'target-turret-get-off 90) + (send-shoves + (-> self root-override) + proc + (the-as touching-shapes-entry (-> event param 0)) + 0.7 + 6144.0 + 16384.0 + ) + #f + ) + (('exit) + #t + ) + (else + (turret-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set-zero! (-> self smush-control)) + (base-turret-method-43 self) + (set! (-> self focus-status) (focus-status disable ignore inactive)) + (none) + ) + :code (behavior () + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 2)) + 0.0 + (let ((f30-0 20480.0)) + (until #f + (when (and (and *target* + (and (>= f30-0 (vector-vector-distance (-> self root-override trans) (-> *target* control trans))) + (zero? (logand (focus-status teleporting) (-> *target* focus-status))) + ) + ) + (and (not (task-node-closed? (game-task-node drill-ship-resolution))) + (can-display-query? self (the-as string #f) -99.0) + (not (logtest? (focus-status in-head board mech dark) (-> *target* focus-status))) + (let ((f28-0 24576.0) + (s4-0 (-> self root-override)) + (s5-0 (target-pos 0)) + ) + (and (< f28-0 + (fabs + (deg-diff (y-angle s4-0) (vector-y-angle (vector-! (new 'stack-no-clear 'vector) s5-0 (-> s4-0 trans)))) + ) + ) + (-> self available-for-pickup) + ) + ) + ) + ) + (let ((gp-1 (new + 'stack + 'font-context + *font-default-matrix* + 32 + 320 + 0.0 + (font-color default-#cddbcd) + (font-flags shadow kerning) + ) + ) + ) + (let ((v1-21 gp-1)) + (set! (-> v1-21 width) (the float 340)) + ) + (let ((v1-22 gp-1)) + (set! (-> v1-22 height) (the float 80)) + ) + (let ((v1-23 gp-1)) + (set! (-> v1-23 scale) 0.9) + ) + (set! (-> gp-1 flags) (font-flags shadow kerning large)) + (print-game-text (lookup-text! *common-text* (game-text-id text-x182) #f) gp-1 #f 44 (bucket-id progress)) + ) + (when (and (cpad-pressed? 0 triangle) (send-event *target* 'change-mode 'turret self)) + (set! (-> self rider) (process->handle *target*)) + (let ((gp-2 (res-lump-struct (-> self entity) 'on-exit structure))) + (if (and gp-2 (not *scene-player*)) + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (the-as vector #f)) + (the-as pair gp-2) + ) + ) + ) + (go-virtual setup) + ) + ) + (if *target* + (look-at! + (-> *target* neck) + (vector+! + (new 'stack-no-clear 'vector) + (the-as vector (-> self root-override root-prim prim-core)) + (new 'static 'vector :y 2048.0 :w 1.0) + ) + 'nothing-special + self + ) + ) + (base-turret-method-36 self) + (suspend) + ) + ) + #f + (none) + ) + :post (behavior () + (cond + ((-> self enable-controls) + (quaternion-slerp! + (-> self root-override quat) + (-> self root-override quat) + (-> self init-quat) + (* 3.0 (-> self clock seconds-per-frame)) + ) + (quaternion-copy! (-> self target-quat) (-> self root-override quat)) + ) + (else + (let ((s4-0 (new 'stack-no-clear 'matrix)) + (s5-0 (new 'stack-no-clear 'matrix)) + (gp-0 (new 'stack-no-clear 'quaternion)) + ) + (matrix-rotate-y! s4-0 (-> self roty)) + (matrix-rotate-x! s5-0 (-> self rotx)) + (matrix*! s4-0 s5-0 s4-0) + (matrix->quaternion gp-0 s4-0) + (quaternion-smooth-seek! (-> self target-quat) (-> self target-quat) gp-0 0.33) + (let ((f0-4 (update! (-> self smush-control)))) + (quaternion-rotate-local-x! (-> self root-override quat) gp-0 (* -910.2222 f0-4)) + ) + ) + ) + ) + (transform-post) + (none) + ) + ) + +(defstate setup (base-turret) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('change-mode) + (go-virtual active) + ) + (else + (turret-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set-setting! 'mode-name 'cam-turret 0 0) + (none) + ) + :code (the-as (function none :behavior base-turret) sleep-code) + :post (the-as (function none :behavior base-turret) transform-post) + ) + +;; WARN: Return type mismatch symbol vs none. +(defun set-recoil ((arg0 joint-mod) (arg1 float) (arg2 symbol)) + (set! (-> arg0 target z) arg1) + (set! (-> arg0 twist-min-y) (the-as float #t)) + (none) + ) + +(defstate active (base-turret) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (let ((v1-0 event-type)) + (the-as + object + (cond + ((= v1-0 'draw) + (cond + ((-> event param 0) + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 2)) + (transform-post) + ) + (else + (ja-channel-set! 0) + (transform-post) + ) + ) + ) + ((= v1-0 'fire-down) + (cond + ((>= (-> self heat) 1.0) + (let ((v1-8 (- (-> self clock frame-counter) (-> self fire-time))) + (a0-7 6) + (a1-1 (-> self fire-time-interval)) + ) + (when (>= v1-8 (* a0-7 a1-1)) + (set! (-> self fire-time) (-> self clock frame-counter)) + (the-as object (base-turret-method-45 self a1-1 event-type)) + ) + ) + ) + (else + (when (>= (- (-> self clock frame-counter) (-> self fire-time)) (-> self fire-time-interval)) + (set! (-> self fire-time) (-> self clock frame-counter)) + (the-as object (base-turret-method-45 self arg1 event-type)) + ) + ) + ) + ) + ((= v1-0 'fire-pressed) + (set! (-> self fire-time) (-> self clock frame-counter)) + (the-as object (base-turret-method-45 self arg1 event-type)) + ) + ((= v1-0 'bonk) + #f + ) + ((or (= v1-0 'touch) (= v1-0 'attack)) + (let* ((gp-0 (-> event param 0)) + (s5-0 (the-as object (-> event param 1))) + (s4-0 proc) + (v1-21 (if (type? s4-0 projectile) + s4-0 + ) + ) + ) + (when (and gp-0 v1-21) + (case (-> (the-as attack-info s5-0) mode) + (('wasp-shot 'guard-shot) + (seek! (-> self health) 0.0 0.25) + (activate! (-> self smush-control) 0.2 15 75 1.0 0.9 (-> *display* entity-clock)) + (sound-play "turret-take-hit") + (let ((v0-1 (the-as object (+ (-> self clock frame-counter) (seconds 0.08))))) + (set! (-> self red-filter-timer) (the-as time-frame v0-1)) + v0-1 + ) + ) + (('drill-ship-shot) + (seek! (-> self health) 0.0 0.5) + (activate! (-> self smush-control) 0.2 24 144 1.0 0.9 (-> *display* entity-clock)) + (sound-play "turret-take-hit") + ) + ) + ) + ) + ) + ((= v1-0 'test) + (set! (-> self health) (seek (-> self health) 0.0 (the-as float (-> event param 0)))) + ) + ((= v1-0 'exit-valid) + (let ((v1-33 (-> self path-mode))) + (cond + ((or (zero? v1-33) (= v1-33 5) (= v1-33 1)) + (base-turret-method-41 self (the-as vector (-> event param 0))) + #t + ) + (else + #f + ) + ) + ) + ) + ((= v1-0 'exit) + (let ((v1-37 (-> self path-mode))) + (when (if (or (zero? v1-37) (= v1-37 5) (= v1-37 1)) + #t + ) + (go-virtual shutdown) + #f + ) + ) + ) + (else + (turret-handler proc arg1 event-type event) + ) + ) + ) + ) + ) + :enter (behavior () + (logior! (-> self skel status) (joint-control-status sync-math)) + (process-entity-status! self (entity-perm-status no-kill) #t) + (set! (-> self focus-status) (focus-status)) + (set! (-> self red-filter-timer) 0) + (set! (-> self ride-height) 0.0) + (set! (-> self roty) (y-angle (-> self root-override))) + (set! (-> self rotyv) 0.0) + (set! (-> self rotx) 0.0) + (set! (-> self rotxv) 0.0) + (let ((a1-1 (handle->process (-> self rider)))) + (if a1-1 + (base-turret-method-34 self a1-1) + ) + ) + (let ((v1-14 (-> (the-as collide-shape-prim-group (-> self root-override root-prim)) child 1))) + (set! (-> v1-14 prim-core action) (collide-action solid)) + (set! (-> v1-14 prim-core collide-as) (collide-spec obstacle)) + ) + (none) + ) + :exit (behavior () + (set-filter-color! 1.0 1.0 1.0) + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override root-prim)) child 1))) + (set! (-> v1-3 prim-core action) (collide-action)) + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + ) + 0 + (send-event (handle->process (-> self hud)) 'hide-and-die) + (none) + ) + :trans (behavior () + (if (<= (the int (-> self health)) 0) + (go-virtual die) + ) + (none) + ) + :code (behavior () + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 2)) + (while (handle->process (-> self rider)) + (base-turret-method-35 self) + (base-turret-method-37 self) + (when (>= (-> *camera-combiner* interp-val) 1.0) + (seek! (-> self path-speed-mult) (-> self path-speed-mult-final) (-> self clock seconds-per-frame)) + (let ((gp-0 (-> self path-mode))) + (case gp-0 + ((1) + (set! (-> self path-mode) (the-as uint 2)) + ) + ((2 3 4) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (get-point-at-percent-along-path! (-> self path) s5-0 (-> self path-u) 'interp) + (set! (-> self root-override trans quad) (-> s5-0 quad)) + (set! (-> self root-override trans y) (+ (-> s5-0 y) (-> self ride-height))) + ) + (seek! (-> self ride-height) 2048.0 (* 2048.0 (-> self clock seconds-per-frame))) + (set! (-> self path-u-prev) (-> self path-u)) + (seek! + (-> self path-u) + (if (-> self path-direction) + 0.0 + 1.0 + ) + (* (-> self path-speed) (-> self path-speed-mult) (-> self clock seconds-per-frame)) + ) + (base-turret-method-38 self) + (when (= (-> self path-u) 1.0) + (get-point-at-percent-along-path! (-> self path) (-> self root-override trans) 1.0 'interp) + (let ((a1-9 (displacement-between-points-at-percent-normalized! (-> self path) (new 'stack-no-clear 'vector) 1.0))) + (forward-up-nopitch->quaternion (-> self init-quat) a1-9 *y-vector*) + ) + (activate! (-> self smush-control) 0.2 30 240 0.8 0.8 (-> *display* entity-clock)) + (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 255 (seconds 0.5)) + (set! (-> self path-mode) (the-as uint 5)) + (send-event *target* 'end-mode) + ) + ) + ((5) + (go-virtual shutdown) + ) + ) + (cond + ((= gp-0 3) + (when ((-> self pause-proc) self) + (set! (-> self path-mode) (the-as uint 2)) + (set! (-> self path-speed-mult-final) 1.0) + ) + ) + ((= gp-0 4) + (when (not ((-> self pause-proc) self)) + (set! (-> self path-mode) (the-as uint 2)) + (set! (-> self path-speed-mult-final) 1.0) + ) + ) + ) + ) + ) + (set! (-> self path-old-pos quad) (-> self root-override trans quad)) + (base-turret-method-36 self) + (suspend) + ) + (go-virtual shutdown) + (none) + ) + :post (behavior () + (when (nonzero? (-> self red-filter-timer)) + (cond + ((< (-> self clock frame-counter) (-> self red-filter-timer)) + (let* ((v1-5 (- (-> self red-filter-timer) (-> self clock frame-counter))) + (f0-1 (- 1.0 (* 0.041666668 (the float v1-5)))) + ) + (set-filter-color! 1.0 f0-1 f0-1) + ) + ) + (else + (set! (-> self red-filter-timer) 0) + (set-filter-color! 1.0 1.0 1.0) + ) + ) + ) + (dotimes (gp-0 4) + (let ((s5-0 (-> self gun-recoil-jmod gp-0))) + (when (-> s5-0 enable) + (let ((s4-0 (-> s5-0 transform))) + (let ((f0-3 (* 2.4 (fabs (-> s4-0 trans z))))) + (seek! (-> s4-0 trans z) 0.0 (* f0-3 (-> self clock seconds-per-frame))) + ) + (if (= (-> s4-0 trans z) 0.0) + (set! (-> s5-0 enable) #f) + ) + ) + ) + ) + ) + (when (and (-> self enable-controls) (>= (-> *camera-combiner* interp-val) 1.0)) + (set! (-> self rotyvv) (analog-input (the-as int (-> *cpad-list* cpads 0 leftx)) 128.0 32.0 110.0 -98304.0)) + (set! (-> self rotxvv) (analog-input (the-as int (-> *cpad-list* cpads 0 lefty)) 128.0 32.0 110.0 -65536.0)) + ) + (+! (-> self rotyv) (* (-> self rotyvv) (-> self clock seconds-per-frame))) + (seek! (-> self rotyv) 0.0 (* 32768.0 (-> self clock seconds-per-frame))) + (set! (-> self rotyv) (fmax -14563.556 (fmin 14563.556 (-> self rotyv)))) + (set! (-> self roty) + (the float + (sar (shl (the int (+ (-> self roty) (* (-> self rotyv) (-> self clock seconds-per-frame)))) 48) 48) + ) + ) + (+! (-> self rotxv) (* (-> self rotxvv) (-> self clock seconds-per-frame))) + (seek! (-> self rotxv) 0.0 (* 32768.0 (-> self clock seconds-per-frame))) + (set! (-> self rotxv) (fmax -9102.223 (fmin 9102.223 (-> self rotxv)))) + (set! (-> self rotx) + (the float + (sar (shl (the int (+ (-> self rotx) (* (-> self rotxv) (-> self clock seconds-per-frame)))) 48) 48) + ) + ) + (cond + ((>= (-> self rotx) (-> self rotx-max)) + (set! (-> self rotx) (-> self rotx-max)) + (set! (-> self rotxv) 0.0) + ) + ((>= (-> self rotx-min) (-> self rotx)) + (set! (-> self rotx) (-> self rotx-min)) + (set! (-> self rotxv) 0.0) + ) + ) + (when (!= (-> self roty-min) (-> self roty-max)) + (cond + ((>= (-> self roty) (-> self roty-max)) + (set! (-> self roty) (-> self roty-max)) + (set! (-> self rotyv) 0.0) + ) + ((>= (-> self roty-min) (-> self roty)) + (set! (-> self roty) (-> self roty-min)) + (set! (-> self rotyv) 0.0) + ) + ) + ) + (base-turret-method-40 self) + (base-turret-method-47 self) + (set! (-> *game-info* score) (-> self health)) + (send-event (handle->process (-> self hud)) 'set-heat (-> self heat)) + (send-event (handle->process (-> self hud)) 'set-arrow-alpha (-> self arrow-alpha)) + (send-event (handle->process (-> self hud)) 'set-arrow-angle (-> self arrow-angle)) + (send-event (handle->process (-> self hud)) 'set-arrow-red (-> self arrow-red)) + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 x) 0.0) + (set! (-> s5-1 y) 20480.0) + (set! (-> s5-1 z) 81920.0) + (set! (-> s5-1 w) 1.0) + (let ((gp-1 (new 'stack-no-clear 'vector4w))) + (set! (-> gp-1 quad) (the-as uint128 0)) + (vector-matrix*! s5-1 s5-1 (-> self node-list data 0 bone transform)) + (if (transform-point-qword! gp-1 s5-1) + (send-event + (handle->process (-> self hud)) + 'set-hud-pos + (+ (/ (-> gp-1 x) 16) -1792) + (+ (/ (-> gp-1 y) 16) -1840) + ) + ) + ) + ) + (seek! + (-> self heat) + (-> self heat-target) + (* (fmin 0.5 (fabs (- (-> self heat) (-> self heat-target)))) (-> self clock seconds-per-frame)) + ) + (seek! (-> self heat-target) 0.0 (* 0.4 (-> self clock seconds-per-frame))) + (transform-post) + (none) + ) + ) + +(defstate shutdown (base-turret) + :virtual #t + :event turret-handler + :exit (behavior () + (remove-setting! 'mode-name) + (sound-stop (-> self sound-id 0)) + (sound-stop (-> self sound-id 1)) + (sound-stop (-> self sound-id 2)) + (set-zero! (-> self smush-control)) + (logclear! (-> self skel status) (joint-control-status sync-math)) + (none) + ) + :trans (behavior () + (when (< 0.99 (vector-dot + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override quat)) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self init-quat)) + ) + ) + (cond + ((= (-> self path-mode) 5) + (if (= (-> self ride-height) 0.0) + (go-virtual dormant) + ) + ) + (else + (go-virtual idle) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 2)) + (until #f + (base-turret-method-37 self) + (if *target* + (look-at! + (-> *target* neck) + (vector+! + (new 'stack-no-clear 'vector) + (the-as vector (-> self root-override root-prim prim-core)) + (new 'static 'vector :y 2048.0 :w 1.0) + ) + 'nothing-special + self + ) + ) + (suspend) + ) + #f + (none) + ) + :post (behavior () + (when (= (-> self path-mode) 5) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (get-point-at-percent-along-path! (-> self path) gp-0 1.0 'interp) + (set! (-> self root-override trans quad) (-> gp-0 quad)) + (set! (-> self root-override trans y) (+ (-> gp-0 y) (-> self ride-height))) + ) + (seek! (-> self ride-height) 0.0 (* 2048.0 (-> self clock seconds-per-frame))) + ) + (dotimes (gp-1 4) + (let ((s5-0 (-> self gun-recoil-jmod gp-1))) + (when (-> s5-0 enable) + (let ((s4-0 (-> s5-0 transform))) + (let ((f0-7 (* 2.4 (fabs (-> s4-0 trans z))))) + (seek! (-> s4-0 trans z) 0.0 (* f0-7 (-> self clock seconds-per-frame))) + ) + (if (= (-> s4-0 trans z) 0.0) + (set! (-> s5-0 enable) #f) + ) + ) + ) + ) + ) + (set! (-> self rotxv) + (* (deg-diff + (-> self rotx) + (deg-seek-smooth (-> self rotx) 0.0 (* 16384.0 (-> self clock seconds-per-frame)) 0.1) + ) + (-> self clock frames-per-second) + ) + ) + (set! (-> self rotyv) + (* (deg-diff + (-> self roty) + (deg-seek-smooth + (-> self roty) + (the float (sar (shl (the int (quaternion-y-angle (-> self init-quat))) 48) 48)) + (* 21845.334 (-> self clock seconds-per-frame)) + 0.1 + ) + ) + (-> self clock frames-per-second) + ) + ) + (set! (-> self roty) + (the float + (sar (shl (the int (+ (-> self roty) (* (-> self rotyv) (-> self clock seconds-per-frame)))) 48) 48) + ) + ) + (set! (-> self rotx) + (the float + (sar (shl (the int (+ (-> self rotx) (* (-> self rotxv) (-> self clock seconds-per-frame)))) 48) 48) + ) + ) + (base-turret-method-40 self) + (transform-post) + (none) + ) + ) + +(defstate dormant (base-turret) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('attack 'bonk) + (send-event proc 'target-turret-get-off 90) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer self)) + (set! (-> a1-2 num-params) 2) + (set! (-> a1-2 message) 'shove) + (set! (-> a1-2 param 0) (the-as uint #f)) + (let ((v1-9 (new 'static 'attack-info :mask (attack-info-mask shove-back shove-up id)))) + (let* ((a0-7 *game-info*) + (a2-2 (+ (-> a0-7 attack-id) 1)) + ) + (set! (-> a0-7 attack-id) a2-2) + (set! (-> v1-9 id) a2-2) + ) + (set! (-> v1-9 shove-back) 12288.0) + (set! (-> v1-9 shove-up) 4096.0) + (set! (-> a1-2 param 1) (the-as uint v1-9)) + ) + (send-event-function proc a1-2) + ) + #f + ) + (('touch) + (send-event proc 'target-turret-get-off 90) + (send-shoves + (-> self root-override) + proc + (the-as touching-shapes-entry (-> event param 0)) + 0.7 + 6144.0 + 16384.0 + ) + #f + ) + (('exit) + #t + ) + (else + (turret-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set-zero! (-> self smush-control)) + (base-turret-method-43 self) + (set! (-> self focus-status) (focus-status disable ignore inactive)) + (none) + ) + :code (the-as (function none :behavior base-turret) sleep-code) + ) + +(defstate die (base-turret) + :virtual #t + :code (behavior () + (remove-setting! 'mode-name) + (sound-stop (-> self sound-id 0)) + (sound-stop (-> self sound-id 1)) + (sound-stop (-> self sound-id 2)) + (set! (-> self focus-status) (focus-status disable ignore inactive)) + (let ((gp-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-0) (seconds 0.8)) + (suspend) + ) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer self)) + (set! (-> a1-1 num-params) 2) + (set! (-> a1-1 message) 'attack) + (set! (-> a1-1 param 0) (the-as uint #f)) + (let ((v1-11 (new 'static 'attack-info :mask (attack-info-mask mode id)))) + (let* ((a0-4 *game-info*) + (a2-2 (+ (-> a0-4 attack-id) 1)) + ) + (set! (-> a0-4 attack-id) a2-2) + (set! (-> v1-11 id) a2-2) + ) + (set! (-> v1-11 mode) 'turret) + (set! (-> a1-1 param 1) (the-as uint v1-11)) + ) + (send-event-function (handle->process (-> self rider)) a1-1) + ) + (let ((v1-17 (-> self root-override root-prim))) + (set! (-> v1-17 prim-core collide-as) (collide-spec)) + (set! (-> v1-17 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (sound-play "turret-die" :position (-> self root-override trans)) + (let ((gp-2 (new 'stack 'joint-exploder-tuning (the-as uint 0)))) + (process-spawn + joint-exploder + (art-group-get-by-name *level* "skel-turret-explode" (the-as (pointer uint32) #f)) + 6 + gp-2 + *turret-exploder-params* + :to self + ) + ) + (let ((gp-3 (new 'stack-no-clear 'vector))) + (set! (-> gp-3 quad) (-> self root-override trans quad)) + (set! (-> gp-3 y) (+ 8192.0 (-> gp-3 y))) + (let ((s5-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when s5-2 + (let ((t9-13 (method-of-type part-tracker activate))) + (t9-13 (the-as part-tracker s5-2) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-14 run-function-in-process) + (a0-20 s5-2) + (a1-14 part-tracker-init) + (a2-12 (-> *part-group-id-table* 201)) + (a3-4 0) + (t0-2 #f) + (t1-2 #f) + (t2-1 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> gp-3 quad)) + ((the-as (function object object object object object object object object none) t9-14) + a0-20 + a1-14 + a2-12 + a3-4 + t0-2 + t1-2 + t2-1 + t3-0 + ) + ) + (-> s5-2 ppointer) + ) + ) + ) + (while (-> self child) + (suspend) + ) + (none) + ) + ) + +;; WARN: Return type mismatch symbol vs process. +(defmethod base-turret-method-46 base-turret ((obj base-turret) (arg0 process)) + (the-as process #t) + ) + +(defmethod base-turret-method-47 base-turret ((obj base-turret)) + (with-pp + (let ((a0-1 (-> obj root-override trans)) + (f30-0 0.0) + (s4-0 (the-as process-drawable #f)) + ) + (let ((s5-0 (new 'stack-no-clear 'array 'collide-shape 32)) + (a1-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> a1-0 quad) (-> a0-1 quad)) + (set! (-> a1-0 w) 409600.0) + (countdown (s3-0 (fill-actor-list-for-sphere *actor-hash* (the-as sphere a1-0) s5-0 32)) + (let* ((s2-0 (-> s5-0 s3-0)) + (a0-5 (if (type? s2-0 collide-shape) + s2-0 + ) + ) + ) + (when a0-5 + (let* ((s1-0 (-> a0-5 process)) + (s2-1 (if (type? s1-0 process-focusable) + s1-0 + ) + ) + ) + (when (and s2-1 + (logtest? (process-mask enemy) (-> s2-1 mask)) + (logtest? (process-mask collectable) (-> s2-1 mask)) + (not (logtest? (-> (the-as process-focusable s2-1) focus-status) (focus-status disable dead ignore inactive))) + (!= s2-1 obj) + (!= s2-1 *target*) + (base-turret-method-46 obj s2-1) + ) + (let ((f0-1 (vector-vector-xz-distance (-> obj root-override trans) (-> s2-1 root trans)))) + (when (or (not s4-0) (< f0-1 f30-0)) + (set! s4-0 s2-1) + (set! f30-0 f0-1) + ) + ) + ) + ) + ) + ) + ) + ) + (cond + (s4-0 + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 x) 0.0) + (set! (-> s5-1 y) 10240.0) + (set! (-> s5-1 z) 0.0) + (set! (-> s5-1 w) 1.0) + (let ((s1-1 (new 'stack-no-clear 'vector)) + (s3-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 12))) + (s2-2 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override quat))) + ) + (vector-matrix*! s5-1 s5-1 (-> (the-as process-focusable s4-0) node-list data 0 bone transform)) + (vector-line-distance-point! s5-1 s3-1 (vector+float*! (new 'stack-no-clear 'vector) s3-1 s2-2 4096.0) s1-1) + (let* ((a1-10 (vector-! (new 'stack-no-clear 'vector) s5-1 s1-1)) + (s4-1 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) a1-10 (-> obj root-override quat))) + (f30-1 (vector-vector-angle-safe s2-2 (vector-! (new 'stack-no-clear 'vector) s5-1 s3-1))) + ) + (let ((f0-10 (- (atan (-> s4-1 x) (-> s4-1 y))))) + (if (logtest? (-> *game-info* secrets) (game-secrets hflip-screen)) + (set! f0-10 (* -1.0 f0-10)) + ) + (set! (-> obj arrow-angle) (deg-seek (-> obj arrow-angle) f0-10 (* 65536.0 (-> pp clock seconds-per-frame)))) + ) + (cond + ((< 910.2222 f30-1) + (seek! (-> obj arrow-alpha) 1.0 (-> pp clock seconds-per-frame)) + (send-event (handle->process (-> obj hud)) 'set-target-flash #f) + ) + (else + (seek! (-> obj arrow-alpha) 0.0 (* 4.0 (-> pp clock seconds-per-frame))) + (send-event (handle->process (-> obj hud)) 'set-target-flash #t) + ) + ) + ) + ) + (seek! + (-> obj arrow-red) + (lerp-scale 1.0 0.0 (vector-vector-distance s5-1 (-> obj root-override trans)) 122880.0 245760.0) + (-> pp clock seconds-per-frame) + ) + ) + ) + (else + (seek! (-> obj arrow-alpha) 0.0 (-> pp clock seconds-per-frame)) + (send-event (handle->process (-> obj hud)) 'set-target-flash #f) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod base-turret-method-43 base-turret ((obj base-turret)) + (set! (-> obj roty) (y-angle (-> obj root-override))) + (set! (-> obj rotyv) 0.0) + (set! (-> obj rotyvv) 0.0) + (set! (-> obj rotx) 0.0) + (set! (-> obj rotxv) 0.0) + (set! (-> obj rotxvv) 0.0) + 0 + (none) + ) + +(defmethod turret-init! base-turret ((obj base-turret) (arg0 entity-actor) (arg1 matrix)) + (local-vars (sv-16 res-tag)) + (stack-size-set! (-> obj main-thread) 1024) ;; changed + (let ((s3-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-others)))) + (set! (-> s3-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s3-0 reaction) cshape-reaction-default) + (set! (-> s3-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (let ((s2-0 (new 'process 'collide-shape-prim-group s3-0 (the-as uint 2) 0))) + (set! (-> s3-0 total-prims) (the-as uint 3)) + (set! (-> s2-0 prim-core collide-as) (collide-spec bot)) + (set! (-> s2-0 prim-core action) (collide-action solid)) + (set! (-> s2-0 transform-index) 3) + (set-vector! (-> s2-0 local-sphere) 0.0 7372.8 0.0 14745.6) + (set! (-> s3-0 root-prim) s2-0) + ) + (let ((v1-14 (new 'process 'collide-shape-prim-sphere s3-0 (the-as uint 0)))) + (set! (-> v1-14 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> v1-14 prim-core action) (collide-action solid)) + (set! (-> v1-14 transform-index) 3) + (set-vector! (-> v1-14 local-sphere) 0.0 8192.0 0.0 9830.4) + ) + (let ((v1-16 (new 'process 'collide-shape-prim-sphere s3-0 (the-as uint 0)))) + (set! (-> v1-16 transform-index) 3) + (set-vector! (-> v1-16 local-sphere) 0.0 6553.6 0.0 12288.0) + ) + (set! (-> s3-0 nav-radius) (* 0.75 (-> s3-0 root-prim local-sphere w))) + (let ((v1-19 (-> s3-0 root-prim))) + (set! (-> s3-0 backup-collide-as) (-> v1-19 prim-core collide-as)) + (set! (-> s3-0 backup-collide-with) (-> v1-19 prim-core collide-with)) + ) + (set! (-> obj root-override) s3-0) + ) + (when arg0 + (process-drawable-from-entity! obj arg0) + (set-yaw-angle-clear-roll-pitch! (-> obj root-override) (res-lump-float arg0 'rotoffset)) + ) + (when arg1 + (set! (-> obj root-override trans quad) (-> arg1 vector 0 quad)) + (quaternion-copy! (-> obj root-override quat) (the-as quaternion (-> arg1 vector 1))) + ) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-turret" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj shadow-backup) (the-as symbol (-> obj draw shadow))) + (logclear! (-> obj mask) (process-mask actor-pause)) + (set! (-> obj condition) (res-lump-value arg0 'index int :time -1000000000.0)) + (set! (-> obj fact) + (new 'process 'fact-info obj (pickup-type eco-pill-random) (-> *FACT-bank* default-eco-pill-green-inc)) + ) + (if (-> obj entity) + (move-to-ground + (the-as collide-shape-moving (-> obj root-override)) + 40960.0 + 40960.0 + #t + (collide-spec backgnd) + ) + ) + (set-zero! (-> obj smush-control)) + (set! (-> obj hud) (the-as handle #f)) + (base-turret-method-43 obj) + (set! (-> obj alt-actor) (the-as symbol (entity-actor-lookup (-> obj entity) 'alt-actor 0))) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-49 (res-lump-data (-> obj entity) 'actor-groups pointer :tag-ptr (& sv-16)))) + (cond + ((and v1-49 (nonzero? (-> sv-16 elt-count))) + (set! (-> obj actor-group) (the-as (pointer actor-group) v1-49)) + (set! (-> obj actor-group-count) (the-as int (-> sv-16 elt-count))) + ) + (else + (set! (-> obj actor-group) (the-as (pointer actor-group) #f)) + (set! (-> obj actor-group-count) 0) + 0 + ) + ) + ) + (set! (-> obj sound-id 0) (new-sound-id)) + (set! (-> obj sound-id 1) (new-sound-id)) + (set! (-> obj sound-id 2) (new-sound-id)) + (set! (-> obj sound-playing 0) #f) + (set! (-> obj sound-playing 1) #f) + (set! (-> obj sound-playing 2) #f) + (let ((s5-1 (new 'process 'curve-control obj 'path -1000000000.0))) + (set! (-> obj path) s5-1) + (set! (-> obj path-u) 0.0) + (set! (-> obj path-u-prev) 0.0) + (set! (-> obj path-speed) (/ 16384.0 (total-distance s5-1))) + (set! (-> obj path-speed-mult) 0.0) + (set! (-> obj path-speed-mult-final) 1.0) + (set! (-> obj path-direction) #f) + (cond + ((logtest? (-> s5-1 flags) (path-control-flag not-found)) + (set! (-> obj path-mode) (the-as uint 0)) + 0 + ) + (else + (set! (-> obj path-mode) (the-as uint 1)) + ) + ) + (logior! (-> s5-1 flags) (path-control-flag display draw-line draw-point draw-text)) + ) + (when (not (logtest? (-> obj path flags) (path-control-flag not-found))) + (get-point-at-percent-along-path! (-> obj path) (-> obj root-override trans) 0.0 'interp) + (set! (-> obj path-old-pos quad) (-> obj root-override trans quad)) + ) + (set! (-> obj path-speed-mult) 1.0) + (quaternion-copy! (-> obj target-quat) *unity-quaternion*) + (quaternion-copy! (-> obj init-quat) (-> obj root-override quat)) + (set! (-> obj gun-index) 0) + (set! (-> obj shot-timeout) (seconds 0.667)) + (set! (-> obj gun-recoil-jmod 0) (new 'process 'joint-mod-add-local obj 5 #t #f #f)) + (set! (-> obj gun-recoil-jmod 0 enable) #f) + (set! (-> obj gun-recoil-jmod 1) (new 'process 'joint-mod-add-local obj 11 #t #f #f)) + (set! (-> obj gun-recoil-jmod 1 enable) #f) + (set! (-> obj gun-recoil-jmod 2) (new 'process 'joint-mod-add-local obj 7 #t #f #f)) + (set! (-> obj gun-recoil-jmod 2 enable) #f) + (set! (-> obj gun-recoil-jmod 3) (new 'process 'joint-mod-add-local obj 9 #t #f #f)) + (set! (-> obj gun-recoil-jmod 3 enable) #f) + (set! (-> obj health) 16.0) + (set! (-> obj heat) 0.0) + (set! (-> obj heat-target) 0.0) + (set! (-> obj arrow-angle) 0.0) + (set! (-> obj enable-controls) #t) + (set! (-> obj available-for-pickup) #t) + (set! (-> obj rotx-min) -10922.667) + (set! (-> obj rotx-max) 5461.3335) + (set! (-> obj roty-min) 0.0) + (set! (-> obj roty-max) 0.0) + (set! (-> obj fire-time-interval) (seconds 0.15)) + 0 + (none) + ) + +(defmethod base-turret-method-41 base-turret ((obj base-turret) (arg0 vector)) + (local-vars (sv-592 int)) + (let* ((s3-0 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj init-quat))) + (s1-0 (-> obj root-override trans)) + (s5-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack 'collide-query)) + (s0-0 8) + (f30-0 (/ 65536.0 (+ -1.0 (the float s0-0)))) + ) + (set! (-> s3-0 y) 0.0) + (vector-xz-normalize! s3-0 -18432.0) + (set! sv-592 0) + (while (< sv-592 s0-0) + (vector+! s5-0 s1-0 s3-0) + (vector-rotate-y! s3-0 s3-0 f30-0) + (set! (-> s2-0 start-pos quad) (-> s5-0 quad)) + (set-vector! (-> s2-0 move-dist) 0.0 -24576.0 0.0 0.0) + (set! (-> s2-0 start-pos y) (+ 2048.0 (-> s2-0 start-pos y))) + (let ((v1-9 s2-0)) + (set! (-> v1-9 radius) 409.6) + (set! (-> v1-9 collide-with) (collide-spec backgnd)) + (set! (-> v1-9 ignore-process0) obj) + (set! (-> v1-9 ignore-process1) #f) + (set! (-> v1-9 ignore-pat) (-> obj root-override pat-ignore-mask)) + (set! (-> v1-9 action-mask) (collide-action solid)) + ) + (when (>= (fill-and-probe-using-line-sphere *collide-cache* s2-0) 0.0) + (set! (-> s5-0 y) (+ 4096.0 (-> s2-0 best-other-tri intersect y))) + (set! (-> arg0 quad) (-> s5-0 quad)) + (return #t) + ) + (set! sv-592 (+ sv-592 1)) + ) + ) + #f + ) + +(defmethod base-turret-method-44 base-turret ((obj base-turret) (arg0 vector) (arg1 vector)) + (let ((gp-0 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> gp-0 ent) (-> obj entity)) + (set! (-> gp-0 charge) 1.0) + (set! (-> gp-0 options) (projectile-options account-for-target-velocity proj-options-8000)) + (set! (-> gp-0 pos quad) (-> arg0 quad)) + (set! (-> gp-0 vel quad) (-> (vector-normalize-copy! (new 'stack-no-clear 'vector) arg1 1228800.0) quad)) + (set! (-> gp-0 notify-handle) (the-as handle #f)) + (set! (-> gp-0 owner-handle) (the-as handle #f)) + (set! (-> gp-0 ignore-handle) (process->handle obj)) + (let* ((v1-9 *game-info*) + (a0-9 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-9) + (set! (-> gp-0 attack-id) a0-9) + ) + (set! (-> gp-0 timeout) (-> obj shot-timeout)) + (spawn-projectile turret-shot gp-0 obj *default-dead-pool*) + ) + 0 + (none) + ) + +(defmethod base-turret-method-42 base-turret ((obj base-turret) (arg0 vector) (arg1 vector) (arg2 float)) + (let ((s5-0 (new 'stack-no-clear 'collide-query))) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (vector-normalize-copy! (-> s5-0 move-dist) arg1 819200.0) + (let ((v1-1 s5-0)) + (set! (-> v1-1 radius) 2048.0) + (set! (-> v1-1 collide-with) (collide-spec backgnd enemy obstacle hit-by-others-list)) + (set! (-> v1-1 ignore-process0) obj) + (set! (-> v1-1 ignore-process1) #f) + (set! (-> v1-1 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-1 action-mask) (collide-action solid)) + ) + (let ((f0-1 (fill-and-probe-using-line-sphere *collide-cache* s5-0))) + (cond + ((>= f0-1 0.0) + (* arg2 f0-1) + ) + (else + (empty) + arg2 + ) + ) + ) + ) + ) + +(defmethod base-turret-method-45 base-turret ((obj base-turret) (arg0 object) (arg1 symbol)) + (local-vars (sv-112 vector) (sv-128 vector) (sv-144 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + ) + (init-vf0-vector) + (when (< (-> obj heat) 1.0) + (let ((s3-0 (new 'static 'array int32 4 5 11 7 9)) + (s4-0 (* (-> obj gun-index) 2)) + (s2-0 (+ (* (-> obj gun-index) 2) 1)) + (s5-0 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override quat))) + ) + (set-recoil (the-as joint-mod (-> obj gun-recoil-jmod s4-0)) -819.2 arg1) + (set-recoil (the-as joint-mod (-> obj gun-recoil-jmod s2-0)) 819.2 arg1) + (let ((s4-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data (-> s3-0 s4-0)))) + (s3-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data (-> s3-0 s2-0)))) + (s0-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 12))) + (s1-0 (new 'stack-no-clear 'vector)) + (s2-1 (new 'stack-no-clear 'vector)) + ) + (set! sv-144 s0-0) + (set! sv-112 s0-0) + (set! sv-128 s5-0) + (let ((f0-2 (+ 20480.0 (base-turret-method-42 obj s0-0 s5-0 819200.0)))) + (.lvf vf2 (&-> sv-128 quad)) + (.lvf vf1 (&-> sv-112 quad)) + (let ((v1-25 f0-2)) + (.mov vf3 v1-25) + ) + ) + (.add.x.vf vf4 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf2 vf3) + (.add.mul.w.vf vf4 vf1 vf0 acc :mask #b111) + (.svf (&-> sv-144 quad) vf4) + (vector-! s1-0 s0-0 s4-1) + (vector-! s2-1 s0-0 s3-1) + (vector-normalize! s1-0 1.0) + (vector-normalize! s2-1 1.0) + (base-turret-method-44 obj s4-1 s1-0) + (base-turret-method-44 obj s3-1 s2-1) + ) + ) + (set! (-> obj gun-index) (- 1 (-> obj gun-index))) + (activate! (-> obj smush-control) 0.1 30 120 0.8 0.9 (-> *display* entity-clock)) + ) + (seek! (-> obj heat-target) 1.05 0.1) + 0 + (none) + ) + ) + +(defmethod base-turret-method-39 base-turret ((obj base-turret) (arg0 turret-path-event)) + (with-pp + (case (-> arg0 event-type) + (('script) + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (the-as vector #f)) + (the-as pair (-> arg0 param)) + ) + ) + (('cue-chase) + (let ((a0-4 (process-by-name (the-as string (-> arg0 param)) *active-pool*))) + (if a0-4 + (send-event a0-4 'cue-chase) + ) + ) + ) + (('pause-until) + (set! (-> obj path-mode) (the-as uint 3)) + (set! (-> obj pause-proc) (the-as (function base-turret symbol) (-> arg0 param))) + (set! (-> obj path-speed-mult-final) 0.0) + ) + (('pause-while) + (set! (-> obj path-mode) (the-as uint 4)) + (set! (-> obj pause-proc) (the-as (function base-turret symbol) (-> arg0 param))) + (set! (-> obj path-speed-mult-final) 0.0) + ) + (('set-speed-mult) + ;; NOTE: cast to (array int32) has been added because the turret-path params were changed to boxed int arrays + (set! (-> obj path-speed-mult-final) (* 0.1 (the float (/ (-> (the-as (array int32) (-> arg0 param)) 0) 8)))) + ) + (('enable-controls) + (set! (-> obj enable-controls) #t) + ) + (('disable-controls) + (set! (-> obj enable-controls) #f) + ) + (('set-roty-min) + (set! (-> obj roty-min) (* 182.04445 (the float (/ (the-as int (-> arg0 param)) 8)))) + ) + (('set-roty-max) + (set! (-> obj roty-max) (* 182.04445 (the float (/ (the-as int (-> arg0 param)) 8)))) + ) + (('set-rotyvv) + (set! (-> obj rotyvv) (* 182.04445 (the float (/ (the-as int (-> arg0 param)) 8)))) + ) + ) + 0 + (none) + ) + ) + +(defmethod base-turret-method-38 base-turret ((obj base-turret)) + (when (nonzero? (-> obj path-event)) + (let* ((s5-0 (-> obj path-event)) + (f0-0 (get-num-segments (-> obj path))) + (f30-0 (* f0-0 (-> obj path-u))) + (f28-0 (* f0-0 (-> obj path-u-prev))) + ) + (dotimes (s4-0 (-> s5-0 event-count)) + (let ((a1-0 (-> s5-0 event-tbl s4-0))) + (if (and (>= f30-0 (-> a1-0 pos)) (< f28-0 (-> a1-0 pos))) + (base-turret-method-39 obj a1-0) + ) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod deactivate base-turret ((obj base-turret)) + (if (valid? (-> obj hud) (the-as type #f) (the-as symbol "") #t 0) + (send-event (handle->process (-> obj hud)) 'hide-and-die) + ) + (sound-stop (-> obj sound-id 0)) + (sound-stop (-> obj sound-id 1)) + (sound-stop (-> obj sound-id 2)) + ((method-of-type process-drawable deactivate) obj) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod init-from-entity! base-turret ((obj base-turret) (arg0 entity-actor)) + "Typically the method that does the initial setup on the process, potentially using the [[entity-actor]] provided as part of that. +This commonly includes things such as: +- stack size +- collision information +- loading the skeleton group / bones +- sounds" + (turret-init! obj arg0 (the-as matrix #f)) + (go (method-of-object obj idle)) + (none) + ) + +(defstate cam-turret (camera-slave) + :event (the-as + (function process int symbol event-message-block object :behavior camera-slave) + cam-standard-event-handler + ) + :enter (behavior () + (when (not (-> self enter-has-run)) + (set! (-> self saved-pt quad) (-> self trans quad)) + (set! (-> self blend-from-type) (the-as uint 1)) + (set! (-> self blend-to-type) (camera-blend-to-type unknown-0)) + 0 + ) + (none) + ) + :trans (behavior () + (if (not (logtest? (-> *camera* master-options) (cam-master-options-u32 HAVE_TARGET))) + (cam-slave-go cam-free-floating) + ) + (none) + ) + :code (behavior () + (until #f + (when (not (paused?)) + (let ((gp-0 (handle->process (-> *camera* focus handle)))) + (when gp-0 + (quaternion->matrix (the-as matrix (-> self tracking)) (get-quat (the-as process-focusable gp-0) 1)) + (let ((v1-9 (handle->process (-> (the-as target gp-0) turret handle)))) + (if v1-9 + (vector<-cspace! (-> self trans) (-> (the-as process-focusable v1-9) node-list data 12)) + ) + ) + ) + ) + ) + (suspend) + ) + #f + (none) + ) + ) + +(defbehavior target-turret-post target () + (send-event (handle->process (-> self turret handle)) 'trans (-> self turret trans)) + (send-event (handle->process (-> self turret handle)) 'quat (-> self control dir-targ)) + (set-quaternion! (-> self control) (-> self control dir-targ)) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> self turret trans quad)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 x) 0.0) + (set! (-> s5-0 y) 0.0) + (set! (-> s5-0 z) -10649.6) + (set! (-> s5-0 w) 1.0) + (vector-orient-by-quat! s5-0 s5-0 (-> self control dir-targ)) + (vector+! gp-0 gp-0 s5-0) + ) + (move-to-point! (-> self control) gp-0) + ) + (update-transforms (-> self control)) + (target-no-move-post) + (cond + ((cpad-pressed? (-> self control cpad number) r1) + (send-event (handle->process (-> self turret handle)) 'fire-pressed) + ) + ((cpad-hold? (-> self control cpad number) r1) + (send-event (handle->process (-> self turret handle)) 'fire-down) + ) + ) + 0 + (none) + ) + +(defstate target-turret-stance (target) + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('change-mode) + (case (-> event param 0) + (('grab) + (when (not (logtest? (-> self focus-status) (focus-status dead))) + (if (-> event param 1) + (set! (-> self turret grabbed?) #t) + ) + #t + ) + ) + ) + ) + (('end-mode) + (cond + ((-> self turret grabbed?) + (set! (-> self turret grabbed?) #f) + #t + ) + (else + (when (-> self control unknown-handle02) + (set! (-> self control unknown-handle02) (the-as handle #f)) + #t + ) + ) + ) + ) + (('attack 'attack-invinc) + (let ((gp-0 + (the-as object (mem-copy! (the-as pointer (-> self attack-info-rec)) (the-as pointer (-> event param 1)) 160)) + ) + ) + ((method-of-type attack-info compute-intersect-info) + (the-as attack-info gp-0) + (-> event param 1) + self + (if (type? proc process-drawable) + proc + ) + (the-as touching-shapes-entry (-> event param 0)) + ) + (case (-> (the-as attack-info gp-0) mode) + (('turret) + (let ((a0-12 (-> self attack-info))) + (let ((v1-17 a0-12)) + (set! (-> v1-17 attacker) (the-as handle #f)) + (set! (-> v1-17 mode) 'generic) + (set! (-> v1-17 shove-back) 6144.0) + (set! (-> v1-17 shove-up) 4915.2) + (set! (-> v1-17 angle) #f) + (set! (-> v1-17 trans quad) (-> self control trans quad)) + (set! (-> v1-17 control) 0.0) + (set! (-> v1-17 invinc-time) (the-as time-frame (-> *TARGET-bank* hit-invulnerable-timeout))) + (set! (-> v1-17 damage) (-> *FACT-bank* health-default-inc)) + ) + (combine! a0-12 (the-as attack-info gp-0) self) + ) + (cond + ((= (-> self game mode) 'play) + (send-event (handle->process (-> self turret handle)) 'trans (-> self control trans)) + (go target-death 'turret) + #t + ) + (else + (go target-turret-get-off) + #f + ) + ) + ) + (('bot) + (let ((a0-22 (-> self attack-info))) + (let ((v1-33 a0-22)) + (set! (-> v1-33 attacker) (the-as handle #f)) + (set! (-> v1-33 mode) 'generic) + (set! (-> v1-33 shove-back) 6144.0) + (set! (-> v1-33 shove-up) 4915.2) + (set! (-> v1-33 angle) #f) + (set! (-> v1-33 trans quad) (-> self control trans quad)) + (set! (-> v1-33 control) 0.0) + (set! (-> v1-33 invinc-time) (the-as time-frame (-> *TARGET-bank* hit-invulnerable-timeout))) + (set! (-> v1-33 damage) (-> *FACT-bank* health-default-inc)) + ) + (combine! a0-22 (the-as attack-info gp-0) self) + ) + (go target-death 'bot) + ) + ) + ) + ) + (else + (target-generic-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior ((arg0 handle)) + (send-event (handle->process arg0) 'change-mode) + (set! (-> self turret trans quad) (-> self control trans quad)) + (set! (-> self turret turret) (the-as (pointer base-turret) #f)) + (target-exit) + (set! (-> self neck flex-blend) 0.0) + (logior! (-> self state-flags) (state-flags sf2 sf5)) + (logior! (-> self focus-status) (focus-status disable grabbed)) + (set! (-> self control mod-surface) *empty-mods*) + (none) + ) + :exit (behavior () + (target-exit) + (logclear! (-> self state-flags) (state-flags sf2 sf5)) + (logclear! (-> self focus-status) (focus-status disable grabbed)) + (set! (-> self turret grabbed?) #f) + (let ((v1-6 (-> self turret turret))) + (if v1-6 + (deactivate (-> v1-6 0)) + ) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior ((arg0 handle)) + (local-vars + (v1-19 object) + (a0-28 process) + (a1-6 event-message-block) + (t9-5 (function process-tree event-message-block object)) + ) + (let ((v1-2 (handle->process (-> self turret handle)))) + (if v1-2 + (quaternion<-rotate-y-vector + (-> self control dir-targ) + (vector-! + (new 'stack-no-clear 'vector) + (-> (the-as process-focusable v1-2) root-override trans) + (-> self control trans) + ) + ) + ) + ) + (set! (-> self control unknown-handle02) (-> self turret handle)) + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 359)) + (until v1-19 + (suspend) + (can-play-stance-amibent?) + (ja :num! (loop! 0.5)) + (set! v1-19 + (and (or (not (-> self control unknown-handle02)) (cpad-pressed? (-> self control cpad number) triangle)) + (send-event (handle->process (-> self turret handle)) 'exit-valid (-> self control unknown-vector38)) + ) + ) + ) + (until (t9-5 a0-28 a1-6) + (suspend) + (set! a1-6 (new 'stack-no-clear 'event-message-block)) + (set! (-> a1-6 from) (process->ppointer self)) + (set! (-> a1-6 num-params) 0) + (set! (-> a1-6 message) 'exit) + (set! t9-5 send-event-function) + (set! a0-28 (handle->process (-> self turret handle))) + ) + (send-event self 'end-mode) + (go target-turret-get-off) + (none) + ) + :post (behavior () + (target-turret-post) + (none) + ) + ) + +(let ((a0-74 (copy *empty-mods* 'loading-level))) + (set! (-> a0-74 flags) (surface-flag gun-off gun-fast-exit)) + (set! *turret-get-on-mods* a0-74) + ) + +(defstate target-turret-get-on (target) + :event target-generic-event-handler + :exit (behavior () + (logclear! (-> self state-flags) (state-flags sf6)) + (none) + ) + :code (behavior ((arg0 handle)) + (when (zero? (-> self turret)) + (set! (-> self turret) (new 'process 'turret-info)) + (set! (-> self turret process) (process->ppointer self)) + ) + (set! (-> self turret handle) arg0) + (set! (-> self turret grabbed?) #f) + (ja-channel-set! 1) + (set! (-> self control mod-surface) *turret-get-on-mods*) + (set! (-> self neck flex-blend) 0.0) + (set! (-> self control unknown-vector37 quad) (-> self control trans quad)) + (set! (-> self control unknown-vector38 quad) (-> self control trans quad)) + (set! (-> self control unknown-vector39 quad) (-> self control quat quad)) + (set! (-> self control unknown-vector40 quad) (-> self control quat quad)) + (let* ((s4-0 (handle->process arg0)) + (s5-0 (if (type? s4-0 process-drawable) + s4-0 + ) + ) + ) + (when s5-0 + (vector-matrix*! + (-> self control unknown-vector38) + (new 'static 'vector :z -10649.6 :w 1.0) + (-> (the-as process-focusable s5-0) node-list data 0 bone transform) + ) + (set! (-> self control unknown-vector40 quad) (-> (the-as process-focusable s5-0) root-override quat quad)) + ) + ) + (set! (-> self alt-cam-pos quad) (-> self control camera-pos quad)) + (ja-no-eval :group! (-> self draw art-group data 361) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 361)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((f30-0 (sin (lerp-scale 0.0 16384.0 (ja-aframe-num 0) 0.0 12.0)))) + (let ((f28-0 (lerp-scale 0.0 1.0 (ja-aframe-num 0) 0.0 12.0))) + (let* ((s5-3 (handle->process arg0)) + (a0-39 (if (type? s5-3 process-drawable) + s5-3 + ) + ) + ) + (if a0-39 + (set! (-> self alt-cam-pos quad) (-> (the-as process-focusable a0-39) root-override trans quad)) + ) + ) + (vector-lerp! + (-> self control trans) + (-> self control unknown-vector37) + (-> self control unknown-vector38) + f30-0 + ) + (set! (-> self control trans y) + (lerp (-> self control unknown-vector37 y) (-> self control unknown-vector38 y) f28-0) + ) + ) + (quaternion-slerp! + (-> self control quat-for-control) + (the-as quaternion (-> self control unknown-vector39)) + (the-as quaternion (-> self control unknown-vector40)) + f30-0 + ) + ) + (rot->dir-targ! (-> self control)) + (suspend) + (ja :num! (seek!)) + ) + (go target-turret-stance arg0) + (none) + ) + :post target-no-move-post + ) + +(defstate target-turret-get-off (target) + :event target-generic-event-handler + :exit (behavior () + (target-exit) + (logclear! (-> self state-flags) (state-flags sf6)) + (none) + ) + :code (behavior () + (set! (-> self control mod-surface) *empty-mods*) + (rot->dir-targ! (-> self control)) + (set! (-> self neck flex-blend) 0.0) + (send-event (handle->process (-> self turret handle)) 'trans (-> self turret trans)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'quaternion)) + ) + (vector-! s5-0 (-> self turret trans) (-> self control unknown-vector38)) + (vector-normalize! s5-0 1.0) + (forward-up-nopitch->quaternion gp-0 s5-0 *y-vector*) + (set! (-> self control unknown-vector40 quad) (-> gp-0 quad)) + ) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 360) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 360)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (cond + ((< (ja-aframe-num 0) 88.0) + (send-event (handle->process (-> self turret handle)) 'quat (-> self control dir-targ)) + (set-quaternion! (-> self control) (-> self control dir-targ)) + (quaternion-copy! (the-as quaternion (-> self control unknown-vector39)) (-> self control quat-for-control)) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (set! (-> gp-1 quad) (-> self turret trans quad)) + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 x) 0.0) + (set! (-> s5-1 y) 0.0) + (set! (-> s5-1 z) -10649.6) + (set! (-> s5-1 w) 1.0) + (vector-orient-by-quat! s5-1 s5-1 (-> self control dir-targ)) + (vector+! gp-1 gp-1 s5-1) + ) + (move-to-point! (-> self control) gp-1) + ) + (set! (-> self control unknown-vector37 quad) (-> self control trans quad)) + ) + (else + (let ((f30-0 (sin (lerp-scale 0.0 16384.0 (ja-aframe-num 0) 88.0 102.0)))) + (let ((f28-0 (lerp-scale 0.0 1.0 (ja-aframe-num 0) 88.0 102.0))) + (vector-lerp! + (-> self control trans) + (-> self control unknown-vector37) + (-> self control unknown-vector38) + f30-0 + ) + (set! (-> self control trans y) + (lerp (-> self control unknown-vector37 y) (-> self control unknown-vector38 y) f28-0) + ) + ) + (quaternion-slerp! + (-> self control quat-for-control) + (the-as quaternion (-> self control unknown-vector39)) + (the-as quaternion (-> self control unknown-vector40)) + f30-0 + ) + ) + ) + ) + (rot->dir-targ! (-> self control)) + (if (< 86.0 (ja-aframe-num 0)) + (vector<-cspace! (-> self alt-cam-pos) (-> self node-list data 36)) + ) + (suspend) + (ja :num! (seek!)) + ) + (rot->dir-targ! (-> self control)) + (ja-post) + (let ((gp-4 (new 'stack-no-clear 'vector))) + (vector<-cspace! gp-4 (-> self node-list data 3)) + (set! (-> gp-4 y) (+ -9011.2 (-> gp-4 y))) + (move-to-point! (-> self control) gp-4) + ) + (send-event *camera* 'ease-in) + (ja-channel-set! 0) + (logclear! (-> self control status) (collide-status on-surface on-ground touch-surface)) + (let ((v1-96 (new-stack-vector0))) + (let ((f0-20 (vector-dot (-> self control dynam gravity-normal) (-> self control transv)))) + 0.0 + (vector-! v1-96 (-> self control transv) (vector-float*! v1-96 (-> self control dynam gravity-normal) f0-20)) + ) + (let* ((f0-21 (vector-length v1-96)) + (f1-3 f0-21) + (f2-0 -49152.0) + (a0-61 (vector+! + (-> self control transv) + (vector-float*! (-> self control transv) (-> self control dynam gravity-normal) f2-0) + (vector-float*! v1-96 v1-96 (/ f0-21 f1-3)) + ) + ) + ) + (go target-falling (the-as symbol a0-61)) + ) + ) + (none) + ) + :post (behavior () + (target-no-move-post) + (none) + ) + ) diff --git a/goal_src/jak2/levels/atoll/juicer.gc b/goal_src/jak2/levels/atoll/juicer.gc index 679449a7e3..750a66d99b 100644 --- a/goal_src/jak2/levels/atoll/juicer.gc +++ b/goal_src/jak2/levels/atoll/juicer.gc @@ -735,6 +735,7 @@ (none) ) +;; WARN: Return type mismatch object vs none. (defmethod juicer-method-180 juicer ((obj juicer)) (if (and (= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) (not (and (-> obj next-state) (let ((v1-6 (-> obj next-state name))) @@ -1272,7 +1273,7 @@ (set! (-> s5-0 owner-handle) (the-as handle #f)) (set! (-> s5-0 ignore-handle) (process->handle obj)) (set! (-> s5-0 attack-id) arg1) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) ) (vector-normalize! (vector-! (-> s5-0 pos) (get-trans arg0 3) s4-0) 1.0) (vector-float*! (-> s5-0 vel) (-> s5-0 pos) (* 24576.0 (-> pp clock frames-per-second))) diff --git a/goal_src/jak2/levels/city/common/guard.gc b/goal_src/jak2/levels/city/common/guard.gc index dd8e6c5f6d..da6d810148 100644 --- a/goal_src/jak2/levels/city/common/guard.gc +++ b/goal_src/jak2/levels/city/common/guard.gc @@ -1285,7 +1285,7 @@ (set! (-> a0-13 attack-id) a1-12) (set! (-> s4-1 attack-id) a1-12) ) - (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 timeout) (seconds 4)) (set! (-> s4-1 pos quad) (-> s5-0 quad)) (set! (-> s4-1 vel quad) (-> v1-3 quad)) (vector-normalize! (-> s4-1 vel) 819200.0) @@ -3076,7 +3076,7 @@ (set! (-> s0-1 owner-handle) (the-as handle #f)) (set! (-> s0-1 ignore-handle) (process->handle obj)) (set! (-> s0-1 attack-id) (-> obj attack-id)) - (set! (-> s0-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s0-1 timeout) (seconds 4)) (set! (-> s0-1 pos quad) (-> s4-0 quad)) (vector-! (-> s0-1 vel) s5-0 s4-0) (vector-normalize! (-> s0-1 vel) 131072.0) diff --git a/goal_src/jak2/levels/city/common/metalhead-predator.gc b/goal_src/jak2/levels/city/common/metalhead-predator.gc index abd69e9d61..63ed84f602 100644 --- a/goal_src/jak2/levels/city/common/metalhead-predator.gc +++ b/goal_src/jak2/levels/city/common/metalhead-predator.gc @@ -688,7 +688,7 @@ (set! (-> v1-10 attack-id) a0-11) (set! (-> s5-0 attack-id) a0-11) ) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) (vector<-cspace! (-> s5-0 pos) a1-1) (let ((s3-0 (handle->process (-> obj focus handle))) (s2-0 (new 'stack-no-clear 'vector)) diff --git a/goal_src/jak2/levels/city/common/vehicle-guard.gc b/goal_src/jak2/levels/city/common/vehicle-guard.gc index 9f08f42be0..72b933d380 100644 --- a/goal_src/jak2/levels/city/common/vehicle-guard.gc +++ b/goal_src/jak2/levels/city/common/vehicle-guard.gc @@ -516,7 +516,7 @@ (set! (-> v1-14 attack-id) a0-16) (set! (-> s4-0 proj-params attack-id) a0-16) ) - (set! (-> s4-0 proj-params timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-0 proj-params timeout) (seconds 4)) (let* ((v1-16 (-> s4-0 mat-1)) (a3-0 (-> arg0 node-list data (-> obj info joint-index) bone transform)) (a0-20 (-> a3-0 quad 0)) @@ -802,7 +802,7 @@ (set! (-> v1-15 attack-id) a0-14) (set! (-> a1-1 attack-id) a0-14) ) - (set! (-> a1-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> a1-1 timeout) (seconds 4)) (spawn-projectile vehicle-grenade a1-1 obj *default-dead-pool*) ) (let ((a1-2 (new 'stack-no-clear 'traffic-danger-info))) @@ -837,7 +837,7 @@ (set! (-> v1-38 attack-id) a0-36) (set! (-> s5-1 proj-params attack-id) a0-36) ) - (set! (-> s5-1 proj-params timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-1 proj-params timeout) (seconds 4)) (vector+float*! (-> s5-1 proj-params pos) (the-as vector (-> s5-1 mat-1)) (-> s5-1 mat-1 vector 1) 16384.0) (vector-float*! (-> s5-1 proj-params vel) (-> s5-1 mat-1 vector 1) 819200.0) (spawn-projectile guard-shot (-> s5-1 proj-params) obj *default-dead-pool*) diff --git a/goal_src/jak2/levels/common/enemy/bombots/bombbot.gc b/goal_src/jak2/levels/common/enemy/bombots/bombbot.gc index df0063ce9d..a39c2745f4 100644 --- a/goal_src/jak2/levels/common/enemy/bombots/bombbot.gc +++ b/goal_src/jak2/levels/common/enemy/bombots/bombbot.gc @@ -796,8 +796,7 @@ (set! (-> a1-0 decay-rate) 0.0) (set! (-> a1-0 flags) (traffic-danger-flags tdf0)) (set! (-> a1-0 danger-type) (traffic-danger-type tdt0)) - ;; TODO - traffic - ;; (add-danger-sphere *traffic-engine* a1-0) + (add-danger *traffic-engine* a1-0) ) (none) ) @@ -1813,7 +1812,7 @@ (set! (-> v1-69 attack-id) a0-67) (set! (-> s2-1 attack-id) a0-67) ) - (set! (-> s2-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s2-1 timeout) (seconds 4)) (set! (-> s2-1 pos quad) (-> s3-0 start-pos quad)) (vector+! (-> s2-1 vel) (-> s3-0 start-pos) s5-0) (vector-normalize-copy! (-> s2-1 vel) (-> s3-0 move-dist) 40960000.0) diff --git a/goal_src/jak2/levels/common/enemy/guards/crimson-guard-level.gc b/goal_src/jak2/levels/common/enemy/guards/crimson-guard-level.gc index b193098a2f..162b167903 100644 --- a/goal_src/jak2/levels/common/enemy/guards/crimson-guard-level.gc +++ b/goal_src/jak2/levels/common/enemy/guards/crimson-guard-level.gc @@ -117,7 +117,72 @@ :default-hit-points 4 :gnd-collide-with (collide-spec backgnd obstacle hit-by-others-list pusher) :overlaps-others-collide-with-filter (collide-spec jak bot player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.5 :attack-shove-back (meters 3) @@ -229,7 +294,72 @@ :default-hit-points 4 :gnd-collide-with (collide-spec backgnd obstacle hit-by-others-list pusher) :overlaps-others-collide-with-filter (collide-spec jak bot player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.5 :attack-shove-back (meters 3) @@ -341,7 +471,72 @@ :default-hit-points 4 :gnd-collide-with (collide-spec backgnd obstacle hit-by-others-list pusher) :overlaps-others-collide-with-filter (collide-spec jak bot player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.5 :attack-shove-back (meters 3) @@ -453,7 +648,72 @@ :default-hit-points 4 :gnd-collide-with (collide-spec backgnd obstacle hit-by-others-list pusher) :overlaps-others-collide-with-filter (collide-spec jak bot player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.5 :attack-shove-back (meters 3) @@ -565,7 +825,72 @@ :default-hit-points 4 :gnd-collide-with (collide-spec backgnd obstacle hit-by-others-list pusher) :overlaps-others-collide-with-filter (collide-spec jak bot player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.5 :attack-shove-back (meters 3) @@ -871,7 +1196,7 @@ (set! (-> a0-13 attack-id) a1-12) (set! (-> s4-1 attack-id) a1-12) ) - (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 timeout) (seconds 4)) (set! (-> s4-1 pos quad) (-> s5-0 quad)) (set! (-> s4-1 vel quad) (-> v1-3 quad)) (vector-normalize! (-> s4-1 vel) 819200.0) @@ -2476,7 +2801,7 @@ (set! (-> v1-24 attack-id) a0-23) (set! (-> a1-9 attack-id) a0-23) ) - (set! (-> a1-9 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> a1-9 timeout) (seconds 4)) (spawn-projectile vehicle-grenade a1-9 obj *default-dead-pool*) ) ) diff --git a/goal_src/jak2/levels/common/enemy/hover/crimson-guard-hover.gc b/goal_src/jak2/levels/common/enemy/hover/crimson-guard-hover.gc index 620c962ed4..fd516ec586 100644 --- a/goal_src/jak2/levels/common/enemy/hover/crimson-guard-hover.gc +++ b/goal_src/jak2/levels/common/enemy/hover/crimson-guard-hover.gc @@ -7,3 +7,1925 @@ ;; DECOMP BEGINS +(defpartgroup group-crimson-guard-hover-explosion + :id 158 + :duration (seconds 2) + :linger-duration (seconds 1) + :flags (use-local-clock unk-5 unk-6 unk-7) + :bounds (static-bspherem 0 0 0 15) + :rotate ((degrees 0) (degrees 4) (degrees 0)) + :scale (0.0 16384.0 0.0) + :parts ((sp-item 744 :flags (bit6) :period 900 :length 5) + (sp-item 745 :flags (bit6) :period 900 :length 5) + (sp-item 746 :period 900 :length 15) + (sp-item 747 :fade-after (meters 60) :period 900 :length 10 :offset 10) + (sp-item 748 :fade-after (meters 60) :falloff-to (meters 60) :period 900 :length 50 :offset 20) + (sp-item 749 :fade-after (meters 200) :falloff-to (meters 200) :period 900 :length 25 :offset 20) + (sp-item 750 :fade-after (meters 150) :falloff-to (meters 150) :period 900 :length 20 :offset 30) + ) + ) + +(defpartgroup group-crimson-guard-hover-jet-explosion + :id 159 + :duration (seconds 2) + :linger-duration (seconds 1) + :flags (use-local-clock unk-5 unk-6 unk-7) + :bounds (static-bspherem 0 0 0 15) + :rotate ((degrees 0) (degrees 4) (degrees 0)) + :scale (0.0 16384.0 0.0) + :parts ((sp-item 744 :flags (bit6) :period 900 :length 5) + (sp-item 745 :flags (bit6) :period 900 :length 5) + (sp-item 746 :period 900 :length 15) + (sp-item 747 :fade-after (meters 60) :period 900 :length 10 :offset 10) + (sp-item 748 :fade-after (meters 60) :falloff-to (meters 60) :period 900 :length 50 :offset 20) + (sp-item 749 :fade-after (meters 200) :falloff-to (meters 200) :period 900 :length 25 :offset 20) + (sp-item 750 :fade-after (meters 150) :falloff-to (meters 150) :period 900 :length 20 :offset 30) + ) + ) + +(defpart 745 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 2)) + (sp-flt spt-rot-x 2048.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 24.0) + (sp-flt spt-scalevel-x (meters 0.10666667)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -4.266667) + (sp-flt spt-fade-b -4.266667) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 150) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 glow) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 751) + ) + ) + +(defpart 751 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.85333335) + (sp-flt spt-fade-g -1.7066667) + (sp-flt spt-fade-b -1.7066667) + (sp-flt spt-fade-a -0.64) + ) + ) + +(defpart 750 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x34 :page #xc)) + (sp-rnd-flt spt-num 2.0 0.2 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-rot-z) + :flags (sp-flag spflag7) + :random-rangef 655360.0 + :random-multf 1.0 + ) + (sp-rnd-flt spt-scale-y (meters 0.8) (meters 0.2) 1.0) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 752) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-conerot-x) + :flags (sp-flag from-pointer) + :func '*sp-temp* + ) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 749 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x33 :page #xc)) + (sp-func spt-birth-func 'birth-func-texture-group) + (sp-flt spt-num 3.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (sp-flt spt-rot-z (degrees 0.0)) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.02) (meters 0.01) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-userdata) + :flags (sp-flag plain-v2) + :object (new 'static 'boxed-array :type int32 40 1 0 #xc00000 #xc03300) + ) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 752) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 752 + :init-specs ((sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.0) + (sp-flt spt-fade-b 0.0) + (sp-int-plain-rnd spt-next-time 5 19 1) + (sp-launcher-by-id spt-next-launcher 753) + ) + ) + +(defpart 753 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.016666668) (meters 0.016666668) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.44) + (sp-flt spt-fade-g -2.36) + (sp-flt spt-fade-b -2.64) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 754) + ) + ) + +(defpart 754 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.008333334) (meters 0.008333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -1.2944444) + (sp-flt spt-fade-g -0.7111111) + (sp-flt spt-fade-b -0.094444446) + (sp-rnd-flt spt-fade-a -0.06545454 -0.06545454 1.0) + (sp-int-plain-rnd spt-next-time 150 29 1) + (sp-launcher-by-id spt-next-launcher 755) + ) + ) + +(defpart 755 + :init-specs ((sp-flt spt-fade-r 0.0) (sp-flt spt-fade-g 0.0) (sp-flt spt-fade-b 0.0) (sp-flt spt-fade-a -0.1125)) + ) + +(defpart 744 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 5)) + (sp-flt spt-rot-x 2048.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 96.0) + (sp-flt spt-scalevel-x (meters 0.5)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -1.28) + (sp-flt spt-fade-b -5.1) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 65) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-int spt-next-time 30) + (sp-launcher-by-id spt-next-launcher 756) + ) + ) + +(defpart 756 + :init-specs ((sp-flt spt-scalevel-x (meters -0.2857143)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -3.6571429) + (sp-flt spt-fade-b 0.0) + (sp-flt spt-fade-a -2.7428572) + ) + ) + +(defpart 748 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x32 :page #xc)) + (sp-rnd-flt spt-num 8.0 2.0 1.0) + (sp-flt spt-x (meters 0.25)) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.25) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 16.0 48.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.083333336) (meters 0.083333336) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.006666667) (meters 0.0016666667) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.18) + (sp-flt spt-fade-b -2.12) + (sp-rnd-flt spt-accel-y -0.68266666 -1.3653333 1.0) + (sp-flt spt-friction 0.87) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 757) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 757 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0016666667)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.02) + (sp-flt spt-fade-b 0.23555556) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 758) + ) + ) + +(defpart 758 + :init-specs ((sp-flt spt-fade-r -0.5543478) (sp-flt spt-fade-g -0.5543478) (sp-flt spt-fade-a -0.13913043)) + ) + +(defpart 746 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 8.0 1.0 1.0) + (sp-rnd-flt spt-x (meters 0) (meters 0.6) 1.0) + (sp-rnd-flt spt-scale-x (meters 2.5) (meters 2) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 70.0 20.0 1.0) + (sp-rnd-flt spt-g 70.0 20.0 1.0) + (sp-rnd-flt spt-b 70.0 20.0 1.0) + (sp-rnd-flt spt-a 0.0 40.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0) (meters 0.1) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.033333335) (meters 0.02) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 3.3) + (sp-flt spt-fade-g 3.12) + (sp-flt spt-fade-b 1.18) + (sp-flt spt-fade-a 1.76) + (sp-flt spt-friction 0.88) + (sp-int spt-timer 710) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 759) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 759 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.53333336) + (sp-flt spt-fade-g -1.9666667) + (sp-flt spt-fade-b -2.2) + (sp-flt spt-fade-a -0.41666666) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 760) + ) + ) + +(defpart 760 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.38833332) + (sp-flt spt-fade-g -0.21333334) + (sp-flt spt-fade-b -0.028333334) + (sp-flt spt-fade-a -0.38833332) + ) + ) + +(defpart 747 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x31 :page #xc)) + (sp-rnd-flt spt-num 4.0 2.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.2) (meters 0.5) 1.0) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.2) (meters 0.1) 1.0) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-flt spt-g 96.0) + (sp-flt spt-b 64.0) + (sp-rnd-flt spt-a 64.0 64.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.13333334) (meters 0.02) 1.0) + (sp-flt spt-fade-g 1.6) + (sp-flt spt-fade-b 3.2) + (sp-flt spt-fade-a -1.6) + (sp-int spt-timer 90) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + ) + ) + +(defpart 761 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-flt spt-num 16.0) + (sp-rnd-flt spt-y (meters 0.5) (meters 1) 1.0) + (sp-rnd-flt spt-scale-x (meters 1.5) (meters 1.5) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 128.0 32.0 1.0) + (sp-rnd-flt spt-g 128.0 32.0 1.0) + (sp-rnd-flt spt-b 128.0 32.0 1.0) + (sp-rnd-flt spt-a 32.0 16.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.016666668) (meters 0.033333335) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -1.2) (degrees 1.2) 1.0) + (sp-flt spt-accel-y 2.7306666) + (sp-int spt-timer 120) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14 sp-cpuinfo-flag-21) + (sp-int-plain-rnd spt-next-time 30 59 1) + (sp-launcher-by-id spt-next-launcher 762) + (sp-rnd-flt spt-conerot-x (degrees 70.0) (degrees 20.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +(defpart 762 + :init-specs ((sp-flt spt-fade-a -1.0666667)) + ) + +(defpart 763 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x92 :page #xc)) + (sp-flt spt-num 4.0) + (sp-flt spt-y (meters 0.75)) + (sp-flt spt-scale-x (meters 6)) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.3) (meters 1) 1.0) + (sp-flt spt-r 192.0) + (sp-flt spt-g 192.0) + (sp-rnd-flt spt-b 64.0 128.0 1.0) + (sp-flt spt-a 0.0) + (sp-flt spt-scalevel-x (meters 0.009765625)) + (sp-rnd-flt spt-rotvel-z (degrees -0.15) (degrees 0.3) 1.0) + (sp-flt spt-scalevel-y (meters 0.009765625)) + (sp-flt spt-fade-a 2.1333334) + (sp-int spt-timer 30) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 sp-cpuinfo-flag-21) + (sp-int spt-next-time 15) + (sp-launcher-by-id spt-next-launcher 764) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +(defpart 764 + :init-specs ((sp-flt spt-fade-a -2.1333334)) + ) + +(defpart 765 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x29 :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 1)) + (sp-flt spt-scale-x (meters 8)) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 196.0) + (sp-flt spt-g 196.0) + (sp-flt spt-b 196.0) + (sp-flt spt-a 28.0) + (sp-int spt-timer 10) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 sp-cpuinfo-flag-21) + ) + ) + +(defpart 766 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xb :page #xc)) + (sp-flt spt-num 4.5) + (sp-rnd-flt spt-x (meters -0.5) (meters 1) 1.0) + (sp-rnd-flt spt-y (meters 0.25) (meters 1.5) 1.0) + (sp-rnd-flt spt-z (meters -0.5) (meters 1) 1.0) + (sp-rnd-int-flt spt-scale-x (meters 0.3) 1 4096.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-scale-y (meters 0.3)) + (sp-flt spt-r 100.0) + (sp-flt spt-g 100.0) + (sp-flt spt-b 100.0) + (sp-flt spt-a 128.0) + (sp-rnd-flt spt-vel-y (meters 0.06666667) (meters 0.06666667) 1.0) + (sp-flt spt-rotvel-x (degrees 1.2)) + (sp-flt spt-rotvel-y (degrees 2.4)) + (sp-rnd-int-flt spt-rotvel-z (degrees 0.0) 3 436.90668) + (sp-flt spt-accel-y -13.653334) + (sp-flt spt-friction 0.97) + (sp-int spt-timer 150) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14 sp-cpuinfo-flag-21) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 767) + (sp-rnd-flt spt-conerot-x (degrees 40.0) (degrees 30.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +(defpartgroup group-crimson-guard-hover-explode + :id 160 + :duration (seconds 0.017) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 12) + :parts ((sp-item 761) (sp-item 763) (sp-item 765) (sp-item 766) (sp-item 766) (sp-item 766)) + ) + +(deftype crimson-guard-hover-shot (guard-shot) + () + :heap-base #x170 + :method-count-assert 40 + :size-assert #x1f0 + :flag-assert #x28017001f0 + ) + + +(defmethod play-impact-sound crimson-guard-hover-shot ((obj crimson-guard-hover-shot) (arg0 projectile-options)) + (cond + ((zero? arg0) + ) + (else + ((method-of-type guard-shot play-impact-sound) obj arg0) + ) + ) + 0 + (none) + ) + +(deftype crimson-guard-hover (hover-enemy) + ((gun-jmod joint-mod :offset-assert 784) + (hips-jmod joint-mod :offset-assert 788) + (entity-group actor-group :offset-assert 792) + (los los-control :inline :offset-assert 800) + (smoke-part sparticle-launch-control :offset-assert 948) + (engine-part sparticle-launch-control :offset-assert 952) + (last-fire-time time-frame :offset-assert 960) + (gun-x-angle float :offset-assert 968) + (gun-x-angle-final float :offset-assert 972) + (path-u float :offset-assert 976) + (path-du float :offset-assert 980) + (path-du-final float :offset-assert 984) + (path-dest float :offset-assert 988) + (sound-id sound-id :offset-assert 992) + (knocked-recover-anim int32 :offset-assert 996) + (attack-wait-min float :offset-assert 1000) + (attack-wait-max float :offset-assert 1004) + (attack-miss-dist-min float :offset-assert 1008) + (attack-miss-dist-max float :offset-assert 1012) + (attack-miss-dist-curr float :offset-assert 1016) + (shots-fired int32 :offset-assert 1020) + ) + :heap-base #x380 + :method-count-assert 163 + :size-assert #x400 + :flag-assert #xa303800400 + (:methods + (ambush-fly () _type_ :state 156) + (ambush-attack () _type_ :state 157) + (kick-attack () _type_ :state 158) + (attack () _type_ :state 159) + (die-now () _type_ :state 160) + (shoot (_type_ vector projectile-init-by-other-params int float float) none 161) + (crimson-guard-hover-method-162 (_type_ process-focusable) symbol 162) + ) + ) + + +(define *crimson-guard-hover-enemy-info* + (new 'static 'enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #f + :hover-if-no-ground #f + :idle-anim-script #f + :idle-anim 4 + :notice-anim 4 + :hostile-anim 4 + :hit-anim 12 + :knocked-anim 10 + :knocked-land-anim 19 + :die-anim -1 + :die-falling-anim -1 + :victory-anim 4 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 26 + :look-at-joint 26 + :bullseye-joint 4 + :sound-hit (static-sound-name "crimson-guard-h") + :sound-die (static-sound-name "crimson-guard-h") + :notice-distance (meters 70) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 55) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 2730.6667 + :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 32768.0 + :knocked-hard-vxz-hi 77004.8 + :knocked-hard-vy-lo 60620.8 + :knocked-hard-vy-hi 95027.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 10) + :shadow-min-y (meters -20) + :shadow-locus-dist (meters 150) + :gem-joint -1 + :gem-offset (new 'static 'sphere :r 163840.0) + ) + ) + +(set! (-> *crimson-guard-hover-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defskelgroup skel-crimson-guard-hover-explode crimson-guard-hover crimson-guard-hover-explode-lod0-jg crimson-guard-hover-explode-idle-ja + ((crimson-guard-hover-explode-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :origin-joint-index 3 + ) + +(define *crimson-guard-hover-exploder-params* + (new 'static 'joint-exploder-static-params + :joints (new 'static 'boxed-array :type joint-exploder-static-joint-params + (new 'static 'joint-exploder-static-joint-params :joint-index 3 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 4 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 5 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 6 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 7 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 8 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 9 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 10 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 11 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 12 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 13 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 14 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 15 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 16 :parent-joint-index -1) + ) + :collide-spec #x1 + ) + ) + +;; WARN: Return type mismatch int vs sound-id. +(defmethod enemy-method-135 crimson-guard-hover ((obj crimson-guard-hover) (arg0 int)) + (if (and (zero? arg0) (logtest? #x4000000 (-> obj incoming penetrate-using))) + (sound-play "hover-take-hit") + ((the-as (function enemy int sound-id) (find-parent-method crimson-guard-hover 135)) obj arg0) + ) + (the-as sound-id 0) + ) + +(defstate ambush (crimson-guard-hover) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy ambush) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self last-fire-time) + (+ (-> self clock frame-counter) (the int (* 300.0 (get-rand-float-range self 2.0 3.0)))) + ) + (go-virtual ambush-fly) + (none) + ) + :exit (behavior () + '() + (none) + ) + ) + +(defstate ambush-fly (crimson-guard-hover) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior crimson-guard-hover) + enemy-event-handler + ) + :trans (behavior () + (when (hover-nav-control-method-23 (-> self hover)) + (hover-enemy-method-153 self) + (if (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (hover-enemy-method-141 self 1.0) + ) + ((-> (method-of-type hover-enemy ambush) exit)) + (go-virtual hostile) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (when gp-0 + (if (< (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable gp-0) 0)) + 450560.0 + ) + (speech-control-method-15 *speech-control* self) + ) + (if (crimson-guard-hover-method-162 self (the-as process-focusable gp-0)) + (go-virtual ambush-attack) + ) + ) + ) + (none) + ) + :code (the-as (function none :behavior crimson-guard-hover) hover-enemy-fly-code) + :post (-> (method-of-type hover-enemy ambush) post) + ) + +(defstate ambush-attack (crimson-guard-hover) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (when (< (-> self shots-fired) 2) + (let ((s5-0 (new 'stack-no-clear 'projectile-init-by-other-params)) + (gp-0 (-> self focus-pos)) + ) + (set! (-> s5-0 ent) (-> self entity)) + (set! (-> s5-0 charge) 1.0) + (set! (-> s5-0 options) (projectile-options)) + (set! (-> s5-0 notify-handle) (the-as handle #f)) + (set! (-> s5-0 owner-handle) (the-as handle #f)) + (set! (-> s5-0 ignore-handle) (process->handle self)) + (let* ((v1-7 *game-info*) + (a0-6 (+ (-> v1-7 attack-id) 1)) + ) + (set! (-> v1-7 attack-id) a0-6) + (set! (-> s5-0 attack-id) a0-6) + ) + (set! (-> s5-0 timeout) (seconds 4)) + (shoot self gp-0 s5-0 9 0.000000000000000000000000000000000000000000017 1.0) + (shoot self gp-0 s5-0 11 0.000000000000000000000000000000000000000000017 -1.0) + ) + (sound-play "hover-fire") + (let ((v0-0 (the-as object (+ (-> self shots-fired) 1)))) + (set! (-> self shots-fired) (the-as int v0-0)) + v0-0 + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self attack-miss-dist-curr) (-> self attack-miss-dist-min)) + (let ((f0-1 (vector-vector-distance-squared (-> self root-override2 trans) (-> self focus-pos))) + (f1-0 122880.0) + ) + (if (< f0-1 (* f1-0 f1-0)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-3)) + ) + ) + (set! (-> self shots-fired) 0) + 0 + (none) + ) + :exit (behavior () + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self restart-fly-anims) #t) + (none) + ) + :trans (behavior () + ((-> (method-of-type crimson-guard-hover ambush) trans)) + (if (or (skip-check-los? (-> self los) 60) (not (enemy-method-95 self (-> self focus-pos) 9102.223))) + (go-virtual ambush-fly) + ) + (none) + ) + :code (behavior () + (sound-play "hover-warn") + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self hover-info shoot-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self hover-info shoot-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual ambush-fly) + (none) + ) + :post (behavior () + (let* ((a1-0 (-> self node-list data (-> self hover-info gun-base))) + (a0-2 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-4 (new 'stack-no-clear 'vector))) + (set! (-> v1-4 quad) (-> self focus-pos quad)) + (+! (-> v1-4 y) (-> self attack-miss-dist-curr)) + (vector-! gp-0 v1-4 a0-2) + ) + (vector-normalize! gp-0 1.0) + (set! (-> self gun-x-angle-final) (fmax -5461.3335 (fmin 8192.0 (- (vector-x-angle gp-0))))) + ) + (quaternion-vector-angle! (the-as quaternion (-> self gun-jmod target)) *x-vector* (-> self gun-x-angle)) + (seek! + (-> self attack-miss-dist-curr) + (-> self attack-miss-dist-max) + (* 0.5 (-> self clock seconds-per-frame) (- (-> self attack-miss-dist-max) (-> self attack-miss-dist-min))) + ) + ((the-as (function none) (-> (method-of-type crimson-guard-hover ambush) post))) + (none) + ) + ) + +(defstate notice (crimson-guard-hover) + :virtual #t + :post (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy notice) post))) + (if t9-0 + ((the-as (function none) t9-0)) + ) + ) + (talker-spawn-func (-> *talker-speech* 10) *entity-pool* (target-pos 0) (the-as region #f)) + (set! (-> self last-fire-time) (+ (-> self clock frame-counter) (seconds -1.5))) + (none) + ) + ) + +(defstate hostile (crimson-guard-hover) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (when gp-0 + (if (< (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable gp-0) 0)) + 450560.0 + ) + (speech-control-method-15 *speech-control* self) + ) + (if (crimson-guard-hover-method-162 self (the-as process-focusable gp-0)) + (go-virtual attack) + ) + ) + ) + (none) + ) + ) + +(defstate kick-attack (crimson-guard-hover) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior crimson-guard-hover) + enemy-event-handler + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :trans (behavior () + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 4)) + (go-hostile self) + ) + (none) + ) + :code (the-as (function none :behavior crimson-guard-hover) hover-enemy-fly-code) + :post (behavior () + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) (process->ppointer self)) + (set! (-> a1-0 num-params) 0) + (set! (-> a1-0 message) 'get-formation) + (let ((t9-0 send-event-function) + (v1-2 (-> self formation-entity)) + ) + (t9-0 + (if v1-2 + (-> v1-2 extra process) + ) + a1-0 + ) + ) + ) + (let ((gp-0 (-> self dest-pos))) + (let* ((s5-0 (handle->process (-> self focus handle))) + (a0-6 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-6) 0) quad)) + ) + (set! (-> gp-0 y) (+ -20480.0 (-> gp-0 y))) + (hover-nav-control-method-11 (-> self hover) gp-0) + ) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate attack (crimson-guard-hover) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (when (< (-> self shots-fired) 2) + (let ((s5-0 (new 'stack-no-clear 'projectile-init-by-other-params)) + (gp-0 (-> self focus-pos)) + ) + (set! (-> s5-0 ent) (-> self entity)) + (set! (-> s5-0 charge) 1.0) + (set! (-> s5-0 options) (projectile-options)) + (set! (-> s5-0 notify-handle) (the-as handle #f)) + (set! (-> s5-0 owner-handle) (the-as handle #f)) + (set! (-> s5-0 ignore-handle) (process->handle self)) + (let* ((v1-7 *game-info*) + (a0-6 (+ (-> v1-7 attack-id) 1)) + ) + (set! (-> v1-7 attack-id) a0-6) + (set! (-> s5-0 attack-id) a0-6) + ) + (set! (-> s5-0 timeout) (seconds 4)) + (shoot self gp-0 s5-0 9 0.000000000000000000000000000000000000000000017 1.0) + (shoot self gp-0 s5-0 11 0.000000000000000000000000000000000000000000017 -1.0) + ) + (sound-play "hover-fire") + (let ((v0-0 (the-as object (+ (-> self shots-fired) 1)))) + (set! (-> self shots-fired) (the-as int v0-0)) + v0-0 + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self attack-miss-dist-curr) (-> self attack-miss-dist-min)) + (set! (-> self shots-fired) 0) + 0 + (none) + ) + :exit (behavior () + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self restart-fly-anims) #t) + (none) + ) + :trans (behavior () + (if (or (skip-check-los? (-> self los) 60) (not (enemy-method-95 self (-> self focus-pos) 9102.223))) + (go-hostile self) + ) + (none) + ) + :code (behavior () + (sound-play "hover-warn") + (let ((f0-0 (vector-vector-distance-squared (-> self root-override2 trans) (-> self focus-pos))) + (f1-0 122880.0) + ) + (if (< f0-0 (* f1-0 f1-0)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-3)) + ) + ) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self hover-info shoot-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self hover-info shoot-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (let* ((a1-0 (-> self node-list data (-> self hover-info gun-base))) + (a0-2 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-4 (new 'stack-no-clear 'vector))) + (set! (-> v1-4 quad) (-> self focus-pos quad)) + (+! (-> v1-4 y) (-> self attack-miss-dist-curr)) + (vector-! gp-0 v1-4 a0-2) + ) + (vector-normalize! gp-0 1.0) + (set! (-> self gun-x-angle-final) (fmax -5461.3335 (fmin 8192.0 (- (vector-x-angle gp-0))))) + ) + (quaternion-vector-angle! (the-as quaternion (-> self gun-jmod target)) *x-vector* (-> self gun-x-angle)) + (seek! + (-> self attack-miss-dist-curr) + (-> self attack-miss-dist-max) + (* 0.5 (-> self clock seconds-per-frame) (- (-> self attack-miss-dist-max) (-> self attack-miss-dist-min))) + ) + (hover-enemy-hostile-post) + (none) + ) + ) + +(defstate knocked (crimson-guard-hover) + :virtual #t + :enter (behavior () + (let ((t9-1 (-> (the-as (state hover-enemy) (find-parent-method crimson-guard-hover 30)) enter))) + (if t9-1 + (t9-1) + ) + ) + (none) + ) + ) + +(defstate knocked-recover (crimson-guard-hover) + :virtual #t + :code (behavior () + (local-vars (v1-35 enemy-flag) (v1-43 enemy-flag)) + (ja-channel-push! 1 (seconds 0.5)) + (ja-no-eval :group! (-> self draw art-group data (-> self knocked-recover-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self knocked-recover-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self restart-fly-anims) #t) + (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-34 (-> self enemy-flags))) + (if (logtest? v1-34 (enemy-flag checking-water)) + (set! v1-35 (logior v1-34 (enemy-flag enable-on-active))) + (set! v1-35 (logclear v1-34 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-35) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-move-dest)) + (set! (-> self mask) (logior (process-mask collectable) (-> self mask))) + (logclear! (-> self mask) (process-mask collectable)) + ) + (let ((v1-42 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-42) + (set! v1-43 (logior (enemy-flag check-water-backup) v1-42)) + (set! v1-43 (logclear v1-42 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-43) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (hover-nav-control-method-21 (-> self hover)) + (go-hostile self) + (none) + ) + ) + +(defstate die-now (crimson-guard-hover) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior crimson-guard-hover) + enemy-event-handler + ) + :code (behavior () + (dispose! self) + (let ((v1-3 (-> self root-override2 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) + (do-effect (-> self skel effect) 'death-default 0.0 -1) + (let ((gp-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-0) (seconds 1)) + (suspend) + ) + ) + (send-event self 'death-end) + (cleanup-for-death self) + (none) + ) + :post (the-as (function none :behavior crimson-guard-hover) transform-post) + ) + +(defstate flying-death (crimson-guard-hover) + :virtual #t + :enter (behavior () + (let ((t9-1 (-> (the-as (state hover-enemy) (find-parent-method crimson-guard-hover 138)) enter))) + (if t9-1 + (t9-1) + ) + ) + (let ((gp-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-0 + (let ((t9-3 (method-of-type part-tracker activate))) + (t9-3 (the-as part-tracker gp-0) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-4 run-function-in-process) + (a0-3 gp-0) + (a1-3 part-tracker-init) + (a2-4 (-> *part-group-id-table* 159)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-4) + a0-3 + a1-3 + a2-4 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> gp-0 ppointer) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (cond + ((< (-> self flying-death-spin-dest) 0.0) + (ja-no-eval :group! crimson-guard-hover-death-left-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim crimson-guard-hover-death-left-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (ja-no-eval :group! crimson-guard-hover-death-right-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim crimson-guard-hover-death-right-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (sleep-code) + (none) + ) + ) + +(defstate flying-death-explode (crimson-guard-hover) + :virtual #t + :enter (behavior () + (let ((t9-1 (-> (the-as (state hover-enemy) (find-parent-method crimson-guard-hover 139)) enter))) + (if t9-1 + (t9-1) + ) + ) + (sound-play "hover-explode") + (let ((gp-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-1 + (let ((t9-5 (method-of-type part-tracker activate))) + (t9-5 (the-as part-tracker gp-1) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-6 run-function-in-process) + (a0-5 gp-1) + (a1-4 part-tracker-init) + (a2-5 (-> *part-group-id-table* 158)) + (a3-2 0) + (t0-1 #f) + (t1-1 #f) + (t2-1 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-6) + a0-5 + a1-4 + a2-5 + a3-2 + t0-1 + t1-1 + t2-1 + t3-0 + ) + ) + (-> gp-1 ppointer) + ) + ) + (let ((gp-2 (new 'stack 'joint-exploder-tuning (the-as uint 0)))) + (process-spawn + joint-exploder + (art-group-get-by-name *level* "skel-crimson-guard-hover-explode" (the-as (pointer uint32) #f)) + 25 + gp-2 + *crimson-guard-hover-exploder-params* + :to self + ) + ) + (sound-stop (-> self sound-id)) + (none) + ) + ) + +(defmethod general-event-handler crimson-guard-hover ((obj crimson-guard-hover) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (local-vars (v1-15 enemy-flag)) + (case arg2 + (('attack-invinc) + (case (-> (the-as attack-info (-> arg3 param 1)) mode) + (('endlessfall) + #f + ) + ) + ) + (('hit 'hit-flinch 'hit-knocked) + (speech-control-method-13 *speech-control* (the-as handle obj)) + (when (and (-> obj next-state) (let ((v1-8 (-> obj next-state name))) + (or (= v1-8 'ambush-fly) (= v1-8 'ambush-attack)) + ) + ) + (hover-nav-control-method-20 (-> obj hover)) + (hover-enemy-method-140 obj #t) + (let ((v1-14 (-> obj enemy-flags))) + (if (logtest? v1-14 (enemy-flag checking-water)) + (set! v1-15 (logior v1-14 (enemy-flag enable-on-active))) + (set! v1-15 (logclear v1-14 (enemy-flag enable-on-active))) + ) + ) + (set! (-> obj enemy-flags) v1-15) + (hover-enemy-method-153 obj) + ) + (when (> (-> obj hit-points) 0) + (let* ((s1-0 (handle->process (-> obj incoming attacker-handle))) + (v1-23 (if (type? s1-0 process-focusable) + s1-0 + ) + ) + ) + (if (and *target* + v1-23 + (let ((f0-0 (vector-vector-distance-squared (-> obj root-override2 trans) (-> obj focus-pos))) + (f1-0 122880.0) + ) + (< f0-0 (* f1-0 f1-0)) + ) + ) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-0 speech-type-1 speech-type-3)) + ) + ) + ) + ((the-as + (function enemy process int symbol event-message-block object) + (find-parent-method crimson-guard-hover 74) + ) + obj + arg0 + arg1 + arg2 + arg3 + ) + ) + (('notify) + (let ((a0-27 (the-as object (-> arg3 param 0))) + (v1-31 (the-as object (-> arg3 param 1))) + ) + (when (= (the-as symbol a0-27) 'attack) + (when (logtest? (-> (the-as process-focusable v1-31) mask) (process-mask target)) + (if (and (logtest? (-> (the-as process-focusable v1-31) focus-status) (focus-status dead)) + (let ((f0-1 (vector-vector-distance-squared (-> obj root-override2 trans) (-> obj focus-pos))) + (f1-3 122880.0) + ) + (< f0-1 (* f1-3 f1-3)) + ) + ) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-1 speech-type-3)) + ) + ) + ) + ) + ((the-as + (function enemy process int symbol event-message-block object) + (find-parent-method crimson-guard-hover 74) + ) + obj + arg0 + arg1 + arg2 + arg3 + ) + ) + (else + ((the-as + (function enemy process int symbol event-message-block object) + (find-parent-method crimson-guard-hover 74) + ) + obj + arg0 + arg1 + arg2 + arg3 + ) + ) + ) + ) + +;; WARN: Return type mismatch object vs symbol. +(defmethod crimson-guard-hover-method-162 crimson-guard-hover ((obj crimson-guard-hover) (arg0 process-focusable)) + (with-pp + (let* ((v1-1 (vector+! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) (-> obj root-override2 transv))) + (s5-1 (vector-! (new 'stack-no-clear 'vector) v1-1 (-> obj focus-pos))) + (f30-0 (vector-length s5-1)) + (a0-4 (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + ) + ) + (the-as + symbol + (when a0-4 + (let ((s4-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (get-quat (the-as process-focusable a0-4) 0))) + (s5-2 (vector-normalize-copy! (new 'stack-no-clear 'vector) s5-1 1.0)) + ) + (and (< 0.0 (vector-dot s4-1 s5-2)) + (and (>= (- (-> pp clock frame-counter) (-> obj last-fire-time)) + (the int (* 300.0 (rand-vu-float-range (-> obj attack-wait-min) (-> obj attack-wait-max)))) + ) + (get-enemy-target obj) + (< f30-0 225280.0) + (and (< (fabs (vector-x-angle s5-2)) 3640.889) + (enemy-method-95 obj (-> obj focus-pos) 5461.3335) + (check-los? (-> obj los) (seconds 0.4)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + +(defmethod hover-enemy-method-145 crimson-guard-hover ((obj crimson-guard-hover) (arg0 int) (arg1 float) (arg2 int) (arg3 int)) + (local-vars (v1-1 int)) + 0 + (if (< 0.0 arg1) + (set! v1-1 arg2) + (set! v1-1 arg3) + ) + (let* ((f0-2 (- 1.0 arg1)) + (a2-2 (- 1.0 (* f0-2 f0-2 f0-2))) + (a3-7 (-> obj skel root-channel arg0)) + ) + (let ((f0-6 (fabs a2-2))) + (set! (-> a3-7 frame-interp 1) f0-6) + (set! (-> a3-7 frame-interp 0) f0-6) + ) + (set! (-> a3-7 frame-group) (the-as art-joint-anim (-> obj draw art-group data v1-1))) + (set! (-> a3-7 param 0) 0.0) + (set! (-> a3-7 frame-num) (-> obj skel root-channel 0 frame-num)) + (joint-control-channel-group! a3-7 (the-as art-joint-anim (-> obj draw art-group data v1-1)) num-func-chan) + ) + (none) + ) + +(defmethod enemy-method-52 crimson-guard-hover ((obj crimson-guard-hover) (arg0 vector)) + (let ((s4-0 (-> obj root-override2))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-2)) + (let ((gp-1 (-> obj root-override2 transv))) + (let ((a1-1 (handle->process (-> obj incoming attacker-handle)))) + (if a1-1 + (vector-! gp-1 (-> (the-as process-focusable a1-1) root-override trans) (-> obj root-override2 trans)) + (vector-! gp-1 (-> obj incoming attacker-pos) (-> obj root-override2 trans)) + ) + ) + (set! (-> gp-1 y) 0.0) + (vector-normalize! gp-1 1.0) + (vector-rotate90-around-y! gp-1 gp-1) + (if (< 0.0 (vector-dot + (vector-! (new 'stack-no-clear 'vector) (-> obj incoming attacker-pos) (-> s4-0 trans)) + (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> s4-0 quat)) + ) + ) + (vector-negate! gp-1 gp-1) + ) + (let ((f30-1 (get-rand-float-range obj 0.0 1.0)) + (s5-1 (-> obj enemy-info)) + ) + (vector-float*! gp-1 gp-1 (lerp (-> s5-1 knocked-hard-vxz-lo) (-> s5-1 knocked-hard-vxz-hi) f30-1)) + (set! (-> gp-1 y) (lerp (-> s5-1 knocked-hard-vy-lo) (-> s5-1 knocked-hard-vy-hi) f30-1)) + ) + ) + ) + (else + ((the-as (function hover-enemy vector none) (find-parent-method crimson-guard-hover 52)) obj arg0) + ) + ) + ) + (none) + ) + +(defmethod enemy-method-77 crimson-guard-hover ((obj crimson-guard-hover) (arg0 (pointer float))) + (ja-channel-push! 1 0) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-5)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 12))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 12)) 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 (-> obj draw art-group data 12)) num-func-seek!) + ) + (set! (-> obj knocked-recover-anim) 13) + ) + (else + (let ((a0-4 (-> obj skel root-channel 0))) + (set! (-> a0-4 frame-group) (the-as art-joint-anim (-> obj draw art-group data 10))) + (set! (-> a0-4 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 10)) frames num-frames) -1)) + ) + (set! (-> a0-4 param 1) (-> arg0 0)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim (-> obj draw art-group data 10)) num-func-seek!) + ) + (set! (-> obj knocked-recover-anim) 11) + ) + ) + #t + ) + +(defmethod enemy-method-78 crimson-guard-hover ((obj crimson-guard-hover) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (ja-channel-push! 1 (seconds 0.4)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 19))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 19)) frames num-frames) -1)) + ) + (set! (-> a0-2 param 1) (-> arg0 0)) + (set! (-> a0-2 frame-num) 0.0) + (joint-control-channel-group! a0-2 (the-as art-joint-anim (-> obj draw art-group data 19)) num-func-seek!) + ) + #t + ) + (else + #f + ) + ) + ) + +(defmethod track-target! crimson-guard-hover ((obj crimson-guard-hover)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (seek! (-> obj gun-x-angle) (-> obj gun-x-angle-final) (* 21845.334 (-> pp clock seconds-per-frame))) + (let* ((s5-0 (hover-nav-control-method-16 (-> obj hover) (new 'stack-no-clear 'vector))) + (s4-0 + (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + *x-vector* + (fmax -8192.0 (fmin 8192.0 (* 14563.556 (-> s5-0 z)))) + ) + ) + (a1-4 + (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + *z-vector* + (fmax -8192.0 (fmin 8192.0 (* 14563.556 (-> s5-0 x)))) + ) + ) + (s5-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion*! s5-1 a1-4 s4-0) + (quaternion-slerp! + (the-as quaternion (-> obj hips-jmod target)) + (the-as quaternion (-> obj hips-jmod target)) + s5-1 + (* 2.0 (-> pp clock seconds-per-frame)) + ) + ) + (let ((t9-6 (method-of-type hover-enemy track-target!))) + (t9-6 obj) + ) + (los-control-method-9 (-> obj los) (the-as process-focusable #f) (the-as vector #f) 2048.0) + 0 + (none) + ) + ) + +(defmethod hover-enemy-method-142 crimson-guard-hover ((obj crimson-guard-hover)) + (let ((s5-0 (-> obj main-joint-acc)) + (s4-0 (-> obj main-joint-vel)) + (gp-0 + (lambda ((arg0 crimson-guard-hover) (arg1 cspace) (arg2 float) (arg3 float) (arg4 vector) (arg5 vector) (arg6 int)) + (local-vars (sv-192 float) (sv-208 quaternion) (sv-224 vector)) + (with-pp + (set! sv-192 arg2) + (let ((s0-0 arg3)) + (set! sv-224 arg4) + (let ((s1-0 arg5) + (s3-0 arg6) + (s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) arg1)) + (s5-0 (new 'stack-no-clear 'matrix)) + (a1-3 (matrix-with-scale->quaternion (new 'stack-no-clear 'quaternion) (-> arg1 bone transform))) + ) + (set! sv-208 (new 'stack-no-clear 'quaternion)) + (let ((s2-1 (new 'stack-no-clear 'vector))) + (-> arg0 scale) + (quaternion-rotate-local-z! sv-208 a1-3 sv-192) + (quaternion->matrix s5-0 sv-208) + (set! (-> s2-1 quad) (-> arg0 root-override2 scale quad)) + (scale-matrix! s5-0 s2-1 s5-0) + (let* ((s1-1 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) s1-0 (-> arg0 root-override2 quat))) + (t9-6 vector-inv-orient-by-quat!) + (a0-10 (new 'stack-no-clear 'vector)) + (a2-4 (-> arg0 root-override2 quat)) + (v0-6 (t9-6 a0-10 sv-224 a2-4)) + (f30-0 (* 2867200.0 (-> pp clock seconds-per-frame))) + (f28-0 + (seek + (-> arg0 thrust s3-0) + (+ (* 0.4 (fmax 0.0 (* (-> v0-6 x) s0-0))) + (fmax 0.0 (-> v0-6 y)) + (fabs (* 0.2 (-> v0-6 z))) + (fmax 0.0 (-> s1-1 y)) + ) + (* 0.2 f30-0) + ) + ) + ) + (let ((f20-0 (lerp-scale 819.2 4096.0 f28-0 1638.4 f30-0)) + (f26-0 (lerp-scale 4915.2 11468.8 f28-0 1638.4 f30-0)) + (f22-0 (lerp-scale 0.5 1.5 f28-0 1638.4 f30-0)) + (f24-0 (lerp-scale 0.1 1.0 f28-0 1638.4 f30-0)) + ) + (lerp-scale 0.1 1.0 f28-0 1638.4 f30-0) + (let ((f1-10 (lerp-scale 0.02 0.6 f28-0 1638.4 f30-0)) + (f2-6 (fmin 1.0 (-> s2-1 x))) + (f0-14 (fmin 1.0 (-> s2-1 y))) + ) + (set! (-> *part-id-table* 718 init-specs 4 initial-valuef) (* f20-0 f2-6)) + (set! (-> *part-id-table* 718 init-specs 5 initial-valuef) (* f26-0 f0-14)) + (set! (-> *part-id-table* 722 init-specs 3 initial-valuef) (* f22-0 f2-6)) + (set! (-> *part-id-table* 719 init-specs 1 initial-valuef) (* f24-0 f0-14)) + (set! (-> *part-id-table* 720 init-specs 1 initial-valuef) (* f1-10 f0-14)) + (set! (-> *part-id-table* 721 init-specs 0 initial-valuef) (* f24-0 f0-14)) + (set! (-> arg0 thrust s3-0) f28-0) + (let ((f0-15 (* f26-0 f0-14))) + (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 vector 1) (* -0.5 f0-15)) + ) + ) + ) + (set! (-> s5-0 trans quad) (-> s4-0 quad)) + (spawn-with-matrix (-> arg0 engine-part) s5-0) + (let ((f0-17 (lerp-scale 0.4 1.0 f28-0 1638.4 f30-0))) + (sound-play-by-name + (static-sound-name "hover-jets") + (-> arg0 sound-id) + (the int (* 1024.0 f0-17)) + 0 + 0 + (sound-group sfx) + #t + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + ) + ) + (gp-0 + obj + (-> obj node-list data (-> obj hover-info engine-left)) + (-> obj hover-info thrust-rotate-left) + -1.0 + s5-0 + s4-0 + 0 + ) + (gp-0 + obj + (-> obj node-list data (-> obj hover-info engine-right)) + (-> obj hover-info thrust-rotate-right) + 1.0 + s5-0 + s4-0 + 1 + ) + ) + 0 + (none) + ) + +(defmethod hover-enemy-method-143 crimson-guard-hover ((obj crimson-guard-hover) (arg0 int) (arg1 float)) + (let* ((s2-0 (-> obj node-list data arg0)) + (s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) s2-0)) + (s5-0 (new 'stack-no-clear 'matrix)) + ) + (let ((a1-3 (matrix-with-scale->quaternion (new 'stack-no-clear 'quaternion) (-> s2-0 bone transform))) + (s2-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-rotate-local-z! s2-1 a1-3 arg1) + (quaternion->matrix s5-0 s2-1) + ) + (let ((f4-0 6144.0) + (f0-0 17203.2) + ) + (let ((f3-0 2.0) + (f1-0 1.5) + ) + 1.5 + (let ((f2-1 1.0)) + (set! (-> *part-id-table* 718 init-specs 4 initial-valuef) f4-0) + (set! (-> *part-id-table* 718 init-specs 5 initial-valuef) f0-0) + (set! (-> *part-id-table* 722 init-specs 3 initial-valuef) f3-0) + (set! (-> *part-id-table* 719 init-specs 1 initial-valuef) f1-0) + (set! (-> *part-id-table* 720 init-specs 1 initial-valuef) f2-1) + ) + (set! (-> *part-id-table* 721 init-specs 0 initial-valuef) f1-0) + ) + (let ((v1-29 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 vector 1) (* -0.5 f0-0)))) + (vector+! (-> s5-0 trans) s4-0 v1-29) + ) + ) + (spawn-with-matrix (-> obj engine-part) s5-0) + ) + (sound-play "hover-jets" :id (-> obj sound-id)) + 0 + (none) + ) + +(defmethod shoot crimson-guard-hover ((obj crimson-guard-hover) + (arg0 vector) + (arg1 projectile-init-by-other-params) + (arg2 int) + (arg3 float) + (arg4 float) + ) + (vector<-cspace! (-> arg1 pos) (-> obj node-list data arg2)) + (let ((s2-1 (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> obj node-list data arg2 bone transform vector 1) + 1.0 + ) + (* 273.06668 arg4) + ) + ) + (a1-8 (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> obj node-list data arg2 bone transform vector 2) + 1.0 + ) + ) + ) + (vector-orient-by-quat! (-> arg1 vel) a1-8 s2-1) + ) + (vector-normalize! (-> arg1 vel) (* 819200.0 arg4)) + (spawn-projectile crimson-guard-hover-shot arg1 obj *default-dead-pool*) + 0 + (none) + ) + +(defmethod kill-prefer-falling crimson-guard-hover ((obj crimson-guard-hover)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + (cond + ((and (-> obj next-state) (= (-> obj next-state name) 'knocked)) + (go (method-of-object obj die-now)) + ) + ((-> obj enemy-info use-die-falling) + (go (method-of-object obj die-falling)) + ) + (else + (go (method-of-object obj die)) + ) + ) + ) + +;; WARN: Return type mismatch none vs symbol. +(defmethod enemy-method-63 crimson-guard-hover ((obj crimson-guard-hover) (arg0 process-focusable) (arg1 enemy-aware)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-63))) + (the-as symbol (if (t9-0 (the-as nav-enemy obj) arg0 arg1) + (set-dst-proc! (-> obj los) (-> obj focus handle)) + ) + ) + ) + ) + +(defmethod hover-enemy-method-149 crimson-guard-hover ((obj crimson-guard-hover)) + (initialize-skeleton + obj + (the-as + skeleton-group + (art-group-get-by-name *level* "skel-crimson-guard-hover" (the-as (pointer uint32) #f)) + ) + (the-as pair 0) + ) + 0 + (none) + ) + +(defmethod init-enemy-collision! crimson-guard-hover ((obj crimson-guard-hover)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (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 8) 0))) + (set! (-> s5-0 total-prims) (the-as uint 9)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd)) + (set! (-> s4-0 prim-core action) (collide-action solid semi-solid deadly)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 -5734.4 0.0 16384.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)) + (set! (-> v1-14 prim-core action) (collide-action solid deadly)) + (set! (-> v1-14 transform-index) 0) + (set-vector! (-> v1-14 local-sphere) 0.0 10240.0 -2048.0 6144.0) + ) + (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 backgnd)) + (set! (-> v1-16 prim-core action) (collide-action solid deadly)) + (set! (-> v1-16 transform-index) 0) + (set-vector! (-> v1-16 local-sphere) 0.0 8192.0 -2048.0 4915.2) + ) + (let ((v1-18 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-18 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-18 prim-core collide-with) (collide-spec backgnd)) + (set! (-> v1-18 prim-core action) (collide-action solid deadly)) + (set! (-> v1-18 transform-index) 0) + (set-vector! (-> v1-18 local-sphere) 0.0 12288.0 -2048.0 4915.2) + ) + (let ((v1-20 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-20 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-20 prim-core action) (collide-action semi-solid deadly)) + (set! (-> v1-20 transform-index) 21) + (set-vector! (-> v1-20 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (let ((v1-22 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-22 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-22 prim-core action) (collide-action semi-solid deadly)) + (set! (-> v1-22 transform-index) 24) + (set-vector! (-> v1-22 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (let ((v1-24 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-24 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-24 prim-core action) (collide-action semi-solid)) + (set! (-> v1-24 transform-index) 8) + (set-vector! (-> v1-24 local-sphere) 0.0 0.0 0.0 2457.6) + ) + (let ((v1-26 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-26 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-26 prim-core action) (collide-action semi-solid)) + (set! (-> v1-26 transform-index) 10) + (set-vector! (-> v1-26 local-sphere) 0.0 0.0 0.0 2457.6) + ) + (let ((v1-28 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-28 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-28 prim-core action) (collide-action semi-solid)) + (set! (-> v1-28 transform-index) 7) + (set-vector! (-> v1-28 local-sphere) 0.0 0.0 0.0 2457.6) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (let ((v1-31 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-31 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-31 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +(defmethod hover-enemy-method-150 crimson-guard-hover ((obj crimson-guard-hover)) + *crimson-guard-hover-enemy-info* + ) + +(defmethod hover-enemy-method-151 crimson-guard-hover ((obj crimson-guard-hover)) + (new 'static 'hover-enemy-info + :fly-forward-anim 7 + :fly-backward-anim 8 + :fly-left-anim 6 + :fly-right-anim 5 + :shoot-anim 9 + :main-joint 3 + :gun-base 7 + :engine-left 15 + :engine-right 17 + :thrust-rotate-left 32768.0 + :thrust-rotate-right -32768.0 + ) + ) + +(defmethod hover-enemy-method-152 crimson-guard-hover ((obj crimson-guard-hover)) + (new 'static 'hover-nav-params :max-speed 102400.0 :max-acceleration 143360.0 :friction 0.05) + ) + +;; WARN: Return type mismatch hover-enemy vs crimson-guard-hover. +(defmethod relocate crimson-guard-hover ((obj crimson-guard-hover) (arg0 int)) + (if (nonzero? (-> obj gun-jmod)) + (&+! (-> obj gun-jmod) arg0) + ) + (if (nonzero? (-> obj hips-jmod)) + (&+! (-> obj hips-jmod) arg0) + ) + (if (nonzero? (-> obj smoke-part)) + (&+! (-> obj smoke-part) arg0) + ) + (if (nonzero? (-> obj engine-part)) + (&+! (-> obj engine-part) arg0) + ) + (the-as crimson-guard-hover ((method-of-type hover-enemy relocate) obj arg0)) + ) + +(defmethod deactivate crimson-guard-hover ((obj crimson-guard-hover)) + (if (nonzero? (-> obj smoke-part)) + (kill-and-free-particles (-> obj smoke-part)) + ) + (if (nonzero? (-> obj engine-part)) + (kill-and-free-particles (-> obj engine-part)) + ) + (sound-stop (-> obj sound-id)) + ((method-of-type hover-enemy deactivate) obj) + (none) + ) + +(defmethod init-enemy! crimson-guard-hover ((obj crimson-guard-hover)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (local-vars (sv-16 res-tag) (sv-32 res-tag) (sv-48 res-tag) (sv-64 res-tag)) + (hover-enemy-method-149 obj) + (init-enemy-behaviour-and-stats! obj (hover-enemy-method-150 obj)) + (hover-enemy-method-155 obj) + (new-source! (-> obj los) obj (seconds 2) (collide-spec backgnd enemy obstacle)) + (set! (-> obj neck up) (the-as uint 1)) + (set! (-> obj neck nose) (the-as uint 2)) + (set! (-> obj neck ear) (the-as uint 0)) + (set! (-> obj scale) 1.2) + (set! (-> obj sound-id) (new-sound-id)) + (set! (-> obj root-override2 dynam gravity y) 327680.0) + (set! (-> obj root-override2 dynam gravity-length) 327680.0) + (set! (-> obj root-override2 dynam gravity-max) 327680.0) + (set! (-> obj gun-jmod) + (the-as joint-mod (new 'process 'joint-mod-rotate-local obj (-> obj hover-info gun-base) #t)) + ) + (set! (-> obj gun-x-angle) 0.0) + (set! (-> obj gun-x-angle-final) 0.0) + (set! (-> obj hips-jmod) (the-as joint-mod (new 'process 'joint-mod-rotate-local obj 18 #t))) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-30 (res-lump-data (-> obj entity) 'actor-groups (pointer actor-group) :tag-ptr (& sv-16)))) + (if (and v1-30 (= (-> sv-16 elt-count) 1)) + (set! (-> obj entity-group) (-> v1-30 0)) + (set! (-> obj entity-group) #f) + ) + ) + (set! sv-32 (new 'static 'res-tag)) + (let ((v1-34 (res-lump-data (-> obj entity) 'timeout (pointer float) :tag-ptr (& sv-32)))) + (cond + ((and v1-34 (= (-> sv-32 elt-count) 2)) + (set! (-> obj attack-wait-min) (-> v1-34 0)) + (set! (-> obj attack-wait-max) (-> v1-34 1)) + ) + (else + (set! (-> obj attack-wait-min) 1.0) + (set! (-> obj attack-wait-max) 3.0) + ) + ) + ) + (set! sv-48 (new 'static 'res-tag)) + (let ((v1-40 (res-lump-data (-> obj entity) 'min-max (pointer float) :tag-ptr (& sv-48)))) + (set! (-> obj attack-miss-dist-min) (if (and v1-40 (> (the-as int (-> sv-48 elt-count)) 0)) + (-> v1-40 0) + -40960.0 + ) + ) + ) + (set! sv-64 (new 'static 'res-tag)) + (let ((v1-43 (res-lump-data (-> obj entity) 'min-max (pointer float) :tag-ptr (& sv-64)))) + (set! (-> obj attack-miss-dist-max) (if (and v1-43 (< 1 (the-as int (-> sv-64 elt-count)))) + (-> v1-43 1) + 40960.0 + ) + ) + ) + (set! (-> obj attack-miss-dist-curr) 0.0) + (set! (-> obj path) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (set! (-> obj path-u) 0.0) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! (-> obj smoke-part) (create-launch-control (-> *part-group-id-table* 154) obj)) + (set! (-> obj engine-part) (create-launch-control (-> *part-group-id-table* 156) obj)) + (add-connection + *part-engine* + obj + 26 + obj + 318 + (new 'static 'vector :x 1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 26 + obj + 318 + (new 'static 'vector :x -1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection *part-engine* obj 26 obj 743 (new 'static 'vector :y 1433.6 :z 1228.8 :w 163840.0)) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/common/enemy/hover/flamer.gc b/goal_src/jak2/levels/common/enemy/hover/flamer.gc index 86065f7bbf..8eb9ae35cf 100644 --- a/goal_src/jak2/levels/common/enemy/hover/flamer.gc +++ b/goal_src/jak2/levels/common/enemy/hover/flamer.gc @@ -7,3 +7,1537 @@ ;; DECOMP BEGINS +(deftype flying-formation (hover-formation) + () + :heap-base #x10 + :method-count-assert 16 + :size-assert #x90 + :flag-assert #x1000100090 + ) + + +(deftype flamer (nav-enemy) + ((shot-trajectory trajectory :inline :offset-assert 608) + (last-fire-time time-frame :offset-assert 648) + (sync-off uint32 :offset-assert 656) + (base-pos vector :inline :offset-assert 672) + (idle-pos vector :inline :offset-assert 688) + (offset vector :inline :offset-assert 704) + (dest-pos vector :inline :offset-assert 720) + (zone-to-world matrix :inline :offset-assert 736) + (world-to-zone matrix :inline :offset-assert 800) + (formation-entity entity-actor :offset-assert 864) + (flit-joint joint-mod :offset-assert 868) + (flit-angle float :offset-assert 872) + (flit-timer time-frame :offset-assert 880) + (path-pos float :offset-assert 888) + (sound-volume float :offset-assert 892) + (scale float :offset-assert 896) + (hit-surface? symbol :offset-assert 900) + (ground-mode int8 :offset-assert 904) + (init-quat quaternion :inline :offset-assert 912) + (surface-normal vector :inline :offset-assert 928) + (main-joint-pos vector :inline :offset-assert 944) + (main-joint-vel vector :inline :offset-assert 960) + (main-joint-acc vector :inline :offset-assert 976) + (main-acceleration float :offset-assert 992) + (fly-dir vector :inline :offset-assert 1008) + ) + :heap-base #x380 + :method-count-assert 192 + :size-assert #x400 + :flag-assert #xc003800400 + (:methods + (attack () _type_ :state 178) + (wait-for-formation () _type_ :state 179) + (exit-ambush () _type_ :state 180) + (exit-ambush-path () _type_ :state 181) + (flamer-method-182 (_type_ vector process-focusable) none 182) + (flamer-method-183 (_type_) symbol 183) + (flamer-method-184 (_type_) none 184) + (flamer-method-185 (_type_) none 185) + (flamer-method-186 (_type_ float) vector 186) + (flamer-method-187 (_type_) none 187) + (flamer-method-188 (_type_ int float int int) none 188) + (flamer-method-189 (_type_) none 189) + (flamer-method-190 (_type_) none 190) + (flamer-method-191 (_type_) none 191) + ) + ) + + +(defskelgroup skel-flamer flamer flamer-lod0-jg -1 + ((flamer-lod0-mg (meters 20)) (flamer-lod1-mg (meters 40)) (flamer-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :shadow flamer-shadow-mg + :origin-joint-index 3 + :shadow-joint-index 3 + ) + +(defskelgroup skel-flamer-explode flamer flamer-explode-lod0-jg flamer-explode-idle-ja + ((flamer-explode-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :origin-joint-index 3 + ) + +(define *flamer-exploder-params* + (new 'static 'joint-exploder-static-params + :joints (new 'static 'boxed-array :type joint-exploder-static-joint-params + (new 'static 'joint-exploder-static-joint-params :joint-index 3 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 4 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 5 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 6 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 7 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 8 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 9 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 10 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 11 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 12 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 13 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 14 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 15 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 16 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 17 :parent-joint-index -1) + ) + :collide-spec #x1 + ) + ) + +(define *flamer-fact-defaults* (new 'static 'fact-info-enemy-defaults :idle-distance (meters 80))) + +(define *flamer-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #f + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 5 + :notice-anim 5 + :hostile-anim 5 + :hit-anim 13 + :knocked-anim 14 + :knocked-land-anim 16 + :die-anim 17 + :die-falling-anim 17 + :victory-anim 5 + :jump-wind-up-anim 5 + :jump-in-air-anim 5 + :jump-land-anim 5 + :neck-joint 19 + :look-at-joint 19 + :bullseye-joint 3 + :sound-hit (static-sound-name "flamer-hit") + :sound-die (static-sound-name "flamer-die") + :notice-distance (meters 70) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 55) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :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-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 90112.0 + :knocked-blue-vy-lo 90112.0 + :knocked-blue-vy-hi 172032.0 + :shadow-size (meters 2) + :shadow-max-y (meters 10) + :shadow-min-y (meters -40) + :shadow-locus-dist (meters 150) + :gem-joint 19 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 450.56 :z 1638.4 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 5 + :turn-anim 5 + :run-anim 5 + :taunt-anim -1 + :run-travel-speed (meters 16) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 50) + :walk-travel-speed (meters 12) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 50) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 55) + :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! (-> *flamer-nav-enemy-info* fact-defaults) *flamer-fact-defaults*) + +(defmethod general-event-handler flamer ((obj flamer) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('hit 'hit-flinch 'hit-knocked) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (go (method-of-object obj knocked)) + ) + (('update-formation) + (let ((v0-3 (the-as object (-> obj offset)))) + (set! (-> (the-as vector v0-3) quad) (-> (the-as vector (-> arg3 param 0)) quad)) + v0-3 + ) + ) + (else + ((method-of-type nav-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +(defmethod flamer-method-189 flamer ((obj flamer)) + (with-pp + (let ((v1-0 (-> obj formation-entity))) + (when (if v1-0 + (-> v1-0 extra process) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer pp)) + (set! (-> a1-1 num-params) 0) + (set! (-> a1-1 message) 'join) + (let ((t9-0 send-event-function) + (v1-5 (-> obj formation-entity)) + ) + (t9-0 + (if v1-5 + (-> v1-5 extra process) + ) + a1-1 + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod flamer-method-190 flamer ((obj flamer)) + (with-pp + (let ((v1-0 (-> obj formation-entity))) + (when (if v1-0 + (-> v1-0 extra process) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer pp)) + (set! (-> a1-1 num-params) 0) + (set! (-> a1-1 message) 'leave) + (let ((t9-0 send-event-function) + (v1-5 (-> obj formation-entity)) + ) + (t9-0 + (if v1-5 + (-> v1-5 extra process) + ) + a1-1 + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod nav-enemy-method-142 flamer ((obj flamer) (arg0 nav-control)) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (vector-! gp-0 (target-pos 0) (-> obj root-override2 trans)) + (seek-toward-heading-vec! (-> obj root-override2) gp-0 131072.0 (seconds 0.5)) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod flamer-method-182 flamer ((obj flamer) (arg0 vector) (arg1 process-focusable)) + (with-pp + (set! arg0 (cond + ((and *target* (-> obj next-state) (let ((v1-4 (-> obj next-state name))) + (or (= v1-4 'hostile) (= v1-4 'attack) (= v1-4 'hit)) + ) + ) + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) (process->ppointer pp)) + (set! (-> a1-3 num-params) 0) + (set! (-> a1-3 message) 'get-formation) + (let* ((t9-0 send-event-function) + (v1-7 (-> obj formation-entity)) + (s2-0 (the-as hover-formation-control (t9-0 + (if v1-7 + (-> v1-7 extra process) + ) + a1-3 + ) + ) + ) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (cond + ((and s2-0 (not (is-formation-type-in-range s2-0))) + (hover-formation-control-method-15 s2-0 arg0 (-> obj offset)) + ) + (else + (cond + (s2-0 + (hover-formation-control-method-13 s2-0 s4-0) + ) + (else + (let ((s1-0 (new 'stack-no-clear 'vector))) + (set! (-> s1-0 quad) (-> (get-trans arg1 0) quad)) + (let ((s3-1 (new 'stack-no-clear 'vector))) + (let ((s2-1 (new 'stack-no-clear 'vector))) + (vector-! s3-1 s1-0 (-> obj root-override2 trans)) + (vector-flatten! s2-1 s3-1 (-> obj zone-to-world vector 2)) + (vector-float*! s2-1 s2-1 -0.9) + (vector+! s3-1 s3-1 s2-1) + ) + (vector+! s4-0 (-> obj root-override2 trans) s3-1) + ) + ) + ) + ) + (vector-matrix*! arg0 s4-0 (-> obj world-to-zone)) + (vector+! arg0 arg0 (-> obj offset)) + (vector-matrix*! arg0 arg0 (-> obj zone-to-world)) + ) + ) + ) + ) + (let* ((v1-30 (+ (-> pp clock frame-counter) (the-as time-frame (-> obj sync-off)))) + (f0-5 (+ (-> arg0 x) (* 614.4 (cos (* 54.613335 (the float (mod v1-30 1200))))))) + ) + (set! (-> arg0 x) f0-5) + (the-as vector f0-5) + ) + ) + (else + (set! (-> arg0 quad) (-> obj idle-pos quad)) + arg0 + ) + ) + ) + (none) + ) + ) + +(defbehavior flamer-attack-post flamer () + (let ((a2-0 (handle->process (-> self focus handle)))) + (when a2-0 + (flamer-method-182 self (-> self dest-pos) (the-as process-focusable a2-0)) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (vector-matrix*! gp-0 (-> self dest-pos) (-> self world-to-zone)) + (if (< (-> gp-0 z) 0.0) + (set! (-> gp-0 z) 0.0) + ) + (vector-matrix*! (-> self dest-pos) gp-0 (-> self zone-to-world)) + ) + ) + ) + (cloest-point-on-mesh (-> self nav) (-> self dest-pos) (-> self dest-pos) (the-as nav-poly #f)) + (if #f + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (-> self dest-pos) + (new 'static 'rgba :r #xff :g #xff :b #xff :a #xff) + #f + (the-as rgba -1) + ) + ) + (let ((a0-8 (-> self nav state)) + (v1-16 (-> self dest-pos)) + ) + (logclear! (-> a0-8 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-8 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-8 target-post quad) (-> v1-16 quad)) + ) + 0 + (flamer-method-184 self) + (nav-enemy-travel-post) + (none) + ) + +(defbehavior flamer-flit-post flamer () + (when (>= (- (-> self clock frame-counter) (-> self flit-timer)) (rand-vu-int-range (seconds 1.2) (seconds 3))) + (set! (-> self flit-angle) + (the float + (sar (shl (the int (+ (-> self flit-angle) (* 182.04445 (rand-vu-float-range 160.0 200.0)))) 48) 48) + ) + ) + (set! (-> self flit-timer) (-> self clock frame-counter)) + ) + (flamer-attack-post) + (none) + ) + +;; WARN: Return type mismatch object vs symbol. +;; WARN: disable def twice: 22. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. +;; WARN: disable def twice: 45. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. +(defmethod flamer-method-183 flamer ((obj flamer)) + (with-pp + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) (process->ppointer pp)) + (set! (-> a1-0 num-params) 0) + (set! (-> a1-0 message) 'get-formation) + (let* ((t9-0 send-event-function) + (v1-2 (-> obj formation-entity)) + (a0-3 (the-as hover-formation-control (t9-0 + (if v1-2 + (-> v1-2 extra process) + ) + a1-0 + ) + ) + ) + ) + (the-as + symbol + (cond + (a0-3 + (and (hover-formation-control-method-16 a0-3) (>= (the-as int (-> obj focus aware)) 3)) + ) + (*target* + (let ((a1-1 (target-pos 0))) + (-> obj root-override2 trans) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (vector-matrix*! s5-0 a1-1 (-> obj world-to-zone)) + (and (>= (-> obj enemy-info-override notice-distance) (-> s5-0 z)) (>= (the-as int (-> obj focus aware)) 3)) + ) + ) + ) + (else + #f + ) + ) + ) + ) + ) + ) + ) + +(defmethod flamer-method-188 flamer ((obj flamer) (arg0 int) (arg1 float) (arg2 int) (arg3 int)) + (local-vars (v1-1 int)) + 0 + (if (< 0.0 arg1) + (set! v1-1 arg2) + (set! v1-1 arg3) + ) + (let ((a3-5 (-> obj skel root-channel arg0))) + (let ((f0-2 (fabs arg1))) + (set! (-> a3-5 frame-interp 1) f0-2) + (set! (-> a3-5 frame-interp 0) f0-2) + ) + (set! (-> a3-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data v1-1))) + (set! (-> a3-5 param 0) 0.0) + (set! (-> a3-5 frame-num) (-> obj skel root-channel 0 frame-num)) + (joint-control-channel-group! a3-5 (the-as art-joint-anim (-> obj draw art-group data v1-1)) num-func-chan) + ) + (none) + ) + +(defmethod flamer-method-187 flamer ((obj flamer)) + (local-vars (at-0 int) (at-1 int)) + (with-pp + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (let ((a1-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 3))) + (a0-2 (new 'stack-no-clear 'vector)) + (v1-1 (new 'stack-no-clear 'vector)) + ) + (new 'stack-no-clear 'vector) + (vector-! a0-2 a1-1 (-> obj main-joint-pos)) + (let ((a2-2 a0-2)) + (.lvf vf1 (&-> a0-2 quad)) + (let ((f0-0 (-> pp clock frames-per-second))) + (.mov at-0 f0-0) + ) + (.mov vf2 at-0) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a2-2 quad) vf1) + ) + (vector-! v1-1 a0-2 (-> obj main-joint-vel)) + (let ((a2-4 v1-1)) + (.lvf vf1 (&-> v1-1 quad)) + (let ((f0-1 (-> pp clock frames-per-second))) + (.mov at-1 f0-1) + ) + (.mov vf2 at-1) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a2-4 quad) vf1) + ) + (set! (-> obj main-joint-pos quad) (-> a1-1 quad)) + (let* ((f0-2 0.4) + (f1-1 (- 1.0 f0-2)) + (a1-5 (-> obj main-joint-vel)) + ) + (set! (-> a1-5 x) (+ (* f0-2 (-> a0-2 x)) (* f1-1 (-> a1-5 x)))) + (set! (-> a1-5 y) (+ (* f0-2 (-> a0-2 y)) (* f1-1 (-> a1-5 y)))) + (set! (-> a1-5 z) (+ (* f0-2 (-> a0-2 z)) (* f1-1 (-> a1-5 z)))) + ) + (set! (-> obj main-joint-acc quad) (-> v1-1 quad)) + ) + 0 + 0 + (none) + ) + ) + ) + +(defmethod track-target! flamer ((obj flamer)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (update-vol! (-> obj sound) (-> obj sound-volume)) + (flamer-method-191 obj) + ((method-of-type nav-enemy track-target!) obj) + (none) + ) + +(defmethod flamer-method-191 flamer ((obj flamer)) + (cond + ((and (-> obj draw shadow) + (zero? (-> obj draw cur-lod)) + (logtest? (-> obj draw status) (draw-control-status on-screen)) + ) + (new 'stack-no-clear 'vector) + (new 'stack-no-clear 'vector) + (let ((s4-0 (new 'stack-no-clear 'collide-query)) + (gp-0 (-> obj draw shadow-ctrl settings shadow-dir)) + (f30-0 122880.0) + ) + (set! (-> s4-0 start-pos quad) (-> obj root-override2 trans quad)) + (vector-normalize-copy! (-> s4-0 move-dist) gp-0 f30-0) + (let ((v1-12 s4-0)) + (set! (-> v1-12 radius) 3276.8) + (set! (-> v1-12 collide-with) (collide-spec backgnd)) + (set! (-> v1-12 ignore-process0) obj) + (set! (-> v1-12 ignore-process1) #f) + (set! (-> v1-12 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-12 action-mask) (collide-action solid)) + ) + (let ((f0-1 (fill-and-probe-using-line-sphere *collide-cache* s4-0))) + (cond + ((>= f0-1 0.0) + (let ((v1-16 (-> obj draw shadow-ctrl))) + (logclear! (-> v1-16 settings flags) (shadow-flags disable-draw)) + ) + 0 + (-> s4-0 best-other-tri intersect) + (let ((a1-3 (-> obj root-override2 trans))) + (-> a1-3 y) + (let ((f1-2 (* f0-1 f30-0))) + (shadow-control-method-14 + (-> obj draw shadow-ctrl) + a1-3 + gp-0 + (fmax 32768.0 (* 409600.0 f0-1)) + (+ -12288.0 f1-2) + (+ 12288.0 f1-2) + ) + ) + ) + ) + (else + (let ((v1-27 (-> obj draw shadow-ctrl))) + (logior! (-> v1-27 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + ) + ) + ) + (else + (let ((v1-29 (-> obj draw shadow-ctrl))) + (logior! (-> v1-29 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + (none) + ) + +;; WARN: new jak 2 until loop case, check carefully +(defbehavior flamer-fly-code flamer () + (let ((v1-2 (ja-group))) + (if (not (and v1-2 (= v1-2 flamer-idle-ja))) + (ja-channel-push! 3 (seconds 0.2)) + (ja-channel-set! 3) + ) + ) + (ja-no-eval :group! flamer-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim flamer-idle-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (let ((a0-7 (-> self skel root-channel 1))) + (let ((f0-4 0.0)) + (set! (-> a0-7 frame-interp 1) f0-4) + (set! (-> a0-7 frame-interp 0) f0-4) + ) + (set! (-> a0-7 frame-group) (the-as art-joint-anim flamer-idle-ja)) + (set! (-> a0-7 param 0) (the float (+ (-> (the-as art-joint-anim flamer-idle-ja) frames num-frames) -1))) + (set! (-> a0-7 param 1) 1.0) + (set! (-> a0-7 frame-num) 0.0) + (joint-control-channel-group! a0-7 (the-as art-joint-anim flamer-idle-ja) num-func-seek!) + ) + (let ((a0-8 (-> self skel root-channel 2))) + (let ((f0-9 0.0)) + (set! (-> a0-8 frame-interp 1) f0-9) + (set! (-> a0-8 frame-interp 0) f0-9) + ) + (set! (-> a0-8 frame-group) (the-as art-joint-anim flamer-idle-ja)) + (set! (-> a0-8 param 0) (the float (+ (-> (the-as art-joint-anim flamer-idle-ja) frames num-frames) -1))) + (set! (-> a0-8 param 1) 1.0) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim flamer-idle-ja) num-func-seek!) + ) + (until #f + (let ((gp-0 (vector-inv-orient-by-quat! + (new 'stack-no-clear 'vector) + (-> self main-joint-vel) + (-> self root-override2 quat) + ) + ) + ) + (vector-float*! gp-0 gp-0 (/ 1.0 (-> self enemy-info-override run-travel-speed))) + (flamer-method-188 self 1 (-> gp-0 x) 7 6) + (flamer-method-188 self 2 (-> gp-0 z) 8 9) + ) + (suspend) + (ja :num! (loop!)) + (seek! (-> self sound-volume) 1.0 (* 0.5 (-> self clock seconds-per-frame))) + ) + #f + ) + +(defmethod flamer-method-184 flamer ((obj flamer)) + (with-pp + (let ((v1-0 (-> obj ground-mode))) + (cond + ((= v1-0 1) + (seek! (-> obj base-pos y) (-> obj dest-pos y) (* 40960.0 (-> pp clock seconds-per-frame))) + ) + ((zero? v1-0) + (let ((a1-1 (new 'stack-no-clear 'collide-query))) + (cond + ((enemy-method-125 obj a1-1 (collide-spec backgnd) 8192.0 26624.0 1024.0) + (set! (-> obj base-pos y) (+ 22528.0 (-> obj root-override2 gspot-pos y))) + ) + (else + (let ((s4-0 (-> obj nav)) + (s3-0 (-> obj base-pos)) + (s5-0 (new 'stack 'nav-find-poly-parms)) + ) + (vector-! (-> s5-0 point) s3-0 (-> s4-0 state mesh bounds)) + (set! (-> s5-0 y-threshold) (-> s4-0 nearest-y-threshold)) + (set! (-> s5-0 ignore) (the-as uint 2)) + (find-nearest-poly-to-point-local (-> s4-0 state mesh) s5-0) + (let ((v1-13 (-> s5-0 poly))) + (if v1-13 + (set! (-> obj base-pos y) (+ 22528.0 (-> obj nav state mesh bounds y) (-> v1-13 vertex0 y))) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (let ((v1-16 (+ (-> pp clock frame-counter) (the-as time-frame (-> obj sync-off))))) + (seek! + (-> obj root-override2 trans y) + (+ (-> obj base-pos y) (* 1228.8 (cos (* 100.66974 (the float (mod v1-16 651)))))) + (* 16384.0 (-> pp clock seconds-per-frame)) + ) + ) + (let ((s5-2 (new 'stack-no-clear 'vector))) + (set! (-> s5-2 quad) (-> *up-vector* quad)) + (vector-normalize! s5-2 6144.0) + (vector/! s5-2 s5-2 (-> obj root-override2 scale)) + (vector-rotate-around-z! s5-2 s5-2 (-> obj flit-angle)) + (vector-seek! (-> obj flit-joint target) s5-2 (* 32768.0 (-> pp clock seconds-per-frame))) + ) + (update-trans! (-> obj sound) (-> obj root-override2 trans)) + (update! (-> obj sound)) + (none) + ) + ) + +(defmethod go-stare flamer ((obj flamer)) + (go-hostile obj) + (none) + ) + +(defstate wait-for-formation (flamer) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior flamer) enemy-event-handler) + :enter (-> (method-of-type flamer idle) enter) + :trans (-> (method-of-type flamer idle) trans) + :code (behavior () + (until #f + (let ((v1-0 (-> self formation-entity))) + (if (if v1-0 + (-> v1-0 extra process) + ) + (go-virtual idle) + ) + ) + (suspend) + ) + #f + (none) + ) + :post (-> (method-of-type flamer idle) post) + ) + +(defstate dormant (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy dormant) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self root-override2 trans quad) (-> self idle-pos quad)) + (none) + ) + ) + +(defstate dormant-aware (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy dormant-aware) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self root-override2 trans quad) (-> self idle-pos quad)) + (none) + ) + :trans (behavior () + (when (and (>= (- (-> self clock frame-counter) (-> self state-time)) (-> self state-timeout)) + (flamer-method-183 self) + ) + (if (logtest? (enemy-option ambush) (-> self fact-info-override enemy-options)) + (go-virtual ambush) + (go-virtual active) + ) + ) + (none) + ) + ) + +(defstate idle (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy idle) enter))) + (if t9-0 + (t9-0) + ) + ) + (flamer-method-190 self) + (set! (-> self ground-mode) 0) + 0 + (none) + ) + :trans (behavior () + (if (flamer-method-183 self) + (go-virtual active) + ) + (flamer-method-184 self) + (none) + ) + ) + +(defstate active (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self ground-mode) 0) + 0 + (none) + ) + :trans (behavior () + (if (flamer-method-183 self) + (go-virtual hostile) + ) + (if (>= 819.2 (vector-vector-xz-distance (-> self root-override2 trans) (-> self idle-pos))) + (go-virtual idle) + ) + (none) + ) + :post flamer-attack-post + ) + +(defstate ambush (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy ambush) enter))) + (if t9-0 + (t9-0) + ) + ) + (logclear! (-> self mask) (process-mask actor-pause)) + (logclear! (-> self enemy-flags) (enemy-flag notice)) + (if (not (-> self path)) + (go-virtual notice) + ) + (let ((v1-13 self)) + (set! (-> v1-13 enemy-flags) (the-as enemy-flag (logclear (-> v1-13 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-13 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-16 self)) + (set! (-> v1-16 enemy-flags) (the-as enemy-flag (logclear (-> v1-16 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self flit-joint twist-min-y) (the-as float #f)) + (vector-reset! (-> self flit-joint target)) + (vector<-cspace! (-> self main-joint-pos) (-> self node-list data 3)) + (vector-reset! (-> self main-joint-vel)) + (vector-reset! (-> self main-joint-acc)) + (set! (-> self main-acceleration) 0.0) + (vector-reset! (-> self fly-dir)) + (sound-play "flamer-ambush") + (quaternion-copy! (-> self root-override2 quat) (-> self init-quat)) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy ambush) exit))) + (if t9-0 + (t9-0) + ) + ) + (logior! (-> self mask) (process-mask actor-pause)) + (logior! (-> self enemy-flags) (enemy-flag notice)) + (set! (-> self flit-joint twist-min-y) (the-as float #t)) + (set! (-> self last-fire-time) (+ (-> self clock frame-counter) (seconds -1.5))) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy ambush) trans))) + (if t9-0 + (t9-0) + ) + ) + (+! (-> self path-pos) (* 0.85 (-> self clock seconds-per-frame))) + (let ((f30-0 (-> self path-pos))) + (when (>= f30-0 1.0) + (set! (-> self path-pos) 1.0) + (get-point-at-percent-along-path! (-> self path) (-> self root-override2 trans) f30-0 'interp) + (go-virtual notice) + ) + (get-point-at-percent-along-path! (-> self path) (-> self root-override2 trans) f30-0 'interp) + (let ((a1-3 (displacement-between-points-at-percent-normalized! (-> self path) (new 'stack-no-clear 'vector) f30-0)) + ) + (forward-up->quaternion (-> self root-override2 quat) a1-3 *up-vector*) + ) + (flamer-method-186 self f30-0) + ) + (none) + ) + :code (the-as (function none :behavior flamer) flamer-fly-code) + :post (behavior () + (flamer-method-187 self) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate exit-ambush (flamer) + :virtual #t + :enter (behavior () + (logclear! (-> self mask) (process-mask actor-pause)) + (logclear! (-> self enemy-flags) (enemy-flag notice)) + (if (not (-> self path)) + (go-virtual active) + ) + (let ((v1-9 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-9 enemy-flags))) + (set! (-> v1-9 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-9 enemy-flags)))) + ) + (set! (-> v1-9 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-9 enemy-flags)))) + (set! (-> v1-9 nav callback-info) (-> v1-9 enemy-info-override callback-info)) + ) + 0 + (let ((v1-12 self)) + (set! (-> v1-12 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-12 enemy-flags)))) + ) + 0 + (get-point-at-percent-along-path! (-> self path) (-> self dest-pos) 1.0 'interp) + (let ((a0-18 (-> self nav state)) + (v1-17 (-> self dest-pos)) + ) + (logclear! (-> a0-18 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-18 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-18 target-post quad) (-> v1-17 quad)) + ) + 0 + (set! (-> self ground-mode) 1) + (none) + ) + :trans (behavior () + (if (< (vector-vector-xz-distance (-> self root-override2 trans) (-> self dest-pos)) 409.6) + (go-virtual exit-ambush-path) + ) + (none) + ) + :code (the-as (function none :behavior flamer) flamer-fly-code) + :post (behavior () + (flamer-method-187 self) + (flamer-flit-post) + (none) + ) + ) + +(defstate exit-ambush-path (flamer) + :virtual #t + :enter (behavior () + (let ((v1-0 self)) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logclear (-> v1-0 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-0 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-3 self)) + (set! (-> v1-3 enemy-flags) (the-as enemy-flag (logclear (-> v1-3 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :exit (behavior () + (logior! (-> self mask) (process-mask actor-pause)) + (logior! (-> self enemy-flags) (enemy-flag notice)) + (none) + ) + :trans (behavior () + (set! (-> self path-pos) (- (-> self path-pos) (* 0.33333334 (-> self clock seconds-per-frame)))) + (let ((f30-0 (-> self path-pos))) + (when (>= 0.0 f30-0) + (set! (-> self path-pos) 0.0) + (get-point-at-percent-along-path! (-> self path) (-> self root-override2 trans) f30-0 'interp) + (cond + ((logtest? (enemy-option dormant) (-> self fact-info-override enemy-options)) + (go-virtual dormant) + ) + ((logtest? (enemy-option dormant-aware) (-> self fact-info-override enemy-options)) + (go-virtual dormant-aware) + ) + (else + (go-virtual active) + ) + ) + ) + (get-point-at-percent-along-path! (-> self path) (-> self base-pos) f30-0 'interp) + (flamer-method-186 self f30-0) + ) + (none) + ) + :code (the-as (function none :behavior flamer) flamer-fly-code) + :post (behavior () + (flamer-method-187 self) + (when (>= (- (-> self clock frame-counter) (-> self flit-timer)) (rand-vu-int-range (seconds 1.2) (seconds 3))) + (set! (-> self flit-angle) (* 182.04445 (rand-vu-float-range 0.0 360.0))) + (set! (-> self flit-timer) (-> self clock frame-counter)) + ) + (vector-seek! (-> self root-override2 trans) (-> self base-pos) (* 16384.0 (-> self clock seconds-per-frame))) + (flamer-method-184 self) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate notice (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (go-virtual hostile) + (none) + ) + ) + +(defun vector-square! ((arg0 vector) (arg1 vector)) + (set! (-> arg0 x) (* (-> arg1 x) (-> arg1 x))) + (set! (-> arg0 y) (* (-> arg1 y) (-> arg1 y))) + (set! (-> arg0 z) (* (-> arg1 z) (-> arg1 z))) + arg0 + ) + +(defstate hostile (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (flamer-method-189 self) + (set! (-> self ground-mode) 0) + (set! (-> self flit-timer) (+ (-> self clock frame-counter) (seconds -3))) + (none) + ) + :trans (behavior () + (let ((a0-1 (handle->process (-> self focus handle)))) + (when (or (not a0-1) + (and a0-1 + (< 491520.0 (vector-vector-distance (-> self idle-pos) (get-trans (the-as process-focusable a0-1) 0))) + (not (flamer-method-183 self)) + ) + ) + (if (logtest? (enemy-option ambush) (-> self fact-info-override enemy-options)) + (go-virtual exit-ambush) + (go-virtual active) + ) + ) + ) + (let ((gp-1 (get-enemy-target self))) + (if (and gp-1 + (>= (- (-> self clock frame-counter) (-> self last-fire-time)) + (the int (* 300.0 (rand-vu-float-range 3.0 6.0))) + ) + (< (vector-vector-distance (get-trans gp-1 3) (-> self root-override2 trans)) 245760.0) + ) + (go-virtual attack) + ) + ) + (none) + ) + :code (the-as (function none :behavior flamer) flamer-fly-code) + :post (behavior () + (flamer-method-187 self) + (flamer-flit-post) + (none) + ) + ) + +(defstate attack (flamer) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (let ((s5-0 (handle->process (-> self focus handle)))) + (when s5-0 + (let ((gp-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data 9)))) + (let ((a2-1 (get-trans (the-as process-focusable s5-0) 3)) + (s5-1 (new 'stack-no-clear 'vector)) + ) + (setup-from-to-xz-vel! (-> self shot-trajectory) gp-0 a2-1 122880.0 -102400.0) + (set! (-> s5-1 quad) (-> self shot-trajectory initial-velocity quad)) + (vector-normalize! s5-1 1638.4) + (vector+! gp-0 gp-0 s5-1) + ) + (let ((a1-6 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> a1-6 ent) (-> self entity)) + (set! (-> a1-6 charge) 1.0) + (set! (-> a1-6 options) (projectile-options)) + (set! (-> a1-6 pos quad) (-> gp-0 quad)) + (set! (-> a1-6 vel quad) (-> self shot-trajectory initial-velocity quad)) + (set! (-> a1-6 notify-handle) (process->handle self)) + (set! (-> a1-6 owner-handle) (the-as handle #f)) + (set! (-> a1-6 ignore-handle) (process->handle self)) + (let* ((v1-21 *game-info*) + (a0-24 (+ (-> v1-21 attack-id) 1)) + ) + (set! (-> v1-21 attack-id) a0-24) + (set! (-> a1-6 attack-id) a0-24) + ) + (set! (-> a1-6 timeout) (seconds 4)) + (spawn-projectile metalhead-grenade-shot a1-6 self *default-dead-pool*) + ) + ) + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((zero? (rand-vu-int-range 0 2)) + (ja-no-eval :group! flamer-shoot1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim flamer-shoot1-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (ja-no-eval :group! flamer-shoot-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim flamer-shoot-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (go-virtual hostile) + (none) + ) + :post flamer-attack-post + ) + +(defmethod enemy-method-46 flamer ((obj flamer) (arg0 int)) + "@abstract" + (let ((v1-0 arg0)) + (cond + ((= v1-0 1) + (let ((v1-2 (-> obj root-override2 root-prim))) + (let ((a0-1 v1-2)) + (set! (-> a0-1 prim-core action) (collide-action solid deadly)) + (set! (-> a0-1 prim-core collide-with) (collide-spec backgnd jak bot obstacle hit-by-others-list player-list)) + ) + (let ((a0-2 (-> (the-as collide-shape-prim-group v1-2) child 0))) + (set! (-> a0-2 prim-core action) (collide-action solid deadly)) + (set! (-> a0-2 prim-core collide-with) (collide-spec backgnd jak bot obstacle hit-by-others-list player-list)) + ) + ) + ) + ((or (= v1-0 2) (zero? v1-0)) + (let ((v1-8 (-> obj root-override2 root-prim))) + (let ((a0-3 v1-8)) + (set! (-> a0-3 prim-core action) (collide-action semi-solid deadly)) + (set! (-> a0-3 prim-core collide-with) (collide-spec jak bot player-list)) + ) + (let ((a0-4 (-> (the-as collide-shape-prim-group v1-8) child 0))) + (set! (-> a0-4 prim-core action) (collide-action semi-solid deadly)) + (set! (-> a0-4 prim-core collide-with) (collide-spec jak bot player-list)) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch object vs symbol. +;; WARN: Using new Jak 2 rtype-of +(defmethod enemy-method-77 flamer ((obj flamer) (arg0 (pointer float))) + (let ((v1-0 (-> obj incoming knocked-type))) + (the-as + symbol + (cond + ((= v1-0 (knocked-type knocked-type-6)) + (let* ((a0-2 '((flamer-blue-hit0-ja) (flamer-blue-hit1-ja) (flamer-blue-hit2-ja))) + (a1-3 ((method-of-type (rtype-of a0-2) length) a0-2)) + (s4-0 (new 'static 'array uint64 3 #x12 #x13 #x14)) + (s3-0 (new 'static 'array int32 4 0 0 0 0)) + (a2-0 (ash 1 (-> s3-0 0))) + (v1-6 (enemy-method-120 obj a1-3 a2-0)) + (s4-1 (-> obj draw art-group data (-> (the-as (pointer int32) (+ (* v1-6 8) (the-as int s4-0)))))) + ) + (set! (-> s3-0 0) v1-6) + (let ((v1-9 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-9 (= v1-9 (-> obj draw art-group data 16))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + (let ((a0-17 (-> obj skel root-channel 0))) + (set! (-> a0-17 frame-group) (the-as art-joint-anim s4-1)) + (set! (-> a0-17 param 0) (the float (+ (-> (the-as art-joint-anim s4-1) frames num-frames) -1))) + (set! (-> a0-17 param 1) (-> arg0 0)) + (set! (-> a0-17 frame-num) 0.0) + (joint-control-channel-group! a0-17 (the-as art-joint-anim s4-1) num-func-seek!) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-10 (-> obj draw art-group data (-> obj enemy-info-override knocked-anim))) + (a0-21 (-> obj skel root-channel 0)) + ) + (set! (-> a0-21 frame-group) (the-as art-joint-anim a1-10)) + (set! (-> a0-21 param 0) (the float (+ (-> (the-as art-joint-anim a1-10) frames num-frames) -1))) + (set! (-> a0-21 param 1) (-> arg0 0)) + (set! (-> a0-21 frame-num) 0.0) + (joint-control-channel-group! a0-21 (the-as art-joint-anim a1-10) num-func-seek!) + ) + #t + ) + ) + ) + ) + ) + +(defstate knocked (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (set-gravity-length (-> self root-override2 dynam) 368640.0) + (set! (-> self hit-surface?) #f) + (none) + ) + :trans (behavior () + (let ((gp-0 (-> self root-override2))) + (when (logtest? (-> gp-0 status) (collide-status on-surface)) + (when (not (-> self hit-surface?)) + (set! (-> self hit-surface?) #t) + (set! (-> self surface-normal quad) (-> gp-0 poly-normal quad)) + ) + ) + (when (and (-> self hit-surface?) (zero? (-> self hit-points))) + (let ((s4-0 (new 'stack-no-clear 'quaternion))) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (vector-z-quaternion! s5-0 (-> gp-0 quat)) + (forward-up->quaternion s4-0 s5-0 (-> self surface-normal)) + ) + (quaternion-slerp! (-> gp-0 quat) (-> gp-0 quat) s4-0 0.25) + ) + ) + (when (and (nonzero? (-> self hit-points)) + (zero? (-> self fated-time)) + (or (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (and (< (-> self root-override2 trans y) (+ 18432.0 (-> self root-override2 gspot-pos y))) + (< (-> self root-override2 transv y) 0.0) + ) + ) + ) + (set-gravity-length (-> gp-0 dynam) 225280.0) + (vector-reset! (-> gp-0 transv)) + (go-hostile self) + ) + ) + (none) + ) + :post (behavior () + (seek! (-> self sound-volume) 0.0 (* 0.5 (-> self clock seconds-per-frame))) + (flamer-method-187 self) + (let ((t9-2 (-> (method-of-type nav-enemy knocked) post))) + (if t9-2 + ((the-as (function none) t9-2)) + ) + ) + (none) + ) + ) + +(defstate die-falling (flamer) + :virtual #t + :enter (behavior () + (let ((v1-1 (-> self root-override2 root-prim))) + (set! (-> v1-1 prim-core collide-as) (collide-spec)) + (set! (-> v1-1 prim-core collide-with) (collide-spec)) + ) + 0 + (set! (-> self hit-points) 0) + (if (logtest? (enemy-option knocked-into-water) (-> self fact-info-override enemy-options)) + (set! (-> self enemy-flags) (logior (enemy-flag trackable-backup) (-> self enemy-flags))) + ) + (let ((v1-8 self)) + (set! (-> v1-8 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-8 enemy-flags)))) + ) + 0 + (let ((v1-10 self)) + (set! (-> v1-10 enemy-flags) (the-as enemy-flag (logclear (-> v1-10 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-10 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (enemy-method-103 self) + (none) + ) + ) + +(defmethod dispose! flamer ((obj flamer)) + "Cleans-up the enemy and any associated resources. Potentially spawns skull gems" + (let ((s5-1 (logtest? (enemy-flag recover-applied-velocity) (-> obj enemy-flags)))) + (let ((t9-0 (method-of-type nav-enemy dispose!))) + (t9-0 obj) + ) + (if (not s5-1) + (flamer-method-190 obj) + ) + ) + (none) + ) + +(defmethod flamer-method-186 flamer ((obj flamer) (arg0 float)) + (let ((f0-1 (* (-> obj scale) arg0)) + (v0-0 (-> obj root-override2 scale)) + ) + (set! (-> v0-0 x) f0-1) + (set! (-> v0-0 y) f0-1) + (set! (-> v0-0 z) f0-1) + (set! (-> v0-0 w) 1.0) + v0-0 + ) + ) + +(defmethod coin-flip? flamer ((obj flamer)) + "@returns The result of a 50/50 RNG roll" + #f + ) + +(defmethod init-enemy-collision! flamer ((obj flamer)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (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 4) 0))) + (set! (-> s5-0 total-prims) (the-as uint 5)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) (collide-spec jak player-list)) + (set! (-> s4-0 prim-core action) (collide-action semi-solid deadly)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 26624.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 jak bot player-list)) + (set! (-> v1-14 prim-core action) (collide-action semi-solid deadly)) + (set! (-> v1-14 transform-index) 3) + (set-vector! (-> v1-14 local-sphere) 0.0 0.0 0.0 3481.6) + ) + (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 semi-solid deadly)) + (set! (-> v1-16 transform-index) 19) + (set-vector! (-> v1-16 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-18 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-18 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-18 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-18 prim-core action) (collide-action deadly)) + (set! (-> v1-18 transform-index) 6) + (set-vector! (-> v1-18 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-20 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-20 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-20 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-20 prim-core action) (collide-action deadly)) + (set! (-> v1-20 transform-index) 9) + (set-vector! (-> v1-20 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (set! (-> s5-0 nav-radius) 6144.0) + (let ((v1-22 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-22 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-22 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 process-drawable vs flamer. +(defmethod relocate flamer ((obj flamer) (arg0 int)) + (if (nonzero? (-> obj flit-joint)) + (&+! (-> obj flit-joint) arg0) + ) + (the-as + flamer + ((the-as (function process-drawable int process-drawable) (find-parent-method flamer 7)) obj arg0) + ) + ) + +(defmethod init-enemy! flamer ((obj flamer)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-flamer" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *flamer-nav-enemy-info*) + (set! (-> obj neck up) (the-as uint 1)) + (set! (-> obj neck nose) (the-as uint 2)) + (set! (-> obj neck ear) (the-as uint 0)) + (set! (-> obj scale) 1.6) + (flamer-method-186 obj 1.0) + (logclear! (-> obj nav flags) (nav-control-flag limit-rotation-rate)) + (set! (-> obj sync-off) (the-as uint (get-rand-int obj 600))) + (set! (-> obj flit-angle) 0.0) + (set! (-> obj flit-timer) 0) + (set! (-> obj root-override2 dynam gravity y) 225280.0) + (set! (-> obj root-override2 dynam gravity-length) 225280.0) + (set! (-> obj root-override2 dynam gravity-max) 225280.0) + (let ((v1-25 (-> obj root-override2 trans))) + (set! (-> obj base-pos quad) (-> v1-25 quad)) + (set! (-> v1-25 y) (+ 22528.0 (-> v1-25 y))) + (set! (-> obj idle-pos quad) (-> v1-25 quad)) + ) + (set! (-> obj flit-joint) (the-as joint-mod (new 'process 'joint-mod-set-local obj 3 #t #f #f))) + (set! (-> obj flit-joint twist-min-y) (the-as float #t)) + (let ((f0-7 (res-lump-float (-> obj entity) 'rotoffset))) + (if (!= f0-7 0.0) + (quaternion-rotate-y! (-> obj root-override2 quat) (-> obj root-override2 quat) f0-7) + ) + ) + (let ((f0-8 (quaternion-y-angle (-> obj root-override2 quat)))) + (matrix-rotate-y! (-> obj zone-to-world) f0-8) + ) + (set! (-> obj zone-to-world trans quad) (-> obj root-override2 trans quad)) + (matrix-inverse-of-rot-trans! (-> obj world-to-zone) (-> obj zone-to-world)) + (set! (-> obj formation-entity) (entity-actor-lookup (-> obj entity) 'alt-actor 0)) + (set-vector! (-> obj offset) 0.0 0.0 94208.0 1.0) + (set! (-> obj path) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (set! (-> obj path-pos) 0.0) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! (-> obj sound) + (new 'process 'ambient-sound (static-sound-spec "flamer-loop" :fo-max 80) (-> obj root-override2 trans)) + ) + (set! (-> obj enemy-flags) (logior (enemy-flag multi-focus) (-> obj enemy-flags))) + (let ((v1-45 (-> obj nav))) + (set! (-> v1-45 sphere-mask) (the-as uint 0)) + ) + 0 + (let ((v1-47 (-> obj nav))) + (set! (-> v1-47 nearest-y-threshold) 63488.0) + ) + 0 + (quaternion-copy! (-> obj init-quat) (-> obj root-override2 quat)) + (add-connection + *part-engine* + obj + 19 + obj + 318 + (new 'static 'vector :x 819.2 :y -1187.84 :z 2088.96 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 19 + obj + 318 + (new 'static 'vector :x -819.2 :y -1187.84 :z 2088.96 :w 163840.0) + ) + (add-connection *part-engine* obj 9 obj 768 (new 'static 'vector :w 163840.0)) + 0 + (none) + ) + +(defmethod go-idle flamer ((obj flamer)) + (if (-> obj formation-entity) + (go (method-of-object obj wait-for-formation)) + (go (method-of-object obj idle)) + ) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/common/enemy/hover/hover-enemy-battle.gc b/goal_src/jak2/levels/common/enemy/hover/hover-enemy-battle.gc index c32bbd43fe..7d391c415d 100644 --- a/goal_src/jak2/levels/common/enemy/hover/hover-enemy-battle.gc +++ b/goal_src/jak2/levels/common/enemy/hover/hover-enemy-battle.gc @@ -5,5 +5,318 @@ ;; name in dgo: hover-enemy-battle ;; dgos: FOR, DMI, FRA, STR, NEB, D3A, UNB +(declare-type base-turret process-focusable) +(declare-type turret base-turret) + ;; DECOMP BEGINS +(deftype hover-enemy-battle-command (structure) + ((command symbol :offset-assert 0) + (wave uint16 :offset-assert 4) + (time time-frame :offset-assert 8) + (alive-count int32 :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x14 + :flag-assert #x900000014 + ) + + +(deftype hover-enemy-manager (process) + ((command-table (array hover-enemy-battle-command) :offset-assert 128) + (path path-control :offset-assert 132) + (formation hover-formation-control :offset-assert 136) + (actor-group (pointer actor-group) :offset-assert 140) + (actor-group-count int32 :offset-assert 144) + (total-to-spawn int32 :offset-assert 148) + (num-spawned int32 :offset-assert 152) + (alive-count int32 :offset-assert 156) + (formation-timer time-frame :offset-assert 160) + ) + :heap-base #x30 + :method-count-assert 19 + :size-assert #xa8 + :flag-assert #x13003000a8 + (:methods + (idle () _type_ :state 14) + (spawning (object object process pointer) _type_ :state 15) + (die () _type_ :state 16) + (hover-enemy-manager-init! (_type_ (array hover-enemy-battle-command)) none 17) + (spawn-enemy (_type_ uint) none 18) + ) + ) + + +(defbehavior hover-enemy-manager-handler hover-enemy-manager ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (local-vars (v0-0 object)) + (case arg2 + (('join 'leave 'set-type 'get-formation 'set-los) + (when (-> self formation) + (let ((v1-2 (-> self formation)) + (a1-8 arg0) + ) + (case arg2 + (('join) + (hover-formation-control-method-17 v1-2 a1-8) + ) + (('leave) + (hover-formation-control-method-18 v1-2 a1-8) + ) + (('set-type) + (let ((a1-11 1)) + (case (-> arg3 param 0) + (('line) + (set! a1-11 0) + ) + (('circle) + (set! a1-11 2) + ) + (('semicircle) + (set! a1-11 3) + ) + ) + (try-update-formation-type v1-2 (the-as formation-type a1-11)) + ) + ) + (('get-formation) + v1-2 + ) + (('set-los) + (cond + ((-> arg3 param 0) + (set! v0-0 (logior (-> v1-2 flags) 2)) + (set! (-> v1-2 flags) (the-as uint v0-0)) + ) + (else + (set! v0-0 (logand -3 (-> v1-2 flags))) + (set! (-> v1-2 flags) (the-as uint v0-0)) + ) + ) + v0-0 + ) + ) + ) + ) + ) + (('num-alive?) + (-> self alive-count) + ) + (('num-spawned?) + (-> self num-spawned) + ) + (('total-to-spawn?) + (-> self total-to-spawn) + ) + (('hover-die) + (set! v0-0 (max 0 (+ (-> self alive-count) -1))) + (set! (-> self alive-count) (the-as int v0-0)) + v0-0 + ) + (('path) + (if (not (logtest? (-> self path flags) (path-control-flag not-found))) + (-> self path) + ) + ) + ) + ) + +(defbehavior hover-enemy-manager-post hover-enemy-manager () + (when (-> self formation) + (let ((gp-0 (-> self formation))) + (let ((a0-0 gp-0)) + ((the-as (function hover-formation-control none) (method-of-object a0-0 hover-formation-control-method-14)) + a0-0 + ) + ) + (when (and (logtest? (-> gp-0 flags) 2) + (>= (- (-> self clock frame-counter) (-> self formation-timer)) (seconds 0.2)) + ) + (hover-formation-control-method-11 gp-0) + (set! (-> self formation-timer) (-> self clock frame-counter)) + ) + ) + ) + (if (not (logtest? (-> self path flags) (path-control-flag not-found))) + (debug-draw (-> self path)) + ) + (none) + ) + +(defstate idle (hover-enemy-manager) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('trigger) + (go-virtual spawning proc arg1 (the-as process event-type) (the-as pointer event)) + ) + (else + (hover-enemy-manager-handler proc arg1 event-type event) + ) + ) + ) + :code (the-as (function none :behavior hover-enemy-manager) sleep-code) + :post hover-enemy-manager-post + ) + +(defstate spawning (hover-enemy-manager) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('spawning?) + #t + ) + (else + (hover-enemy-manager-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior ((arg0 object) (arg1 object) (arg2 process) (arg3 pointer)) + (let ((a0-1 (-> self formation))) + (if a0-1 + (set-anchor-proc a0-1 (process->handle *target*)) + ) + ) + (none) + ) + :code (behavior ((arg0 object) (arg1 object) (arg2 process) (arg3 pointer)) + (let ((gp-0 (-> self command-table))) + (dotimes (s5-0 (-> gp-0 length)) + (case (-> gp-0 s5-0 command) + (('spawn) + (spawn-enemy self (-> gp-0 s5-0 wave)) + ) + (('wait) + ) + ) + (let ((s4-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s4-0) (-> gp-0 s5-0 time)) + (suspend) + ) + ) + (while (< (-> gp-0 s5-0 alive-count) (-> self alive-count)) + (suspend) + ) + ) + ) + (let ((gp-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-1) (seconds 2)) + (suspend) + ) + ) + (go-virtual die) + (none) + ) + :post hover-enemy-manager-post + ) + +(defstate die (hover-enemy-manager) + :virtual #t + :event hover-enemy-manager-handler + :code (behavior () + (while (-> self child) + (suspend) + ) + (process-entity-status! self (entity-perm-status dead) #t) + (none) + ) + ) + +(defmethod spawn-enemy hover-enemy-manager ((obj hover-enemy-manager) (arg0 uint)) + (when (< arg0 (the-as uint (-> obj actor-group-count))) + (dotimes (s4-0 (-> obj actor-group arg0 length)) + (let* ((s1-0 (-> obj actor-group arg0 data s4-0 actor)) + (s2-0 (-> (the-as entity-actor s1-0) etype)) + (s3-0 (new 'stack-no-clear 'transformq)) + ) + (set! (-> s3-0 trans quad) (-> s1-0 extra trans quad)) + (quaternion-copy! (-> s3-0 quat) (-> (the-as entity-actor s1-0) quat)) + (set! (-> s3-0 scale x) (the-as float s1-0)) + (set! (-> s3-0 scale y) (the-as float #f)) + (set! (-> s3-0 scale z) (the-as float #t)) + (let ((s1-1 (get-process *default-dead-pool* s2-0 #x4000))) + (when (when s1-1 + (let ((t9-2 (method-of-type process activate))) + (t9-2 s1-1 obj (symbol->string (-> s2-0 symbol)) (the-as pointer #x70004000)) + ) + (run-now-in-process s1-1 enemy-init-by-other obj s3-0) + (-> s1-1 ppointer) + ) + (+! (-> obj alive-count) 1) + (+! (-> obj num-spawned) 1) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch process vs hover-enemy-manager. +(defmethod relocate hover-enemy-manager ((obj hover-enemy-manager) (arg0 int)) + (when (-> obj formation) + (if (nonzero? (-> obj formation)) + (&+! (-> obj formation) arg0) + ) + ) + (if (nonzero? (-> obj path)) + (&+! (-> obj path) arg0) + ) + (the-as + hover-enemy-manager + ((the-as (function process int process) (find-parent-method hover-enemy-manager 7)) obj arg0) + ) + ) + +(defmethod hover-enemy-manager-init! hover-enemy-manager ((obj hover-enemy-manager) (arg0 (array hover-enemy-battle-command))) + "Initialize this [[hover-enemy-manager]]." + (local-vars (sv-16 res-tag)) + (with-pp + (set! (-> obj command-table) arg0) + (set! (-> obj path) (new 'process 'path-control obj 'path 0.0 (-> obj entity) #f)) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-5 (res-lump-data (-> obj entity) 'actor-groups pointer :tag-ptr (& sv-16)))) + (cond + ((and v1-5 (nonzero? (-> sv-16 elt-count))) + (set! (-> obj actor-group) (the-as (pointer actor-group) v1-5)) + (set! (-> obj actor-group-count) (the-as int (-> sv-16 elt-count))) + ) + (else + (set! (-> obj actor-group) (the-as (pointer actor-group) #f)) + (set! (-> obj actor-group-count) 0) + 0 + ) + ) + ) + (set! (-> obj total-to-spawn) 0) + (set! (-> obj num-spawned) 0) + (when (-> obj command-table) + (let ((v1-13 (-> obj command-table))) + (dotimes (a0-6 (-> v1-13 length)) + (if (= (-> v1-13 a0-6 command) 'spawn) + (+! (-> obj total-to-spawn) (-> obj actor-group (-> v1-13 a0-6 wave) length)) + ) + ) + ) + ) + (set! (-> obj formation) #f) + (set! (-> obj formation-timer) (-> pp clock frame-counter)) + (set! (-> obj alive-count) 0) + 0 + (none) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defbehavior hover-enemy-manager-init-by-other hover-enemy-manager ((arg0 entity-actor) (arg1 (array hover-enemy-battle-command))) + (set! (-> self entity) arg0) + (hover-enemy-manager-init! self arg1) + (go-virtual idle) + (none) + ) + +;; WARN: Return type mismatch process-tree vs process. +(defun hover-manager-spawn ((arg0 turret) (arg1 entity-actor) (arg2 (array hover-enemy-battle-command))) + (the-as process (ppointer->process (process-spawn hover-enemy-manager arg1 arg2 :to arg0))) + ) diff --git a/goal_src/jak2/levels/common/enemy/hover/hover-enemy-h.gc b/goal_src/jak2/levels/common/enemy/hover/hover-enemy-h.gc index f7cdc4adf1..ea555b95a6 100644 --- a/goal_src/jak2/levels/common/enemy/hover/hover-enemy-h.gc +++ b/goal_src/jak2/levels/common/enemy/hover/hover-enemy-h.gc @@ -27,56 +27,56 @@ (deftype hover-enemy (enemy) - ((hover basic :offset-assert 532) - (hover-info hover-enemy-info :offset-assert 536) - (formation-entity basic :offset-assert 540) - (fly-anim-speed float :offset-assert 544) - (restart-fly-anims basic :offset-assert 548) - (main-joint-acc vector :inline :offset-assert 560) - (main-joint-vel vector :inline :offset-assert 576) - (main-joint-pos vector :inline :offset-assert 592) - (thrust int64 2 :offset-assert 608) - (rotation-vec vector :inline :offset-assert 624) - (dest-pos vector :inline :offset-assert 640) - (offset vector :inline :offset-assert 656) - (surface-normal vector :inline :offset-assert 672) - (local-dir vector :inline :offset-assert 688) - (scale float :offset-assert 704) - (scale-timer uint64 :offset-assert 712) - (hit-surface? basic :offset-assert 720) - (knocked-start-level float :offset-assert 724) - (knocked-fall-dist float :offset-assert 728) - (flying-death-anim int32 :offset-assert 732) - (flying-death-transv vector :inline :offset-assert 736) - (flying-death-engine int32 :offset-assert 752) - (flying-death-thrust-rotate float :offset-assert 756) - (flying-death-spin float :offset-assert 760) - (flying-death-spin-dest float :offset-assert 764) - (flying-death-spin-axis vector :inline :offset-assert 768) + ((hover hover-nav-control :offset-assert 532) + (hover-info hover-enemy-info :offset-assert 536) + (formation-entity entity :offset-assert 540) + (fly-anim-speed float :offset-assert 544) + (restart-fly-anims symbol :offset-assert 548) + (main-joint-acc vector :inline :offset-assert 560) + (main-joint-vel vector :inline :offset-assert 576) + (main-joint-pos vector :inline :offset-assert 592) + (thrust float 2 :offset-assert 608) + (rotation-vec vector :inline :offset-assert 624) + (dest-pos vector :inline :offset-assert 640) + (offset vector :inline :offset-assert 656) + (surface-normal vector :inline :offset-assert 672) + (local-dir vector :inline :offset-assert 688) + (scale float :offset-assert 704) + (scale-timer uint64 :offset-assert 712) + (hit-surface? symbol :offset-assert 720) + (knocked-start-level float :offset-assert 724) + (knocked-fall-dist float :offset-assert 728) + (flying-death-anim int32 :offset-assert 732) + (flying-death-transv vector :inline :offset-assert 736) + (flying-death-engine int32 :offset-assert 752) + (flying-death-thrust-rotate float :offset-assert 756) + (flying-death-spin float :offset-assert 760) + (flying-death-spin-dest float :offset-assert 764) + (flying-death-spin-axis vector :inline :offset-assert 768) ) :heap-base #x290 :method-count-assert 156 :size-assert #x310 :flag-assert #x9c02900310 (:methods - (hover-enemy-method-137 () none 137) - (hover-enemy-method-138 () none 138) - (hover-enemy-method-139 () none 139) - (hover-enemy-method-140 () none 140) - (hover-enemy-method-141 () none 141) - (hover-enemy-method-142 () none 142) - (hover-enemy-method-143 () none 143) - (hover-enemy-method-144 () none 144) - (hover-enemy-method-145 () none 145) - (hover-enemy-method-146 () none 146) - (hover-enemy-method-147 () none 147) - (hover-enemy-method-148 () none 148) - (hover-enemy-method-149 () none 149) - (hover-enemy-method-150 () none 150) - (hover-enemy-method-151 () none 151) - (hover-enemy-method-152 () none 152) - (hover-enemy-method-153 () none 153) - (hover-enemy-method-154 () none 154) - (hover-enemy-method-155 () none 155) + (knocked-recover () _type_ :state 137) + (flying-death () _type_ :state 138) + (flying-death-explode () _type_ :state 139) + (hover-enemy-method-140 (_type_ symbol) none 140) + (hover-enemy-method-141 (_type_ float) none 141) + (hover-enemy-method-142 (_type_) none 142) + (hover-enemy-method-143 (_type_ int float) none 143) + (hover-enemy-method-144 (_type_) none 144) + (hover-enemy-method-145 (_type_ int float int int) none 145) + (hover-enemy-method-146 (_type_) none 146) + (hover-enemy-method-147 (_type_) none 147) + (hover-enemy-method-148 (_type_) none 148) + (hover-enemy-method-149 (_type_) none 149) + (hover-enemy-method-150 (_type_) enemy-info 150) + (hover-enemy-method-151 (_type_) hover-enemy-info 151) + (hover-enemy-method-152 (_type_) hover-nav-params 152) + (hover-enemy-method-153 (_type_) none 153) + (hover-enemy-method-154 (_type_) none 154) + (hover-enemy-method-155 (_type_) none 155) ) ) diff --git a/goal_src/jak2/levels/common/enemy/hover/hover-enemy.gc b/goal_src/jak2/levels/common/enemy/hover/hover-enemy.gc index 90025bb1d8..f61e382074 100644 --- a/goal_src/jak2/levels/common/enemy/hover/hover-enemy.gc +++ b/goal_src/jak2/levels/common/enemy/hover/hover-enemy.gc @@ -7,3 +7,1025 @@ ;; DECOMP BEGINS +(defmethod general-event-handler hover-enemy ((obj hover-enemy) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (local-vars (v1-41 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (case arg2 + (('hit 'hit-knocked 'hit-flinch) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (cond + ((zero? (-> obj hit-points)) + (if (rng-hit? obj 0.4) + (go (method-of-object obj flying-death)) + (go (method-of-object obj flying-death-explode)) + ) + ) + (else + (go (method-of-object obj knocked)) + ) + ) + #t + ) + (('update-formation) + (let ((s5-1 (the-as object (-> arg3 param 0)))) + (let* ((f0-0 409.6) + (f0-2 (* f0-0 f0-0)) + ) + (.lvf vf1 (&-> (vector-! (new 'stack-no-clear 'vector) (the-as vector s5-1) (-> obj offset)) quad)) + (.add.w.vf vf2 vf0 vf0 :mask #b1) + (.mul.vf vf1 vf1 vf1) + (.mul.x.vf acc vf2 vf1 :mask #b1) + (.add.mul.y.vf acc vf2 vf1 acc :mask #b1) + (.add.mul.z.vf vf1 vf2 vf1 acc :mask #b1) + (.mov v1-41 vf1) + (if (< f0-2 v1-41) + (hover-nav-control-method-21 (-> obj hover)) + ) + ) + (let ((v0-7 (the-as object (-> obj offset)))) + (set! (-> (the-as vector v0-7) quad) (-> (the-as vector s5-1) quad)) + v0-7 + ) + ) + ) + (('get-hover-nav-sphere) + (if (not (and (-> obj next-state) (let ((v1-49 (-> obj next-state name))) + (or (= v1-49 'dormant) (= v1-49 'dormant-aware)) + ) + ) + ) + (-> (the-as collide-shape-prim-group (-> obj root-override2 root-prim)) + child + (-> obj hover params nav-collide-prim-index) + prim-core + ) + ) + ) + (else + ((method-of-type enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +(defbehavior hover-enemy-dest-post hover-enemy () + (local-vars (at-0 int) (at-1 int)) + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (let ((a1-1 (hover-nav-control-method-16 (-> self hover) (new 'stack-no-clear 'vector))) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (vector-flatten! gp-0 a1-1 *y-vector*) + (let ((f28-0 (lerp-scale -10922.667 10922.667 (-> gp-0 z) -1.0 1.0)) + (f30-0 (lerp-scale 10922.667 -10922.667 (-> gp-0 x) -1.0 1.0)) + ) + (set! (-> self rotation-vec x) + (deg-seek (-> self rotation-vec x) f28-0 (* 5461.3335 (-> self clock seconds-per-frame))) + ) + (set! (-> self rotation-vec z) + (deg-seek (-> self rotation-vec z) f30-0 (* 6371.5557 (-> self clock seconds-per-frame))) + ) + ) + ) + (let ((s4-1 (vector-! (new 'stack-no-clear 'vector) (-> self focus-pos) (-> self root-override2 trans)))) + (vector-normalize! s4-1 1.0) + (set! (-> self rotation-vec y) + (deg-seek (-> self rotation-vec y) (vector-y-angle s4-1) (* 14563.556 (-> self clock seconds-per-frame))) + ) + ) + (hover-enemy-method-146 self) + (hover-nav-control-method-12 (-> self hover)) + (enemy-simple-post) + (let ((a0-14 + (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data (-> self hover-info main-joint))) + ) + (v1-18 (new 'stack-no-clear 'vector)) + ) + (let ((a1-10 (new 'stack-no-clear 'vector))) + (vector-! v1-18 a0-14 (-> self main-joint-pos)) + (let ((a2-7 v1-18)) + (.lvf vf1 (&-> v1-18 quad)) + (let ((f0-14 (-> self clock frames-per-second))) + (.mov at-0 f0-14) + ) + (.mov vf2 at-0) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a2-7 quad) vf1) + ) + (vector-! a1-10 v1-18 (-> self main-joint-vel)) + (let ((a2-9 (-> self main-joint-acc))) + (.lvf vf1 (&-> a1-10 quad)) + (let ((f0-15 (-> self clock frames-per-second))) + (.mov at-1 f0-15) + ) + (.mov vf2 at-1) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a2-9 quad) vf1) + ) + ) + (set! (-> self main-joint-pos quad) (-> a0-14 quad)) + (set! (-> self main-joint-vel quad) (-> v1-18 quad)) + ) + 0 + (hover-enemy-method-142 self) + 0 + (none) + ) + ) + +(defbehavior hover-enemy-hostile-post hover-enemy () + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) (process->ppointer self)) + (set! (-> a1-0 num-params) 0) + (set! (-> a1-0 message) 'get-formation) + (let* ((t9-0 send-event-function) + (v1-2 (-> self formation-entity)) + (a0-2 (the-as hover-formation (t9-0 + (if v1-2 + (-> v1-2 extra process) + ) + a1-0 + ) + ) + ) + (gp-0 (-> self dest-pos)) + ) + (cond + (a0-2 + (hover-formation-method-15 a0-2 gp-0 (-> self offset)) + ) + (else + (let* ((s5-0 (handle->process (-> self focus handle))) + (a0-7 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (cond + (a0-7 + (let* ((s5-1 (get-trans (the-as process-focusable a0-7) 3)) + (a0-9 (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) s5-1)) + ) + (vector+! gp-0 s5-1 (vector-rotate-y! (new 'stack-no-clear 'vector) (-> self offset) (vector-y-angle a0-9))) + ) + ) + (else + (set! (-> gp-0 quad) (-> self root-override2 trans quad)) + ) + ) + ) + ) + ) + (hover-nav-control-method-11 (-> self hover) gp-0) + ) + ) + (hover-enemy-dest-post) + (none) + ) + +(defmethod hover-enemy-method-142 hover-enemy ((obj hover-enemy)) + 0 + (none) + ) + +(defmethod hover-enemy-method-153 hover-enemy ((obj hover-enemy)) + (let* ((v1-0 (-> obj formation-entity)) + (a0-1 (if v1-0 + (-> v1-0 extra process) + ) + ) + ) + (if a0-1 + (send-event a0-1 'join) + ) + ) + 0 + (none) + ) + +(defmethod hover-enemy-method-154 hover-enemy ((obj hover-enemy)) + (let* ((v1-0 (-> obj formation-entity)) + (a0-1 (if v1-0 + (-> v1-0 extra process) + ) + ) + ) + (if a0-1 + (send-event a0-1 'leave) + ) + ) + 0 + (none) + ) + +(defmethod coin-flip? hover-enemy ((obj hover-enemy)) + "@returns The result of a 50/50 RNG roll" + #f + ) + +(defmethod hover-enemy-method-144 hover-enemy ((obj hover-enemy)) + (set! (-> obj main-joint-pos quad) (-> obj root-override2 trans quad)) + (set! (-> obj main-joint-vel quad) (the-as uint128 0)) + (set! (-> obj main-joint-acc quad) (the-as uint128 0)) + (set! (-> obj thrust 0) 0.0) + (set! (-> obj thrust 1) 0.0) + 0 + (none) + ) + +(defmethod hover-enemy-method-145 hover-enemy ((obj hover-enemy) (arg0 int) (arg1 float) (arg2 int) (arg3 int)) + (local-vars (v1-1 int)) + 0 + (if (< 0.0 arg1) + (set! v1-1 arg2) + (set! v1-1 arg3) + ) + (let ((a3-5 (-> obj skel root-channel arg0))) + (let ((f0-2 (fabs arg1))) + (set! (-> a3-5 frame-interp 1) f0-2) + (set! (-> a3-5 frame-interp 0) f0-2) + ) + (set! (-> a3-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data v1-1))) + (set! (-> a3-5 param 0) 0.0) + (set! (-> a3-5 frame-num) (-> obj skel root-channel 0 frame-num)) + (joint-control-channel-group! a3-5 (the-as art-joint-anim (-> obj draw art-group data v1-1)) num-func-chan) + ) + (none) + ) + +;; WARN: Return type mismatch vector vs none. +(defmethod enemy-method-129 hover-enemy ((obj hover-enemy)) + (local-vars (s5-0 vector)) + (let ((t9-0 (method-of-type enemy enemy-method-129))) + (t9-0 obj) + ) + (let ((a0-3 (handle->process (-> obj focus handle)))) + (set! s5-0 (when a0-3 + (set! s5-0 (-> obj focus-pos)) + (set! (-> s5-0 quad) (-> (get-trans (the-as process-focusable a0-3) 3) quad)) + s5-0 + ) + ) + ) + (none) + ) + +(defmethod track-target! hover-enemy ((obj hover-enemy)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (hover-enemy-method-148 obj) + (enemy-method-129 obj) + (let ((t9-2 (method-of-type enemy track-target!))) + (t9-2 obj) + ) + (hover-nav-control-method-13 (-> obj hover)) + (none) + ) + +(defmethod hover-enemy-method-148 hover-enemy ((obj hover-enemy)) + (cond + ((and (-> obj draw shadow) (logtest? (-> obj draw status) (draw-control-status on-screen))) + (new 'stack-no-clear 'vector) + (new 'stack-no-clear 'vector) + (let ((s4-0 (new 'stack-no-clear 'collide-query)) + (gp-0 (-> obj draw shadow-ctrl settings shadow-dir)) + (f30-0 122880.0) + ) + (set! (-> s4-0 start-pos quad) (-> obj root-override2 trans quad)) + (vector-normalize-copy! (-> s4-0 move-dist) gp-0 f30-0) + (let ((v1-10 s4-0)) + (set! (-> v1-10 radius) 2048.0) + (set! (-> v1-10 collide-with) (collide-spec backgnd)) + (set! (-> v1-10 ignore-process0) obj) + (set! (-> v1-10 ignore-process1) #f) + (set! (-> v1-10 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-10 action-mask) (collide-action solid)) + ) + (let ((f0-1 (fill-and-probe-using-line-sphere *collide-cache* s4-0))) + (cond + ((>= f0-1 0.0) + (let ((v1-14 (-> obj draw shadow-ctrl))) + (logclear! (-> v1-14 settings flags) (shadow-flags disable-draw)) + ) + 0 + (-> s4-0 best-other-tri intersect) + (let ((a1-3 (-> obj root-override2 trans))) + (-> a1-3 y) + (let ((f0-2 (* f0-1 f30-0))) + (shadow-control-method-14 + (-> obj draw shadow-ctrl) + a1-3 + gp-0 + (- (+ 81920.0 f30-0)) + (+ -12288.0 f0-2) + (+ 12288.0 f0-2) + ) + ) + ) + ) + (else + (let ((v1-25 (-> obj draw shadow-ctrl))) + (logior! (-> v1-25 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + ) + ) + ) + (else + (let ((v1-28 (-> obj draw shadow-ctrl))) + (logior! (-> v1-28 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch symbol vs none. +;; WARN: new jak 2 until loop case, check carefully +(defbehavior hover-enemy-fly-code hover-enemy () + (let ((gp-0 (-> self draw art-group data (-> self enemy-info idle-anim)))) + (cond + ((-> self restart-fly-anims) + (ja-channel-push! 3 (seconds 0.2)) + (ja-no-eval :group! gp-0 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1)) (-> self fly-anim-speed)) + :frame-num 0.0 + ) + (let ((a0-4 (-> self skel root-channel 1))) + (let ((f0-4 0.0)) + (set! (-> a0-4 frame-interp 1) f0-4) + (set! (-> a0-4 frame-interp 0) f0-4) + ) + (set! (-> a0-4 frame-group) (the-as art-joint-anim gp-0)) + (set! (-> a0-4 param 0) (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> self fly-anim-speed)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim gp-0) num-func-seek!) + ) + (let ((a0-5 (-> self skel root-channel 2))) + (let ((f0-9 0.0)) + (set! (-> a0-5 frame-interp 1) f0-9) + (set! (-> a0-5 frame-interp 0) f0-9) + ) + (set! (-> a0-5 frame-group) (the-as art-joint-anim gp-0)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> self fly-anim-speed)) + (set! (-> a0-5 frame-num) 0.0) + (joint-control-channel-group! a0-5 (the-as art-joint-anim gp-0) num-func-seek!) + ) + (set! (-> self restart-fly-anims) #f) + ) + (else + (ja-no-eval :group! gp-0 :num! (loop! (-> self fly-anim-speed))) + (let ((a0-7 (-> self skel root-channel 1))) + (let ((f0-15 0.0)) + (set! (-> a0-7 frame-interp 1) f0-15) + (set! (-> a0-7 frame-interp 0) f0-15) + ) + (set! (-> a0-7 frame-group) (the-as art-joint-anim gp-0)) + (set! (-> a0-7 param 0) (-> self fly-anim-speed)) + (joint-control-channel-group! a0-7 (the-as art-joint-anim gp-0) num-func-loop!) + ) + (let ((a0-8 (-> self skel root-channel 2))) + (let ((f0-17 0.0)) + (set! (-> a0-8 frame-interp 1) f0-17) + (set! (-> a0-8 frame-interp 0) f0-17) + ) + (set! (-> a0-8 frame-group) (the-as art-joint-anim gp-0)) + (set! (-> a0-8 param 0) (-> self fly-anim-speed)) + (joint-control-channel-group! a0-8 (the-as art-joint-anim gp-0) num-func-loop!) + ) + (ja :num! (loop!)) + ) + ) + ) + (until #f + (let ((s5-0 (hover-nav-control-method-16 (-> self hover) (new 'stack-no-clear 'vector))) + (gp-1 (-> self hover-info)) + ) + (seek! (-> self local-dir x) (-> s5-0 x) (* 1.3 (-> self clock seconds-per-frame))) + (seek! (-> self local-dir z) (-> s5-0 z) (* 1.3 (-> self clock seconds-per-frame))) + (hover-enemy-method-145 self 1 (-> self local-dir x) (-> gp-1 fly-left-anim) (-> gp-1 fly-right-anim)) + (hover-enemy-method-145 self 2 (-> self local-dir z) (-> gp-1 fly-forward-anim) (-> gp-1 fly-backward-anim)) + ) + (suspend) + (ja :num! (loop! (-> self fly-anim-speed))) + ) + #f + (none) + ) + +(defstate ambush (hover-enemy) + :virtual #t + :enter (behavior () + (logior! (-> self enemy-flags) (enemy-flag use-notice-distance)) + (hover-enemy-method-140 self #f) + (if (logtest? (-> self path flags) (path-control-flag not-found)) + (go process-drawable-art-error "no path") + ) + (set! (-> self scale-timer) (the-as uint (-> self clock frame-counter))) + (cond + ((not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (logclear! (-> self enemy-flags) (enemy-flag enable-on-active)) + (hover-enemy-method-141 self 0.0) + ) + (else + (hover-enemy-method-141 self 1.0) + ) + ) + (let* ((gp-0 *target*) + (s1-0 (if (type? gp-0 process-focusable) + gp-0 + ) + ) + (gp-1 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s4-0 (-> self root-override2)) + (s5-0 (get-point-at-percent-along-path! (-> self path) (new 'stack-no-clear 'vector) 0.0 'interp)) + ) + (let ((s0-0 (get-point-at-percent-along-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp)) + (s3-1 + (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) + child + (-> (hover-enemy-method-152 self) nav-collide-prim-index) + local-sphere + ) + ) + ) + (if s1-0 + (set! (-> self focus-pos quad) (-> (get-trans s1-0 3) quad)) + (set! (-> self focus-pos quad) (-> s0-0 quad)) + ) + (vector-! s2-0 (-> self focus-pos) (-> s4-0 trans)) + (vector-normalize! s2-0 1.0) + (set-vector! (-> self rotation-vec) (- (vector-x-angle s2-0)) (vector-y-angle s2-0) 0.0 0.0) + (hover-enemy-method-146 self) + (set! (-> s4-0 trans quad) (-> s5-0 quad)) + (if (logtest? (-> self fact-info-override enemy-options) (enemy-option user0)) + (vector-! + (-> s4-0 trans) + (-> s4-0 trans) + (vector-orient-by-quat! (new 'stack-no-clear 'vector) s3-1 (-> s4-0 quat)) + ) + ) + ) + (displacement-between-points-at-percent-normalized! (-> self path) gp-1 0.0) + (hover-nav-control-method-10 + (-> self hover) + s5-0 + gp-1 + (vector-normalize-copy! (new 'stack-no-clear 'vector) gp-1 (* 0.8 (-> self hover params max-speed))) + ) + ) + (hover-enemy-method-144 self) + (hover-nav-control-method-18 (-> self hover) (-> self path) -1 -1) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :exit (behavior () + (local-vars (v1-5 enemy-flag)) + (hover-nav-control-method-20 (-> self hover)) + (hover-enemy-method-140 self #t) + (let ((v1-4 (-> self enemy-flags))) + (if (logtest? v1-4 (enemy-flag checking-water)) + (set! v1-5 (logior v1-4 (enemy-flag enable-on-active))) + (set! v1-5 (logclear v1-4 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-5) + (hover-enemy-method-153 self) + (none) + ) + :trans (behavior () + (when (hover-nav-control-method-23 (-> self hover)) + (hover-enemy-method-153 self) + (if (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (hover-enemy-method-141 self 1.0) + ) + (go-virtual hostile) + ) + (none) + ) + :code hover-enemy-fly-code + :post (behavior () + (local-vars (v1-19 enemy-flag)) + (when (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (let ((f0-1 (the float (- (-> self clock frame-counter) (the-as int (-> self scale-timer))))) + (f1-0 1200.0) + ) + (when (< f0-1 f1-0) + (let ((f30-0 (fmin 1.0 (/ (+ 30.0 f0-1) f1-0)))) + (hover-enemy-method-141 self f30-0) + (when (and (not (logtest? (-> self enemy-flags) (enemy-flag enable-on-active))) (>= f30-0 1.0)) + (let ((v1-18 (-> self enemy-flags))) + (if (logtest? v1-18 (enemy-flag checking-water)) + (set! v1-19 (logior v1-18 (enemy-flag enable-on-active))) + (set! v1-19 (logclear v1-18 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-19) + ) + ) + ) + ) + ) + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate notice (hover-enemy) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((gp-0 (new 'stack-no-clear 'vector)) + (a0-0 *target*) + (s5-0 (-> self root-override2 trans)) + ) + (if a0-0 + (vector-normalize! (vector-! gp-0 (get-trans a0-0 3) s5-0) 1.0) + (vector-z-quaternion! gp-0 (-> self root-override2 quat)) + ) + (hover-nav-control-method-10 (-> self hover) s5-0 gp-0 (the-as vector #t)) + ) + (hover-enemy-method-144 self) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type enemy notice) exit))) + (if t9-0 + (t9-0) + ) + ) + (hover-enemy-method-153 self) + (none) + ) + ) + +(defstate hostile (hover-enemy) + :virtual #t + :code hover-enemy-fly-code + :post hover-enemy-hostile-post + ) + +(defstate knocked (hover-enemy) + :virtual #t + :enter (behavior () + (let* ((t9-0 find-parent-method) + (a0-0 hover-enemy) + (t9-1 (-> (the-as state (t9-0 a0-0 30)) enter)) + ) + (if t9-1 + ((the-as (function enemy none) t9-1) (the-as enemy a0-0)) + ) + ) + (set! (-> self hit-surface?) #f) + (set! (-> self knocked-start-level) (-> self root-override2 trans y)) + (none) + ) + :exit (behavior () + (let ((t9-1 (-> (the-as state (find-parent-method hover-enemy 30)) exit))) + (if t9-1 + (t9-1) + ) + ) + (set! (-> self hit-surface?) #f) + (none) + ) + :trans (behavior () + (let ((gp-0 (-> self root-override2))) + (when (logtest? (-> gp-0 status) (collide-status on-surface)) + (when (not (-> self hit-surface?)) + (set! (-> self hit-surface?) #t) + (set! (-> self surface-normal quad) (-> gp-0 poly-normal quad)) + ) + ) + (when (and (-> self hit-surface?) (zero? (-> self hit-points))) + (let ((s4-0 (new 'stack-no-clear 'quaternion))) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (vector-z-quaternion! s5-0 (-> gp-0 quat)) + (forward-up->quaternion s4-0 s5-0 (-> self surface-normal)) + ) + (quaternion-slerp! (-> gp-0 quat) (-> gp-0 quat) s4-0 0.25) + ) + ) + ) + (if (and (nonzero? (-> self hit-points)) + (zero? (-> self fated-time)) + (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (< (-> self root-override2 trans y) (- (-> self knocked-start-level) (-> self knocked-fall-dist))) + ) + (go-virtual knocked-recover) + ) + (none) + ) + ) + +(defstate knocked-recover (hover-enemy) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior hover-enemy) enemy-event-handler) + :code (behavior () + (local-vars (v1-38 enemy-flag) (v1-46 enemy-flag)) + (ja-channel-push! 1 (seconds 0.5)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info knocked-land-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info knocked-land-anim))) + frames + num-frames + ) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self restart-fly-anims) #t) + (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-37 (-> self enemy-flags))) + (if (logtest? v1-37 (enemy-flag checking-water)) + (set! v1-38 (logior v1-37 (enemy-flag enable-on-active))) + (set! v1-38 (logclear v1-37 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-38) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-move-dest)) + (set! (-> self mask) (logior (process-mask collectable) (-> self mask))) + (logclear! (-> self mask) (process-mask collectable)) + ) + (let ((v1-45 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-45) + (set! v1-46 (logior (enemy-flag check-water-backup) v1-45)) + (set! v1-46 (logclear v1-45 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-46) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (hover-nav-control-method-21 (-> self hover)) + (go-hostile self) + (none) + ) + :post hover-enemy-hostile-post + ) + +(defstate flying-death (hover-enemy) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('touch 'touched 'attack) + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (go-virtual flying-death-explode) + ) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (dispose! self) + (stop-looking-at-target! self) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logclear! (-> self mask) (process-mask actor-pause)) + (logclear! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self enemy-flags) (enemy-flag check-water-backup)) + (set! (-> self root-override2 penetrate-using) (penetrate lunge vehicle knocked)) + (let ((gp-0 (-> self flying-death-transv))) + (let ((a1-0 (handle->process (-> self incoming attacker-handle)))) + (if a1-0 + (vector-! gp-0 (-> (the-as process-focusable a1-0) root-override trans) (-> self root-override2 trans)) + (vector-! gp-0 (-> self incoming attacker-pos) (-> self root-override2 trans)) + ) + ) + (set! (-> gp-0 y) 0.0) + (vector-normalize! gp-0 1.0) + (vector-rotate90-around-y! gp-0 gp-0) + (if (rng-hit? self 0.5) + (vector-negate! gp-0 gp-0) + ) + (let ((f30-0 (get-rand-float-range self 0.0 1.0))) + (vector-float*! gp-0 gp-0 (lerp 98304.0 172032.0 f30-0)) + (set! (-> gp-0 y) (lerp 8192.0 98304.0 f30-0)) + ) + (let ((v1-29 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat)))) + (cond + ((< 0.0 (vector-dot gp-0 v1-29)) + (set! (-> self flying-death-anim) (-> self hover-info fly-left-anim)) + (set! (-> self flying-death-engine) (-> self hover-info engine-left)) + (set! (-> self flying-death-thrust-rotate) (-> self hover-info thrust-rotate-left)) + (set! (-> self flying-death-spin-dest) -524288.0) + ) + (else + (set! (-> self flying-death-anim) (-> self hover-info fly-right-anim)) + (set! (-> self flying-death-engine) (-> self hover-info engine-right)) + (set! (-> self flying-death-thrust-rotate) (-> self hover-info thrust-rotate-right)) + (set! (-> self flying-death-spin-dest) 524288.0) + ) + ) + ) + ) + (set! (-> self flying-death-spin-axis quad) (-> *y-vector* quad)) + (vector-rotate-x! + (-> self flying-death-spin-axis) + (-> self flying-death-spin-axis) + (* 182.04445 (rand-vu-float-range -120.0 120.0)) + ) + (set-gravity-length (-> self root-override2 dynam) 163840.0) + (set! (-> self hover speed) 0.2) + (set! (-> self flying-death-spin) 0.0) + (enemy-method-103 self) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :trans (behavior () + (if (or (logtest? (-> self root-override2 status) + (collide-status touch-surface touch-wall touch-ceiling touch-actor impact-surface touch-background) + ) + (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 4)) + ) + (go-virtual flying-death-explode) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self flying-death-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self flying-death-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (seek! + (-> self flying-death-spin) + (-> self flying-death-spin-dest) + (* 196608.0 (-> self clock seconds-per-frame)) + ) + (let ((gp-0 (-> self root-override2))) + (let ((a2-2 + (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + (-> self flying-death-spin-axis) + (* (-> self flying-death-spin) (-> self clock seconds-per-frame)) + ) + ) + ) + (quaternion*! (-> gp-0 quat) (-> gp-0 quat) a2-2) + ) + (vector-v++! + (-> self flying-death-transv) + (compute-acc-due-to-gravity gp-0 (new 'stack-no-clear 'vector) 0.8) + ) + (let ((v1-6 (hover-enemy-method-152 self))) + (seek! + (-> self hover speed) + (* 2.0 (-> v1-6 max-speed)) + (* 0.8 (-> self clock seconds-per-frame) (-> v1-6 max-acceleration)) + ) + ) + (vector-normalize-copy! (-> gp-0 transv) (-> self flying-death-transv) (-> self hover speed)) + (let ((a2-8 (new 'stack-no-clear 'collide-query))) + (set! (-> a2-8 collide-with) (-> gp-0 root-prim prim-core collide-with)) + (set! (-> a2-8 ignore-process0) (-> gp-0 process)) + (set! (-> a2-8 ignore-process1) #f) + (set! (-> a2-8 ignore-pat) (-> gp-0 pat-ignore-mask)) + (set! (-> a2-8 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide gp-0 (-> gp-0 transv) a2-8 (meters 0)) + ) + ) + (enemy-simple-post) + (hover-enemy-method-143 self (-> self flying-death-engine) (-> self flying-death-thrust-rotate)) + (none) + ) + ) + +(defstate flying-death-explode (hover-enemy) + :virtual #t + :enter (behavior () + (dispose! self) + (let ((v1-3 (-> self root-override2 root-prim))) + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + (set! (-> v1-3 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (none) + ) + :code (behavior () + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + ) + +(defmethod go-stare hover-enemy ((obj hover-enemy)) + (go-hostile obj) + (none) + ) + +(defmethod go-stare2 hover-enemy ((obj hover-enemy)) + (go-hostile obj) + (none) + ) + +;; WARN: Return type mismatch quaternion vs none. +(defmethod hover-enemy-method-146 hover-enemy ((obj hover-enemy)) + (let ((gp-0 (new 'stack-no-clear 'matrix))) + (matrix-rotate-zxy! gp-0 (-> obj rotation-vec)) + (matrix->quaternion (-> obj root-override2 quat) gp-0) + ) + (none) + ) + +;; WARN: Return type mismatch float vs none. +(defmethod hover-enemy-method-147 hover-enemy ((obj hover-enemy)) + (let ((s5-0 (-> obj root-override2 quat)) + (gp-0 (-> obj rotation-vec)) + ) + (set! (-> gp-0 z) (quaternion-z-angle s5-0)) + (set! (-> gp-0 y) (quaternion-y-angle s5-0)) + (set! (-> gp-0 x) (quaternion-x-angle s5-0)) + ) + (none) + ) + +(defmethod hover-enemy-method-140 hover-enemy ((obj hover-enemy) (arg0 symbol)) + (let ((v1-0 0) + (a0-2 (-> obj root-override2 root-prim)) + ) + (if arg0 + (set! v1-0 1) + ) + (set! (-> (the-as collide-shape-prim-group a0-2) child 0 prim-core collide-with) (the-as collide-spec v1-0)) + (set! (-> (the-as collide-shape-prim-group a0-2) child 1 prim-core collide-with) (the-as collide-spec v1-0)) + (set! (-> (the-as collide-shape-prim-group a0-2) child 2 prim-core collide-with) (the-as collide-spec v1-0)) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch vector vs none. +(defmethod hover-enemy-method-141 hover-enemy ((obj hover-enemy) (arg0 float)) + (let ((f0-1 (* (-> obj scale) arg0))) + (set-vector! (-> obj root-override2 scale) (* 1.2 f0-1) (* 0.9 f0-1) f0-1 1.0) + ) + (none) + ) + +(defmethod dispose! hover-enemy ((obj hover-enemy)) + "Cleans-up the enemy and any associated resources. Potentially spawns skull gems" + (when (not (logtest? (enemy-flag recover-applied-velocity) (-> obj enemy-flags))) + (process-entity-status! obj (entity-perm-status subtask-complete) #t) + (send-event (ppointer->process (-> obj parent)) 'hover-die) + (hover-enemy-method-154 obj) + ((method-of-type enemy dispose!) obj) + ) + (none) + ) + +(defmethod deactivate hover-enemy ((obj hover-enemy)) + (hover-nav-control-method-9 (-> obj hover)) + ((method-of-type enemy deactivate) obj) + (none) + ) + +;; WARN: Return type mismatch enemy vs hover-enemy. +(defmethod relocate hover-enemy ((obj hover-enemy) (arg0 int)) + (if (nonzero? (-> obj hover)) + (&+! (-> obj hover) arg0) + ) + (the-as hover-enemy ((method-of-type enemy relocate) obj arg0)) + ) + +(defmethod hover-enemy-method-155 hover-enemy ((obj hover-enemy)) + (set! (-> obj hover-info) (hover-enemy-method-151 obj)) + (set! (-> obj fly-anim-speed) (get-rand-float-range obj 0.8 1.2)) + (vector-reset! (-> obj rotation-vec)) + (vector-reset! (-> obj dest-pos)) + (vector-reset! (-> obj local-dir)) + (set! (-> obj scale) 1.0) + (hover-enemy-method-141 obj 1.0) + (set! (-> obj formation-entity) (entity-actor-lookup (-> obj entity) 'alt-actor 0)) + (logior! (-> obj skel status) (joint-control-status sync-math)) + (let ((t0-0 (hover-enemy-method-152 obj))) + (set! (-> obj hover) (new 'process 'hover-nav-control obj (-> obj root-override2) t0-0)) + ) + (let ((s5-0 (-> obj offset)) + (t9-6 (method-of-type res-lump get-property-struct)) + (a0-8 (-> obj entity)) + (a1-4 'trans-offset) + (a2-3 'interp) + (a3-1 -1000000000.0) + (t0-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> t0-1 x) 0.0) + (set! (-> t0-1 y) 20480.0) + (set! (-> t0-1 z) 61440.0) + (set! (-> t0-1 w) 1.0) + (set! (-> s5-0 quad) + (-> (the-as vector (t9-6 a0-8 a1-4 a2-3 a3-1 t0-1 (the-as (pointer res-tag) #f) *res-static-buf*)) quad) + ) + ) + (set! (-> obj restart-fly-anims) #t) + (set! (-> obj knocked-fall-dist) 8192.0) + 0 + (none) + ) + +(deftype wasp (hover-enemy) + ((gun-jmod joint-mod :offset-assert 784) + (entity-group actor-group :offset-assert 788) + (smoke-part sparticle-launch-control :offset-assert 792) + (engine-part sparticle-launch-control :offset-assert 796) + (old-gravity float :offset 804) + (knocked-anim int32 :offset-assert 808) + (knocked-recover-anim int32 :offset-assert 812) + (last-fire-time time-frame :offset-assert 816) + (bridge-index int32 :offset-assert 824) + (gun-x-angle float :offset-assert 828) + (gun-x-angle-final float :offset-assert 832) + (path-u float :offset-assert 836) + (path-du float :offset-assert 840) + (path-du-final float :offset-assert 844) + (path-dest float :offset-assert 848) + (plat-pos vector :inline :offset-assert 864) + (sound-id sound-id :offset-assert 880) + (attack-wait-min float :offset-assert 884) + (attack-wait-max float :offset-assert 888) + (attack-miss-dist-min float :offset-assert 892) + (attack-miss-dist-max float :offset-assert 896) + (attack-miss-dist-curr float :offset-assert 900) + ) + :heap-base #x310 + :method-count-assert 166 + :size-assert #x388 + :flag-assert #xa603100388 + (:methods + (shoot-bridge-wait () _type_ :state 156) + (shoot-bridge-intro () _type_ :state 157) + (shoot-bridge-hold () _type_ :state 158) + (shoot-bridge-hostile () _type_ :state 159) + (shoot-bridge-attack () _type_ :state 160) + (shoot-bridge-outro () _type_ :state 161) + (attack () _type_ :state 162) + (die-now () _type_ :state 163) + (die-explode () _type_ :state 164) + (spawn-wasp-shot (_type_ projectile-init-by-other-params int float float) none 165) + ) + ) diff --git a/goal_src/jak2/levels/common/enemy/hover/hover-formation-h.gc b/goal_src/jak2/levels/common/enemy/hover/hover-formation-h.gc index 7ea3390f5a..d5d7a03398 100644 --- a/goal_src/jak2/levels/common/enemy/hover/hover-formation-h.gc +++ b/goal_src/jak2/levels/common/enemy/hover/hover-formation-h.gc @@ -35,7 +35,7 @@ (deftype hover-actor (structure) - ((handle uint64 :offset-assert 0) + ((handle handle :offset-assert 0) (offset vector :inline :offset-assert 16) ) :method-count-assert 9 @@ -91,6 +91,6 @@ :flag-assert #x1000100090 (:methods (idle () _type_ :state 14) - (hover-formation-method-15 (_type_) int 15) + (hover-formation-method-15 (_type_ vector vector) int 15) ) ) diff --git a/goal_src/jak2/levels/common/enemy/hover/hover-formation.gc b/goal_src/jak2/levels/common/enemy/hover/hover-formation.gc index 236d50f469..34643df160 100644 --- a/goal_src/jak2/levels/common/enemy/hover/hover-formation.gc +++ b/goal_src/jak2/levels/common/enemy/hover/hover-formation.gc @@ -671,7 +671,7 @@ (the-as hover-formation ((the-as (function basic int basic) (find-parent-method hover-formation 7)) obj arg0)) ) -(defmethod hover-formation-method-15 hover-formation ((obj hover-formation)) +(defmethod hover-formation-method-15 hover-formation ((obj hover-formation) (arg0 vector) (arg1 vector)) 0 ) @@ -720,8 +720,14 @@ This commonly includes things such as: ) (set! (-> obj formation-timer) (the-as uint (-> pp clock frame-counter))) (logclear! (-> obj mask) (process-mask actor-pause)) - (process-entity-status! obj (entity-perm-status no-kill) #t) - (hover-formation-method-15 obj) + (let ((t9-6 process-entity-status!) + (a0-9 obj) + (a1-7 8) + (a2-6 #t) + ) + (t9-6 a0-9 (the-as entity-perm-status a1-7) a2-6) + (hover-formation-method-15 obj (the-as vector a1-7) (the-as vector a2-6)) + ) (go (method-of-object obj idle)) (none) ) diff --git a/goal_src/jak2/levels/common/enemy/hover/hover-nav-control-h.gc b/goal_src/jak2/levels/common/enemy/hover/hover-nav-control-h.gc index cfa3813879..45258601b2 100644 --- a/goal_src/jak2/levels/common/enemy/hover/hover-nav-control-h.gc +++ b/goal_src/jak2/levels/common/enemy/hover/hover-nav-control-h.gc @@ -88,9 +88,9 @@ (set! (-> nav-network-info-array heap-base) (the-as uint 80)) (deftype hover-nav-sphere (list-node) - ((sphere sphere :inline :offset-assert 16) - (handle uint64 :offset-assert 32) - (timer uint64 :offset-assert 40) + ((sphere sphere :inline :offset-assert 16) + (handle handle :offset-assert 32) + (timer time-frame :offset-assert 40) ) :method-count-assert 9 :size-assert #x30 @@ -100,7 +100,7 @@ (deftype hover-nav-path-segment (list-node) ((curve-matrix matrix :inline :offset-assert 16) - (pos-index int32 2 :offset-assert 80) + (pos-index float 2 :offset-assert 80) (dist float :offset-assert 88) (du float :offset-assert 92) ) @@ -129,7 +129,7 @@ :size-assert #x10 :flag-assert #xa00000010 (:methods - (hover-nav-path-info-method-9 () none 9) + (hover-nav-path-info-method-9 (_type_) none 9) ) ) @@ -146,46 +146,47 @@ (set! (-> path-index-array heap-base) (the-as uint 4)) (deftype nav-network (basic) - ((network basic :offset-assert 4) - (dummy nav-network-info :inline :offset-assert 16) - (control-handle handle :offset-assert 88) - (list-table list-node 5 :offset-assert 96) - (open-list nav-network-path-node :offset 96) - (closed-list nav-network-path-node :offset 100) - (sphere-list hover-nav-sphere :offset 108) - (free-segment-list hover-nav-path-segment :offset 104) - (free-sphere-list hover-nav-sphere :offset 112) - (segment-pool uint32 :offset-assert 116) - (sphere-pool uint32 :offset-assert 120) + ((network (array nav-network-info) :offset-assert 4) + (dummy nav-network-info :inline :offset-assert 16) + (control-handle handle :offset-assert 88) + (list-table list-node 5 :offset-assert 96) + (open-list nav-network-path-node :offset 96) + (closed-list nav-network-path-node :offset 100) + (sphere-list hover-nav-sphere :offset 108) + (free-segment-list hover-nav-path-segment :offset 104) + (free-sphere-list hover-nav-sphere :offset 112) + (segment-pool (pointer hover-nav-path-segment) :offset-assert 116) + (sphere-pool (pointer hover-nav-sphere) :offset-assert 120) ) :method-count-assert 33 :size-assert #x7c :flag-assert #x210000007c (:methods + (new (symbol type) _type_ 0) (nav-network-method-9 (_type_) none 9) (nav-network-method-10 (_type_ level (array nav-network-info)) none 10) (nav-network-method-11 (_type_) none 11) (nav-network-method-12 (_type_) none 12) - (nav-network-method-13 (_type_) none 13) - (nav-network-method-14 (_type_ int) none 14) - (nav-network-method-15 (_type_) none 15) - (nav-network-method-16 (_type_) none 16) + (nav-network-method-13 (_type_ int nav-network-path-node) none 13) + (nav-network-method-14 (_type_ int nav-network-path-node) object 14) + (nav-network-method-15 (_type_ nav-network-path-node) object 15) + (nav-network-method-16 (_type_ nav-network-path-node) none 16) (nav-network-method-17 (_type_) nav-network-path-node 17) - (nav-network-method-18 (_type_) none 18) - (nav-network-method-19 (_type_) none 19) - (nav-network-method-20 (_type_) none 20) - (nav-network-method-21 (_type_) none 21) - (nav-network-method-22 (_type_) none 22) - (nav-network-method-23 (_type_) none 23) - (nav-network-method-24 (_type_) none 24) - (nav-network-method-25 (_type_) none 25) - (nav-network-method-26 (_type_) none 26) + (nav-network-method-18 (_type_ nav-network-path-node) none 18) + (nav-network-method-19 (_type_ nav-network-path-node) none 19) + (nav-network-method-20 (_type_ nav-network-path-node vector) none 20) + (nav-network-method-21 (_type_ object int int) none 21) + (nav-network-method-22 (_type_ hover-nav-path-info vector vector int int) hover-nav-path-segment 22) + (nav-network-method-23 (_type_ hover-nav-path-info) none 23) + (nav-network-method-24 (_type_ hover-nav-path-info int int int) symbol 24) + (nav-network-method-25 (_type_ process collide-prim-core) none 25) + (nav-network-method-26 (_type_ vector process vector vector float) vector 26) (nav-network-method-27 (_type_) none 27) (nav-network-method-28 (_type_) none 28) (nav-network-method-29 (_type_) symbol 29) - (get-network (_type_) basic 30) - (nav-network-method-31 () none 31) - (nav-network-method-32 () none 32) + (get-network (_type_) (array nav-network-info) 30) + (nav-network-method-31 (_type_ bounding-box) none 31) + (nav-network-method-32 (_type_ string) none 32) ) ) @@ -207,58 +208,59 @@ (deftype hover-nav-control (basic) - ((root basic :offset-assert 4) - (nav basic :offset-assert 8) - (flags uint16 :offset-assert 12) - (params hover-nav-params :offset-assert 16) - (path-timer uint64 :offset-assert 24) - (transvv vector :inline :offset-assert 32) - (dest-pos vector :inline :offset-assert 48) - (dest-vel vector :inline :offset-assert 64) - (dest-move-dir vector :inline :offset-assert 80) - (dest-offset vector :inline :offset-assert 96) - (move-dir vector :inline :offset-assert 112) - (nav-collide-impulse vector :inline :offset-assert 128) - (nav-collide-impulse-len float :offset-assert 144) - (dest-speed float :offset-assert 148) - (local-dist float :offset-assert 152) - (speed float :offset-assert 156) - (max-los-speed float :offset-assert 160) - (target-speed float :offset-assert 164) - (target-acceleration float :offset-assert 168) - (speed-dest float :offset-assert 172) - (path-info hover-nav-path-info :inline :offset-assert 176) - (curr-dest-pt int32 :offset-assert 192) - (los-obstruction-distance float :offset-assert 196) - (los-last-clear-time time-frame :offset-assert 200) - (max-speed-multiplier float :offset-assert 208) - (max-acceleration-multiplier float :offset-assert 212) + ((root collide-shape-moving :offset-assert 4) + (nav nav-network :offset-assert 8) + (flags uint16 :offset-assert 12) + (params hover-nav-params :offset-assert 16) + (path-timer time-frame :offset-assert 24) + (transvv vector :inline :offset-assert 32) + (dest-pos vector :inline :offset-assert 48) + (dest-vel vector :inline :offset-assert 64) + (dest-move-dir vector :inline :offset-assert 80) + (dest-offset vector :inline :offset-assert 96) + (move-dir vector :inline :offset-assert 112) + (nav-collide-impulse vector :inline :offset-assert 128) + (nav-collide-impulse-len float :offset-assert 144) + (dest-speed float :offset-assert 148) + (local-dist float :offset-assert 152) + (speed float :offset-assert 156) + (max-los-speed float :offset-assert 160) + (target-speed float :offset-assert 164) + (target-acceleration float :offset-assert 168) + (speed-dest float :offset-assert 172) + (path-info hover-nav-path-info :inline :offset-assert 176) + (curr-dest-pt int32 :offset-assert 192) + (los-obstruction-distance float :offset-assert 196) + (los-last-clear-time time-frame :offset-assert 200) + (max-speed-multiplier float :offset-assert 208) + (max-acceleration-multiplier float :offset-assert 212) ) :method-count-assert 32 :size-assert #xd8 :flag-assert #x20000000d8 (:methods + (new (symbol type process collide-shape-moving hover-nav-params) _type_ 0) (hover-nav-control-method-9 (_type_) none 9) - (hover-nav-control-method-10 (_type_) none 10) - (hover-nav-control-method-11 (_type_) none 11) + (hover-nav-control-method-10 (_type_ vector vector vector) none 10) + (hover-nav-control-method-11 (_type_ vector) none 11) (hover-nav-control-method-12 (_type_) none 12) (hover-nav-control-method-13 (_type_) none 13) (hover-nav-control-method-14 (_type_ float float) none 14) - (hover-nav-control-method-15 (_type_) none 15) - (hover-nav-control-method-16 (_type_) none 16) - (hover-nav-control-method-17 (_type_) none 17) - (hover-nav-control-method-18 (_type_) none 18) - (hover-nav-control-method-19 (_type_) none 19) + (hover-nav-control-method-15 (_type_ vector) none 15) + (hover-nav-control-method-16 (_type_ vector) vector 16) + (hover-nav-control-method-17 (_type_) collide-prim-core 17) + (hover-nav-control-method-18 (_type_ path-control int int) none 18) + (hover-nav-control-method-19 (_type_ (inline-array vector) int) none 19) (hover-nav-control-method-20 (_type_) none 20) (hover-nav-control-method-21 (_type_) none 21) (hover-nav-control-method-22 (_type_) hover-nav-path-segment 22) (hover-nav-control-method-23 (_type_) object 23) (hover-nav-control-method-24 (_type_) none 24) (hover-nav-control-method-25 (_type_) none 25) - (hover-nav-control-method-26 (_type_) none 26) - (hover-nav-control-method-27 (_type_) none 27) - (hover-nav-control-method-28 (_type_) none 28) - (hover-nav-control-method-29 (_type_) none 29) + (hover-nav-control-method-26 (_type_ vector vector float) symbol 26) + (hover-nav-control-method-27 (_type_ vector vector) int 27) + (hover-nav-control-method-28 (_type_ vector vector) none 28) + (hover-nav-control-method-29 (_type_ vector) none 29) (hover-nav-control-method-30 (_type_) float 30) (hover-nav-control-method-31 (_type_) float 31) ) diff --git a/goal_src/jak2/levels/common/enemy/hover/hover-nav-control.gc b/goal_src/jak2/levels/common/enemy/hover/hover-nav-control.gc index 7278831353..2db179813c 100644 --- a/goal_src/jak2/levels/common/enemy/hover/hover-nav-control.gc +++ b/goal_src/jak2/levels/common/enemy/hover/hover-nav-control.gc @@ -7,3 +7,1725 @@ ;; DECOMP BEGINS +(define *debug-hover* #f) + +(deftype nav-network-control (process) + ((nav-network nav-network :offset-assert 128) + ) + :heap-base #x10 + :method-count-assert 15 + :size-assert #x84 + :flag-assert #xf00100084 + (:methods + (idle () _type_ :state 14) + ) + ) + + +(defstate idle (nav-network-control) + :virtual #t + :code (the-as (function none :behavior nav-network-control) sleep-code) + :post (behavior () + (nav-network-method-29 (-> self nav-network)) + (nav-network-method-27 (-> self nav-network)) + (none) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defbehavior nav-network-control-init-by-other nav-network-control ((arg0 nav-network) (arg1 level)) + (set! (-> self nav-network) arg0) + (set! (-> self level) arg1) + (logior! (-> self mask) (process-mask no-kill)) + (go-virtual idle) + (none) + ) + +;; ERROR: function has no type analysis. Cannot decompile. + +;; ERROR: function has no type analysis. Cannot decompile. + +(defmethod new nav-network ((allocation symbol) (type-to-make type)) + (let ((gp-0 (object-new allocation type-to-make (the-as int (-> type-to-make size))))) + (set! (-> gp-0 dummy index) 0) + (set! (-> gp-0 dummy count) 0) + (vector-reset! (-> gp-0 dummy pos)) + (set! (-> gp-0 network) (the-as (array nav-network-info) (-> gp-0 dummy))) + (dotimes (v1-4 5) + (set! (-> gp-0 list-table v1-4) #f) + ) + (nav-network-method-12 gp-0) + (set! (-> gp-0 control-handle) (the-as handle #f)) + gp-0 + ) + ) + +(defmethod nav-network-method-9 nav-network ((obj nav-network)) + (set! (-> obj segment-pool) (the-as (pointer hover-nav-path-segment) (malloc 'loading-level #x6000))) + (set! (-> obj free-segment-list) #f) + (dotimes (v1-0 256) + (let ((a0-3 (&+ (-> obj segment-pool) (* 96 v1-0)))) + (set! (-> a0-3 0) #f) + (set! (-> a0-3 1) #f) + (let ((a2-0 (-> obj free-segment-list)) + (a1-3 (&-> obj free-segment-list)) + ) + (when (zero? a0-3) + (break!) + 0 + ) + (when (or (= a0-3 a2-0) (= a0-3 a1-3)) + (break!) + 0 + ) + (when (not (or (not a2-0) (!= (-> a2-0 prev) a0-3))) + (break!) + 0 + ) + (when a2-0 + (set! (-> a0-3 0) a2-0) + (set! (-> a0-3 1) (the-as hover-nav-path-segment (-> a2-0 prev))) + (if (-> a0-3 1) + (set! (-> a0-3 1 next) (the-as list-node a0-3)) + ) + (if (-> a0-3 0) + (set! (-> a0-3 0 prev) (the-as list-node a0-3)) + ) + ) + (if (or (not a2-0) (= a2-0 (-> a1-3 0))) + (set! (-> a1-3 0) (the-as hover-nav-path-segment a0-3)) + ) + ) + ) + ) + (set! (-> obj sphere-pool) (the-as (pointer hover-nav-sphere) (malloc 'loading-level 768))) + (set! (-> obj free-sphere-list) #f) + (dotimes (v1-3 16) + (let ((a0-6 (&+ (-> obj sphere-pool) (* 48 v1-3)))) + (set! (-> a0-6 0) #f) + (set! (-> a0-6 1) #f) + (let ((a2-4 (-> obj free-sphere-list)) + (a1-7 (&-> obj free-sphere-list)) + ) + (when (zero? a0-6) + (break!) + 0 + ) + (when (or (= a0-6 a2-4) (= a0-6 a1-7)) + (break!) + 0 + ) + (when (not (or (not a2-4) (!= (-> a2-4 prev) a0-6))) + (break!) + 0 + ) + (when a2-4 + (set! (-> a0-6 0) a2-4) + (set! (-> a0-6 1) (the-as hover-nav-sphere (-> a2-4 prev))) + (if (-> a0-6 1) + (set! (-> a0-6 1 next) (the-as list-node a0-6)) + ) + (if (-> a0-6 0) + (set! (-> a0-6 0 prev) (the-as list-node a0-6)) + ) + ) + (if (or (not a2-4) (= a2-4 (-> a1-7 0))) + (set! (-> a1-7 0) (the-as hover-nav-sphere a0-6)) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod nav-network-method-10 nav-network ((obj nav-network) (arg0 level) (arg1 (array nav-network-info))) + (set! (-> obj network) arg1) + (while (-> obj sphere-list) + (let ((v1-0 (-> obj sphere-list))) + (let ((a0-1 v1-0)) + (let ((a1-1 (&-> obj sphere-list))) + (if (= (-> a1-1 0) a0-1) + (set! (-> a1-1 0) (the-as hover-nav-sphere (-> a0-1 next))) + ) + ) + (if (-> a0-1 prev) + (set! (-> a0-1 prev next) (-> a0-1 next)) + ) + (if (-> a0-1 next) + (set! (-> a0-1 next prev) (-> a0-1 prev)) + ) + (set! (-> a0-1 prev) #f) + (set! (-> a0-1 next) #f) + ) + (let ((a1-8 (-> obj free-sphere-list)) + (a0-3 (&-> obj free-sphere-list)) + ) + (when (zero? v1-0) + (break!) + 0 + ) + (when (or (= v1-0 a1-8) (= v1-0 a0-3)) + (break!) + 0 + ) + (when (not (or (not a1-8) (!= (-> a1-8 prev) v1-0))) + (break!) + 0 + ) + (when a1-8 + (set! (-> v1-0 next) a1-8) + (set! (-> v1-0 prev) (-> a1-8 prev)) + (if (-> v1-0 prev) + (set! (-> v1-0 prev next) v1-0) + ) + (if (-> v1-0 next) + (set! (-> v1-0 next prev) v1-0) + ) + ) + (if (or (not a1-8) (= a1-8 (-> a0-3 0))) + (set! (-> a0-3 0) v1-0) + ) + ) + ) + ) + (if (not (handle->process (-> obj control-handle))) + (set! (-> obj control-handle) + (process->handle (the-as process (ppointer->process (process-spawn nav-network-control obj arg0)))) + ) + ) + 0 + (none) + ) + +(defmethod nav-network-method-12 nav-network ((obj nav-network)) + (set! (-> obj open-list) #f) + (set! (-> obj closed-list) #f) + (let ((v1-0 (-> obj network))) + (when v1-0 + (dotimes (a0-2 (-> v1-0 length)) + (let ((a1-3 (-> v1-0 a0-2 path-node))) + (set! (-> a1-3 status) (net-path-node-status)) + (set! (-> a1-3 parent) #f) + (set! (-> a1-3 next) #f) + (set! (-> a1-3 prev) #f) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod nav-network-method-28 nav-network ((obj nav-network)) + (dotimes (s5-0 2) + (format #t "list ~d: ~%" s5-0) + (let ((a0-2 (-> obj list-table s5-0))) + (while a0-2 + (let ((s4-0 (-> a0-2 next))) + (inspect a0-2) + (set! a0-2 s4-0) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod nav-network-method-29 nav-network ((obj nav-network)) + (when *display-nav-network* + (let ((gp-0 (-> obj network))) + (when gp-0 + (dotimes (s5-0 (-> gp-0 length)) + (let ((s4-0 (-> gp-0 s5-0))) + (add-debug-x #t (bucket-id debug2) (-> s4-0 pos) *color-white*) + (format (clear *temp-string*) "~d" s5-0) + (let ((a2-2 *temp-string*)) + (add-debug-text-3d #t (bucket-id debug2) a2-2 (-> s4-0 pos) (font-color #dadada) (the-as vector2h #f)) + ) + (dotimes (s3-1 (-> s4-0 count)) + (let ((a2-3 (new 'stack-no-clear 'vector))) + (set! (-> a2-3 quad) (-> s4-0 pos quad)) + (let ((a3-2 (new 'stack-no-clear 'vector))) + (set! (-> a3-2 quad) (-> gp-0 (-> s4-0 adjacency s3-1 index) pos quad)) + (add-debug-line + #t + (bucket-id debug2) + a2-3 + a3-2 + (new 'static 'rgba :r #x7f :g #xff :b #x7f :a #x10) + #f + (the-as rgba -1) + ) + ) + ) + ) + ) + ) + #f + ) + ) + ) + ) + +(defmethod nav-network-method-15 nav-network ((obj nav-network) (arg0 nav-network-path-node)) + (local-vars (a2-4 list-node)) + (when (nonzero? (-> arg0 status)) + (break!) + 0 + ) + (let ((f0-1 (+ (-> arg0 cost-to-start) (-> arg0 cost-to-end)))) + (when (not (and (not (-> arg0 next)) (not (-> arg0 prev)))) + (break!) + 0 + ) + (let ((v1-8 (the-as list-node (-> obj open-list)))) + (while v1-8 + (let ((a2-1 (-> v1-8 next))) + (if (= v1-8 arg0) + (return #t) + ) + (set! v1-8 a2-1) + ) + ) + ) + (when #f + (break!) + 0 + ) + (logior! (-> arg0 status) (net-path-node-status open)) + (let ((v1-17 (the-as list-node (-> obj open-list)))) + (while v1-17 + (let ((a2-3 (-> v1-17 next))) + (when (< f0-1 (+ (-> (the-as nav-network-path-node v1-17) cost-to-start) + (-> (the-as nav-network-path-node v1-17) cost-to-end) + ) + ) + (set! a2-4 v1-17) + (goto cfg-23) + ) + (set! v1-17 a2-3) + ) + ) + ) + ) + (set! a2-4 (the-as list-node #f)) + (label cfg-23) + (cond + (a2-4 + (let ((v1-20 arg0) + (a0-1 (-> obj list-table)) + ) + (when (zero? v1-20) + (break!) + 0 + ) + (when (or (= v1-20 a2-4) (= v1-20 a0-1)) + (break!) + 0 + ) + (when (not (or (not a2-4) (!= (-> (the-as nav-network-path-node a2-4) prev) v1-20))) + (break!) + 0 + ) + (when a2-4 + (set! (-> v1-20 next) a2-4) + (set! (-> v1-20 prev) (-> (the-as nav-network-path-node a2-4) prev)) + (if (-> v1-20 prev) + (set! (-> v1-20 prev next) v1-20) + ) + (if (-> v1-20 next) + (set! (-> v1-20 next prev) v1-20) + ) + ) + (if (or (not a2-4) (= a2-4 (-> a0-1 0))) + (set! (-> a0-1 0) v1-20) + ) + ) + ) + (else + (let ((a2-8 (the-as list-node #f))) + (let ((v1-21 (the-as list-node (-> obj open-list)))) + (while v1-21 + (let ((a3-22 (-> v1-21 next))) + (set! a2-8 v1-21) + (set! v1-21 a3-22) + ) + ) + ) + (let ((v1-23 arg0) + (a0-2 (-> obj list-table)) + ) + (when (or (= v1-23 a2-8) (= v1-23 a0-2)) + (break!) + 0 + ) + (when (not (or (not a2-8) (!= (-> (the-as nav-network-path-node a2-8) next) v1-23))) + (break!) + 0 + ) + (cond + (a2-8 + (set! (-> v1-23 next) (-> (the-as nav-network-path-node a2-8) next)) + (set! (-> v1-23 prev) a2-8) + (if (-> v1-23 prev) + (set! (-> v1-23 prev next) v1-23) + ) + (if (-> v1-23 next) + (set! (-> v1-23 next prev) v1-23) + ) + ) + (else + (set! (-> v1-23 next) (-> a0-2 0)) + (set! (-> v1-23 prev) #f) + (if (-> v1-23 next) + (set! (-> v1-23 next prev) v1-23) + ) + (set! (-> a0-2 0) v1-23) + ) + ) + ) + ) + ) + ) + arg0 + ) + +;; WARN: Return type mismatch nav-network-path-node vs none. +(defmethod nav-network-method-13 nav-network ((obj nav-network) (arg0 int) (arg1 nav-network-path-node)) + (when (nonzero? (-> arg1 status)) + (break!) + 0 + ) + (let ((v1-3 arg1) + (a3-2 (-> obj list-table arg0)) + (a0-2 (the-as object (&+ (-> obj list-table) (* arg0 4)))) + ) + (when (zero? v1-3) + (break!) + 0 + ) + (when (or (= v1-3 a3-2) (= v1-3 (the-as (pointer list-node) a0-2))) + (break!) + 0 + ) + (when (not (or (not a3-2) (!= (-> a3-2 prev) v1-3))) + (break!) + 0 + ) + (when a3-2 + (set! (-> v1-3 next) a3-2) + (set! (-> v1-3 prev) (-> a3-2 prev)) + (if (-> v1-3 prev) + (set! (-> v1-3 prev next) v1-3) + ) + (if (-> v1-3 next) + (set! (-> v1-3 next prev) v1-3) + ) + ) + (if (or (not a3-2) (= a3-2 (-> (the-as list-node a0-2) next))) + (set! (-> (the-as list-node a0-2) next) v1-3) + ) + ) + (none) + ) + +(defmethod nav-network-method-14 nav-network ((obj nav-network) (arg0 int) (arg1 nav-network-path-node)) + (let ((v1-0 arg1)) + (let ((a3-1 (the-as list-node (&+ (-> obj list-table) (* arg0 4))))) + (if (= (-> a3-1 next) v1-0) + (set! (-> a3-1 next) (-> v1-0 next)) + ) + ) + (if (-> v1-0 prev) + (set! (-> v1-0 prev next) (-> v1-0 next)) + ) + (if (-> v1-0 next) + (set! (-> v1-0 next prev) (-> v1-0 prev)) + ) + (set! (-> v1-0 prev) #f) + (set! (-> v1-0 next) #f) + ) + (let ((v1-4 (-> obj list-table arg0))) + (while v1-4 + (let ((a0-2 (-> v1-4 next))) + (if (= v1-4 arg1) + (return #t) + ) + (set! v1-4 a0-2) + ) + ) + ) + (when #f + (break!) + 0 + ) + (when (not (and (not (-> arg1 next)) (not (-> arg1 prev)))) + (break!) + 0 + ) + (set! (-> arg1 status) (net-path-node-status)) + 0 + ) + +;; WARN: Return type mismatch object vs none. +(defmethod nav-network-method-16 nav-network ((obj nav-network) (arg0 nav-network-path-node)) + (nav-network-method-14 obj 0 arg0) + (none) + ) + +(defmethod nav-network-method-17 nav-network ((obj nav-network)) + (let ((gp-0 (-> obj open-list))) + (if gp-0 + (nav-network-method-16 obj gp-0) + (set! gp-0 (the-as nav-network-path-node #f)) + ) + gp-0 + ) + ) + +;; WARN: Return type mismatch net-path-node-status vs none. +(defmethod nav-network-method-18 nav-network ((obj nav-network) (arg0 nav-network-path-node)) + (nav-network-method-13 obj 1 arg0) + (logior! (-> arg0 status) (net-path-node-status closed)) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod nav-network-method-19 nav-network ((obj nav-network) (arg0 nav-network-path-node)) + (nav-network-method-14 obj 1 arg0) + (none) + ) + +(defmethod nav-network-method-20 nav-network ((obj nav-network) (arg0 nav-network-path-node) (arg1 vector)) + (let* ((s3-0 (-> obj network)) + (s2-0 (-> s3-0 (-> arg0 row-index))) + ) + (dotimes (s1-0 (-> s2-0 count)) + (let* ((v1-8 (-> s3-0 (-> s2-0 adjacency s1-0 index))) + (s0-0 (-> v1-8 path-node)) + (f0-1 (+ (-> arg0 cost-to-start) (-> s2-0 adjacency s1-0 dist))) + ) + (when (or (not (or (logtest? (-> s0-0 status) (net-path-node-status open)) + (logtest? (-> s0-0 status) (net-path-node-status closed)) + ) + ) + (< f0-1 (-> s0-0 cost-to-start)) + ) + (set! (-> s0-0 parent) arg0) + (set! (-> s0-0 cost-to-start) f0-1) + (set! (-> s0-0 cost-to-end) (vector-vector-distance (-> v1-8 pos) arg1)) + (cond + ((logtest? (-> s0-0 status) (net-path-node-status open)) + (nav-network-method-16 obj s0-0) + (nav-network-method-15 obj s0-0) + ) + ((logtest? (-> s0-0 status) (net-path-node-status closed)) + (nav-network-method-19 obj s0-0) + (nav-network-method-15 obj s0-0) + ) + (else + (nav-network-method-15 obj s0-0) + ) + ) + ) + ) + ) + ) + (nav-network-method-18 obj arg0) + 0 + (none) + ) + +(defmethod nav-network-method-22 nav-network ((obj nav-network) (arg0 hover-nav-path-info) (arg1 vector) (arg2 vector) (arg3 int) (arg4 int)) + (-> obj network) + (let ((gp-0 (-> obj free-segment-list))) + (cond + ((and gp-0 (nonzero? gp-0)) + (let ((v1-2 gp-0)) + (let ((a0-1 (&-> obj free-segment-list))) + (if (= (-> a0-1 0) v1-2) + (set! (-> a0-1 0) (the-as hover-nav-path-segment (-> v1-2 next))) + ) + ) + (if (-> v1-2 prev) + (set! (-> v1-2 prev next) (-> v1-2 next)) + ) + (if (-> v1-2 next) + (set! (-> v1-2 next prev) (-> v1-2 prev)) + ) + (set! (-> v1-2 prev) #f) + (set! (-> v1-2 next) #f) + ) + (set! (-> gp-0 curve-matrix quad 0) (-> arg1 quad)) + (set! (-> gp-0 curve-matrix vector 1 quad) (-> arg2 quad)) + (set! (-> gp-0 pos-index 0) (the-as float arg3)) + (set! (-> gp-0 pos-index 1) (the-as float arg4)) + (set! (-> gp-0 dist) + (vector-vector-distance (the-as vector (-> gp-0 curve-matrix)) (-> gp-0 curve-matrix vector 1)) + ) + (if (not (-> arg0 segment-list)) + (set! (-> arg0 tail-segment) gp-0) + ) + (let ((v1-9 gp-0) + (a1-7 (-> arg0 segment-list)) + (a0-13 (&-> arg0 segment-list)) + ) + (when (zero? v1-9) + (break!) + 0 + ) + (when (or (= v1-9 a1-7) (= v1-9 a0-13)) + (break!) + 0 + ) + (when (not (or (not a1-7) (!= (-> a1-7 prev) v1-9))) + (break!) + 0 + ) + (when a1-7 + (set! (-> v1-9 next) a1-7) + (set! (-> v1-9 prev) (-> a1-7 prev)) + (if (-> v1-9 prev) + (set! (-> v1-9 prev next) v1-9) + ) + (if (-> v1-9 next) + (set! (-> v1-9 next prev) v1-9) + ) + ) + (if (or (not a1-7) (= a1-7 (-> a0-13 0))) + (set! (-> a0-13 0) v1-9) + ) + ) + gp-0 + ) + (else + (format #t "nav-network out of path segments~%") + (the-as hover-nav-path-segment #f) + ) + ) + ) + ) + +;; WARN: Return type mismatch hover-nav-path-segment vs none. +(defmethod nav-network-method-21 nav-network ((obj nav-network) (arg0 object) (arg1 int) (arg2 int)) + (let ((t0-0 (-> obj network))) + (nav-network-method-22 obj (the-as hover-nav-path-info arg0) (-> t0-0 arg1 pos) (-> t0-0 arg2 pos) arg1 arg2) + ) + (none) + ) + +(defmethod nav-network-method-23 nav-network ((obj nav-network) (arg0 hover-nav-path-info)) + (while (-> arg0 segment-list) + (let ((v1-0 (-> arg0 segment-list))) + (let ((a2-0 v1-0)) + (let ((a3-0 (&-> arg0 segment-list))) + (if (= (-> a3-0 0) a2-0) + (set! (-> a3-0 0) (the-as hover-nav-path-segment (-> a2-0 next))) + ) + ) + (if (-> a2-0 prev) + (set! (-> a2-0 prev next) (-> a2-0 next)) + ) + (if (-> a2-0 next) + (set! (-> a2-0 next prev) (-> a2-0 prev)) + ) + (set! (-> a2-0 prev) #f) + (set! (-> a2-0 next) #f) + ) + (let ((a3-7 (-> obj free-segment-list)) + (a2-2 (&-> obj free-segment-list)) + ) + (when (zero? v1-0) + (break!) + 0 + ) + (when (or (= v1-0 a3-7) (= v1-0 a2-2)) + (break!) + 0 + ) + (when (not (or (not a3-7) (!= (-> a3-7 prev) v1-0))) + (break!) + 0 + ) + (when a3-7 + (set! (-> v1-0 next) a3-7) + (set! (-> v1-0 prev) (-> a3-7 prev)) + (if (-> v1-0 prev) + (set! (-> v1-0 prev next) v1-0) + ) + (if (-> v1-0 next) + (set! (-> v1-0 next prev) v1-0) + ) + ) + (if (or (not a3-7) (= a3-7 (-> a2-2 0))) + (set! (-> a2-2 0) v1-0) + ) + ) + ) + ) + (set! (-> arg0 tail-segment) #f) + (set! (-> arg0 curr-segment) #f) + 0 + (none) + ) + +;; WARN: new jak 2 until loop case, check carefully +(defmethod nav-network-method-24 nav-network ((obj nav-network) (arg0 hover-nav-path-info) (arg1 int) (arg2 int) (arg3 int)) + (local-vars (s3-1 nav-network-path-node)) + (nav-network-method-12 obj) + (let ((s4-0 (-> obj network))) + (let ((s2-0 (-> s4-0 arg1 path-node))) + (set! (-> s2-0 row-index) arg1) + (set! (-> s2-0 status) (net-path-node-status)) + (set! (-> s2-0 parent) #f) + (set! (-> s2-0 cost-to-start) 0.0) + (set! (-> s2-0 cost-to-end) (vector-vector-distance (-> s4-0 arg1 pos) (-> s4-0 arg2 pos))) + (nav-network-method-15 obj s2-0) + ) + (until #f + (let ((a1-3 (nav-network-method-17 obj))) + (when (not a1-3) + (set! s3-1 (the-as nav-network-path-node #f)) + (goto cfg-9) + ) + (when (= (-> a1-3 row-index) arg2) + (set! s3-1 a1-3) + (goto cfg-9) + ) + (nav-network-method-20 obj a1-3 (-> s4-0 arg2 pos)) + ) + ) + #f + (set! s3-1 (nav-network-method-17 obj)) + (label cfg-9) + (while (and s3-1 (-> s3-1 parent)) + (if *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) (-> s4-0 (-> s3-1 row-index) pos) (meters 0.5) *color-blue*) + ) + (nav-network-method-21 obj arg0 (-> s3-1 parent row-index) (-> s3-1 row-index)) + (set! s3-1 (-> s3-1 parent)) + ) + ) + #t + ) + +(defmethod nav-network-method-25 nav-network ((obj nav-network) (arg0 process) (arg1 collide-prim-core)) + (local-vars (a3-2 hover-nav-sphere)) + (let ((a1-4 (process->handle arg0))) + (let ((v1-2 (-> obj sphere-list))) + (while v1-2 + (let ((a3-1 (-> v1-2 next))) + (when (= (-> v1-2 handle) a1-4) + (set! a3-2 v1-2) + (goto cfg-12) + ) + (set! v1-2 (the-as hover-nav-sphere a3-1)) + ) + ) + ) + (set! a3-2 (the-as hover-nav-sphere #f)) + (label cfg-12) + (when (not a3-2) + (let ((v1-6 (-> obj free-sphere-list))) + (when v1-6 + (let ((a3-3 v1-6)) + (let ((t0-3 (&-> obj free-sphere-list))) + (if (= (-> t0-3 0) a3-3) + (set! (-> t0-3 0) (the-as hover-nav-sphere (-> a3-3 next))) + ) + ) + (if (-> a3-3 prev) + (set! (-> a3-3 prev next) (-> a3-3 next)) + ) + (if (-> a3-3 next) + (set! (-> a3-3 next prev) (-> a3-3 prev)) + ) + (set! (-> a3-3 prev) #f) + (set! (-> a3-3 next) #f) + ) + (set! (-> v1-6 handle) (the-as handle a1-4)) + (let ((a1-5 v1-6) + (a3-5 (-> obj sphere-list)) + (a0-1 (&-> obj sphere-list)) + ) + (when (zero? a1-5) + (break!) + 0 + ) + (when (or (= a1-5 a3-5) (= a1-5 a0-1)) + (break!) + 0 + ) + (when (not (or (not a3-5) (!= (-> a3-5 prev) a1-5))) + (break!) + 0 + ) + (when a3-5 + (set! (-> a1-5 next) a3-5) + (set! (-> a1-5 prev) (-> a3-5 prev)) + (if (-> a1-5 prev) + (set! (-> a1-5 prev next) a1-5) + ) + (if (-> a1-5 next) + (set! (-> a1-5 next prev) a1-5) + ) + ) + (if (or (not a3-5) (= a3-5 (-> a0-1 0))) + (set! (-> a0-1 0) a1-5) + ) + ) + (set! a3-2 v1-6) + ) + ) + ) + ) + (when a3-2 + (set! (-> a3-2 timer) (seconds 0.5)) + (when arg1 + (set! (-> a3-2 sphere quad) (-> arg1 world-sphere quad)) + (set! (-> a3-2 sphere r) (fmax 4096.0 (-> a3-2 sphere r))) + ) + ) + 0 + (none) + ) + +(defmethod nav-network-method-26 nav-network ((obj nav-network) (arg0 vector) (arg1 process) (arg2 vector) (arg3 vector) (arg4 float)) + (local-vars (sv-48 vector) (sv-64 sphere)) + (vector-reset! arg0) + (let ((s1-0 (process->handle arg1)) + (s2-0 0) + ) + (let ((v1-3 (the-as list-node (-> obj sphere-list)))) + (while v1-3 + (let ((s0-0 (-> v1-3 next))) + (when (!= (-> (the-as hover-nav-sphere v1-3) handle) s1-0) + (set! sv-64 (-> (the-as hover-nav-sphere v1-3) sphere)) + (set! sv-48 (new 'stack-no-clear 'vector)) + (vector-segment-distance-point! sv-64 arg2 arg3 sv-48) + (when (>= (+ arg4 (-> sv-64 r)) (vector-vector-distance sv-64 sv-48)) + (let* ((v1-8 (new 'stack-no-clear 'vector)) + (a0-6 arg2) + (v1-9 (vector-! v1-8 (the-as vector sv-64) a0-6)) + ) + (vector+! arg0 arg0 v1-9) + ) + (+! s2-0 1) + ) + ) + (set! v1-3 s0-0) + ) + ) + ) + (vector-float*! arg0 arg0 (/ 1.0 (the float s2-0))) + ) + ) + +(defmethod nav-network-method-27 nav-network ((obj nav-network)) + (with-pp + (let ((v1-0 (the-as list-node (-> obj sphere-list)))) + (while v1-0 + (let ((a0-2 (-> v1-0 next))) + (set! (-> (the-as hover-nav-sphere v1-0) timer) + (- (-> (the-as hover-nav-sphere v1-0) timer) (- (-> pp clock frame-counter) (-> pp clock old-frame-counter))) + ) + (when (<= (-> (the-as hover-nav-sphere v1-0) timer) 0) + (let ((a1-4 v1-0)) + (let ((a2-3 (&-> obj sphere-list))) + (if (= (-> a2-3 0) a1-4) + (set! (-> a2-3 0) (the-as hover-nav-sphere (-> a1-4 next))) + ) + ) + (if (-> a1-4 prev) + (set! (-> a1-4 prev next) (-> a1-4 next)) + ) + (if (-> a1-4 next) + (set! (-> a1-4 next prev) (-> a1-4 prev)) + ) + (set! (-> a1-4 prev) #f) + (set! (-> a1-4 next) #f) + ) + (let ((a2-10 (-> obj free-sphere-list)) + (a1-6 (&-> obj free-sphere-list)) + ) + (when (zero? v1-0) + (break!) + 0 + ) + (when (or (= v1-0 a2-10) (= v1-0 a1-6)) + (break!) + 0 + ) + (when (not (or (not a2-10) (!= (-> a2-10 prev) v1-0))) + (break!) + 0 + ) + (when a2-10 + (set! (-> v1-0 next) a2-10) + (set! (-> v1-0 prev) (-> a2-10 prev)) + (if (-> v1-0 prev) + (set! (-> v1-0 prev next) v1-0) + ) + (if (-> v1-0 next) + (set! (-> v1-0 next prev) v1-0) + ) + ) + (if (or (not a2-10) (= a2-10 (-> a1-6 0))) + (set! (-> a1-6 0) (the-as hover-nav-sphere v1-0)) + ) + ) + ) + (set! v1-0 a0-2) + ) + ) + ) + (let ((v1-2 (the-as list-node (-> obj sphere-list)))) + (while v1-2 + (let ((s5-0 (-> v1-2 next))) + (let* ((s3-0 (handle->process (-> (the-as hover-nav-sphere v1-2) handle))) + (s4-0 (if (type? s3-0 hover-enemy) + s3-0 + ) + ) + ) + (when s4-0 + (let ((a1-9 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-9 from) (process->ppointer pp)) + (set! (-> a1-9 num-params) 0) + (set! (-> a1-9 message) 'get-hover-nav-sphere) + (let ((a2-14 (send-event-function s4-0 a1-9))) + (if a2-14 + (nav-network-method-25 obj s4-0 (the-as collide-prim-core a2-14)) + ) + ) + ) + ) + ) + (set! v1-2 s5-0) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod nav-network-method-31 nav-network ((obj nav-network) (arg0 bounding-box)) + (set-to-point! arg0 (-> obj network 0 pos)) + (let* ((s4-0 (-> obj network length)) + (s3-0 0) + (v1-7 (-> obj network s3-0)) + ) + (while (< s3-0 s4-0) + (add-point! arg0 (-> v1-7 pos)) + (+! s3-0 1) + (set! v1-7 (-> obj network s3-0)) + ) + ) + 0 + (none) + ) + +(defmethod nav-network-method-32 nav-network ((obj nav-network) (arg0 string)) + (let ((gp-0 (new 'stack-no-clear 'bounding-box)) + (s5-0 (entity-by-name arg0)) + ) + (when s5-0 + (nav-network-method-31 obj gp-0) + (vector-! (-> gp-0 min) (-> gp-0 min) (-> s5-0 extra trans)) + (vector-! (-> gp-0 max) (-> gp-0 max) (-> s5-0 extra trans)) + (format #t "~S ~m " (res-lump-struct s5-0 'name structure) (-> s5-0 extra vis-dist)) + (format + #t + " ~m ~m ~m ~m ~m ~m~%" + (-> gp-0 min x) + (-> gp-0 min y) + (-> gp-0 min z) + (-> gp-0 max x) + (-> gp-0 max y) + (-> gp-0 max z) + ) + ) + ) + 0 + (none) + ) + +(define *nav-network* (the-as nav-network 0)) + +(defmethod hover-nav-control-method-26 hover-nav-control ((obj hover-nav-control) (arg0 vector) (arg1 vector) (arg2 float)) + (let ((gp-0 (new 'stack-no-clear 'collide-query))) + (let ((v1-1 (vector-! (new 'stack-no-clear 'vector) arg1 arg0))) + (set! (-> gp-0 start-pos quad) (-> arg0 quad)) + (set! (-> gp-0 move-dist quad) (-> v1-1 quad)) + (vector-normalize! (-> gp-0 move-dist) (fmin (vector-length v1-1) (fmax 16384.0 (* 2.0 arg2)))) + ) + (let ((v1-5 gp-0)) + (set! (-> v1-5 radius) 4096.0) + (set! (-> v1-5 collide-with) (collide-spec backgnd)) + (set! (-> v1-5 ignore-process0) #f) + (set! (-> v1-5 ignore-process1) #f) + (set! (-> v1-5 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-5 action-mask) (collide-action solid)) + ) + (fill-using-line-sphere *collide-cache* gp-0) + (< (probe-using-line-sphere *collide-cache* gp-0) 0.0) + ) + ) + +(defmethod hover-nav-control-method-27 hover-nav-control ((obj hover-nav-control) (arg0 vector) (arg1 vector)) + (let ((s2-0 (-> obj nav network)) + (gp-0 (the-as int #f)) + ) + (let ((f30-0 0.0)) + (dotimes (s1-0 (-> s2-0 length)) + (let* ((a0-1 (-> s2-0 s1-0 pos)) + (v1-5 (vector-! (new 'stack-no-clear 'vector) a0-1 arg0)) + (f28-0 (vector-length v1-5)) + ) + (if (< (vector-dot (vector-float*! (new 'stack-no-clear 'vector) v1-5 (/ 1.0 f28-0)) arg1) 0.0) + (set! f28-0 (* 1.25 f28-0)) + ) + (when (and (< f28-0 204800.0) (hover-nav-control-method-26 obj arg0 (-> s2-0 s1-0 pos) 0.0)) + (when (or (not gp-0) (< f28-0 f30-0)) + (set! gp-0 s1-0) + (set! f30-0 f28-0) + ) + ) + ) + ) + ) + gp-0 + ) + ) + +(defmethod hover-nav-control-method-22 hover-nav-control ((obj hover-nav-control)) + (-> obj path-info curr-segment) + ) + +(defmethod hover-nav-control-method-23 hover-nav-control ((obj hover-nav-control)) + (and (-> obj path-info curr-segment) (>= (-> obj path-info curr-u) 1.0)) + ) + +(defmethod hover-nav-control-method-21 hover-nav-control ((obj hover-nav-control)) + (nav-network-method-23 (-> obj nav) (-> obj path-info)) + (set! (-> obj curr-dest-pt) -1) + 0 + (none) + ) + +(defmethod hover-nav-control-method-28 hover-nav-control ((obj hover-nav-control) (arg0 vector) (arg1 vector)) + (local-vars (v0-15 symbol) (sv-32 int) (sv-48 (function hover-nav-control vector vector int))) + (let ((s4-0 (-> obj nav network)) + (s5-0 (-> obj path-info)) + (s1-0 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) arg0 arg1) 1.0)) + ) + (set! sv-32 (hover-nav-control-method-27 obj arg1 s1-0)) + (set! v0-15 + (cond + (sv-32 + (when (or (!= sv-32 (-> obj curr-dest-pt)) (not (-> obj path-info segment-list))) + (let ((s0-0 obj)) + (set! sv-48 (method-of-object s0-0 hover-nav-control-method-27)) + (let* ((a2-2 (vector-negate! s1-0 s1-0)) + (s2-1 (sv-48 s0-0 arg0 a2-2)) + ) + (when s2-1 + (cond + ((= s2-1 sv-32) + (if *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) (-> s4-0 sv-32 pos) (meters 1) *color-dark-blue*) + ) + (nav-network-method-22 (-> obj nav) s5-0 (-> s4-0 sv-32 pos) arg1 -1 -1) + (nav-network-method-22 + (-> obj nav) + s5-0 + (the-as vector (hover-nav-control-method-17 obj)) + (-> s4-0 s2-1 pos) + -1 + -1 + ) + ) + (else + (when *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) (-> s4-0 s2-1 pos) (meters 1) *color-green*) + (add-debug-sphere #t (bucket-id debug-no-zbuf1) (-> s4-0 sv-32 pos) (meters 1) *color-cyan*) + ) + (let* ((a0-14 (-> obj nav)) + (t9-10 (method-of-object a0-14 nav-network-method-22)) + (a1-11 s5-0) + (a2-8 (-> s4-0 sv-32 pos)) + (a3-5 arg1) + (t0-5 -1) + ) + (t9-10 a0-14 a1-11 a2-8 a3-5 t0-5 -1) + (nav-network-method-24 (-> obj nav) s5-0 s2-1 sv-32 t0-5) + ) + (nav-network-method-22 + (-> obj nav) + s5-0 + (the-as vector (hover-nav-control-method-17 obj)) + (-> s4-0 s2-1 pos) + -1 + -1 + ) + ) + ) + (hover-nav-control-method-29 obj (-> obj root transv)) + (set! (-> s5-0 curr-segment) (-> s5-0 segment-list)) + (set! (-> s5-0 curr-u) (/ 16384.0 (-> s5-0 curr-segment dist))) + (set! (-> obj curr-dest-pt) sv-32) + ) + ) + ) + ) + v0-15 + ) + (else + (if *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) arg1 (meters 1) *color-red*) + ) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod hover-nav-control-method-29 hover-nav-control ((obj hover-nav-control) (arg0 vector)) + (let ((a0-1 (the-as list-node #f)) + (s4-0 (the-as list-node (-> obj path-info segment-list))) + ) + (while s4-0 + (cond + (a0-1 + (set! (-> (the-as hover-nav-path-segment s4-0) curve-matrix vector 2 quad) + (-> (the-as vector (-> (the-as hover-nav-path-segment a0-1) curve-matrix trans)) quad) + ) + ) + (arg0 + (set! (-> (the-as hover-nav-path-segment s4-0) curve-matrix vector 2 quad) (-> arg0 quad)) + ) + (else + (vector-normalize! + (vector-! + (-> (the-as hover-nav-path-segment s4-0) curve-matrix vector 2) + (-> (the-as hover-nav-path-segment s4-0) curve-matrix vector 1) + (the-as vector (-> (the-as hover-nav-path-segment s4-0) curve-matrix)) + ) + (hover-nav-control-method-30 obj) + ) + ) + ) + (let ((a0-9 (-> s4-0 next))) + (cond + (a0-9 + (vector-! + (-> (the-as hover-nav-path-segment s4-0) curve-matrix trans) + (-> (the-as hover-nav-path-segment a0-9) curve-matrix vector 1) + (the-as vector (+ (the-as uint s4-0) 16)) + ) + (vector-float*! + (-> (the-as hover-nav-path-segment s4-0) curve-matrix trans) + (-> (the-as hover-nav-path-segment s4-0) curve-matrix trans) + 0.5 + ) + ) + (else + (set-vector! (-> (the-as hover-nav-path-segment s4-0) curve-matrix trans) 0.0 0.0 0.0 0.0) + ) + ) + ) + (set! a0-1 s4-0) + (set! s4-0 (-> s4-0 next)) + ) + ) + 0 + (none) + ) + +(defmethod hover-nav-control-method-30 hover-nav-control ((obj hover-nav-control)) + (* (-> obj max-speed-multiplier) (-> obj params max-speed)) + ) + +(defmethod hover-nav-control-method-31 hover-nav-control ((obj hover-nav-control)) + (* (-> obj max-acceleration-multiplier) (-> obj params max-acceleration)) + ) + +(defmethod hover-nav-control-method-14 hover-nav-control ((obj hover-nav-control) (arg0 float) (arg1 float)) + (set! (-> obj max-speed-multiplier) arg0) + (set! (-> obj max-acceleration-multiplier) arg1) + 0 + (none) + ) + +(defmethod hover-nav-control-method-18 hover-nav-control ((obj hover-nav-control) (arg0 path-control) (arg1 int) (arg2 int)) + (hover-nav-control-method-21 obj) + (set! arg2 (cond + ((= arg2 -1) + (+ (-> arg0 curve num-cverts) -2) + ) + (else + (empty) + arg2 + ) + ) + ) + (while (>= arg2 (if (= arg1 -1) + 0 + arg1 + ) + ) + (let ((s2-0 (get-point-in-path! arg0 (new 'stack-no-clear 'vector) (the float arg2) 'interp)) + (a3-3 (get-point-in-path! arg0 (new 'stack-no-clear 'vector) (the float (+ arg2 1)) 'interp)) + ) + (hover-nav-path-segment-method-9 + (nav-network-method-22 (-> obj nav) (-> obj path-info) s2-0 a3-3 -1 -1) + (hover-nav-control-method-30 obj) + ) + ) + (+! arg2 -1) + ) + (hover-nav-control-method-29 obj (the-as vector #f)) + (set! (-> obj path-info curr-segment) (-> obj path-info segment-list)) + (logior! (-> obj flags) 1) + 0 + (none) + ) + +(defmethod hover-nav-control-method-19 hover-nav-control ((obj hover-nav-control) (arg0 (inline-array vector)) (arg1 int)) + (hover-nav-control-method-21 obj) + (let ((s4-1 (+ arg1 -2))) + (while (>= s4-1 0) + (hover-nav-path-segment-method-9 + (nav-network-method-22 (-> obj nav) (-> obj path-info) (-> arg0 s4-1) (-> arg0 (+ s4-1 1)) -1 -1) + (hover-nav-control-method-30 obj) + ) + (+! s4-1 -1) + ) + ) + (hover-nav-control-method-29 obj (the-as vector #f)) + (set! (-> obj path-info curr-segment) (-> obj path-info segment-list)) + (logior! (-> obj flags) 1) + 0 + (none) + ) + +(defmethod hover-nav-control-method-20 hover-nav-control ((obj hover-nav-control)) + (hover-nav-control-method-21 obj) + (set! (-> obj flags) (logand -2 (-> obj flags))) + 0 + (none) + ) + +(defmethod hover-nav-control-method-17 hover-nav-control ((obj hover-nav-control)) + (-> (the-as collide-shape-prim-group (-> obj root root-prim)) + child + (-> obj params nav-collide-prim-index) + prim-core + ) + ) + +;; WARN: Return type mismatch vector vs none. +(defmethod hover-nav-control-method-15 hover-nav-control ((obj hover-nav-control) (arg0 vector)) + (local-vars (sv-32 vector) (sv-36 collide-shape-moving)) + (set! sv-32 (new 'stack-no-clear 'vector)) + (set! sv-36 (-> obj root)) + (vector-inv-orient-by-quat! sv-32 (-> sv-36 transv) (-> sv-36 quat)) + (vector-float*! arg0 sv-32 (/ 1.0 (hover-nav-control-method-30 obj))) + (none) + ) + +(defmethod hover-nav-control-method-16 hover-nav-control ((obj hover-nav-control) (arg0 vector)) + (local-vars (sv-32 vector)) + (set! sv-32 (new 'stack-no-clear 'vector)) + (vector-inv-orient-by-quat! sv-32 (-> obj transvv) (-> obj root quat)) + (vector-float*! arg0 sv-32 (/ 1.0 (hover-nav-control-method-31 obj))) + ) + +(defmethod hover-nav-control-method-10 hover-nav-control ((obj hover-nav-control) (arg0 vector) (arg1 vector) (arg2 vector)) + (set! (-> obj dest-pos quad) (-> arg0 quad)) + (cond + ;; condition has been changed from `arg2` because some places call this method with #t as arg2 + ((and (!= arg2 #t) arg2) ;arg2 + (set! (-> obj dest-vel quad) (-> arg2 quad)) + (set! (-> obj root transv quad) (-> arg2 quad)) + ) + (else + (set! (-> obj dest-vel quad) (the-as uint128 0)) + (set! (-> obj root transv quad) (the-as uint128 0)) + ) + ) + (vector-normalize-copy! (-> obj dest-move-dir) arg1 1.0) + 0 + (none) + ) + +(defmethod hover-nav-control-method-24 hover-nav-control ((obj hover-nav-control)) + (with-pp + (when (not (logtest? (-> obj flags) 1)) + (let ((s5-0 (new 'stack-no-clear 'collide-query))) + (-> obj params) + (let ((v1-5 (hover-nav-control-method-17 obj)) + (s4-0 (-> obj root transv)) + ) + (when (< 0.0 (vector-length s4-0)) + (set! (-> s5-0 start-pos quad) (-> v1-5 world-sphere quad)) + (set! (-> s5-0 move-dist quad) (-> s4-0 quad)) + (let ((f0-1 (vector-length (-> s5-0 move-dist)))) + (if (< 40960.0 f0-1) + (vector-float*! (-> s5-0 move-dist) (-> s5-0 move-dist) (/ 40960.0 f0-1)) + ) + ) + (let ((a0-14 s5-0)) + (set! (-> a0-14 radius) (-> v1-5 world-sphere w)) + (set! (-> a0-14 collide-with) (-> obj root root-prim prim-core collide-with)) + (set! (-> a0-14 ignore-process0) (-> obj root process)) + (set! (-> a0-14 ignore-process1) #f) + (set! (-> a0-14 ignore-pat) (-> obj root pat-ignore-mask)) + (set! (-> a0-14 action-mask) (collide-action solid)) + ) + (let ((f0-4 (fill-and-probe-using-line-sphere *collide-cache* s5-0))) + (cond + ((>= f0-4 0.0) + (set! (-> obj los-obstruction-distance) (* f0-4 (vector-length s4-0))) + (logior! (-> obj flags) 2) + ) + (else + (set! (-> obj los-last-clear-time) (-> pp clock frame-counter)) + (set! (-> obj flags) (logand -3 (-> obj flags))) + ) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod hover-nav-control-method-11 hover-nav-control ((obj hover-nav-control) (arg0 vector)) + (local-vars (sv-288 vector) (sv-304 vector) (sv-320 vector) (sv-336 vector) (sv-352 int)) + (with-pp + (when *debug-hover* + (if arg0 + (add-debug-sphere #t (bucket-id debug2) arg0 (meters 0.9) *color-yellow*) + ) + (if (!= (-> obj curr-dest-pt) -1) + (add-debug-sphere + #t + (bucket-id debug-no-zbuf1) + (-> obj nav network (-> obj curr-dest-pt) pos) + (meters 0.4) + *color-blue* + ) + ) + ) + (when (not (logtest? (-> obj flags) 1)) + (cond + ((and arg0 (and (< (vector-vector-distance arg0 (-> obj root trans)) 40960.0) + (>= (-> obj los-last-clear-time) (+ (-> pp clock frame-counter) (seconds -0.2))) + ) + ) + (if (not (and (-> obj path-info curr-segment) (< (-> obj path-info curr-u) 1.0))) + (hover-nav-control-method-21 obj) + ) + ) + ((or (>= (- (-> pp clock frame-counter) (-> obj los-last-clear-time)) (seconds 1)) + (not (-> obj path-info curr-segment)) + ) + (hover-nav-control-method-21 obj) + (when arg0 + (let ((s4-0 (new 'stack-no-clear 'vector))) + (set! (-> s4-0 quad) (-> obj root transv quad)) + (if (>= (- (-> pp clock frame-counter) (-> obj los-last-clear-time)) (seconds 1)) + (vector-normalize! s4-0 (fmin (vector-length s4-0) (-> obj los-obstruction-distance))) + ) + (hover-nav-control-method-28 + obj + (vector+! (new 'stack-no-clear 'vector) (the-as vector (hover-nav-control-method-17 obj)) s4-0) + arg0 + ) + ) + ) + ) + ) + ) + (let ((s4-1 (new 'stack-no-clear 'vector))) + (let* ((s3-1 (-> obj path-info)) + (s2-1 (-> s3-1 curr-segment)) + ) + (cond + (s2-1 + (when *debug-hover* + (let ((s1-2 (the-as list-node (-> s3-1 segment-list)))) + (while s1-2 + (add-debug-x + #t + (bucket-id debug-no-zbuf1) + (the-as vector (+ (the-as uint s1-2) 16)) + (new 'static 'rgba :r #xff :g #xff :b #xff :a #x40) + ) + (let ((s0-0 (matrix*! (new 'stack-no-clear 'matrix) *hermite-matrix* (the-as matrix (+ (the-as uint s1-2) 16))))) + (set! sv-288 (new 'stack-no-clear 'vector)) + (set! sv-304 (new 'stack-no-clear 'vector)) + (set! sv-320 (new 'stack-no-clear 'vector)) + (set! sv-336 (new 'stack-no-clear 'vector)) + (let ((f30-0 0.0) + (f28-0 0.1) + ) + (set! sv-352 0) + (while (< sv-352 10) + (set-vector! sv-288 (* f30-0 f30-0 f30-0) (* f30-0 f30-0) f30-0 1.0) + (set-vector! sv-304 (* f28-0 f28-0 f28-0) (* f28-0 f28-0) f28-0 1.0) + (vector-matrix*! sv-320 sv-288 s0-0) + (vector-matrix*! sv-336 sv-304 s0-0) + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + sv-320 + sv-336 + (new 'static 'rgba :r #xff :g #xff :b #xff :a #x40) + #f + (the-as rgba -1) + ) + (set! f30-0 (+ 0.1 f30-0)) + (set! f28-0 (+ 0.1 f28-0)) + (set! sv-352 (+ sv-352 1)) + ) + ) + ) + (set! s1-2 (-> s1-2 next)) + ) + ) + ) + (if arg0 + (set! (-> s3-1 tail-segment curve-matrix vector 1 quad) (-> arg0 quad)) + ) + (let ((f30-1 (-> s3-1 curr-u)) + (a2-11 (matrix*! (new 'stack-no-clear 'matrix) *hermite-matrix* (-> s2-1 curve-matrix))) + (a1-12 (new 'stack-no-clear 'vector)) + ) + (set-vector! a1-12 (* f30-1 f30-1 f30-1) (* f30-1 f30-1) f30-1 1.0) + (vector-matrix*! s4-1 a1-12 a2-11) + ) + (if *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) s4-1 (meters 0.8) *color-magenta*) + ) + (let ((f0-19 (+ 2048.0 (vector-length (-> obj root transv))))) + (if (logtest? (-> obj flags) 2) + (set! f0-19 (fmin f0-19 (fmax 8192.0 (-> obj los-obstruction-distance)))) + ) + (hover-nav-path-segment-method-9 s2-1 f0-19) + ) + (seek! (-> s3-1 curr-u) 1.0 (* (-> s2-1 du) (-> pp clock seconds-per-frame))) + (when (and (>= (-> s3-1 curr-u) 1.0) (-> s2-1 next)) + (set! (-> s3-1 curr-segment) (the-as hover-nav-path-segment (-> s2-1 next))) + (set! (-> s3-1 curr-u) 0.0) + (hover-nav-path-segment-method-9 (-> s3-1 curr-segment) (hover-nav-control-method-30 obj)) + ) + ) + (arg0 + (set! (-> s4-1 quad) (-> arg0 quad)) + ) + (else + (set! (-> s4-1 quad) (-> (hover-nav-control-method-17 obj) world-sphere quad)) + ) + ) + ) + (let ((v1-94 (vector-! (new 'stack-no-clear 'vector) s4-1 (-> obj dest-pos)))) + (set! (-> obj dest-pos quad) (-> s4-1 quad)) + (vector-float*! (-> obj dest-vel) v1-94 (-> pp clock frames-per-second)) + ) + ) + (if (< 0.0 (vector-length (-> obj dest-vel))) + (vector-normalize-copy! (-> obj dest-move-dir) (-> obj dest-vel) 1.0) + ) + 0 + (none) + ) + ) + +(defmethod hover-nav-control-method-25 hover-nav-control ((obj hover-nav-control)) + (with-pp + (let ((s5-0 (new 'stack-no-clear 'hover-nav-path-segment)) + (f28-0 (hover-nav-control-method-31 obj)) + (f30-0 (hover-nav-control-method-30 obj)) + (s3-0 (-> obj root transv)) + ) + (-> obj transvv) + (let ((s4-0 (-> obj dest-offset))) + (vector-normalize-copy! (-> s5-0 curve-matrix vector 2) s3-0 1.0) + (vector-normalize-copy! (-> s5-0 curve-matrix trans) s4-0 1.0) + (set! (-> s5-0 pos-index 0) (vector-dot s3-0 (-> s5-0 curve-matrix trans))) + (set! (-> s5-0 pos-index 1) (/ (* 0.5 (-> s5-0 pos-index 0) (-> s5-0 pos-index 0)) (* 0.2 f28-0))) + (set! (-> s5-0 dist) (vector-dot (-> obj dest-vel) (-> s5-0 curve-matrix trans))) + (vector-normalize-copy! (-> s5-0 curve-matrix vector 1) s4-0 (-> obj target-speed)) + (vector-! (the-as vector (-> s5-0 curve-matrix)) (-> s5-0 curve-matrix vector 1) s3-0) + (let ((f0-9 (vector-length (the-as vector (-> s5-0 curve-matrix))))) + (if (< f28-0 f0-9) + (vector-float*! (the-as vector (-> s5-0 curve-matrix)) (the-as vector (-> s5-0 curve-matrix)) (/ f28-0 f0-9)) + ) + ) + (vector+float*! + (the-as vector (&-> s5-0 next)) + (-> obj root transv) + (the-as vector (-> s5-0 curve-matrix)) + (-> pp clock seconds-per-frame) + ) + (let ((f0-12 (vector-length (the-as vector (&-> s5-0 next)))) + (f1-6 (if (logtest? (-> obj flags) 2) + (fmax 8192.0 (* 0.8 (-> obj los-obstruction-distance))) + f30-0 + ) + ) + ) + (if (< f1-6 f0-12) + (vector-float*! (the-as vector (&-> s5-0 next)) (the-as vector (&-> s5-0 next)) (/ f1-6 f0-12)) + ) + ) + (set! (-> obj root transv quad) (-> (the-as vector (&-> s5-0 next)) quad)) + (set! (-> obj transvv quad) (-> s5-0 curve-matrix quad 0)) + (when *debug-hover* + (format *stdcon* " speed act: ~m target: ~m~%" (-> s5-0 pos-index 0) (-> obj target-speed)) + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> obj root trans) + (-> obj root transv) + (meters 0.00024414062) + *color-yellow* + ) + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> obj root trans) + (-> s5-0 curve-matrix vector 1) + (meters 0.00024414062) + *color-cyan* + ) + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> obj root trans) + (-> obj transvv) + (meters 0.00024414062) + *color-blue* + ) + (add-debug-x + #t + (bucket-id debug-no-zbuf1) + (vector+! (new 'stack-no-clear 'vector) (-> obj root trans) s4-0) + *color-green* + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod hover-nav-control-method-12 hover-nav-control ((obj hover-nav-control)) + (local-vars (at-0 int)) + (with-pp + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (hover-nav-control-method-25 obj) + (hover-nav-control-method-24 obj) + (let ((v1-5 (-> obj root transv)) + (a0-4 (-> obj root transv)) + (a1-0 (new 'stack-no-clear 'vector)) + ) + (.lvf vf1 (&-> (-> obj nav-collide-impulse) quad)) + (let ((f0-0 (-> pp clock seconds-per-frame))) + (.mov at-0 f0-0) + ) + (.mov vf2 at-0) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a1-0 quad) vf1) + (vector+! v1-5 a0-4 a1-0) + ) + (let ((v1-7 (-> obj root)) + (a2-2 (new 'stack-no-clear 'collide-query)) + ) + (set! (-> a2-2 collide-with) (-> v1-7 root-prim prim-core collide-with)) + (set! (-> a2-2 ignore-process0) (-> v1-7 process)) + (set! (-> a2-2 ignore-process1) #f) + (set! (-> a2-2 ignore-pat) (-> v1-7 pat-ignore-mask)) + (set! (-> a2-2 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide v1-7 (-> v1-7 transv) a2-2 (meters 0)) + ) + (vector-float*! + (-> obj root transv) + (-> obj root transv) + (- 1.0 (* (-> obj params friction) (-> pp clock seconds-per-frame))) + ) + 0 + (none) + ) + ) + ) + +;; ERROR: Stack slot load at 128 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 144 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 160 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 128 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 144 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 160 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 128 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 144 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 160 mismatch: defined as size 4, got size 16 +(defmethod hover-nav-control-method-13 hover-nav-control ((obj hover-nav-control)) + (local-vars (sv-112 float) (sv-128 float) (sv-144 float) (sv-160 float)) + (with-pp + (let* ((s5-0 (-> obj root)) + (s3-0 (hover-nav-control-method-17 obj)) + (v1-2 (vector-! (new 'stack-no-clear 'vector) (the-as vector s3-0) (-> s5-0 trans))) + (s4-1 (vector-! (new 'stack-no-clear 'vector) (-> obj dest-pos) v1-2)) + ) + (when (not (logtest? (-> obj flags) 1)) + (let* ((s2-0 (-> obj root transv)) + (f30-0 (vector-length s2-0)) + (s1-0 lerp-scale) + (s0-0 0.0) + ) + (set! sv-112 (hover-nav-control-method-30 obj)) + (set! sv-128 (* 2.0 f30-0)) + (set! sv-144 (the-as float 0.0)) + (let* ((t0-0 (hover-nav-control-method-30 obj)) + (f0-4 (s1-0 s0-0 sv-112 sv-128 sv-144 t0-0)) + (t0-2 (vector+float*! (new 'stack-no-clear 'vector) (the-as vector s3-0) s2-0 (/ f0-4 f30-0))) + (s2-1 (nav-network-method-26 + (-> obj nav) + (new 'stack-no-clear 'vector) + (-> obj root process) + (the-as vector s3-0) + t0-2 + (-> s3-0 world-sphere w) + ) + ) + ) + (let ((f0-7 (vector-length s2-1)) + (s1-1 seek) + (s0-1 (-> obj nav-collide-impulse-len)) + ) + (set! sv-160 f0-7) + (let ((a2-2 (* (hover-nav-control-method-31 obj) (-> pp clock seconds-per-frame)))) + (set! (-> obj nav-collide-impulse-len) (s1-1 s0-1 sv-160 a2-2)) + ) + ) + (vector-normalize-copy! (-> obj nav-collide-impulse) s2-1 (- (-> obj nav-collide-impulse-len))) + ) + ) + (if *debug-hover* + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (the-as vector s3-0) + (-> obj nav-collide-impulse) + (meters 0.00024414062) + *color-red* + ) + ) + ) + (let ((f30-1 (hover-nav-control-method-31 obj)) + (f28-0 (hover-nav-control-method-30 obj)) + ) + (vector-z-quaternion! (-> obj move-dir) (-> s5-0 quat)) + (set! (-> obj speed) (vector-length (-> s5-0 transv))) + (vector-! (-> obj dest-offset) s4-1 (-> s5-0 trans)) + (let ((s4-2 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> obj dest-offset) 1.0)) + (v0-13 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 transv) 1.0)) + ) + (set! (-> obj speed-dest) (vector-dot (-> s5-0 transv) s4-2)) + (set! (-> obj local-dist) (vector-dot v0-13 (-> obj dest-offset))) + ) + (let* ((f0-20 (fmax 0.0 (+ -2048.0 (vector-length (-> obj dest-offset))))) + (f1-5 (sqrtf (* 1.6 f0-20 f30-1))) + (f0-23 0.0) + ) + (seek! (-> obj target-speed) (fmax (fmin f1-5 f28-0) f0-23) (* 0.9 (-> pp clock seconds-per-frame) f30-1)) + ) + ) + ) + (when *debug-hover* + (add-debug-x #t (bucket-id debug-no-zbuf1) (-> obj dest-pos) *color-white*) + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> obj dest-pos) + (-> obj dest-vel) + (meters 0.00024414062) + *color-white* + ) + ) + 0 + (none) + ) + ) + +(defun hover-bounce-reaction ((arg0 control-info) (arg1 collide-query) (arg2 vector) (arg3 vector)) + (cshape-reaction-update-state arg0 arg1 arg3) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (vector-reflect! s4-0 arg3 (-> arg0 surface-normal)) + (vector-float*! arg2 s4-0 0.4) + ) + (-> arg0 status) + ) + +(defmethod hover-nav-control-method-9 hover-nav-control ((obj hover-nav-control)) + (hover-nav-control-method-21 obj) + 0 + (none) + ) + +(defmethod relocate hover-nav-control ((obj hover-nav-control) (arg0 int)) + (if (nonzero? (-> obj root)) + (&+! (-> obj root) arg0) + ) + obj + ) + +(defmethod new hover-nav-control ((allocation symbol) (type-to-make type) (arg0 process) (arg1 collide-shape-moving) (arg2 hover-nav-params)) + (with-pp + (let ((s5-0 (object-new allocation type-to-make (the-as int (-> type-to-make size))))) + (set! (-> s5-0 root) arg1) + (set! (-> s5-0 root reaction) hover-bounce-reaction) + (set! (-> s5-0 nav) *nav-network*) + (set! (-> s5-0 path-info segment-list) #f) + (set! (-> s5-0 path-info tail-segment) #f) + (set! (-> s5-0 path-info curr-segment) #f) + (set! (-> s5-0 path-info curr-u) 0.0) + (set! (-> s5-0 flags) (the-as uint 0)) + (set! (-> s5-0 params) arg2) + (set! *hover-nav-time-offset* (+ *hover-nav-time-offset* 1)) + (vector-reset! (-> s5-0 dest-pos)) + (set! (-> s5-0 dest-vel quad) (the-as uint128 0)) + (set! (-> s5-0 dest-move-dir quad) (the-as uint128 0)) + (set! (-> s5-0 dest-offset quad) (the-as uint128 0)) + (set! (-> s5-0 nav-collide-impulse quad) (the-as uint128 0)) + (vector-z-quaternion! (-> s5-0 move-dir) (-> s5-0 root quat)) + (set! (-> s5-0 nav-collide-impulse-len) 0.0) + (set! (-> s5-0 speed) 0.0) + (set! (-> s5-0 target-speed) 0.0) + (set! (-> s5-0 target-acceleration) 0.0) + (set! (-> s5-0 speed-dest) 0.0) + (set! (-> s5-0 curr-dest-pt) -1) + (set! (-> s5-0 los-obstruction-distance) 0.0) + (set! (-> s5-0 los-last-clear-time) (-> pp clock frame-counter)) + (hover-nav-control-method-14 s5-0 1.0 1.0) + (nav-network-method-25 (-> s5-0 nav) arg0 (the-as collide-prim-core #f)) + s5-0 + ) + ) + ) diff --git a/goal_src/jak2/levels/common/enemy/hover/wasp.gc b/goal_src/jak2/levels/common/enemy/hover/wasp.gc index ac1301949e..96c0abfd6e 100644 --- a/goal_src/jak2/levels/common/enemy/hover/wasp.gc +++ b/goal_src/jak2/levels/common/enemy/hover/wasp.gc @@ -7,3 +7,1615 @@ ;; DECOMP BEGINS +(defpartgroup group-wasp-explosion + :id 157 + :duration (seconds 2) + :linger-duration (seconds 1) + :flags (use-local-clock unk-5 unk-6 unk-7) + :bounds (static-bspherem 0 0 0 15) + :rotate ((degrees 0) (degrees 4) (degrees 0)) + :scale (0.0 16384.0 0.0) + :parts ((sp-item 726 :flags (bit6) :period 900 :length 5) + (sp-item 727 :flags (bit6) :period 900 :length 5) + (sp-item 728 :period 900 :length 15) + (sp-item 729 :fade-after (meters 60) :period 900 :length 10 :offset 10) + (sp-item 730 :fade-after (meters 60) :falloff-to (meters 60) :period 900 :length 50 :offset 20) + (sp-item 731 :fade-after (meters 200) :falloff-to (meters 200) :period 900 :length 25 :offset 20) + (sp-item 732 :fade-after (meters 150) :falloff-to (meters 150) :period 900 :length 20 :offset 30) + ) + ) + +(defpart 727 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 2)) + (sp-flt spt-rot-x 2048.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 24.0) + (sp-flt spt-scalevel-x (meters 0.10666667)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -4.266667) + (sp-flt spt-fade-b -4.266667) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 150) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 glow) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 733) + ) + ) + +(defpart 733 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.85333335) + (sp-flt spt-fade-g -1.7066667) + (sp-flt spt-fade-b -1.7066667) + (sp-flt spt-fade-a -0.64) + ) + ) + +(defpart 732 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x34 :page #xc)) + (sp-rnd-flt spt-num 2.0 0.2 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-rot-z) + :flags (sp-flag spflag7) + :random-rangef 655360.0 + :random-multf 1.0 + ) + (sp-rnd-flt spt-scale-y (meters 0.8) (meters 0.2) 1.0) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 734) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-conerot-x) + :flags (sp-flag from-pointer) + :func '*sp-temp* + ) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 731 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x33 :page #xc)) + (sp-func spt-birth-func 'birth-func-texture-group) + (sp-flt spt-num 3.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (sp-flt spt-rot-z (degrees 0.0)) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.02) (meters 0.01) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-userdata) + :flags (sp-flag plain-v2) + :object (new 'static 'boxed-array :type int32 40 1 0 #xc00000 #xc03300) + ) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 734) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 734 + :init-specs ((sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.0) + (sp-flt spt-fade-b 0.0) + (sp-int-plain-rnd spt-next-time 5 19 1) + (sp-launcher-by-id spt-next-launcher 735) + ) + ) + +(defpart 735 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.016666668) (meters 0.016666668) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.44) + (sp-flt spt-fade-g -2.36) + (sp-flt spt-fade-b -2.64) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 736) + ) + ) + +(defpart 736 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.008333334) (meters 0.008333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -1.2944444) + (sp-flt spt-fade-g -0.7111111) + (sp-flt spt-fade-b -0.094444446) + (sp-rnd-flt spt-fade-a -0.06545454 -0.06545454 1.0) + (sp-int-plain-rnd spt-next-time 150 29 1) + (sp-launcher-by-id spt-next-launcher 737) + ) + ) + +(defpart 737 + :init-specs ((sp-flt spt-fade-r 0.0) (sp-flt spt-fade-g 0.0) (sp-flt spt-fade-b 0.0) (sp-flt spt-fade-a -0.1125)) + ) + +(defpart 726 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 5)) + (sp-flt spt-rot-x 2048.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 96.0) + (sp-flt spt-scalevel-x (meters 0.5)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -1.28) + (sp-flt spt-fade-b -5.1) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 65) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-int spt-next-time 30) + (sp-launcher-by-id spt-next-launcher 738) + ) + ) + +(defpart 738 + :init-specs ((sp-flt spt-scalevel-x (meters -0.2857143)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -3.6571429) + (sp-flt spt-fade-b 0.0) + (sp-flt spt-fade-a -2.7428572) + ) + ) + +(defpart 730 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x32 :page #xc)) + (sp-rnd-flt spt-num 8.0 2.0 1.0) + (sp-flt spt-x (meters 0.25)) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.25) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 16.0 48.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.083333336) (meters 0.083333336) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.006666667) (meters 0.0016666667) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.18) + (sp-flt spt-fade-b -2.12) + (sp-rnd-flt spt-accel-y -0.68266666 -1.3653333 1.0) + (sp-flt spt-friction 0.87) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 739) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 739 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0016666667)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.02) + (sp-flt spt-fade-b 0.23555556) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 740) + ) + ) + +(defpart 740 + :init-specs ((sp-flt spt-fade-r -0.5543478) (sp-flt spt-fade-g -0.5543478) (sp-flt spt-fade-a -0.13913043)) + ) + +(defpart 728 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 8.0 1.0 1.0) + (sp-rnd-flt spt-x (meters 0) (meters 0.6) 1.0) + (sp-rnd-flt spt-scale-x (meters 2.5) (meters 2) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 70.0 20.0 1.0) + (sp-rnd-flt spt-g 70.0 20.0 1.0) + (sp-rnd-flt spt-b 70.0 20.0 1.0) + (sp-rnd-flt spt-a 0.0 40.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0) (meters 0.1) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.033333335) (meters 0.02) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 3.3) + (sp-flt spt-fade-g 3.12) + (sp-flt spt-fade-b 1.18) + (sp-flt spt-fade-a 1.76) + (sp-flt spt-friction 0.88) + (sp-int spt-timer 710) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 741) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 741 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.53333336) + (sp-flt spt-fade-g -1.9666667) + (sp-flt spt-fade-b -2.2) + (sp-flt spt-fade-a -0.41666666) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 742) + ) + ) + +(defpart 742 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.38833332) + (sp-flt spt-fade-g -0.21333334) + (sp-flt spt-fade-b -0.028333334) + (sp-flt spt-fade-a -0.38833332) + ) + ) + +(defpart 729 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x31 :page #xc)) + (sp-rnd-flt spt-num 4.0 2.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.2) (meters 0.5) 1.0) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.2) (meters 0.1) 1.0) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-flt spt-g 96.0) + (sp-flt spt-b 64.0) + (sp-rnd-flt spt-a 64.0 64.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.13333334) (meters 0.02) 1.0) + (sp-flt spt-fade-g 1.6) + (sp-flt spt-fade-b 3.2) + (sp-flt spt-fade-a -1.6) + (sp-int spt-timer 90) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + ) + ) + +(deftype wasp-shot (metalhead-shot) + () + :heap-base #x170 + :method-count-assert 40 + :size-assert #x1f0 + :flag-assert #x28017001f0 + ) + + +(defmethod play-impact-sound wasp-shot ((obj wasp-shot) (arg0 projectile-options)) + (let ((v1-0 arg0)) + (cond + ((zero? v1-0) + (sound-play "wasp-shot-fire") + ) + ((= v1-0 (projectile-options lose-altitude)) + (sound-play "wasp-shot-hit") + ) + ) + ) + 0 + (none) + ) + +(defmethod init-proj-settings! wasp-shot ((obj wasp-shot)) + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" + (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) + (set! (-> obj attack-mode) 'wasp-shot) + (set! (-> obj max-speed) 491520.0) + (set! (-> obj move) metalhead-shot-move) + (set! (-> obj timeout) (seconds 1.375)) + 0 + (none) + ) + +(defskelgroup skel-wasp wasp wasp-lod0-jg -1 + ((wasp-lod0-mg (meters 20)) (wasp-lod1-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :shadow wasp-shadow-mg + :origin-joint-index 3 + ) + +(defskelgroup skel-wasp-explode wasp wasp-explode-lod0-jg wasp-explode-idle-ja + ((wasp-explode-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :origin-joint-index 3 + ) + +(define *wasp-exploder-params* + (new 'static 'joint-exploder-static-params + :joints (new 'static 'boxed-array :type joint-exploder-static-joint-params + (new 'static 'joint-exploder-static-joint-params :joint-index 3 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 4 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 5 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 6 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 7 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 8 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 9 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 10 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 11 :parent-joint-index -1) + ) + :collide-spec #x1 + ) + ) + +(define *wasp-enemy-info* (new 'static 'enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #f + :hover-if-no-ground #f + :idle-anim-script #f + :idle-anim 4 + :notice-anim 4 + :hostile-anim 4 + :hit-anim 12 + :knocked-anim 10 + :knocked-land-anim 11 + :die-anim 14 + :die-falling-anim 15 + :victory-anim 4 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 7 + :look-at-joint 7 + :bullseye-joint 4 + :sound-hit (static-sound-name "wasp-hit") + :sound-die (static-sound-name "wasp-die") + :notice-distance (meters 70) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 55) + :default-hit-points 6 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 2730.6667 + :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 53248.0 + :knocked-hard-vxz-hi 101580.8 + :knocked-hard-vy-lo 60620.8 + :knocked-hard-vy-hi 95027.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 10) + :shadow-min-y (meters -20) + :shadow-locus-dist (meters 150) + :gem-joint 7 + :gem-offset (new 'static 'sphere :r 163840.0) + ) + ) + +(set! (-> *wasp-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod general-event-handler wasp ((obj wasp) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('hit 'hit-knocked) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (if (zero? (-> obj hit-points)) + (go (method-of-object obj die-explode)) + (go (method-of-object obj knocked)) + ) + ) + (else + ((method-of-type hover-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +(defmethod enemy-method-52 wasp ((obj wasp) (arg0 vector)) + (let ((s4-0 (-> obj root-override2))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-2)) + (let ((gp-1 (-> obj root-override2 transv))) + (let ((a1-1 (handle->process (-> obj incoming attacker-handle)))) + (if a1-1 + (vector-! gp-1 (-> (the-as process-focusable a1-1) root-override trans) (-> obj root-override2 trans)) + (vector-! gp-1 (-> obj incoming attacker-pos) (-> obj root-override2 trans)) + ) + ) + (set! (-> gp-1 y) 0.0) + (vector-normalize! gp-1 1.0) + (vector-rotate90-around-y! gp-1 gp-1) + (if (< 0.0 (vector-dot + (vector-! (new 'stack-no-clear 'vector) (-> obj incoming attacker-pos) (-> s4-0 trans)) + (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> s4-0 quat)) + ) + ) + (vector-negate! gp-1 gp-1) + ) + (let ((f30-1 (get-rand-float-range obj 0.0 1.0)) + (s5-1 (-> obj enemy-info)) + ) + (vector-float*! gp-1 gp-1 (lerp (-> s5-1 knocked-hard-vxz-lo) (-> s5-1 knocked-hard-vxz-hi) f30-1)) + (set! (-> gp-1 y) (lerp (-> s5-1 knocked-hard-vy-lo) (-> s5-1 knocked-hard-vy-hi) f30-1)) + ) + ) + ) + (else + ((the-as (function enemy vector none) (find-parent-method wasp 52)) obj arg0) + ) + ) + ) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-idle wasp ((obj wasp)) + (cond + ((logtest? (-> obj fact-info-override enemy-options) (enemy-option user0)) + (go (method-of-object obj shoot-bridge-wait)) + ) + ((logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (go (method-of-object obj ambush)) + ) + (else + (go (method-of-object obj notice)) + ) + ) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-hostile wasp ((obj wasp)) + (go (method-of-object obj hostile)) + (none) + ) + +(defmethod react-to-focus wasp ((obj wasp)) + "@TODO - flesh out docs" + (go-hostile obj) + (none) + ) + +(defmethod enemy-method-129 wasp ((obj wasp)) + (if (logtest? (-> obj fact-info-override enemy-options) (enemy-option user0)) + (set! (-> obj focus-pos quad) (-> obj plat-pos quad)) + ((method-of-type hover-enemy enemy-method-129) obj) + ) + (none) + ) + +(defmethod track-target! wasp ((obj wasp)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (seek! (-> obj gun-x-angle) (-> obj gun-x-angle-final) (* 21845.334 (-> pp clock seconds-per-frame))) + ((method-of-type hover-enemy track-target!) obj) + (none) + ) + ) + +(defbehavior shoot-bridge-post wasp () + (get-point-at-percent-along-path! (-> self path) (-> self focus-pos) 0.5 'interp) + (hover-nav-control-method-11 (-> self hover) (-> self focus-pos)) + (hover-enemy-dest-post) + (none) + ) + +(defstate dormant (wasp) + :virtual #t + :enter (behavior () + (if (logtest? (-> self fact-info-override enemy-options) (enemy-option user0)) + (go-virtual shoot-bridge-wait) + ) + (none) + ) + ) + +(defstate ambush (wasp) + :virtual #t + :post (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy ambush) post))) + (if t9-0 + ((the-as (function none) t9-0)) + ) + ) + (set! (-> self last-fire-time) (+ (-> self clock frame-counter) (seconds -1.5))) + (none) + ) + ) + +(defstate notice (wasp) + :virtual #t + :post (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy notice) post))) + (if t9-0 + ((the-as (function none) t9-0)) + ) + ) + (set! (-> self last-fire-time) (+ (-> self clock frame-counter) (seconds -1.5))) + (none) + ) + ) + +(defstate shoot-bridge-wait (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('trigger) + (go-virtual shoot-bridge-intro) + ) + ) + ) + :enter (behavior () + (logior! (-> self enemy-flags) (enemy-flag use-notice-distance)) + (hover-enemy-method-140 self #f) + (if (logtest? (-> self path flags) (path-control-flag not-found)) + (go process-drawable-art-error "no path") + ) + (hover-enemy-method-141 self 1.0) + (hover-enemy-method-144 self) + (let ((s5-0 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 0.0 'interp)) + (s4-0 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp)) + (gp-0 (displacement-between-points-at-percent-normalized! (-> self path) (new 'stack-no-clear 'vector) 0.0)) + ) + (set! (-> self focus-pos quad) (-> s4-0 quad)) + (hover-nav-control-method-10 (-> self hover) s5-0 gp-0 (the-as vector #t)) + (set-vector! (-> self rotation-vec) 0.0 (vector-y-angle gp-0) 0.0 0.0) + ) + (hover-enemy-method-146 self) + (hover-nav-control-method-18 (-> self hover) (-> self path) -1 6) + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self bridge-index) 0) + (logclear! (-> self enemy-flags) (enemy-flag enable-on-active checking-water)) + (logclear! (-> self mask) (process-mask collectable)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-move-dest)) + (none) + ) + :exit (behavior () + (let ((gp-0 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 0.0 'interp)) + (v1-2 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp)) + ) + (hover-nav-control-method-10 + (-> self hover) + gp-0 + (vector-normalize! (vector-! (new 'stack-no-clear 'vector) v1-2 gp-0) 1.0) + (the-as vector #t) + ) + ) + (none) + ) + :code (the-as (function none :behavior wasp) sleep-code) + ) + +(defstate shoot-bridge-intro (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('shoot) + (go-virtual shoot-bridge-hostile) + ) + ) + ) + :enter (behavior () + (set! (-> self plat-pos quad) (-> self entity-group data 0 actor extra trans quad)) + (none) + ) + :trans (behavior () + (if (< (vector-vector-distance + (-> self root-override2 trans) + (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 6.0 'interp) + ) + 40960.0 + ) + (go-virtual shoot-bridge-hold) + ) + (none) + ) + :code (the-as (function none :behavior wasp) hover-enemy-fly-code) + :post (behavior () + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate shoot-bridge-hold (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('shoot) + (go-virtual shoot-bridge-hostile) + ) + ) + ) + :code (the-as (function none :behavior wasp) hover-enemy-fly-code) + :post (behavior () + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate shoot-bridge-hostile (wasp) + :virtual #t + :exit (-> (method-of-type wasp ambush) exit) + :trans (behavior () + (let ((v1-0 (-> self entity-group)) + (a0-0 (-> self bridge-index)) + ) + (cond + ((< a0-0 (-> v1-0 length)) + (let ((a1-1 (-> v1-0 data a0-0 actor extra trans))) + (set! (-> self plat-pos quad) (-> a1-1 quad)) + (set! (-> self plat-pos y) (+ -8192.0 (-> self plat-pos y))) + (set! (-> self focus-pos quad) (-> self plat-pos quad)) + (when (< (vector-vector-distance (-> self root-override2 trans) a1-1) + (- 327680.0 (* 81920.0 (the float (-> self bridge-index)))) + ) + (+! (-> self bridge-index) 1) + (go-virtual shoot-bridge-attack) + ) + ) + ) + (else + (go-virtual shoot-bridge-outro) + ) + ) + ) + (none) + ) + :code (the-as (function none :behavior wasp) hover-enemy-fly-code) + :post (behavior () + (let ((a1-0 (new 'stack-no-clear 'vector))) + (set! (-> a1-0 quad) (-> self focus-pos quad)) + (set! (-> a1-0 z) (+ 81920.0 (-> a1-0 z))) + (set! (-> a1-0 y) (+ 40960.0 (-> a1-0 y))) + (hover-nav-control-method-11 (-> self hover) a1-0) + ) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate shoot-bridge-attack (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (let ((gp-0 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> gp-0 ent) (-> self entity)) + (set! (-> gp-0 charge) 1.0) + (set! (-> gp-0 options) (projectile-options)) + (set! (-> gp-0 notify-handle) (the-as handle #f)) + (set! (-> gp-0 owner-handle) (the-as handle #f)) + (set! (-> gp-0 ignore-handle) (process->handle self)) + (let* ((v1-6 *game-info*) + (a0-6 (+ (-> v1-6 attack-id) 1)) + ) + (set! (-> v1-6 attack-id) a0-6) + (set! (-> gp-0 attack-id) a0-6) + ) + (set! (-> gp-0 timeout) (seconds 4)) + (spawn-wasp-shot self gp-0 19 0.000000000000000000000000000000000000000000024 -1.0) + (spawn-wasp-shot self gp-0 23 0.00000000000000000000000000000000000000000003 1.0) + ) + (sound-play "wasp-fire" :position (-> self root-override2 trans)) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self attack-miss-dist-curr) (-> self attack-miss-dist-min)) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (sound-play "wasp-warn" :position (-> self root-override2 trans)) + (ja-no-eval :group! (-> self draw art-group data (-> self hover-info shoot-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self hover-info shoot-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self restart-fly-anims) #t) + (go-virtual shoot-bridge-hostile) + (none) + ) + :post (behavior () + (let* ((a1-0 (-> self node-list data (-> self hover-info gun-base))) + (a0-2 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-4 (new 'stack-no-clear 'vector))) + (set! (-> v1-4 quad) (-> self focus-pos quad)) + (+! (-> v1-4 y) (-> self attack-miss-dist-curr)) + (vector-! gp-0 v1-4 a0-2) + ) + (vector-normalize! gp-0 1.0) + (set! (-> self gun-x-angle-final) (- (vector-x-angle gp-0))) + ) + (quaternion-vector-angle! (the-as quaternion (-> self gun-jmod target)) *x-vector* (-> self gun-x-angle)) + (seek! + (-> self attack-miss-dist-curr) + (-> self attack-miss-dist-max) + (* 0.5 (-> self clock seconds-per-frame) (- (-> self attack-miss-dist-max) (-> self attack-miss-dist-min))) + ) + (let ((a1-8 (new 'stack-no-clear 'vector))) + (set! (-> a1-8 quad) (-> self focus-pos quad)) + (set! (-> a1-8 z) (+ 81920.0 (-> a1-8 z))) + (set! (-> a1-8 y) (+ 40960.0 (-> a1-8 y))) + (hover-nav-control-method-11 (-> self hover) a1-8) + ) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate shoot-bridge-outro (wasp) + :virtual #t + :enter (behavior () + (let ((v1-1 (-> self root-override2 root-prim))) + (set! (-> v1-1 prim-core collide-as) (collide-spec)) + (set! (-> v1-1 prim-core collide-with) (collide-spec)) + ) + 0 + (hover-nav-control-method-18 (-> self hover) (-> self path) 7 -1) + (let ((gp-0 (get-point-at-percent-along-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp)) + (v1-7 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 8.0 'interp)) + ) + (set! (-> self focus-pos quad) (-> gp-0 quad)) + (hover-nav-control-method-10 + (-> self hover) + v1-7 + (vector-normalize! (vector-! (new 'stack-no-clear 'vector) v1-7 (-> self root-override2 trans)) 1.0) + (the-as vector #t) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :trans (behavior () + (when (< (vector-vector-distance + (-> self root-override2 trans) + (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) (get-num-segments (-> self path)) 'interp) + ) + 8192.0 + ) + (cleanup-for-death self) + (go empty-state) + ) + (none) + ) + :code (the-as (function none :behavior wasp) hover-enemy-fly-code) + :post (behavior () + (if (not (hover-nav-control-method-23 (-> self hover))) + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-nav-control-method-11 + (-> self hover) + (get-point-at-percent-along-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp) + ) + ) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate hostile (wasp) + :virtual #t + :trans (behavior () + (let ((gp-0 (ja-group)) + (f0-0 (ja-aframe-num 0)) + ) + (when (and (= gp-0 wasp-idle-ja) + (or (and (>= f0-0 0.0) (>= 1.0 f0-0)) + (and (>= f0-0 16.0) + (>= (the float (+ (-> (the-as art-joint-anim wasp-idle-ja) frames num-frames) -1)) (ja-frame-num 0)) + ) + ) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self last-fire-time)) + (the int (* 300.0 (rand-vu-float-range (-> self attack-wait-min) (-> self attack-wait-max)))) + ) + (get-enemy-target self) + ) + (go-virtual attack) + ) + ) + ) + (none) + ) + ) + +(defstate attack (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (let ((gp-0 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> gp-0 ent) (-> self entity)) + (set! (-> gp-0 charge) 1.0) + (set! (-> gp-0 options) (projectile-options)) + (set! (-> gp-0 notify-handle) (the-as handle #f)) + (set! (-> gp-0 owner-handle) (the-as handle #f)) + (set! (-> gp-0 ignore-handle) (process->handle self)) + (let* ((v1-6 *game-info*) + (a0-6 (+ (-> v1-6 attack-id) 1)) + ) + (set! (-> v1-6 attack-id) a0-6) + (set! (-> gp-0 attack-id) a0-6) + ) + (set! (-> gp-0 timeout) (seconds 4)) + (spawn-wasp-shot self gp-0 19 0.000000000000000000000000000000000000000000024 -1.0) + (spawn-wasp-shot self gp-0 23 0.00000000000000000000000000000000000000000003 1.0) + ) + (sound-play "wasp-fire" :position (-> self root-override2 trans)) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self attack-miss-dist-curr) (-> self attack-miss-dist-min)) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (sound-play "wasp-warn" :position (-> self root-override2 trans)) + (ja-no-eval :group! (-> self draw art-group data (-> self hover-info shoot-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self hover-info shoot-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self restart-fly-anims) #t) + (go-hostile self) + (none) + ) + :post (behavior () + (let* ((a1-0 (-> self node-list data (-> self hover-info gun-base))) + (a0-2 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-4 (new 'stack-no-clear 'vector))) + (set! (-> v1-4 quad) (-> self focus-pos quad)) + (+! (-> v1-4 y) (-> self attack-miss-dist-curr)) + (vector-! gp-0 v1-4 a0-2) + ) + (vector-normalize! gp-0 1.0) + (set! (-> self gun-x-angle-final) (- (vector-x-angle gp-0))) + ) + (quaternion-vector-angle! (the-as quaternion (-> self gun-jmod target)) *x-vector* (-> self gun-x-angle)) + (seek! + (-> self attack-miss-dist-curr) + (-> self attack-miss-dist-max) + (* 0.5 (-> self clock seconds-per-frame) (- (-> self attack-miss-dist-max) (-> self attack-miss-dist-min))) + ) + (hover-enemy-hostile-post) + (none) + ) + ) + +(defstate knocked-recover (wasp) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior wasp) enemy-event-handler) + :code (behavior () + (local-vars (v1-35 enemy-flag) (v1-43 enemy-flag)) + (ja-channel-push! 1 (seconds 0.5)) + (ja-no-eval :group! (-> self draw art-group data (-> self knocked-recover-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self knocked-recover-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self restart-fly-anims) #t) + (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-34 (-> self enemy-flags))) + (if (logtest? v1-34 (enemy-flag checking-water)) + (set! v1-35 (logior v1-34 (enemy-flag enable-on-active))) + (set! v1-35 (logclear v1-34 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-35) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-move-dest)) + (set! (-> self mask) (logior (process-mask collectable) (-> self mask))) + (logclear! (-> self mask) (process-mask collectable)) + ) + (let ((v1-42 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-42) + (set! v1-43 (logior (enemy-flag check-water-backup) v1-42)) + (set! v1-43 (logclear v1-42 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-43) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (hover-nav-control-method-21 (-> self hover)) + (go-hostile self) + (none) + ) + ) + +(defstate die-explode (wasp) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior wasp) enemy-event-handler) + :code (behavior () + (dispose! self) + (set! (-> self hit-points) 0) + (let ((v1-3 (-> self root-override2 root-prim))) + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + (set! (-> v1-3 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (sound-stop (-> self sound-id)) + (sound-play "wasp-explode") + (let ((gp-1 (new 'stack 'joint-exploder-tuning (the-as uint 0)))) + (process-spawn + joint-exploder + (art-group-get-by-name *level* "skel-wasp-explode" (the-as (pointer uint32) #f)) + 22 + gp-1 + *wasp-exploder-params* + :to self + ) + ) + (let ((gp-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-2 + (let ((t9-10 (method-of-type part-tracker activate))) + (t9-10 (the-as part-tracker gp-2) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-11 run-function-in-process) + (a0-12 gp-2) + (a1-8 part-tracker-init) + (a2-12 (-> *part-group-id-table* 157)) + (a3-4 0) + (t0-2 #f) + (t1-2 #f) + (t2-1 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-11) + a0-12 + a1-8 + a2-12 + a3-4 + t0-2 + t1-2 + t2-1 + t3-0 + ) + ) + (-> gp-2 ppointer) + ) + ) + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + ) + +(defstate die-now (wasp) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior wasp) enemy-event-handler) + :code (behavior () + (dispose! self) + (let ((v1-3 (-> self root-override2 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) + (do-effect (-> self skel effect) 'death-default 0.0 -1) + (let ((gp-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-0) (seconds 1)) + (suspend) + ) + ) + (send-event self 'death-end) + (cleanup-for-death self) + (none) + ) + :post (the-as (function none :behavior wasp) transform-post) + ) + +;; WARN: Return type mismatch process vs process-focusable. +(defmethod get-enemy-target wasp ((obj wasp)) + "@returns the [[process-focusable]] that the enemy is currently focusing on, or [[#f]] otherwise" + (let ((s5-0 (handle->process (-> obj focus handle)))) + (the-as + process-focusable + (when s5-0 + (let* ((a0-4 (-> obj root-override2)) + (s4-1 (vector+! (new 'stack-no-clear 'vector) (-> a0-4 trans) (-> a0-4 transv))) + (s3-1 (vector-! (new 'stack-no-clear 'vector) s4-1 (-> obj focus-pos))) + (s2-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (get-quat (the-as process-focusable s5-0) 0))) + (s3-2 (vector-normalize-copy! (new 'stack-no-clear 'vector) s3-1 1.0)) + ) + (if (and (and s5-0 + (zero? (logand (-> (the-as process-focusable s5-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + (< 0.0 (vector-dot s2-1 s3-2)) + (< (vector-vector-distance s4-1 (-> obj focus-pos)) 225280.0) + (and (< (fabs (vector-x-angle s3-2)) 3640.889) (enemy-method-95 obj (-> obj focus-pos) 5461.3335)) + ) + s5-0 + ) + ) + ) + ) + ) + ) + +(defmethod enemy-method-77 wasp ((obj wasp) (arg0 (pointer float))) + (cond + ((rng-hit? obj 0.5) + (set! (-> obj knocked-anim) 10) + (set! (-> obj knocked-recover-anim) 11) + ) + (else + (set! (-> obj knocked-anim) 12) + (set! (-> obj knocked-recover-anim) 13) + ) + ) + (ja-channel-push! 1 0) + (let ((a1-3 (-> obj draw art-group data (-> obj knocked-anim))) + (a0-5 (-> obj skel root-channel 0)) + ) + (set! (-> a0-5 frame-group) (the-as art-joint-anim a1-3)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim a1-3) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> arg0 0)) + (set! (-> a0-5 frame-num) 0.0) + (joint-control-channel-group! a0-5 (the-as art-joint-anim a1-3) num-func-seek!) + ) + #t + ) + +(defmethod enemy-method-78 wasp ((obj wasp) (arg0 (pointer float))) + (let ((v1-4 (-> obj draw art-group data (-> obj enemy-info knocked-land-anim))) + (a0-3 (-> obj skel root-channel 0)) + ) + (set! (-> a0-3 frame-group) (the-as art-joint-anim v1-4)) + (set! (-> a0-3 param 0) (the float (+ (-> (the-as art-joint-anim v1-4) 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-4) num-func-seek!) + ) + #t + ) + +(defmethod enemy-method-80 wasp ((obj wasp) (arg0 enemy-knocked-info)) + (-> obj root-override2) + (>= (-> arg0 on-surface-count) 1) + ) + +(defmethod enemy-method-81 wasp ((obj wasp)) + #f + ) + +(defmethod kill-prefer-falling wasp ((obj wasp)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + (cond + ((and (-> obj next-state) (= (-> obj next-state name) 'knocked)) + (go (method-of-object obj die-now)) + ) + ((-> obj enemy-info use-die-falling) + (go (method-of-object obj die-falling)) + ) + (else + (go (method-of-object obj die)) + ) + ) + ) + +(defmethod spawn-wasp-shot wasp ((obj wasp) (arg0 projectile-init-by-other-params) (arg1 int) (arg2 float) (arg3 float)) + (vector<-cspace! (-> arg0 pos) (-> obj node-list data arg1)) + (let ((s3-1 (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> obj node-list data arg1 bone transform vector 1) + 1.0 + ) + (* 273.06668 arg3) + ) + ) + (a1-8 (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> obj node-list data arg1 bone transform vector 2) + 1.0 + ) + ) + ) + (vector-orient-by-quat! (-> arg0 vel) a1-8 s3-1) + ) + (vector-normalize! (-> arg0 vel) 491520.0) + (spawn-projectile wasp-shot arg0 obj *default-dead-pool*) + 0 + (none) + ) + +(defmethod hover-enemy-method-142 wasp ((obj wasp)) + (let ((s5-0 (-> obj main-joint-acc)) + (s4-0 (-> obj main-joint-vel)) + (gp-0 + (lambda ((arg0 wasp) (arg1 cspace) (arg2 float) (arg3 float) (arg4 vector) (arg5 vector) (arg6 int)) + (local-vars (sv-192 float) (sv-208 quaternion) (sv-224 vector)) + (with-pp + (set! sv-192 arg2) + (let ((s0-0 arg3)) + (set! sv-224 arg4) + (let ((s1-0 arg5) + (s3-0 arg6) + (s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) arg1)) + (s5-0 (new 'stack-no-clear 'matrix)) + (a1-3 (matrix-with-scale->quaternion (new 'stack-no-clear 'quaternion) (-> arg1 bone transform))) + ) + (set! sv-208 (new 'stack-no-clear 'quaternion)) + (let ((s2-1 (new 'stack-no-clear 'vector))) + (-> arg0 scale) + (quaternion-rotate-local-z! sv-208 a1-3 sv-192) + (quaternion->matrix s5-0 sv-208) + (set! (-> s2-1 quad) (-> arg0 root-override2 scale quad)) + (scale-matrix! s5-0 s2-1 s5-0) + (let* ((s1-1 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) s1-0 (-> arg0 root-override2 quat))) + (t9-6 vector-inv-orient-by-quat!) + (a0-10 (new 'stack-no-clear 'vector)) + (a2-4 (-> arg0 root-override2 quat)) + (v0-6 (t9-6 a0-10 sv-224 a2-4)) + (f30-0 (* 2457600.0 (-> pp clock seconds-per-frame))) + (f28-0 + (seek + (-> arg0 thrust s3-0) + (+ (* 0.4 (fmax 0.0 (* (-> v0-6 x) s0-0))) + (fmax 0.0 (-> v0-6 y)) + (fabs (* 0.2 (-> v0-6 z))) + (fmax 0.0 (-> s1-1 y)) + ) + (* 0.2 f30-0) + ) + ) + ) + (let ((f20-0 (lerp-scale 819.2 4096.0 f28-0 1638.4 f30-0)) + (f26-0 (lerp-scale 4915.2 11468.8 f28-0 1638.4 f30-0)) + ) + (lerp-scale 0.0 -4915.2 f28-0 1638.4 f30-0) + (let ((f22-0 (lerp-scale 0.5 1.5 f28-0 1638.4 f30-0)) + (f24-0 (lerp-scale 0.1 1.0 f28-0 1638.4 f30-0)) + ) + (lerp-scale 0.1 1.0 f28-0 1638.4 f30-0) + (let ((f1-10 (lerp-scale 0.02 0.6 f28-0 1638.4 f30-0)) + (f2-6 (fmin 1.0 (-> s2-1 x))) + (f0-15 (fmin 1.0 (-> s2-1 y))) + ) + (set! (-> *part-id-table* 718 init-specs 4 initial-valuef) (* f20-0 f2-6)) + (set! (-> *part-id-table* 718 init-specs 5 initial-valuef) (* f26-0 f0-15)) + (set! (-> *part-id-table* 722 init-specs 3 initial-valuef) (* f22-0 f2-6)) + (set! (-> *part-id-table* 719 init-specs 1 initial-valuef) (* f24-0 f0-15)) + (set! (-> *part-id-table* 720 init-specs 1 initial-valuef) (* f1-10 f0-15)) + (set! (-> *part-id-table* 721 init-specs 0 initial-valuef) (* f24-0 f0-15)) + (set! (-> arg0 thrust s3-0) f28-0) + (let ((f0-16 (* f26-0 f0-15))) + (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 vector 1) (* -0.5 f0-16)) + ) + ) + ) + ) + (set! (-> s5-0 trans quad) (-> s4-0 quad)) + (spawn-with-matrix (-> arg0 engine-part) s5-0) + (let ((f0-18 (lerp-scale 0.75 1.0 f28-0 1638.4 f30-0))) + (sound-play-by-name + (static-sound-name "wasp-jets") + (-> arg0 sound-id) + (the int (* 1024.0 f0-18)) + 0 + 0 + (sound-group sfx) + (-> arg0 root-override2 trans) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + ) + ) + (gp-0 + obj + (-> obj node-list data (-> obj hover-info engine-left)) + (-> obj hover-info thrust-rotate-left) + -1.0 + s5-0 + s4-0 + 0 + ) + (gp-0 + obj + (-> obj node-list data (-> obj hover-info engine-right)) + (-> obj hover-info thrust-rotate-right) + 1.0 + s5-0 + s4-0 + 1 + ) + ) + 0 + (none) + ) + +(defmethod init-enemy-collision! wasp ((obj wasp)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (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 10) 0))) + (set! (-> s5-0 total-prims) (the-as uint 11)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd)) + (set! (-> s4-0 prim-core action) (collide-action solid)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 15564.8) + (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)) + (set! (-> v1-14 prim-core action) (collide-action solid)) + (set! (-> v1-14 transform-index) 0) + (set-vector! (-> v1-14 local-sphere) 0.0 5324.8 -2048.0 6144.0) + ) + (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 backgnd)) + (set! (-> v1-16 prim-core action) (collide-action solid)) + (set! (-> v1-16 transform-index) 0) + (set-vector! (-> v1-16 local-sphere) 0.0 3276.8 -2048.0 4915.2) + ) + (let ((v1-18 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-18 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-18 prim-core collide-with) (collide-spec backgnd)) + (set! (-> v1-18 prim-core action) (collide-action solid)) + (set! (-> v1-18 transform-index) 0) + (set-vector! (-> v1-18 local-sphere) 0.0 7372.8 -2048.0 4915.2) + ) + (let ((v1-20 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-20 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-20 prim-core action) (collide-action semi-solid)) + (set! (-> v1-20 transform-index) 3) + (set-vector! (-> v1-20 local-sphere) 0.0 0.0 1228.8 3481.6) + ) + (let ((v1-22 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-22 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-22 prim-core action) (collide-action semi-solid)) + (set! (-> v1-22 transform-index) 7) + (set-vector! (-> v1-22 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-24 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-24 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-24 prim-core action) (collide-action semi-solid)) + (set! (-> v1-24 transform-index) 9) + (set-vector! (-> v1-24 local-sphere) 0.0 1638.4 0.0 2048.0) + ) + (let ((v1-26 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-26 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-26 prim-core action) (collide-action semi-solid)) + (set! (-> v1-26 transform-index) 10) + (set-vector! (-> v1-26 local-sphere) -819.2 0.0 0.0 1638.4) + ) + (let ((v1-28 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-28 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-28 prim-core action) (collide-action semi-solid)) + (set! (-> v1-28 transform-index) 12) + (set-vector! (-> v1-28 local-sphere) 0.0 -1638.4 0.0 2048.0) + ) + (let ((v1-30 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-30 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-30 prim-core action) (collide-action semi-solid)) + (set! (-> v1-30 transform-index) 13) + (set-vector! (-> v1-30 local-sphere) 819.2 0.0 0.0 1638.4) + ) + (let ((v1-32 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-32 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-32 prim-core action) (collide-action semi-solid)) + (set! (-> v1-32 transform-index) 15) + (set-vector! (-> v1-32 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (let ((v1-35 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-35 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-35 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +(defmethod deactivate wasp ((obj wasp)) + (if (nonzero? (-> obj smoke-part)) + (kill-and-free-particles (-> obj smoke-part)) + ) + (if (nonzero? (-> obj engine-part)) + (kill-and-free-particles (-> obj engine-part)) + ) + (sound-stop (-> obj sound-id)) + ((method-of-type hover-enemy deactivate) obj) + (none) + ) + +;; WARN: Return type mismatch hover-enemy vs wasp. +(defmethod relocate wasp ((obj wasp) (arg0 int)) + (if (nonzero? (-> obj gun-jmod)) + (&+! (-> obj gun-jmod) arg0) + ) + (if (nonzero? (-> obj smoke-part)) + (&+! (-> obj smoke-part) arg0) + ) + (if (nonzero? (-> obj engine-part)) + (&+! (-> obj engine-part) arg0) + ) + (the-as wasp ((method-of-type hover-enemy relocate) obj arg0)) + ) + +(defmethod hover-enemy-method-149 wasp ((obj wasp)) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-wasp" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + 0 + (none) + ) + +(defmethod hover-enemy-method-150 wasp ((obj wasp)) + *wasp-enemy-info* + ) + +(defmethod hover-enemy-method-151 wasp ((obj wasp)) + (new 'static 'hover-enemy-info + :fly-forward-anim 7 + :fly-backward-anim 8 + :fly-left-anim 6 + :fly-right-anim 5 + :shoot-anim 9 + :main-joint 3 + :gun-base 15 + :engine-left 10 + :engine-right 13 + :thrust-rotate-left 16384.0 + :thrust-rotate-right -16384.0 + ) + ) + +(defmethod hover-enemy-method-152 wasp ((obj wasp)) + (new 'static 'hover-nav-params :max-speed 73728.0 :max-acceleration 122880.0 :friction 0.05) + ) + +(defmethod init-enemy! wasp ((obj wasp)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (local-vars (sv-16 res-tag) (sv-32 res-tag) (sv-48 res-tag) (sv-64 res-tag)) + (hover-enemy-method-149 obj) + (init-enemy-behaviour-and-stats! obj (hover-enemy-method-150 obj)) + (hover-enemy-method-155 obj) + (set! (-> obj neck up) (the-as uint 1)) + (set! (-> obj neck nose) (the-as uint 2)) + (set! (-> obj neck ear) (the-as uint 0)) + (set! (-> obj scale) (get-rand-float-range obj 0.9 1.3)) + (set! (-> obj sound-id) (new-sound-id)) + (set! (-> obj root-override2 dynam gravity y) 327680.0) + (set! (-> obj root-override2 dynam gravity-length) 327680.0) + (set! (-> obj root-override2 dynam gravity-max) 327680.0) + (set! (-> obj gun-jmod) + (the-as joint-mod (new 'process 'joint-mod-rotate-local obj (-> obj hover-info gun-base) #t)) + ) + (set! (-> obj gun-x-angle) 0.0) + (set! (-> obj gun-x-angle-final) 0.0) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-28 (res-lump-data (-> obj entity) 'actor-groups (pointer actor-group) :tag-ptr (& sv-16)))) + (if (and v1-28 (= (-> sv-16 elt-count) 1)) + (set! (-> obj entity-group) (-> v1-28 0)) + (set! (-> obj entity-group) #f) + ) + ) + (set! sv-32 (new 'static 'res-tag)) + (let ((v1-32 (res-lump-data (-> obj entity) 'timeout (pointer float) :tag-ptr (& sv-32)))) + (cond + ((and v1-32 (= (-> sv-32 elt-count) 2)) + (set! (-> obj attack-wait-min) (-> v1-32 0)) + (set! (-> obj attack-wait-max) (-> v1-32 1)) + ) + (else + (set! (-> obj attack-wait-min) 1.0) + (set! (-> obj attack-wait-max) 3.0) + ) + ) + ) + (let ((f30-0 4096.0)) + (set! sv-48 (new 'static 'res-tag)) + (let ((v1-39 (res-lump-data (-> obj entity) 'min-max (pointer float) :tag-ptr (& sv-48)))) + (set! (-> obj attack-miss-dist-min) (* f30-0 (if (and v1-39 (> (the-as int (-> sv-48 elt-count)) 0)) + (-> v1-39 0) + -1.0 + ) + ) + ) + ) + ) + (let ((f30-1 4096.0)) + (set! sv-64 (new 'static 'res-tag)) + (let ((v1-43 (res-lump-data (-> obj entity) 'min-max (pointer float) :tag-ptr (& sv-64)))) + (set! (-> obj attack-miss-dist-max) (* f30-1 (if (and v1-43 (< 1 (the-as int (-> sv-64 elt-count)))) + (-> v1-43 1) + 1.0 + ) + ) + ) + ) + ) + (set! (-> obj path) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (set! (-> obj path-u) 0.0) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! (-> obj smoke-part) (create-launch-control (-> *part-group-id-table* 154) obj)) + (set! (-> obj engine-part) (create-launch-control (-> *part-group-id-table* 156) obj)) + (add-connection + *part-engine* + obj + 7 + obj + 318 + (new 'static 'vector :x 1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 7 + obj + 318 + (new 'static 'vector :x -1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection *part-engine* obj 7 obj 743 (new 'static 'vector :y 1433.6 :z 1228.8 :w 163840.0)) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/common/enemy/metalhead_bearer/centurion.gc b/goal_src/jak2/levels/common/enemy/metalhead_bearer/centurion.gc index ce81801f09..ab70bf80c1 100644 --- a/goal_src/jak2/levels/common/enemy/metalhead_bearer/centurion.gc +++ b/goal_src/jak2/levels/common/enemy/metalhead_bearer/centurion.gc @@ -169,8 +169,7 @@ ) (defmethod init-proj-settings! centurion-shot ((obj centurion-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" ((the-as (function projectile none) (find-parent-method centurion-shot 31)) obj) (set! (-> obj max-speed) 327680.0) (set! (-> obj timeout) (seconds 1.25)) @@ -277,7 +276,72 @@ :default-hit-points 3 :gnd-collide-with (collide-spec backgnd) :overlaps-others-collide-with-filter (collide-spec jak bot player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.1 :attack-shove-back (meters 3) @@ -701,7 +765,7 @@ (set! (-> v1-32 attack-id) a0-26) (set! (-> s5-0 attack-id) a0-26) ) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) (spawn-projectile centurion-shot s5-0 obj *default-dead-pool*) ) (set! (-> obj can-shoot?) #f) diff --git a/goal_src/jak2/levels/common/enemy/metalhead_slinger/grenadier.gc b/goal_src/jak2/levels/common/enemy/metalhead_slinger/grenadier.gc index 900f39c7ff..2fed77f83d 100644 --- a/goal_src/jak2/levels/common/enemy/metalhead_slinger/grenadier.gc +++ b/goal_src/jak2/levels/common/enemy/metalhead_slinger/grenadier.gc @@ -139,7 +139,72 @@ :default-hit-points 14 :gnd-collide-with (collide-spec backgnd) :overlaps-others-collide-with-filter (collide-spec jak bot player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.8 :attack-shove-back (meters 3) @@ -776,7 +841,7 @@ (set! (-> v1-27 attack-id) a0-27) (set! (-> a1-9 attack-id) a0-27) ) - (set! (-> a1-9 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> a1-9 timeout) (seconds 4)) (spawn-projectile metalhead-grenade-shot a1-9 self *default-dead-pool*) ) ) diff --git a/goal_src/jak2/levels/common/enemy/spyder.gc b/goal_src/jak2/levels/common/enemy/spyder.gc index c7f3a0bab3..d1aa1d5d60 100644 --- a/goal_src/jak2/levels/common/enemy/spyder.gc +++ b/goal_src/jak2/levels/common/enemy/spyder.gc @@ -999,7 +999,7 @@ (set! (-> a0-10 attack-id) a3-11) (set! (-> gp-0 attack-id) a3-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (vector-normalize! (vector-! (-> gp-0 vel) a1-1 (the-as vector v1-0)) arg1) ) (spawn-projectile spyder-shot gp-0 obj *default-dead-pool*) diff --git a/goal_src/jak2/levels/common/entities/sew-gunturret.gc b/goal_src/jak2/levels/common/entities/sew-gunturret.gc index 6463f6aae9..669c227fac 100644 --- a/goal_src/jak2/levels/common/entities/sew-gunturret.gc +++ b/goal_src/jak2/levels/common/entities/sew-gunturret.gc @@ -696,7 +696,7 @@ (set! (-> v1-12 attack-id) a0-18) (set! (-> proj-params attack-id) a0-18) ) - (set! (-> proj-params timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> proj-params timeout) (seconds 4)) (vector-normalize-copy! (-> proj-params vel) s2-1 491520.0) (let ((f30-1 (fmin 16384.0 f30-0))) (set-vector! temp-vec (-> s2-1 z) (-> s2-1 y) (- (-> s2-1 x)) 1.0) diff --git a/goal_src/jak2/levels/common/metalhead-projectile.gc b/goal_src/jak2/levels/common/metalhead-projectile.gc index d8ea705132..2176637973 100644 --- a/goal_src/jak2/levels/common/metalhead-projectile.gc +++ b/goal_src/jak2/levels/common/metalhead-projectile.gc @@ -319,8 +319,7 @@ (defmethod draw-laser-sight metalhead-shot ((obj metalhead-shot)) - "TODO - confirm If applicable, draw the laser sight particles -:virtual" + "TODO - confirm If applicable, draw the laser sight particles" (draw-beam (-> *part-id-table* 624) (-> obj tail-pos) (-> obj starting-dir) #f #t) (let* ((a0-3 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> obj starting-dir) 2048.0)) (v1-2 (vector+! (new 'stack-no-clear 'vector) (-> obj tail-pos) a0-3)) @@ -559,8 +558,7 @@ ) (defmethod init-proj-settings! metalhead-shot ((obj metalhead-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) (set! (-> obj attack-mode) 'metalhead-shot) (set! (-> obj max-speed) 532480.0) @@ -586,7 +584,7 @@ (set! (-> a0-10 attack-id) a2-11) (set! (-> gp-0 attack-id) a2-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (set! (-> gp-0 pos quad) (-> arg1 quad)) (vector-normalize-copy! (-> gp-0 vel) v1-1 arg3) ) @@ -914,8 +912,7 @@ ;; WARN: Return type mismatch sound-id vs none. (defmethod init-proj-settings! metalhead-grenade-shot ((obj metalhead-grenade-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj attack-mode) 'eco-yellow) (set! (-> obj blast-radius) 4096.0) (set! (-> obj max-speed) 135168.0) @@ -949,7 +946,7 @@ (set! (-> a0-10 attack-id) a2-11) (set! (-> gp-0 attack-id) a2-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (set! (-> gp-0 pos quad) (-> arg1 quad)) (vector-normalize-copy! (-> gp-0 vel) v1-1 arg3) ) diff --git a/goal_src/jak2/levels/dig/dig3-obs.gc b/goal_src/jak2/levels/dig/dig3-obs.gc index f6806a5d07..742ad61459 100644 --- a/goal_src/jak2/levels/dig/dig3-obs.gc +++ b/goal_src/jak2/levels/dig/dig3-obs.gc @@ -720,7 +720,7 @@ This commonly includes things such as: (set! (-> a0-8 attack-id) a1-6) (set! (-> v1-7 attack-id) a1-6) ) - (set! (-> v1-7 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> v1-7 timeout) (seconds 4)) (vector+! (-> v1-7 pos) (-> self root trans) s5-1) (vector-float*! (-> v1-7 vel) gp-2 163840.0) (spawn-projectile diff --git a/goal_src/jak2/levels/drill_platform/drill-baron.gc b/goal_src/jak2/levels/drill_platform/drill-baron.gc index 3c48465b3f..6e132acc84 100644 --- a/goal_src/jak2/levels/drill_platform/drill-baron.gc +++ b/goal_src/jak2/levels/drill_platform/drill-baron.gc @@ -7,3 +7,2078 @@ ;; DECOMP BEGINS +(defpartgroup group-turret-warning + :id 458 + :duration (seconds 0.2) + :linger-duration (seconds 1) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 15) + :parts ((sp-item 2037 :flags (bit7) :period 930 :length 40)) + ) + +(defpartgroup group-turret-warning-down + :id 459 + :duration (seconds 0.2) + :linger-duration (seconds 1) + :flags (use-local-clock unk-6) + :bounds (static-bspherem 0 0 0 15) + :rotate ((degrees 8) (degrees 0) (degrees 0)) + :parts ((sp-item 2037 :flags (bit7) :period 930 :length 40)) + ) + +(defpartgroup group-turret-warning-side + :id 460 + :duration (seconds 0.2) + :linger-duration (seconds 1) + :flags (use-local-clock unk-6) + :bounds (static-bspherem 0 0 0 15) + :rotate ((degrees 4) (degrees 4) (degrees 0)) + :parts ((sp-item 2037 :flags (bit7) :period 930 :length 40)) + ) + +(defpart 2037 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-flt spt-num 16.0) + (sp-flt spt-x (meters 4)) + (sp-flt spt-y (meters 1)) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-copy-from-other spt-g -1) + (sp-copy-from-other spt-b -1) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-vel-x (meters 0.026666667) (meters 0.026666667) 1.0) + (sp-rnd-flt spt-vel-y (meters 0.026666667) (meters 0.026666667) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.016666668) (meters 0.016666668) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-rnd-flt spt-accel-y -1.3653333 -1.3653333 1.0) + (sp-flt spt-friction 0.94) + (sp-int spt-timer 450) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 2038) + (sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 2038 + :init-specs ((sp-rnd-flt spt-fade-a -0.14222223 -0.42666668 1.0)) + ) + +(defpartgroup group-barons-ship-light1 + :id 461 + :bounds (static-bspherem 0 0 0 1) + :parts ((sp-item 2039 :flags (bit6) :period 375 :length 5)) + ) + +(defpartgroup group-barons-ship-light2 + :id 462 + :bounds (static-bspherem 0 0 0 1) + :parts ((sp-item 2039 :flags (bit6) :period 375 :length 5 :offset 75)) + ) + +(defpartgroup group-barons-ship-light3 + :id 463 + :bounds (static-bspherem 0 0 0 1) + :parts ((sp-item 2039 :flags (bit6) :period 375 :length 5 :offset 150)) + ) + +(defpartgroup group-barons-ship-light4 + :id 464 + :bounds (static-bspherem 0 0 0 1) + :parts ((sp-item 2039 :flags (bit6) :period 375 :length 5 :offset 225)) + ) + +(defpartgroup group-barons-ship-light5 + :id 465 + :bounds (static-bspherem 0 0 0 1) + :parts ((sp-item 2039 :flags (bit6) :period 375 :length 5 :offset 300)) + ) + +(defpart 2039 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbc :page #xc)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-scale-x (meters 3) (meters 0.5) 1.0) + (sp-flt spt-rot-x 1024.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-rnd-flt spt-g 0.0 128.0 1.0) + (sp-flt spt-b 0.0) + (sp-rnd-flt spt-a 64.0 32.0 1.0) + (sp-flt spt-omega 4097638.5) + (sp-int spt-timer 75) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-flt spt-userdata 2048.0) + (sp-func spt-func 'sparticle-track-root) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +(defpartgroup group-turret-smoke-trail + :id 466 + :linger-duration (seconds 1.5) + :bounds (static-bspherem 0 0 0 6) + :parts ((sp-item 2040 :flags (bit7)) (sp-item 2041 :flags (bit6 bit7))) + ) + +(defpartgroup group-turret-smoke-trail-down + :id 467 + :linger-duration (seconds 1.5) + :flags (unk-6) + :bounds (static-bspherem 0 0 0 6) + :rotate ((degrees 8) (degrees 0) (degrees 0)) + :parts ((sp-item 2040 :flags (bit7)) (sp-item 2041 :flags (bit6 bit7))) + ) + +(defpartgroup group-turret-smoke-trail-side + :id 468 + :linger-duration (seconds 1.5) + :flags (unk-6) + :bounds (static-bspherem 0 0 0 6) + :rotate ((degrees 4) (degrees 4) (degrees 0)) + :parts ((sp-item 2040 :flags (bit7)) (sp-item 2041 :flags (bit6 bit7))) + ) + +(defpart 2041 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbc :page #xc)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-x (meters 0) (meters 2) 1.0) + (sp-flt spt-y (meters 1)) + (sp-rnd-flt spt-scale-x (meters 12) (meters 3) 1.0) + (sp-flt spt-rot-x 1228.8) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 3600.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-rnd-flt spt-g 64.0 128.0 1.0) + (sp-rnd-flt spt-b 0.0 64.0 1.0) + (sp-rnd-flt spt-a 12.0 4.0 1.0) + (sp-flt spt-omega 822476.8) + (sp-flt spt-fade-a -0.8) + (sp-int spt-timer 20) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-flt spt-userdata 6144.0) + (sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 2040 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-func spt-birth-func 'birth-func-texture-group) + (sp-flt spt-num 0.5) + (sp-rnd-flt spt-x (meters 0) (meters 4) 1.0) + (sp-rnd-flt spt-scale-x (meters 8) (meters 4) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 246.0) + (sp-flt spt-b 149.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.1) (meters 0.033333335) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.026666667) (meters 0.006666667) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.2) (degrees 0.4) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.14666666) + (sp-flt spt-fade-g -0.7866667) + (sp-flt spt-fade-b -0.88) + (sp-rnd-flt spt-fade-a -0.053333335 -0.053333335 1.0) + (sp-rnd-flt spt-accel-x 5.4613333 1.3653333 1.0) + (sp-rnd-flt spt-accel-y 0.4096 0.4096 1.0) + (sp-flt spt-friction 0.96) + (sp-int spt-timer 2400) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 use-global-acc) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-userdata) + :flags (sp-flag plain-v2) + :object (new 'static 'boxed-array :type int32 40 1 0 #xc00000 #xc00000 #xc03300) + ) + (sp-int-plain-rnd spt-next-time 50 24 1) + (sp-launcher-by-id spt-next-launcher 2042) + (sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 2042 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.013333334) (meters 0.0033333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-int-plain-rnd spt-next-time 75 24 1) + (sp-launcher-by-id spt-next-launcher 2043) + ) + ) + +(defpart 2043 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.006666667) (meters 0.0016666667) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -2.33) + (sp-flt spt-fade-g -1.28) + (sp-flt spt-fade-b -0.17) + (sp-int-plain-rnd spt-next-time 75 24 1) + (sp-launcher-by-id spt-next-launcher 2044) + ) + ) + +(defpart 2044 + :init-specs ((sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.0) + (sp-flt spt-fade-b 0.0) + (sp-rnd-flt spt-fade-a -0.03 -0.24 1.0) + ) + ) + +(defpartgroup group-drill-barons-ship-explosion + :id 469 + :duration (seconds 3) + :linger-duration (seconds 2) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 2) + :parts ((sp-item 2045 :period 9600 :length 25) + (sp-item 2046 :period 9600 :length 10 :offset 10) + (sp-item 2047 :period 9600 :length 50 :offset 25) + (sp-item 2048 :period 9600 :length 35 :offset 10) + (sp-item 2049 :period 9600 :length 50 :offset 15) + (sp-item 2050 :period 9600 :length 5) + (sp-item 2051 :period 9600 :length 50 :offset 15) + (sp-item 2052 :period 9600 :length 5) + (sp-item 2053 :flags (is-3d) :period 9600 :length 5) + ) + ) + +(defpart 2053 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x2c :page #xc)) + (sp-flt spt-num 8.0) + (sp-flt spt-scale-x (meters 16)) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-copy-from-other spt-g -1) + (sp-flt spt-b 128.0) + (sp-flt spt-a 136.0) + (sp-flt spt-scalevel-x (meters 2)) + (sp-flt spt-rotvel-y (degrees 0.1)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -1.0625) + (sp-flt spt-fade-g -2.125) + (sp-flt spt-fade-b -2.1333334) + (sp-flt spt-fade-a -3.2) + (sp-int spt-timer 320) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14) + (sp-int spt-next-time 40) + (sp-launcher-by-id spt-next-launcher 2054) + (sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defpart 2054 + :init-specs ((sp-flt spt-fade-a -0.06666667)) + ) + +(defpart 2050 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters -2.5)) + (sp-flt spt-scale-x (meters 32)) + (sp-flt spt-rot-x 8192.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 96.0) + (sp-flt spt-scalevel-x (meters 0.26666668)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -1.28) + (sp-flt spt-fade-b -5.1) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 65) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-flt spt-userdata 122880.0) + (sp-int spt-next-time 30) + (sp-launcher-by-id spt-next-launcher 2055) + ) + ) + +(defpart 2055 + :init-specs ((sp-flt spt-scalevel-x (meters -0.22857143)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -3.6571429) + (sp-flt spt-fade-b 0.0) + (sp-flt spt-fade-a -2.7428572) + ) + ) + +(defpart 2052 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xca :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 120)) + (sp-flt spt-rot-x 8192.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 24.0) + (sp-flt spt-scalevel-x (meters 0.4)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -4.266667) + (sp-flt spt-fade-b -4.266667) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 150) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 glow) + (sp-flt spt-userdata 409600.0) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 2056) + ) + ) + +(defpart 2056 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.85333335) + (sp-flt spt-fade-g -1.7066667) + (sp-flt spt-fade-b -1.7066667) + (sp-flt spt-fade-a -0.64) + ) + ) + +(defpart 2048 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x92 :page #xc)) + (sp-flt spt-num 16.0) + (sp-flt spt-y (meters 0)) + (sp-flt spt-scale-x (meters 2.5)) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-scale-y (meters 0.2) (meters 0.3) 1.0) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 64.0 32.0 1.0) + (sp-flt spt-omega 12.288) + (sp-rnd-flt spt-vel-y (meters 0.53333336) (meters 0.33333334) 1.0) + (sp-flt spt-fade-b -8.0) + (sp-rnd-flt spt-accel-y -13.653334 -6.826667 1.0) + (sp-rnd-flt spt-friction 0.9 0.08 1.0) + (sp-int-plain-rnd spt-timer 450 299 1) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-func spt-func 'sparticle-motion-blur) + (sp-int spt-next-time 15) + (sp-launcher-by-id spt-next-launcher 2057) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + (sp-flt spt-rotate-y (degrees 90.0)) + ) + ) + +(defpart 2057 + :init-specs ((sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 0.0) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -2.6133332) + (sp-flt spt-fade-b -1.7066667) + (sp-rnd-flt spt-fade-a -0.096 -0.096 1.0) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 2058) + ) + ) + +(defpart 2058 + :init-specs ((sp-flt spt-fade-r 0.0) (sp-flt spt-fade-g 0.0) (sp-flt spt-fade-b 0.0)) + ) + +(defpart 2051 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x34 :page #xc)) + (sp-flt spt-num 5.0) + (sp-flt spt-y (meters -2.5)) + (sp-rnd-flt spt-scale-x (meters 6) (meters 8) 1.0) + (sp-int spt-rot-x 4) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-rot-z) + :flags (sp-flag spflag7) + :random-rangef 655360.0 + :random-multf 1.0 + ) + (sp-rnd-flt spt-scale-y (meters 20) (meters 8) 1.0) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 16.0 16.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.1) (meters 0.4) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.26666668) (meters 0.13333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.13333334) + (sp-rnd-flt spt-friction 0.92 0.02 1.0) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-func spt-func 'sparticle-motion-blur) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 2059) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-conerot-x) + :flags (sp-flag from-pointer) + :func '*sp-temp* + ) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-rnd-flt spt-conerot-radius (meters 0) (meters 2) 1.0) + ) + ) + +(defpart 2059 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.016666668) (meters 0.016666668) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.55) + (sp-flt spt-fade-g -2.95) + (sp-flt spt-fade-b -3.3) + (sp-int-plain-rnd spt-next-time 30 9 1) + (sp-launcher-by-id spt-next-launcher 2060) + ) + ) + +(defpart 2060 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.008333334) (meters 0.008333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -1.2944444) + (sp-flt spt-fade-g -0.7111111) + (sp-flt spt-fade-b -0.2) + (sp-rnd-flt spt-fade-a -0.1 -0.1 1.0) + ) + ) + +(defpart 2049 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x33 :page #xc)) + (sp-func spt-birth-func 'birth-func-texture-group) + (sp-rnd-flt spt-num 16.0 10.0 1.0) + (sp-flt spt-y (meters -2.5)) + (sp-rnd-flt spt-scale-x (meters 6) (meters 4) 1.0) + (sp-flt spt-rot-z (degrees 0.0)) + (sp-rnd-flt spt-scale-y (meters 12.8) (meters 2.4) 1.0) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.06666667) (meters 0.2) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.26666668) (meters 0.2) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.3) (degrees 0.6) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.32) + (sp-flt spt-friction 0.94) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-userdata) + :flags (sp-flag plain-v2) + :object (new 'static 'boxed-array :type int32 40 1 0 #xc00000 #xc03300) + ) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 2061) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-rnd-flt spt-conerot-radius (meters 0) (meters 8) 1.0) + ) + ) + +(defpart 2061 + :init-specs ((sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.0) + (sp-flt spt-fade-b 0.0) + (sp-int-plain-rnd spt-next-time 5 19 1) + (sp-launcher-by-id spt-next-launcher 2062) + ) + ) + +(defpart 2062 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.016666668) (meters 0.016666668) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.44) + (sp-flt spt-fade-g -2.36) + (sp-flt spt-fade-b -2.64) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 2063) + ) + ) + +(defpart 2063 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.008333334) (meters 0.008333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -1.2) + (sp-flt spt-fade-g -0.7111111) + (sp-flt spt-fade-b -0.2) + (sp-rnd-flt spt-fade-a -0.06545454 -0.06545454 1.0) + (sp-int-plain-rnd spt-next-time 150 29 1) + (sp-launcher-by-id spt-next-launcher 2064) + ) + ) + +(defpart 2064 + :init-specs ((sp-flt spt-fade-r 0.0) (sp-flt spt-fade-g 0.0) (sp-flt spt-fade-b 0.0) (sp-flt spt-fade-a -0.1125)) + ) + +(defpart 2047 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x32 :page #xc)) + (sp-rnd-flt spt-num 16.0 4.0 1.0) + (sp-flt spt-x (meters 0.25)) + (sp-flt spt-y (meters -2.5)) + (sp-rnd-flt spt-scale-x (meters 4) (meters 4) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 48.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.13333334) (meters 0.8) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.02) (meters 0.02) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.18) + (sp-flt spt-fade-b -2.12) + (sp-rnd-flt spt-accel-y -5.4613333 -23.210667 1.0) + (sp-rnd-flt spt-friction 0.84 0.02 1.0) + (sp-int spt-timer 3000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 2065) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-rnd-flt spt-conerot-radius (meters 3) (meters 5) 1.0) + ) + ) + +(defpart 2065 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0016666667)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.02) + (sp-flt spt-fade-b 0.23555556) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 2066) + ) + ) + +(defpart 2066 + :init-specs ((sp-flt spt-fade-r -0.5543478) + (sp-flt spt-fade-g -0.5543478) + (sp-flt spt-fade-b -0.5543478) + (sp-rnd-flt spt-fade-a -0.13333334 -0.10666667 1.0) + ) + ) + +(defpart 2045 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 12.0 8.0 1.0) + (sp-flt spt-y (meters -2.5)) + (sp-rnd-flt spt-scale-x (meters 16.5) (meters 16) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 70.0 20.0 1.0) + (sp-rnd-flt spt-g 70.0 20.0 1.0) + (sp-rnd-flt spt-b 70.0 20.0 1.0) + (sp-rnd-flt spt-a 0.0 40.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.06666667) (meters 0.33333334) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.033333335) (meters 0.086666666) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 3.3) + (sp-flt spt-fade-g 3.12) + (sp-flt spt-fade-b 1.18) + (sp-flt spt-fade-a 1.76) + (sp-flt spt-friction 0.89) + (sp-int spt-timer 710) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 2067) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-rnd-flt spt-conerot-radius (meters 0) (meters 16) 1.0) + ) + ) + +(defpart 2067 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.53333336) + (sp-flt spt-fade-g -1.9666667) + (sp-flt spt-fade-b -2.2) + (sp-flt spt-fade-a -0.41666666) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 2068) + ) + ) + +(defpart 2068 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.38833332) + (sp-flt spt-fade-g -0.21333334) + (sp-flt spt-fade-b -0.028333334) + (sp-flt spt-fade-a -0.38833332) + ) + ) + +(defpart 2046 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x31 :page #xc)) + (sp-flt spt-num 8.0) + (sp-flt spt-y (meters -2.5)) + (sp-rnd-flt spt-scale-x (meters 16) (meters 16) 1.0) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 1.5) (meters 0.5) 1.0) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-flt spt-g 96.0) + (sp-flt spt-b 64.0) + (sp-rnd-flt spt-a 64.0 64.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.4) (meters 0.4) 1.0) + (sp-flt spt-fade-g 1.6) + (sp-flt spt-fade-b 3.2) + (sp-flt spt-fade-a -0.9142857) + (sp-int spt-timer 90) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + ) + ) + +(defskelgroup skel-drill-barons-ship drill-barons-ship drill-barons-ship-lod0-jg drill-barons-ship-idle-ja + ((drill-barons-ship-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 110) + ) + +(defskelgroup skel-drill-barons-ship-explode drill-barons-ship drill-barons-ship-explode-lod0-jg drill-barons-ship-explode-idle-ja + ((drill-barons-ship-explode-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 210) + ) + +(defskelgroup skel-drill-barons-ship-turret drill-barons-ship drill-barons-ship-turret-lod0-jg drill-barons-ship-turret-idle-ja + ((drill-barons-ship-turret-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 10) + ) + +(defskelgroup skel-drill-barons-ship-turret-b drill-barons-ship drill-barons-ship-turret-b-lod0-jg drill-barons-ship-turret-b-idle-ja + ((drill-barons-ship-turret-b-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 10) + ) + +(defskelgroup skel-drill-barons-ship-turret-c drill-barons-ship drill-barons-ship-turret-c-lod0-jg drill-barons-ship-turret-c-idle-ja + ((drill-barons-ship-turret-c-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 10) + ) + +(deftype drill-barons-ship (process-drawable) + ((root-override collide-shape-moving :offset 128) + (init-quat quaternion :inline :offset-assert 208) + (next-to-shoot-idx int32 :offset-assert 224) + (current-y-position float :offset-assert 228) + (from-y float :offset-assert 232) + (inc-y float :offset-assert 236) + (ease-y float :offset-assert 240) + (x-offset-angle float :offset-assert 244) + (pass int32 :offset-assert 248) + (end-of-pass symbol :offset-assert 252) + (rock-angle float :offset-assert 256) + (soundid uint32 :offset-assert 260) + ) + :heap-base #x90 + :method-count-assert 23 + :size-assert #x108 + :flag-assert #x1700900108 + (:methods + (idle () _type_ :state 20) + (hidden () _type_ :state 21) + (drill-barons-ship-method-22 (_type_) none 22) + ) + ) + + +(deftype drill-barons-ship-explode (process-drawable) + () + :heap-base #x50 + :method-count-assert 21 + :size-assert #xc8 + :flag-assert #x15005000c8 + (:methods + (idle () _type_ :state 20) + ) + ) + + +(deftype barons-ship-turret-info (structure) + ((init-y-angle float :offset-assert 0) + (twist-y-max float :offset-assert 4) + (joint-idx int32 :offset-assert 8) + (mesh int32 :offset-assert 12) + (ship-y-offset float :offset-assert 16) + (alive symbol :offset-assert 20) + (next-to-shoot basic :offset-assert 24) + ) + :method-count-assert 9 + :size-assert #x1c + :flag-assert #x90000001c + ) + + +(deftype drill-barons-ship-turret (process-drawable) + ((root-override collide-shape-moving :offset 128) + (info barons-ship-turret-info :offset-assert 200) + (shot-timer time-frame :offset-assert 208) + (shot-counter int32 :offset-assert 216) + (jmod joint-mod :offset-assert 220) + (jmod-left joint-mod :offset-assert 224) + (jmod-right joint-mod :offset-assert 228) + (anim-frame float :offset-assert 232) + (error-y-angle float :offset-assert 236) + (error-y-angle-dest float :offset-assert 240) + (hit-count int32 :offset-assert 244) + (soundid sound-id :offset-assert 248) + ) + :heap-base #x80 + :method-count-assert 25 + :size-assert #xfc + :flag-assert #x19008000fc + (:methods + (idle () _type_ :state 20) + (attack () _type_ :state 21) + (dead () _type_ :state 22) + (going-down () _type_ :state 23) + (drill-barons-ship-turret-method-24 (_type_) none 24) + ) + ) + + +(define *ship-turrets-first-pass* (new 'static 'boxed-array :type int32 4 16 5 21 6 15 7 13 14 22 17 23)) + +(define *ship-turrets-second-pass* (new 'static 'boxed-array :type int32 0 20 1 12 2 11 3 8 19 9 10 18)) + +(define *barons-ship-turrets* + (new 'static 'boxed-array :type barons-ship-turret-info + (new 'static 'barons-ship-turret-info + :init-y-angle -16384.0 + :twist-y-max 9102.223 + :joint-idx 13 + :ship-y-offset -40960.0 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle -16384.0 + :twist-y-max 9102.223 + :joint-idx 11 + :ship-y-offset -41369.6 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle -16384.0 + :twist-y-max 9102.223 + :joint-idx 9 + :ship-y-offset -41779.2 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle -16384.0 + :twist-y-max 9102.223 + :joint-idx 16 + :ship-y-offset -42188.8 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle 16384.0 + :twist-y-max 9102.223 + :joint-idx 22 + :ship-y-offset -42598.4 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle 16384.0 + :twist-y-max 9102.223 + :joint-idx 20 + :ship-y-offset -43008.0 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle 16384.0 + :twist-y-max 9102.223 + :joint-idx 18 + :ship-y-offset -43417.6 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle 16384.0 + :twist-y-max 9102.223 + :joint-idx 25 + :ship-y-offset -43827.2 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle -16384.0 + :twist-y-max 9102.223 + :joint-idx 15 + :mesh 2 + :ship-y-offset 40960.0 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle -16384.0 + :twist-y-max 9102.223 + :joint-idx 14 + :mesh 2 + :ship-y-offset 41369.6 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle -16384.0 + :twist-y-max 9102.223 + :joint-idx 12 + :mesh 2 + :ship-y-offset 41779.2 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle -16384.0 + :twist-y-max 9102.223 + :joint-idx 10 + :mesh 2 + :ship-y-offset 42188.8 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle -16384.0 + :twist-y-max 9102.223 + :joint-idx 17 + :mesh 2 + :ship-y-offset 42598.4 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle 16384.0 + :twist-y-max 9102.223 + :joint-idx 24 + :mesh 2 + :ship-y-offset 43008.0 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle 16384.0 + :twist-y-max 9102.223 + :joint-idx 23 + :mesh 2 + :ship-y-offset 43417.6 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle 16384.0 + :twist-y-max 9102.223 + :joint-idx 21 + :mesh 2 + :ship-y-offset 43827.2 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle 16384.0 + :twist-y-max 9102.223 + :joint-idx 19 + :mesh 2 + :ship-y-offset 44236.8 + ) + (new 'static 'barons-ship-turret-info + :init-y-angle 16384.0 + :twist-y-max 9102.223 + :joint-idx 26 + :mesh 2 + :ship-y-offset 44646.4 + ) + (new 'static 'barons-ship-turret-info :init-y-angle -16384.0 :joint-idx 32 :mesh 1 :ship-y-offset 26624.0) + (new 'static 'barons-ship-turret-info :init-y-angle -16384.0 :joint-idx 31 :mesh 1 :ship-y-offset 27033.6) + (new 'static 'barons-ship-turret-info :init-y-angle -16384.0 :joint-idx 30 :mesh 1 :ship-y-offset 27443.2) + (new 'static 'barons-ship-turret-info :init-y-angle 16384.0 :joint-idx 29 :mesh 1 :ship-y-offset 21708.8) + (new 'static 'barons-ship-turret-info :init-y-angle 16384.0 :joint-idx 28 :mesh 1 :ship-y-offset 22118.4) + (new 'static 'barons-ship-turret-info :init-y-angle 16384.0 :joint-idx 27 :mesh 1 :ship-y-offset 22528.0) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defbehavior drill-barons-ship-turret-init-by-other drill-barons-ship-turret ((arg0 entity-actor)) + (cond + ((!= (-> arg0 data-top) 1) + (let ((s5-0 (new 'process 'collide-shape self (collide-list-enum usually-hit-by-player)))) + (let ((v1-3 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-3 prim-core collide-as) (collide-spec obstacle-for-jak)) + (set! (-> v1-3 prim-core action) (collide-action solid)) + (set! (-> v1-3 transform-index) 3) + (set-vector! (-> v1-3 local-sphere) 0.0 0.0 0.0 73728.0) + (set! (-> s5-0 total-prims) (the-as uint 1)) + (set! (-> s5-0 root-prim) v1-3) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (let ((v1-6 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-6 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-6 prim-core collide-with)) + ) + (set! (-> self root-override) (the-as collide-shape-moving s5-0)) + ) + ) + (else + (let ((s5-1 (new 'process 'collide-shape self (collide-list-enum usually-hit-by-player)))) + (let ((v1-10 (new 'process 'collide-shape-prim-sphere s5-1 (the-as uint 0)))) + (set! (-> v1-10 prim-core collide-as) (collide-spec obstacle-for-jak)) + (set! (-> v1-10 prim-core action) (collide-action solid)) + (set! (-> v1-10 transform-index) 3) + (set-vector! (-> v1-10 local-sphere) 81920.0 0.0 0.0 73728.0) + (set! (-> s5-1 total-prims) (the-as uint 1)) + (set! (-> s5-1 root-prim) v1-10) + ) + (set! (-> s5-1 nav-radius) (* 0.75 (-> s5-1 root-prim local-sphere w))) + (let ((v1-13 (-> s5-1 root-prim))) + (set! (-> s5-1 backup-collide-as) (-> v1-13 prim-core collide-as)) + (set! (-> s5-1 backup-collide-with) (-> v1-13 prim-core collide-with)) + ) + (set! (-> self root-override) (the-as collide-shape-moving s5-1)) + ) + ) + ) + (let ((v1-16 (-> self root-override root-prim))) + (set! (-> self root-override backup-collide-as) (-> v1-16 prim-core collide-as)) + (set! (-> self root-override backup-collide-with) (-> v1-16 prim-core collide-with)) + ) + (let ((v1-19 (-> self root-override root-prim))) + (set! (-> v1-19 prim-core collide-as) (collide-spec)) + (set! (-> v1-19 prim-core collide-with) (collide-spec)) + ) + 0 + (set! (-> self root-override trans quad) + (-> (the-as drill-barons-ship (-> self parent 0)) root-override trans quad) + ) + (quaternion-copy! + (-> self root-override quat) + (-> (the-as drill-barons-ship (-> self parent 0)) root-override quat) + ) + (vector-identity! (-> self root-override scale)) + (logclear! (-> self mask) (process-mask actor-pause)) + (set! (-> self info) (the-as barons-ship-turret-info arg0)) + (set! (-> self info alive) #t) + (set! (-> self info next-to-shoot) #f) + (set! (-> self anim-frame) 0.0) + (set! (-> self error-y-angle) 0.0) + (set! (-> self error-y-angle-dest) 0.0) + (set! (-> self hit-count) 0) + (process-spawn part-tracker :init part-tracker-init (-> *part-group-id-table* 461) -1 #f #f self 4 :to self) + (process-spawn part-tracker :init part-tracker-init (-> *part-group-id-table* 462) -1 #f #f self 5 :to self) + (process-spawn part-tracker :init part-tracker-init (-> *part-group-id-table* 463) -1 #f #f self 6 :to self) + (process-spawn part-tracker :init part-tracker-init (-> *part-group-id-table* 464) -1 #f #f self 7 :to self) + (process-spawn part-tracker :init part-tracker-init (-> *part-group-id-table* 465) -1 #f #f self 8 :to self) + (cond + ((= (-> self info mesh) 1) + (initialize-skeleton + self + (the-as + skeleton-group + (art-group-get-by-name *level* "skel-drill-barons-ship-turret-b" (the-as (pointer uint32) #f)) + ) + (the-as pair 0) + ) + (set! (-> self jmod) #f) + (set! (-> self jmod-left) #f) + (set! (-> self jmod-right) #f) + (setup-masks (-> self draw) 3 0) + ) + ((= (-> self info mesh) 2) + (initialize-skeleton + self + (the-as + skeleton-group + (art-group-get-by-name *level* "skel-drill-barons-ship-turret-c" (the-as (pointer uint32) #f)) + ) + (the-as pair 0) + ) + (set! (-> self jmod) (the-as joint-mod (new 'process 'joint-mod-add-local self 6 #f #t #f))) + (set! (-> self jmod twist-min-y) (the-as float #t)) + (quaternion-axis-angle! (the-as quaternion (-> self jmod twist)) 0.0 1.0 0.0 0.0) + (set! (-> self jmod-left) #f) + (set! (-> self jmod-right) #f) + (setup-masks (-> self draw) 3 0) + ) + (else + (initialize-skeleton + self + (the-as + skeleton-group + (art-group-get-by-name *level* "skel-drill-barons-ship-turret" (the-as (pointer uint32) #f)) + ) + (the-as pair 0) + ) + (set! (-> self jmod) (the-as joint-mod (new 'process 'joint-mod-add-local self 10 #f #t #f))) + (set! (-> self jmod twist-min-y) (the-as float #t)) + (set! (-> self jmod-left) (the-as joint-mod (new 'process 'joint-mod-add-local self 11 #f #t #f))) + (set! (-> self jmod-left twist-min-y) (the-as float #t)) + (set! (-> self jmod-right) (the-as joint-mod (new 'process 'joint-mod-add-local self 12 #f #t #f))) + (set! (-> self jmod-right twist-min-y) (the-as float #t)) + (quaternion-axis-angle! (the-as quaternion (-> self jmod twist)) 0.0 1.0 0.0 0.0) + (quaternion-axis-angle! (the-as quaternion (-> self jmod-left twist)) 0.0 0.0 1.0 0.0) + (quaternion-axis-angle! (the-as quaternion (-> self jmod-right twist)) 0.0 0.0 1.0 0.0) + (setup-masks (-> self draw) 3 0) + ) + ) + (go-virtual idle) + (none) + ) + +;; WARN: Return type mismatch process-drawable vs drill-barons-ship-turret. +(defmethod relocate drill-barons-ship-turret ((obj drill-barons-ship-turret) (arg0 int)) + (when (-> obj jmod) + (if (nonzero? (-> obj jmod)) + (&+! (-> obj jmod) arg0) + ) + ) + (when (-> obj jmod-left) + (if (nonzero? (-> obj jmod-left)) + (&+! (-> obj jmod-left) arg0) + ) + ) + (when (-> obj jmod-right) + (if (nonzero? (-> obj jmod-right)) + (&+! (-> obj jmod-right) arg0) + ) + ) + (the-as + drill-barons-ship-turret + ((the-as (function process-drawable int process-drawable) (find-parent-method drill-barons-ship-turret 7)) + obj + arg0 + ) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod init-from-entity! drill-barons-ship ((obj drill-barons-ship) (arg0 entity-actor)) + "Typically the method that does the initial setup on the process, potentially using the [[entity-actor]] provided as part of that. +This commonly includes things such as: +- stack size +- collision information +- loading the skeleton group / bones +- sounds" + (let ((s4-0 (new 'process 'collide-shape obj (collide-list-enum usually-hit-by-player)))) + (let ((s3-0 (new 'process 'collide-shape-prim-group s4-0 (the-as uint 1) 0))) + (set! (-> s4-0 total-prims) (the-as uint 2)) + (set! (-> s3-0 prim-core collide-as) (collide-spec obstacle)) + (set! (-> s3-0 prim-core collide-with) (collide-spec jak player-list)) + (set! (-> s3-0 prim-core action) (collide-action solid)) + (set! (-> s3-0 transform-index) 0) + (set-vector! (-> s3-0 local-sphere) 0.0 0.0 0.0 450560.0) + (set! (-> s4-0 root-prim) s3-0) + ) + (let ((v1-8 (new 'process 'collide-shape-prim-mesh s4-0 (the-as uint 0) (the-as uint 0)))) + (set! (-> v1-8 prim-core collide-as) (collide-spec obstacle)) + (set! (-> v1-8 prim-core collide-with) (collide-spec jak player-list)) + (set! (-> v1-8 prim-core action) (collide-action solid)) + (set! (-> v1-8 transform-index) 0) + (set-vector! (-> v1-8 local-sphere) 0.0 0.0 0.0 450560.0) + ) + (set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w))) + (let ((v1-11 (-> s4-0 root-prim))) + (set! (-> s4-0 backup-collide-as) (-> v1-11 prim-core collide-as)) + (set! (-> s4-0 backup-collide-with) (-> v1-11 prim-core collide-with)) + ) + (set! (-> obj root-override) (the-as collide-shape-moving s4-0)) + ) + (process-drawable-from-entity! obj arg0) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-drill-barons-ship" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logior! (-> obj skel status) (joint-control-status sync-math)) + (quaternion-vector-angle! (-> obj root-override quat) *y-vector* -16384.0) + (set-vector! (-> obj root-override trans) 737280.0 -1024000.0 -1433600.0 1.0) + (set! (-> obj next-to-shoot-idx) 0) + (quaternion-copy! (-> obj init-quat) (-> obj root-override quat)) + (set! (-> obj current-y-position) (-> obj root-override trans y)) + (set! (-> obj from-y) (-> obj current-y-position)) + (set! (-> obj inc-y) 1228.8) + (set! (-> obj ease-y) 40960.0) + (set! (-> obj pass) 0) + (set! (-> obj end-of-pass) #f) + (set! (-> obj rock-angle) 0.0) + (let ((a0-21 (-> obj skel root-channel 0))) + (set! (-> a0-21 frame-group) (the-as art-joint-anim (-> obj draw art-group data 2))) + (set! (-> a0-21 frame-num) 0.0) + (joint-control-channel-group! a0-21 (the-as art-joint-anim (-> obj draw art-group data 2)) num-func-identity) + ) + (ja-post) + (dotimes (s5-2 (length *barons-ship-turrets*)) + (process-spawn drill-barons-ship-turret (-> *barons-ship-turrets* s5-2) :to obj) + ) + (set! (-> *barons-ship-turrets* (-> *ship-turrets-first-pass* 3) alive) #f) + (set! (-> *barons-ship-turrets* (-> *ship-turrets-first-pass* 9) alive) #f) + (set! (-> *barons-ship-turrets* (-> *ship-turrets-first-pass* 11) alive) #f) + (set! (-> obj soundid) (the-as uint (sound-play "drl-ship-steady"))) + (go (method-of-object obj hidden)) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defbehavior drill-barons-ship-explode-init-by-other drill-barons-ship-explode ((arg0 entity-actor)) + (set! (-> self root) (new 'process 'trsqv)) + (logclear! (-> self mask) (process-mask actor-pause)) + (process-entity-status! self (entity-perm-status no-kill) #t) + (quaternion-vector-angle! (-> self root quat) *y-vector* -16384.0) + (set! (-> self root trans quad) (-> (the-as process-drawable (-> self parent 0)) root trans quad)) + (initialize-skeleton + self + (the-as + skeleton-group + (art-group-get-by-name *level* "skel-drill-barons-ship-explode" (the-as (pointer uint32) #f)) + ) + (the-as pair 0) + ) + (ja-no-eval :group! (-> self draw art-group data 5) :num! zero) + (ja-post) + (quaternion-rotate-local-y! (-> self root quat) (-> self root quat) 32768.0) + (add-process *gui-control* self (gui-channel background) (gui-action play) "shpxplo2" -99.0 0) + (go-virtual idle) + (none) + ) + +(deftype drill-ship-shot (guard-shot) + () + :heap-base #x170 + :method-count-assert 40 + :size-assert #x1f0 + :flag-assert #x28017001f0 + ) + + +(defmethod deal-damage! drill-ship-shot ((obj drill-ship-shot) (arg0 process) (arg1 event-message-block)) + "Constructs an [[attack-info]] according to the projectile's `options`" + (if (not (and (-> (the-as drill-barons-ship (-> obj parent 0)) next-state) + (= (-> (the-as drill-barons-ship (-> obj parent 0)) next-state name) 'hidden) + ) + ) + ((method-of-type guard-shot deal-damage!) obj arg0 arg1) + #f + ) + ) + +(defun drill-ship-shot-move ((arg0 drill-ship-shot)) + (guard-shot-move arg0) + 0 + (none) + ) + +(defmethod init-proj-settings! drill-ship-shot ((obj drill-ship-shot)) + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" + ((the-as (function guard-shot none) (find-parent-method drill-ship-shot 31)) obj) + (set! (-> obj attack-mode) 'drill-ship-shot) + (set! (-> obj move) guard-shot-move) + (set! (-> obj max-speed) 737280.0) + (set! (-> obj timeout) (seconds 4.167)) + (none) + ) + +;; NOTE: decompiled by hand +;; TODO make the decompiler work on static data of this type +;; (define *drill-ship-turret-speed-event* (the-as turret-path-event L183)) +(define *drill-ship-turret-speed-event* + (new 'static 'turret-path-event + :pos 0.0 + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x140) + ) + ) + +(defstate idle (drill-barons-ship-explode) + :virtual #t + :code (behavior () + (ja-no-eval :group! (ja-group) + :num! (seek! (the float (+ (-> (ja-group) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (none) + ) + :post (the-as (function none :behavior drill-barons-ship-explode) ja-post) + ) + +(defstate hidden (drill-barons-ship) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('trigger-back) + (set! (-> self pass) 1) + (dotimes (gp-0 (length *ship-turrets-first-pass*)) + (set! (-> *barons-ship-turrets* (-> *ship-turrets-first-pass* gp-0) alive) #f) + ) + (go-virtual idle) + ) + (('trigger) + (go-virtual idle) + ) + (('pass-complete?) + (when (>= (-> self pass) 2) + (task-node-close! (game-task-node drill-ship-resolution)) + (set-continue! *game-info* "drillmid-ship-warp" #f) + (talker-spawn-func (-> *talker-speech* 102) *entity-pool* (target-pos 0) (the-as region #f)) + ) + #t + ) + ) + ) + :enter (behavior () + (set! (-> self from-y) (-> self current-y-position)) + (set! (-> self inc-y) 3276.8) + (set! (-> self ease-y) 40960.0) + (when (> (-> self pass) 0) + (let ((a0-2 (the-as turret (process-by-name + (if (= (-> self pass) 1) + "turret-14" + "turret-15" + ) + *active-pool* + ) + ) + ) + ) + (if a0-2 + (base-turret-method-39 a0-2 *drill-ship-turret-speed-event*) + ) + ) + ) + (none) + ) + :code (behavior () + (cond + ((>= (-> self pass) 2) + (set! (-> self current-y-position) -1024000.0) + (let* ((gp-0 (get-process *default-dead-pool* drill-barons-ship-explode #x4000)) + (v1-3 (when gp-0 + (let ((t9-1 (method-of-type drill-barons-ship-explode activate)) + (a0-1 gp-0) + (a1-1 self) + (a2-3 (symbol->string (-> drill-barons-ship-explode symbol))) + ) + (t9-1 (the-as drill-barons-ship-explode a0-1) a1-1 a2-3 (the-as pointer #x70004000)) + (run-now-in-process gp-0 drill-barons-ship-explode-init-by-other (the-as none a2-3)) + ) + (-> gp-0 ppointer) + ) + ) + ) + (change-parent (-> v1-3 0) *entity-pool*) + ) + (until (task-node-closed? (game-task-node drill-ship-resolution)) + (suspend) + ) + (cleanup-for-death self) + ) + (else + (until #f + (ja :num-func num-func-identity :frame-num 0.0) + (suspend) + ) + #f + ) + ) + (none) + ) + :post (behavior () + (set! (-> self current-y-position) + (seek-ease-in-out + (-> self current-y-position) + (-> self from-y) + -1024000.0 + (* (-> self inc-y) (-> self clock time-adjust-ratio)) + (-> self ease-y) + (-> self ease-y) + (* 0.05 (-> self clock time-adjust-ratio) (-> self inc-y)) + ) + ) + (set! (-> self root-override trans y) + (+ (-> self current-y-position) + (* 4096.0 (* 2.0 (sin (+ 16384.0 (* 45.511112 (the float (-> self clock frame-counter))))))) + ) + ) + (drill-barons-ship-method-22 self) + (transform-post) + (none) + ) + ) + +(defstate idle (drill-barons-ship) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (the-as object (case event-type + (('pass-complete?) + (set! (-> self end-of-pass) #t) + #f + ) + ) + ) + ) + :enter (behavior () + (set-setting! 'music 'danger4 0 0) + (let ((v1-2 2) + (a0-2 (+ (-> self pass) 1)) + ) + (set! (-> self pass) a0-2) + (if (= a0-2 v1-2) + (quaternion-rotate-local-y! (-> self init-quat) (-> self init-quat) 32768.0) + ) + ) + (set! (-> self inc-y) 2048.0) + (set! (-> self ease-y) 40960.0) + (set! (-> self end-of-pass) #f) + (none) + ) + :exit (behavior () + (remove-setting! 'music) + (none) + ) + :code (behavior () + (until #f + (ja :num-func num-func-identity :frame-num 0.0) + (suspend) + ) + #f + (none) + ) + :post (behavior () + (let ((gp-0 (if (= (-> self pass) 1) + *ship-turrets-first-pass* + *ship-turrets-second-pass* + ) + ) + ) + (let* ((s5-0 (-> *barons-ship-turrets* (-> gp-0 (-> self next-to-shoot-idx)))) + (f30-0 (if (= (-> self pass) 1) + 0.0 + 40960.0 + ) + ) + (f28-0 (+ f30-0 (-> s5-0 ship-y-offset))) + ) + (cond + ((and (not (-> s5-0 next-to-shoot)) (= (-> self current-y-position) f28-0)) + (let ((s4-0 1) + (s3-0 (-> self next-to-shoot-idx)) + (s5-1 (-> self next-to-shoot-idx)) + ) + (while (and (not (-> *barons-ship-turrets* (-> gp-0 (mod (+ s3-0 s4-0) (length gp-0))) alive)) + (< s4-0 (+ (length gp-0) 1)) + ) + (+! s4-0 1) + ) + (set! (-> self next-to-shoot-idx) (mod (+ s3-0 s4-0) (length gp-0))) + (let ((v1-35 (-> *barons-ship-turrets* (-> gp-0 (-> self next-to-shoot-idx))))) + (when (-> v1-35 alive) + (cond + ((= s5-1 (-> self next-to-shoot-idx)) + (set! (-> v1-35 next-to-shoot) (the-as basic #t)) + ) + (else + (set! (-> self from-y) (-> self current-y-position)) + (let ((f0-6 (fabs (- (+ f30-0 (-> v1-35 ship-y-offset)) (-> self from-y))))) + (set! (-> self inc-y) (* 0.02 f0-6)) + (set! (-> self ease-y) (* 0.2 f0-6)) + ) + ) + ) + ) + ) + ) + ) + (else + (set! (-> self current-y-position) + (seek-ease-in-out + (-> self current-y-position) + (-> self from-y) + f28-0 + (* (-> self inc-y) (-> self clock time-adjust-ratio)) + (-> self ease-y) + (-> self ease-y) + (* 0.05 (-> self clock time-adjust-ratio) (-> self inc-y)) + ) + ) + (if (and (= (-> self current-y-position) f28-0) (-> s5-0 alive)) + (set! (-> s5-0 next-to-shoot) (the-as basic #t)) + ) + ) + ) + ) + (let ((s5-2 #t)) + (dotimes (s4-2 (length gp-0)) + (if (-> *barons-ship-turrets* (-> gp-0 s4-2) alive) + (set! s5-2 #f) + ) + ) + (if s5-2 + (go-virtual hidden) + ) + ) + ) + (set! (-> self root-override trans y) + (+ (-> self current-y-position) + (* 4096.0 (* 2.0 (sin (+ 16384.0 (* 45.511112 (the float (-> self clock frame-counter))))))) + ) + ) + (drill-barons-ship-method-22 self) + (+! (-> self x-offset-angle) (* 0.7 (-> self clock time-adjust-ratio))) + (transform-post) + (none) + ) + ) + +(defmethod drill-barons-ship-method-22 drill-barons-ship ((obj drill-barons-ship)) + (with-pp + (quaternion-rotate-local-x! + (-> obj root-override quat) + (-> obj init-quat) + (* 182.04445 (sin (* 36.40889 (the float (-> pp clock frame-counter))))) + ) + (let ((f30-2 (* 182.04445 (* 5.0 (sin (* 45.511112 (the float (-> pp clock frame-counter)))))))) + (when (!= (-> obj rock-angle) 0.0) + (+! f30-2 (* 182.04445 (* 20.0 + (if (= (-> obj pass) 1) + 1.0 + -1.0 + ) + (sin (* 182.04445 (-> obj rock-angle))) + ) + ) + ) + (set! (-> obj rock-angle) + (seek-ease + (-> obj rock-angle) + 0.0 + (* 5.0 (-> pp clock time-adjust-ratio)) + 90.0 + (* 0.1 (-> pp clock time-adjust-ratio)) + ) + ) + ) + (quaternion-rotate-local-z! (-> obj root-override quat) (-> obj root-override quat) f30-2) + ) + (set! (-> obj root-override trans z) + (+ (* 4096.0 (* 30.0 (cos (* 45.511112 (the float (-> pp clock frame-counter)))))) (if (= (-> obj pass) 1) + -1433600.0 + -1433600.0 + ) + ) + ) + (if *target* + (set! (-> obj root-override trans x) + (+ (-> *target* control trans x) (* 4096.0 (+ (if (= (-> obj pass) 1) + 15.0 + -35.0 + ) + (* 40.0 (sin (* 182.04445 (-> obj x-offset-angle)))) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod drill-barons-ship-turret-method-24 drill-barons-ship-turret ((obj drill-barons-ship-turret)) + (with-pp + (vector<-cspace! + (-> obj root-override trans) + (-> (the-as drill-barons-ship (-> obj parent 0)) node-list data (-> obj info joint-idx)) + ) + (let ((a2-1 (quaternion-axis-angle! (new 'stack-no-clear 'quaternion) 0.0 1.0 0.0 (-> obj info init-y-angle)))) + (quaternion*! + (-> obj root-override quat) + (-> (the-as drill-barons-ship (-> obj parent 0)) root-override quat) + a2-1 + ) + ) + (when (-> obj jmod) + (let ((s5-1 (vector-! (new 'stack-no-clear 'vector) (target-pos 0) (-> obj root-override trans))) + (s3-0 (quaternion->matrix (new-stack-matrix0) (-> obj root-override quat))) + ) + (vector-normalize! s5-1 1.0) + (let* ((s4-0 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s3-0 vector 1) 1.0)) + (s3-1 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s3-0 vector 2) 1.0)) + (a0-13 (vector-normalize! (vector-flatten! (new 'stack-no-clear 'vector) s5-1 s4-0) 1.0)) + (f30-0 (vector-y-angle a0-13)) + (f0-1 (vector-y-angle s3-1)) + (f0-5 (fmax + (fmin (+ (deg-diff f0-1 f30-0) (* 182.04445 (-> obj error-y-angle))) (-> obj info twist-y-max)) + (- (-> obj info twist-y-max)) + ) + ) + ) + (quaternion-axis-angle! (the-as quaternion (-> obj jmod twist)) 0.0 1.0 0.0 f0-5) + ) + ) + (if (-> obj jmod-left) + (quaternion-axis-angle! + (the-as quaternion (-> obj jmod-left twist)) + 0.0 + 0.0 + 1.0 + (* 182.04445 (* -3.0 (the float (-> pp clock frame-counter)))) + ) + ) + (if (-> obj jmod-right) + (quaternion-axis-angle! + (the-as quaternion (-> obj jmod-right twist)) + 0.0 + 0.0 + 1.0 + (* 182.04445 (* 3.0 (the float (-> pp clock frame-counter)))) + ) + ) + ) + 0 + (none) + ) + ) + +(defstate dead (drill-barons-ship-turret) + :virtual #t + :enter (behavior () + (let ((v1-1 (-> self root-override root-prim))) + (set! (-> v1-1 prim-core collide-as) (collide-spec)) + (set! (-> v1-1 prim-core collide-with) (collide-spec)) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :trans (behavior () + (vector<-cspace! + (-> self root-override trans) + (-> (the-as drill-barons-ship (-> self parent 0)) node-list data (-> self info joint-idx)) + ) + (let ((a2-1 (quaternion-axis-angle! (new 'stack-no-clear 'quaternion) 0.0 1.0 0.0 (-> self info init-y-angle)))) + (quaternion*! + (-> self root-override quat) + (-> (the-as drill-barons-ship (-> self parent 0)) root-override quat) + a2-1 + ) + ) + (if (and (-> (the-as drill-barons-ship (-> self parent 0)) next-state) + (= (-> (the-as drill-barons-ship (-> self parent 0)) next-state name) 'hidden) + ) + (go-virtual going-down) + ) + (none) + ) + :code (behavior () + (until #f + (ja :num-func num-func-identity :frame-num 0.0) + (suspend) + ) + #f + (none) + ) + :post (behavior () + (transform-post) + (none) + ) + ) + +(defstate going-down (drill-barons-ship-turret) + :virtual #t + :enter (behavior () + (cond + ((>= (-> (the-as drill-barons-ship (-> self parent 0)) pass) 2) + (when (zero? (-> self info mesh)) + (let ((gp-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-0 + (let ((t9-1 (method-of-type part-tracker activate))) + (t9-1 + (the-as part-tracker gp-0) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-2 run-function-in-process) + (a0-2 gp-0) + (a1-2 part-tracker-init) + (a2-4 (-> *part-group-id-table* 469)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override trans quad)) + ((the-as (function object object object object object object object object none) t9-2) + a0-2 + a1-2 + a2-4 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> gp-0 ppointer) + ) + ) + ) + ) + ((zero? (-> self info mesh)) + (process-spawn + part-tracker + :init part-tracker-init + (-> *part-group-id-table* 466) + 0 + #f + #f + self + 3 + :to *entity-pool* + ) + ) + (else + (let ((gp-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-2 + (let ((t9-7 (method-of-type part-tracker activate))) + (t9-7 + (the-as part-tracker gp-2) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-8 run-function-in-process) + (a0-8 gp-2) + (a1-8 part-tracker-init) + (a2-14 (-> *part-group-id-table* 469)) + (a3-5 0) + (t0-2 #f) + (t1-2 #f) + (t2-2 #f) + (t3-2 *launch-matrix*) + ) + (set! (-> t3-2 trans quad) (-> self root-override trans quad)) + ((the-as (function object object object object object object object object none) t9-8) + a0-8 + a1-8 + a2-14 + a3-5 + t0-2 + t1-2 + t2-2 + t3-2 + ) + ) + (-> gp-2 ppointer) + ) + ) + ) + ) + (none) + ) + :trans (behavior () + (vector<-cspace! + (-> self root-override trans) + (-> (the-as drill-barons-ship (-> self parent 0)) node-list data (-> self info joint-idx)) + ) + (if (not (and (-> (the-as drill-barons-ship (-> self parent 0)) next-state) + (= (-> (the-as drill-barons-ship (-> self parent 0)) next-state name) 'hidden) + ) + ) + (go-virtual dead) + ) + (none) + ) + :code (behavior () + (until #f + (ja :num-func num-func-identity :frame-num 0.0) + (suspend) + ) + #f + (none) + ) + :post (behavior () + (transform-post) + (none) + ) + ) + +(defun calculate-ship-projectile-velocity ((arg0 projectile-init-by-other-params) (arg1 float)) + (let* ((s4-0 *target*) + (a0-2 (if (type? s4-0 process-focusable) + s4-0 + ) + ) + ) + (cond + (a0-2 + (let ((a0-3 (get-trans a0-2 0))) + (set-vector! + (-> arg0 vel) + 0.0 + (+ (- 6144.0 (-> arg0 pos y)) (-> a0-3 y)) + (vector-vector-xz-distance a0-3 (-> arg0 pos)) + 1.0 + ) + ) + (vector-normalize! (-> arg0 vel) 1.0) + ) + (else + (set-vector! (-> arg0 vel) 0.0 0.0 1.0 1.0) + ) + ) + ) + (vector-rotate-y! (-> arg0 vel) (-> arg0 vel) arg1) + (vector-normalize! (-> arg0 vel) 737280.0) + 0 + (none) + ) + +(defstate attack (drill-barons-ship-turret) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('attack) + (when (and (-> self info alive) (= (-> self anim-frame) 1.0)) + (+! (-> self hit-count) 1) + (cond + ((!= (-> self hit-count) 20) + (sound-play "ship-gun-hit") + ) + (else + (set! (-> self info alive) #f) + (set! (-> self info next-to-shoot) #f) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (set! (-> gp-1 quad) (-> self root-override trans quad)) + (set! (-> gp-1 z) (+ 81920.0 (-> gp-1 z))) + (let ((s5-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s5-1 + (let ((t9-3 (method-of-type part-tracker activate))) + (t9-3 + (the-as part-tracker s5-1) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-4 run-function-in-process) + (a0-7 s5-1) + (a1-4 part-tracker-init) + (a2-6 (-> *part-group-id-table* 469)) + (a3-3 0) + (t0-1 #f) + (t1-1 #f) + (t2-1 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> gp-1 quad)) + ((the-as (function object object object object object object object object none) t9-4) + a0-7 + a1-4 + a2-6 + a3-3 + t0-1 + t1-1 + t2-1 + t3-0 + ) + ) + (-> s5-1 ppointer) + ) + ) + ) + (sound-play "shp-turret-xplo") + (cond + ((= (-> self info mesh) 1) + (setup-masks (-> self draw) 0 1) + (process-spawn part-tracker :init part-tracker-init (-> *part-group-id-table* 468) 0 #f #f self 3 :to self) + ) + ((= (-> self info mesh) 2) + (setup-masks (-> self draw) 0 1) + (process-spawn part-tracker :init part-tracker-init (-> *part-group-id-table* 467) 0 #f #f self 3 :to self) + ) + (else + (setup-masks (-> self draw) 0 1) + (process-spawn part-tracker :init part-tracker-init (-> *part-group-id-table* 466) 0 #f #f self 3 :to self) + ) + ) + (sound-play "ship-veer") + (set! (-> (the-as drill-barons-ship (-> self parent 0)) rock-angle) 180.0) + (go-virtual dead) + ) + ) + ) + ) + ) + ) + :enter (behavior () + (set! (-> self shot-timer) (-> self clock frame-counter)) + (set! (-> self shot-counter) 0) + (set! (-> self error-y-angle) (if (< 25.0 (rand-vu-float-range 0.0 50.0)) + -15.0 + 15.0 + ) + ) + (set! (-> self error-y-angle-dest) (- (-> self error-y-angle))) + (let ((v1-5 (-> self root-override root-prim))) + (set! (-> v1-5 prim-core collide-as) (-> self root-override backup-collide-as)) + (set! (-> v1-5 prim-core collide-with) (-> self root-override backup-collide-with)) + ) + (cond + ((= (-> self info mesh) 1) + (process-spawn + part-tracker + :init part-tracker-init + (-> *part-group-id-table* 460) + 0 + #f + #f + self + 3 + :to *entity-pool* + ) + ) + ((= (-> self info mesh) 2) + (process-spawn + part-tracker + :init part-tracker-init + (-> *part-group-id-table* 459) + 0 + #f + #f + self + 3 + :to *entity-pool* + ) + ) + (else + (process-spawn + part-tracker + :init part-tracker-init + (-> *part-group-id-table* 458) + 0 + #f + #f + self + 3 + :to *entity-pool* + ) + ) + ) + (if (zero? (-> self info mesh)) + (set! (-> self soundid) (sound-play "ship-gun1-chain")) + ) + (none) + ) + :exit (behavior () + (if (zero? (-> self info mesh)) + (sound-stop (-> self soundid)) + ) + (let ((v1-5 (-> self root-override root-prim))) + (set! (-> v1-5 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 prim-core collide-with) (collide-spec)) + ) + 0 + (cond + ((= (-> self info mesh) 1) + (sound-play "ship-gun2-down") + ) + ((= (-> self info mesh) 2) + (sound-play "ship-gun3-close") + ) + (else + (sound-play "ship-gun1-down") + ) + ) + (none) + ) + :code (behavior () + (cond + ((= (-> self info mesh) 1) + (sound-play "ship-gun2-up") + ) + ((= (-> self info mesh) 2) + (sound-play "ship-gun3-open") + ) + (else + (sound-play "ship-gun1-up") + ) + ) + (until #f + (seek! (-> self anim-frame) 1.0 (* 0.01 (-> self clock time-adjust-ratio))) + (let ((v1-12 (-> self skel root-channel 0))) + (set! (-> v1-12 num-func) num-func-identity) + (let ((f0-4 (-> self anim-frame)) + (a0-13 (cond + ((= (-> self info mesh) 1) + 3.0 + ) + ((= (-> self info mesh) 2) + 10.0 + ) + (else + 11.0 + ) + ) + ) + ) + (set! (-> v1-12 frame-num) (* f0-4 a0-13)) + ) + ) + (suspend) + ) + #f + (none) + ) + :post (behavior () + (drill-barons-ship-turret-method-24 self) + (if (and (-> (the-as drill-barons-ship (-> self parent 0)) next-state) + (= (-> (the-as drill-barons-ship (-> self parent 0)) next-state name) 'hidden) + ) + (go-virtual idle) + ) + (when (and (= (-> self anim-frame) 1.0) (>= (- (-> self clock frame-counter) (-> self shot-timer)) (seconds 0.2))) + (let ((gp-0 (new 'stack-no-clear 'projectile-init-by-other-params))) + (cond + ((-> self jmod) + (let* ((a1-1 (quaternion-copy! (new 'stack-no-clear 'quaternion) (the-as quaternion (-> self jmod twist)))) + (v1-23 (quaternion->matrix (new-stack-matrix0) a1-1)) + (f30-0 (vector-y-angle (-> v1-23 vector 2))) + ) + (set! (-> gp-0 ent) #f) + (set! (-> gp-0 charge) 1.0) + (set! (-> gp-0 options) (projectile-options)) + (set! (-> gp-0 notify-handle) (the-as handle #f)) + (set! (-> gp-0 owner-handle) (the-as handle #f)) + (set! (-> gp-0 ignore-handle) (process->handle self)) + (let* ((v1-28 *game-info*) + (a0-11 (+ (-> v1-28 attack-id) 1)) + ) + (set! (-> v1-28 attack-id) a0-11) + (set! (-> gp-0 attack-id) a0-11) + ) + (set! (-> gp-0 timeout) (seconds 4)) + (cond + ((zero? (-> self info mesh)) + (cond + ((not (logtest? (-> self shot-counter) 1)) + (vector<-cspace! (-> gp-0 pos) (-> self node-list data 13)) + (calculate-ship-projectile-velocity gp-0 f30-0) + (spawn-projectile drill-ship-shot gp-0 self *default-dead-pool*) + ) + (else + (vector<-cspace! (-> gp-0 pos) (-> self node-list data 14)) + (calculate-ship-projectile-velocity gp-0 f30-0) + (spawn-projectile drill-ship-shot gp-0 self *default-dead-pool*) + ) + ) + ) + ((not (logtest? (-> self shot-counter) 1)) + (vector<-cspace! (-> gp-0 pos) (-> self node-list data 9)) + (calculate-ship-projectile-velocity gp-0 f30-0) + (spawn-projectile drill-ship-shot gp-0 self *default-dead-pool*) + ) + (else + (vector<-cspace! (-> gp-0 pos) (-> self node-list data 11)) + (calculate-ship-projectile-velocity gp-0 f30-0) + (spawn-projectile drill-ship-shot gp-0 self *default-dead-pool*) + ) + ) + ) + ) + (else + (let ((v1-45 (quaternion->matrix (new-stack-matrix0) (-> self root-override quat))) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s5-0 quad) (-> v1-45 vector 2 quad)) + (vector-normalize! s5-0 1.0) + (vector-normalize-copy! (-> gp-0 vel) s5-0 737280.0) + ) + (set! (-> gp-0 ent) #f) + (set! (-> gp-0 charge) 1.0) + (set! (-> gp-0 options) (projectile-options)) + (set! (-> gp-0 notify-handle) (the-as handle #f)) + (set! (-> gp-0 owner-handle) (the-as handle #f)) + (set! (-> gp-0 ignore-handle) (process->handle self)) + (let* ((v1-52 *game-info*) + (a0-32 (+ (-> v1-52 attack-id) 1)) + ) + (set! (-> v1-52 attack-id) a0-32) + (set! (-> gp-0 attack-id) a0-32) + ) + (set! (-> gp-0 timeout) (seconds 4)) + (cond + ((not (logtest? (-> self shot-counter) 1)) + (vector<-cspace! (-> gp-0 pos) (-> self node-list data 6)) + (calculate-ship-projectile-velocity gp-0 0.0) + (spawn-projectile drill-ship-shot gp-0 self *default-dead-pool*) + ) + (else + (vector<-cspace! (-> gp-0 pos) (-> self node-list data 5)) + (calculate-ship-projectile-velocity gp-0 0.0) + (spawn-projectile drill-ship-shot gp-0 self *default-dead-pool*) + ) + ) + ) + ) + ) + (sound-play "ship-gun1-fire") + (+! (-> self shot-counter) 1) + (set! (-> self shot-timer) (-> self clock frame-counter)) + (seek! (-> self error-y-angle) (-> self error-y-angle-dest) (-> self clock time-adjust-ratio)) + (if (= (-> self error-y-angle) (-> self error-y-angle-dest)) + (set! (-> self info next-to-shoot) #f) + ) + ) + (if (= (-> self error-y-angle) (-> self error-y-angle-dest)) + (go-virtual idle) + ) + (transform-post) + (none) + ) + ) + +(defstate idle (drill-barons-ship-turret) + :virtual #t + :enter (behavior () + (set! (-> self hit-count) 0) + 0 + (none) + ) + :code (behavior () + (until #f + (seek! (-> self anim-frame) 0.0 (* 0.01 (-> self clock time-adjust-ratio))) + (let ((v1-4 (-> self skel root-channel 0))) + (set! (-> v1-4 num-func) num-func-identity) + (let ((f0-4 (-> self anim-frame)) + (a0-3 (cond + ((= (-> self info mesh) 1) + 3.0 + ) + ((= (-> self info mesh) 2) + 10.0 + ) + (else + 11.0 + ) + ) + ) + ) + (set! (-> v1-4 frame-num) (* f0-4 a0-3)) + ) + ) + (suspend) + ) + #f + (none) + ) + :post (behavior () + (cond + ((-> self info alive) + (drill-barons-ship-turret-method-24 self) + (if (-> self info next-to-shoot) + (go-virtual attack) + ) + ) + (else + (go-virtual dead) + ) + ) + (transform-post) + (none) + ) + ) diff --git a/goal_src/jak2/levels/drill_platform/drill-obs.gc b/goal_src/jak2/levels/drill_platform/drill-obs.gc index 9f35572a4e..f0adc87f42 100644 --- a/goal_src/jak2/levels/drill_platform/drill-obs.gc +++ b/goal_src/jak2/levels/drill_platform/drill-obs.gc @@ -1534,7 +1534,7 @@ This commonly includes things such as: (set! (-> v1-48 attack-id) a0-24) (set! (-> s4-4 attack-id) a0-24) ) - (set! (-> s4-4 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-4 timeout) (seconds 4)) (set! (-> s4-4 pos quad) (-> s5-1 start-pos quad)) (vector-normalize-copy! (-> s4-4 vel) (-> s5-1 move-dist) 4096000.0) (spawn-projectile guard-lazer-shot s4-4 self *default-dead-pool*) @@ -1703,20 +1703,20 @@ This commonly includes things such as: (set-subtask-hook! *game-info* 118 1 (lambda () (the-as object (speech-control-method-9 *speech-control*)))) (defun drill-login () - ;; (set! *nav-network* (new 'loading-level 'nav-network)) - ;; (nav-network-method-9 *nav-network*) + (set! *nav-network* (new 'loading-level 'nav-network)) + (nav-network-method-9 *nav-network*) 0 (none) ) (defun drill-deactivate ((arg0 level)) - ;; (set! *nav-network* (the-as nav-network 0)) + (set! *nav-network* (the-as nav-network 0)) 0 (none) ) (defun drill-activate ((arg0 level)) - ;; (nav-network-method-10 *nav-network* arg0 *drill-adjacency*) + (nav-network-method-10 *nav-network* arg0 *drill-adjacency*) 0 (none) ) diff --git a/goal_src/jak2/levels/drill_platform/drill-turret.gc b/goal_src/jak2/levels/drill_platform/drill-turret.gc index 5a4a7dede4..776c71a89e 100644 --- a/goal_src/jak2/levels/drill_platform/drill-turret.gc +++ b/goal_src/jak2/levels/drill_platform/drill-turret.gc @@ -7,3 +7,577 @@ ;; DECOMP BEGINS +(deftype turret (base-turret) + ((hover-battle handle :offset-assert 568) + (hover-formation hover-formation :offset-assert 576) + (use-egg-hud symbol :offset-assert 580) + (hud-egg handle :offset-assert 584) + (use-cgh-hud symbol :offset-assert 592) + (hud-cgh handle :offset-assert 600) + (hud-cgh-event symbol :offset-assert 608) + (egg-timer time-frame :offset-assert 616) + (cgh-timer time-frame :offset-assert 624) + ) + :heap-base #x200 + :method-count-assert 49 + :size-assert #x278 + :flag-assert #x3102000278 + ) + + +(define *drill-turret-10-battle* + (new 'static 'boxed-array :type hover-enemy-battle-command + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 2) :alive-count 1) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x1 :time (seconds 2)) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 2) :alive-count 1) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x3 :time (seconds 2)) + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 2) :alive-count 1) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 2) :alive-count 1) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x1 :time (seconds 2)) + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 2)) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x3 :time (seconds 2)) + ) + ) + +(define *drill-turret-11-battle* + (new 'static 'boxed-array :type hover-enemy-battle-command + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 2) :alive-count 1) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x1 :time (seconds 2) :alive-count 1) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 2)) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x3 :time (seconds 2)) + ) + ) + +(define *drill-turret-12-battle* + (new 'static 'boxed-array :type hover-enemy-battle-command + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 2) :alive-count 1) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x1 :time (seconds 2) :alive-count 2) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 2) :alive-count 2) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x3 :time (seconds 2)) + ) + ) + +;; NOTE: the turret paths were decompiled by hand +;; the static boxed-arrays were originally just int32's, but that didn't compile +;; TODO make these decompile +(define *turret-13-path* + (new 'static 'turret-path + :event-count 16 + :event-tbl (new 'static 'inline-array turret-path-event 16 + (new 'static 'turret-path-event + :pos (the-as float #x3d4ccccd) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #xa0) + ) + (new 'static 'turret-path-event + :pos (the-as float #x3dcccccd) + :event-type 'script + :param '(send-event "drill-elec-gate-1" 'shutdown) + ) + (new 'static 'turret-path-event + :pos (the-as float #x3dcccccd) + :event-type 'cue-chase + :param "crimson-guard-hover-5" + ) + (new 'static 'turret-path-event + :pos (the-as float #x3f800000) + :event-type 'cue-chase + :param "crimson-guard-hover-6" + ) + (new 'static 'turret-path-event + :pos (the-as float #x3f800000) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x50) + ) + (new 'static 'turret-path-event + :pos (the-as float #x40400000) + :event-type 'cue-chase + :param "crimson-guard-hover-3" + ) + (new 'static 'turret-path-event + :pos (the-as float #x40666666) + :event-type 'cue-chase + :param "crimson-guard-hover-1" + ) + (new 'static 'turret-path-event + :pos (the-as float #x40d00000) + :event-type 'cue-chase + :param "crimson-guard-hover-7" + ) + (new 'static 'turret-path-event + :pos (the-as float #x41066666) + :event-type 'cue-chase + :param "crimson-guard-hover-9" + ) + (new 'static 'turret-path-event + :pos (the-as float #x4109999a) + :event-type 'cue-chase + :param "crimson-guard-hover-8" + ) + (new 'static 'turret-path-event + :pos (the-as float #x41500000) + :event-type 'pause-until + :param (lambda () + (and (logtest? (-> (entity-by-name "crimson-guard-hover-1") extra perm status) + (entity-perm-status subtask-complete) + ) + (logtest? (-> (entity-by-name "crimson-guard-hover-3") extra perm status) + (entity-perm-status subtask-complete) + ) + (logtest? (-> (entity-by-name "crimson-guard-hover-5") extra perm status) + (entity-perm-status subtask-complete) + ) + (logtest? (-> (entity-by-name "crimson-guard-hover-6") extra perm status) + (entity-perm-status subtask-complete) + ) + (logtest? (-> (entity-by-name "crimson-guard-hover-7") extra perm status) + (entity-perm-status subtask-complete) + ) + (logtest? (-> (entity-by-name "crimson-guard-hover-8") extra perm status) + (entity-perm-status subtask-complete) + ) + (logtest? (-> (entity-by-name "crimson-guard-hover-9") extra perm status) + (entity-perm-status subtask-complete) + ) + ) + ) + ) + (new 'static 'turret-path-event + :pos (the-as float #x41580000) + :event-type 'trigger-battle + :param '() + ) + (new 'static 'turret-path-event + :pos (the-as float #x41580000) + :event-type 'pause-while + :param (lambda ((arg0 turret)) + (send-event (handle->process (-> arg0 hover-battle)) 'spawning?) + ) + ) + (new 'static 'turret-path-event + :pos (the-as float #x41680000) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x1e0) + ) + (new 'static 'turret-path-event + :pos (the-as float #x41800000) + :event-type 'script + :param '(send-event "drill-elec-gate-7" 'shutdown) + ) + (new 'static 'turret-path-event + :pos (the-as float #x41940000) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x50) + ) + ) + ) + ) + +;; (define *turret-14-path* (the-as turret-path L138)) +(define *turret-14-path* + (new 'static 'turret-path + :event-count 11 + :event-tbl (new 'static 'inline-array turret-path-event 11 + (new 'static 'turret-path-event + :pos (the-as float #x3d4ccccd) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x50) + ) + (new 'static 'turret-path-event + :pos (the-as float #x3d4ccccd) + :event-type 'cue-chase + :param "crimson-guard-hover-25" + ) + (new 'static 'turret-path-event + :pos (the-as float #x3dcccccd) + :event-type 'cue-chase + :param "crimson-guard-hover-26" + ) + (new 'static 'turret-path-event + :pos (the-as float #x40800000) + :event-type 'script + :param '(send-event "drill-barons-ship-3" 'trigger) + ) + (new 'static 'turret-path-event + :pos (the-as float #x41000000) + :event-type 'cue-chase + :param "crimson-guard-hover-47" + ) + (new 'static 'turret-path-event + :pos (the-as float #x41d80000) + :event-type 'cue-chase + :param "crimson-guard-hover-49" + ) + (new 'static 'turret-path-event + :pos (the-as float #x422b999a) + :event-type 'cue-chase + :param "crimson-guard-hover-48" + ) + (new 'static 'turret-path-event + :pos (the-as float #x42340000) + :event-type 'pause-until + :param (lambda () + (let ((a0-1 (process-by-name "drill-barons-ship-3" *active-pool*))) + (and a0-1 (send-event a0-1 'pass-complete?)) + ) + ) + ) + (new 'static 'turret-path-event + :pos (the-as float #x42380000) + :event-type 'script + :param '(send-event "drill-elec-gate-6" 'shutdown) + ) + (new 'static 'turret-path-event + :pos (the-as float #x42386666) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x140) + ) + (new 'static 'turret-path-event + :pos (the-as float #x42460000) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x50) + ) + ) + ) + ) + +;; (define *turret-15-path* (the-as turret-path L119)) +(define *turret-15-path* + (new 'static 'turret-path + :event-count 12 + :event-tbl (new 'static 'inline-array turret-path-event 12 + (new 'static 'turret-path-event + :pos (the-as float #x3d4ccccd) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x50) + ) + (new 'static 'turret-path-event + :pos (the-as float #x40000000) + :event-type 'cue-chase + :param "crimson-guard-hover-27" + ) + (new 'static 'turret-path-event + :pos (the-as float #x400ccccd) + :event-type 'cue-chase + :param "crimson-guard-hover-28" + ) + (new 'static 'turret-path-event + :pos (the-as float #x40400000) + :event-type 'script + :param '(send-event "drill-barons-ship-3" 'trigger-back) + ) + (new 'static 'turret-path-event + :pos (the-as float #x41000000) + :event-type 'cue-chase + :param "crimson-guard-hover-53" + ) + (new 'static 'turret-path-event + :pos (the-as float #x41800000) + :event-type 'cue-chase + :param "crimson-guard-hover-54" + ) + (new 'static 'turret-path-event + :pos (the-as float #x41f00000) + :event-type 'cue-chase + :param "crimson-guard-hover-55" + ) + (new 'static 'turret-path-event + :pos (the-as float #x420f999a) + :event-type 'cue-chase + :param "crimson-guard-hover-56" + ) + (new 'static 'turret-path-event + :pos (the-as float #x42100000) + :event-type 'pause-until + :param (lambda () + (let ((a0-1 (process-by-name "drill-barons-ship-3" *active-pool*))) + (and a0-1 (send-event a0-1 'pass-complete?)) + ) + ) + ) + (new 'static 'turret-path-event + :pos (the-as float #x42120000) + :event-type 'script + :param '(send-event "drill-elec-gate-8" 'shutdown) + ) + (new 'static 'turret-path-event + :pos (the-as float #x42146666) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x140) + ) + (new 'static 'turret-path-event + :pos (the-as float #x421e0000) + :event-type 'set-speed-mult + :param (new 'static 'boxed-array :type int32 #x50) + ) + ) + ) + ) + +(define *drill-turret-13-battle* + (new 'static 'boxed-array :type hover-enemy-battle-command + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 2) :alive-count 2) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x1 :time (seconds 2) :alive-count 2) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 2) :alive-count 2) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x3 :time (seconds 2) :alive-count 2) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x4 :time (seconds 4)) + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 1) :alive-count 2) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 1) :alive-count 3) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x4 :time (seconds 1) :alive-count 2) + (new 'static 'hover-enemy-battle-command :command 'spawn :alive-count 3) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x1 :alive-count 3) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :alive-count 3) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x3 :alive-count 3) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x4) + ) + ) + + +(defstate active (turret) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type base-turret active) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> *game-info* counter) 0.0) + (set! (-> self egg-timer) 0) + (set! (-> self cgh-timer) 0) + (if (and (handle->process (-> self hover-battle)) (zero? (-> self path-event))) + (send-event (handle->process (-> self hover-battle)) 'trigger) + ) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer self)) + (set! (-> a1-2 num-params) 1) + (set! (-> a1-2 message) 'set-los) + (set! (-> a1-2 param 0) (the-as uint #f)) + (let ((t9-2 send-event-function) + (v1-20 (-> self hover-formation)) + ) + (t9-2 + (if v1-20 + (-> v1-20 child 3) + ) + a1-2 + ) + ) + ) + (none) + ) + :exit (behavior () + (let ((t9-1 (-> (the-as (state base-turret) (find-parent-method turret 29)) exit))) + (if t9-1 + (t9-1) + ) + ) + (send-event (handle->process (-> self hud-egg)) 'hide-and-die) + (send-event (handle->process (-> self hud-cgh)) 'hide-and-die) + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) (process->ppointer self)) + (set! (-> a1-3 num-params) 1) + (set! (-> a1-3 message) 'set-los) + (set! (-> a1-3 param 0) (the-as uint #t)) + (let ((t9-4 send-event-function) + (v1-18 (-> self hover-formation)) + ) + (t9-4 + (if v1-18 + (-> v1-18 child 3) + ) + a1-3 + ) + ) + ) + (when (< 0.0 (-> *game-info* counter)) + (let* ((v1-22 (rand-vu-int-count 3)) + (t0-0 (cond + ((zero? v1-22) + "ds439" + ) + ((= v1-22 1) + "ds440" + ) + ((= v1-22 2) + "ds441" + ) + ) + ) + ) + (add-process *gui-control* self (gui-channel daxter) (gui-action play) t0-0 -99.0 0) + ) + ) + (none) + ) + :post (behavior () + (let ((t9-1 (-> (the-as (state base-turret) (find-parent-method turret 29)) post))) + (if t9-1 + ((the-as (function none) t9-1)) + ) + ) + (when (and (-> self use-egg-hud) (< (-> self egg-timer) (-> self clock frame-counter))) + (let ((v1-6 0)) + (let ((a0-4 (+ (-> self actor-group-count) -1))) + (dotimes (a1-1 (-> self actor-group a0-4 length)) + (let ((a2-4 (-> self actor-group a0-4 data a1-1 actor))) + (when a2-4 + (if (not (logtest? (-> a2-4 extra perm status) (entity-perm-status subtask-complete))) + (+! v1-6 1) + ) + ) + ) + ) + ) + (set! (-> *game-info* counter) (the float v1-6)) + ) + (set! (-> self egg-timer) (+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 0.2 0.4))))) + ) + (when (and (-> self use-cgh-hud) + (< (-> self cgh-timer) (-> self clock frame-counter)) + (handle->process (-> self hover-battle)) + ) + (if (= (-> *game-info* counter) 0.0) + (set! (-> self hud-cgh-event) 'force-hide) + ) + 0 + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) (process->ppointer self)) + (set! (-> a1-4 num-params) 0) + (set! (-> a1-4 message) 'total-to-spawn?) + (let ((gp-1 (the-as int (send-event-function (handle->process (-> self hover-battle)) a1-4))) + (a1-5 (new 'stack-no-clear 'event-message-block)) + ) + (set! (-> a1-5 from) (process->ppointer self)) + (set! (-> a1-5 num-params) 0) + (set! (-> a1-5 message) 'num-spawned?) + ;; NOTE: added int casts + (let ((gp-2 (- gp-1 (the-as int (send-event-function (handle->process (-> self hover-battle)) a1-5))))) + (set! (-> *game-info* counter) + (the float (+ gp-2 (the-as int (send-event (handle->process (-> self hover-battle)) 'num-alive?)))) + ) + ) + ) + ) + (if (= (-> *game-info* counter) 0.0) + (set! (-> self cgh-timer) (+ (-> self clock frame-counter) (seconds 4))) + (set! (-> self cgh-timer) (+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 0.2 0.4))))) + ) + ) + (none) + ) + ) + +(defstate die (turret) + :virtual #t + :enter (behavior () + (speech-control-method-12 *speech-control* self (speech-type speech-type-1 speech-type-3)) + (let ((t9-2 (-> (the-as (state base-turret) (find-parent-method turret 32)) enter))) + (if t9-2 + (t9-2) + ) + ) + (none) + ) + ) + +(defmethod turret-init! turret ((obj turret) (arg0 entity-actor) (arg1 matrix)) + (set! (-> obj hover-battle) (the-as handle #f)) + (let ((v1-1 (res-lump-value (-> obj entity) 'extra-id uint128 :default (the-as uint128 -1) :time -1000000000.0))) + (cond + ((zero? v1-1) + (set! (-> obj hover-battle) + (process->handle (hover-manager-spawn obj (-> obj entity) *drill-turret-10-battle*)) + ) + (set! (-> obj use-egg-hud) #t) + (set! (-> obj use-cgh-hud) #f) + ) + ((= (the-as uint v1-1) 1) + (set! (-> obj hover-battle) + (process->handle (hover-manager-spawn obj (-> obj entity) *drill-turret-11-battle*)) + ) + (set! (-> obj use-egg-hud) #t) + (set! (-> obj use-cgh-hud) #f) + ) + ((= (the-as uint v1-1) 2) + (set! (-> obj hover-battle) + (process->handle (hover-manager-spawn obj (-> obj entity) *drill-turret-12-battle*)) + ) + (set! (-> obj use-egg-hud) #t) + (set! (-> obj use-cgh-hud) #f) + ) + ((= (the-as uint v1-1) 3) + (set! (-> obj path-event) *turret-13-path*) + (set! (-> obj hover-battle) + (process->handle (hover-manager-spawn obj (-> obj entity) *drill-turret-13-battle*)) + ) + (set! (-> obj use-egg-hud) #f) + (set! (-> obj use-cgh-hud) #t) + ) + ((= (the-as uint v1-1) 4) + (set! (-> obj path-event) *turret-14-path*) + (set! (-> obj use-egg-hud) #f) + (set! (-> obj use-cgh-hud) #f) + ) + (else + (set! (-> obj path-event) *turret-15-path*) + (set! (-> obj use-egg-hud) #f) + (set! (-> obj use-cgh-hud) #f) + ) + ) + ) + (let ((t9-5 (method-of-type base-turret turret-init!))) + (t9-5 obj arg0 arg1) + ) + (set! (-> obj hud-egg) (the-as handle #f)) + (set! (-> obj hud-cgh) (the-as handle #f)) + (set! (-> obj hover-formation) (the-as hover-formation (entity-actor-lookup arg0 'formation-actor 0))) + (if (or (name= (-> obj name) "turret-14") (name= (-> obj name) "turret-15")) + (set! (-> obj shot-timeout) (seconds 2.667)) + ) + (none) + ) + +(defmethod base-turret-method-39 turret ((obj turret) (arg0 turret-path-event)) + (case (-> arg0 event-type) + (('trigger-battle) + (set! (-> obj hud-cgh-event) 'force-show) + (send-event (handle->process (-> obj hover-battle)) 'trigger) + ) + (else + ((method-of-type base-turret base-turret-method-39) obj arg0) + ) + ) + (none) + ) + +(defmethod base-turret-method-34 turret ((obj turret) (arg0 process)) + (set! (-> obj hud) + (ppointer->handle (process-spawn hud-drill-turret-health :init hud-init-by-other :to arg0)) + ) + (if (-> obj use-egg-hud) + (set! (-> obj hud-egg) (ppointer->handle (process-spawn hud-gruntegg :init hud-init-by-other :to arg0))) + ) + (when (-> obj use-cgh-hud) + (set! (-> obj hud-cgh) (ppointer->handle (process-spawn hud-crimsonhover :init hud-init-by-other :to arg0))) + (set! (-> obj hud-cgh-event) 'force-hide) + ) + 0 + (none) + ) + +(defmethod base-turret-method-35 turret ((obj turret)) + (if (-> obj use-egg-hud) + (send-event (handle->process (-> obj hud-egg)) 'force-show) + ) + (if (-> obj use-cgh-hud) + (send-event (handle->process (-> obj hud-cgh)) (-> obj hud-cgh-event)) + ) + ((the-as (function base-turret none) (find-parent-method turret 35)) obj) + (none) + ) + +(defmethod base-turret-method-46 turret ((obj turret) (arg0 process)) + (if (type? arg0 hover-enemy) + arg0 + ) + ) diff --git a/goal_src/jak2/levels/forest/predator.gc b/goal_src/jak2/levels/forest/predator.gc index df6163cf8b..609e9c8fee 100644 --- a/goal_src/jak2/levels/forest/predator.gc +++ b/goal_src/jak2/levels/forest/predator.gc @@ -180,8 +180,7 @@ ) (defmethod init-proj-settings! predator-shot ((obj predator-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) (set! (-> obj attack-mode) 'predator-shot) (set! (-> obj max-speed) 532480.0) @@ -271,7 +270,72 @@ :default-hit-points 5 :gnd-collide-with (collide-spec backgnd) :overlaps-others-collide-with-filter (collide-spec jak bot player-list) - :penetrate-knocked #xffffffffffffffff + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) :movement-gravity (meters -100) :friction 0.8 :attack-shove-back (meters 3) @@ -632,7 +696,7 @@ (set! (-> v1-10 attack-id) a0-11) (set! (-> s5-0 attack-id) a0-11) ) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) (vector<-cspace! (-> s5-0 pos) a1-1) (let ((s2-0 (handle->process (-> obj focus handle))) (s3-0 (new 'stack-no-clear 'vector)) diff --git a/goal_src/jak2/levels/fortress/ammo_dump/fort-robotank-turret.gc b/goal_src/jak2/levels/fortress/ammo_dump/fort-robotank-turret.gc index aa23e128e3..8fb321639f 100644 --- a/goal_src/jak2/levels/fortress/ammo_dump/fort-robotank-turret.gc +++ b/goal_src/jak2/levels/fortress/ammo_dump/fort-robotank-turret.gc @@ -681,8 +681,7 @@ ) (defmethod init-proj-settings! fort-robotank-shot ((obj fort-robotank-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) (set! (-> obj attack-mode) 'fort-robotank-shot) (set! (-> obj max-speed) 819200.0) @@ -742,7 +741,7 @@ (set! (-> a1-10 attack-id) a2-11) (set! (-> gp-0 attack-id) a2-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (vector-! (-> gp-0 vel) a0-1 v1-0) ) (vector-normalize! (-> gp-0 vel) 512000.0) diff --git a/goal_src/jak2/levels/fortress/fort-turret.gc b/goal_src/jak2/levels/fortress/fort-turret.gc index dfdebe4eac..49f1bd5ea3 100644 --- a/goal_src/jak2/levels/fortress/fort-turret.gc +++ b/goal_src/jak2/levels/fortress/fort-turret.gc @@ -717,7 +717,7 @@ (set! (-> v1-10 attack-id) a0-18) (set! (-> s4-0 attack-id) a0-18) ) - (set! (-> s4-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-0 timeout) (seconds 4)) (vector-normalize-copy! (-> s4-0 vel) s2-1 491520.0) (let ((f30-1 (fmin 16384.0 f30-0))) (set-vector! s3-0 (-> s2-1 z) (-> s2-1 y) (- (-> s2-1 x)) 1.0) diff --git a/goal_src/jak2/levels/mars_tomb/widow2.gc b/goal_src/jak2/levels/mars_tomb/widow2.gc index e147f3fbac..8f6bafc9a5 100644 --- a/goal_src/jak2/levels/mars_tomb/widow2.gc +++ b/goal_src/jak2/levels/mars_tomb/widow2.gc @@ -58,7 +58,7 @@ (set! (-> v1-13 attack-id) a0-12) (set! (-> s5-0 attack-id) a0-12) ) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) (vector-normalize-copy! (-> s5-0 vel) arg2 491520.0) (let ((f30-1 (fmin 16384.0 f30-0))) (set-vector! s3-0 (-> arg2 z) (-> arg2 y) (- (-> arg2 x)) 1.0) diff --git a/goal_src/jak2/levels/nest/flying-spider.gc b/goal_src/jak2/levels/nest/flying-spider.gc index ca91fecfb2..9a5499c6ea 100644 --- a/goal_src/jak2/levels/nest/flying-spider.gc +++ b/goal_src/jak2/levels/nest/flying-spider.gc @@ -45,7 +45,7 @@ (set! (-> a0-10 attack-id) a2-11) (set! (-> gp-0 attack-id) a2-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (set! (-> gp-0 pos quad) (-> arg1 quad)) (vector-normalize-copy! (-> gp-0 vel) v1-1 arg3) ) diff --git a/goal_src/jak2/levels/palace/boss/squid-setup.gc b/goal_src/jak2/levels/palace/boss/squid-setup.gc index d26127f7fd..562471f4c4 100644 --- a/goal_src/jak2/levels/palace/boss/squid-setup.gc +++ b/goal_src/jak2/levels/palace/boss/squid-setup.gc @@ -2741,6 +2741,7 @@ This commonly includes things such as: ) ) +;; WARN: Return type mismatch (pointer process) vs (pointer squid-whirlwind). (defmethod spawn-whirlwind squid ((obj squid)) (let ((gp-0 (new 'stack-no-clear 'vector)) (s4-0 (squid-method-42 obj (new 'stack-no-clear 'vector))) @@ -2790,7 +2791,7 @@ This commonly includes things such as: (set! (-> a1-11 attack-id) a2-12) (set! (-> s4-1 attack-id) a2-12) ) - (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 timeout) (seconds 4)) (vector-! (-> s4-1 vel) v1-6 a0-3) ) (set! (-> arg1 grenade) (ppointer->handle (spawn-projectile squid-grenade s4-1 obj *default-dead-pool*))) diff --git a/goal_src/jak2/levels/palace/pal-obs.gc b/goal_src/jak2/levels/palace/pal-obs.gc index c3746a79f2..beb6802e29 100644 --- a/goal_src/jak2/levels/palace/pal-obs.gc +++ b/goal_src/jak2/levels/palace/pal-obs.gc @@ -834,7 +834,7 @@ This commonly includes things such as: (set! (-> v1-26 attack-id) a0-17) (set! (-> a1-2 attack-id) a0-17) ) - (set! (-> a1-2 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> a1-2 timeout) (seconds 4)) (set! (-> a1-2 pos quad) (-> s5-0 quad)) (set! (-> a1-2 vel quad) (-> gp-0 quad)) (spawn-projectile palent-turret-shot a1-2 self *default-dead-pool*) diff --git a/goal_src/jak2/levels/underport/jellyfish.gc b/goal_src/jak2/levels/underport/jellyfish.gc index 097c61f847..e68ab357da 100644 --- a/goal_src/jak2/levels/underport/jellyfish.gc +++ b/goal_src/jak2/levels/underport/jellyfish.gc @@ -7,3 +7,1429 @@ ;; DECOMP BEGINS +(deftype jellyfish-formation (hover-formation) + () + :heap-base #x10 + :method-count-assert 16 + :size-assert #x90 + :flag-assert #x1000100090 + ) + + +(defmethod hover-formation-method-15 jellyfish-formation ((obj jellyfish-formation) (arg0 vector) (arg1 vector)) + (logior! (-> obj formation flags) 2) + 0 + ) + +(deftype jellyfish-chain-physics (chain-physics) + () + :method-count-assert 18 + :size-assert #x570 + :flag-assert #x1200000570 + ) + + +(defmethod apply-gravity jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 vector) (arg1 int) (arg2 process-drawable)) + (vector-float*! + arg0 + (-> obj gravity) + (* 4096.0 (-> self clock time-adjust-ratio) (lerp-scale 0.01 0.1 (the float arg1) 0.0 5.0)) + ) + (vector+float*! arg0 arg0 (the-as vector (+ (the-as uint (-> obj chain-joints 0 velocity)) (* arg1 64))) 0.2) + 0 + (none) + ) + +(defmethod chain-physics-method-14 jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 vector) (arg1 int)) + (vector-float*! + arg0 + (the-as vector (+ (the-as uint (-> obj chain-joints 0 velocity)) (* (+ arg1 1) 64))) + (lerp-scale 0.1 0.9 (the float arg1) 0.0 5.0) + ) + 0 + (none) + ) + +(defmethod chain-physics-method-16 jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 int)) + (if (zero? arg0) + 0.0 + 5461.3335 + ) + ) + +(defmethod gravity-update jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 process-drawable)) + ((method-of-type chain-physics gravity-update) obj arg0) + (let ((gp-0 (new 'stack-no-clear 'collide-query))) + (let ((s5-0 (new 'stack-no-clear 'bounding-box))) + (let ((s4-0 (new 'stack-no-clear 'sphere))) + (set! (-> s4-0 quad) (-> (the-as collide-shape-moving (-> arg0 root)) root-prim prim-core world-sphere quad)) + (vector+float*! + (the-as vector s4-0) + (the-as vector s4-0) + (vector-y-quaternion! (new 'stack-no-clear 'vector) (-> arg0 root quat)) + -14336.0 + ) + (set! (-> s4-0 r) 12288.0) + (set-from-sphere! s5-0 s4-0) + ) + (set! (-> gp-0 collide-with) (collide-spec backgnd)) + (set! (-> gp-0 ignore-process0) #f) + (set! (-> gp-0 ignore-process1) #f) + (set! (-> gp-0 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> gp-0 action-mask) (collide-action solid)) + (mem-copy! (the-as pointer (-> gp-0 bbox)) (the-as pointer s5-0) 32) + ) + (fill-using-bounding-box *collide-cache* gp-0) + ) + 0 + (none) + ) + +(defmethod chain-physics-method-17 jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 vector) (arg1 int)) + (local-vars (v1-26 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (let* ((s5-0 (new 'stack-no-clear 'collide-query)) + (v1-2 (-> obj chain-joints arg1)) + (s4-1 (vector-! (new 'stack-no-clear 'vector) arg0 (-> v1-2 position))) + (s3-0 0) + ) + (set! (-> arg0 quad) (-> v1-2 position quad)) + (until (or (< 6 s3-0) (begin + (.lvf vf1 (&-> s4-1 quad)) + (.add.w.vf vf2 vf0 vf0 :mask #b1) + (.mul.vf vf1 vf1 vf1) + (.mul.x.vf acc vf2 vf1 :mask #b1) + (.add.mul.y.vf acc vf2 vf1 acc :mask #b1) + (.add.mul.z.vf vf1 vf2 vf1 acc :mask #b1) + (.mov v1-26 vf1) + (let ((f0-7 v1-26) + (f1-5 409.6) + ) + (< f0-7 (* f1-5 f1-5)) + ) + ) + ) + (+! s3-0 1) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (set! (-> s5-0 move-dist quad) (-> s4-1 quad)) + (let ((v1-7 s5-0)) + (set! (-> v1-7 radius) 1228.8) + (set! (-> v1-7 collide-with) (collide-spec backgnd)) + (set! (-> v1-7 ignore-process0) #f) + (set! (-> v1-7 ignore-process1) #f) + (set! (-> v1-7 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-7 action-mask) (collide-action solid)) + ) + (set! (-> s5-0 num-spheres) (the-as uint #f)) + (let ((f0-1 (probe-using-line-sphere *collide-cache* s5-0))) + (cond + ((>= f0-1 0.0) + (let ((f0-2 (fmin 1.0 f0-1))) + (vector+float*! arg0 arg0 s4-1 f0-2) + (vector-float*! s4-1 s4-1 (- 1.0 f0-2)) + ) + (let ((f0-5 (vector-dot s4-1 (-> s5-0 best-other-tri normal)))) + (vector--float*! s4-1 s4-1 (-> s5-0 best-other-tri normal) (* 1.2 f0-5)) + ) + ) + (else + (vector+! arg0 arg0 s4-1) + (goto cfg-11) + ) + ) + ) + ) + ) + (label cfg-11) + 0 + (none) + ) + ) + +(deftype jellyfish (hover-enemy) + ((los los-control :inline :offset-assert 784) + (sync sync-eased :inline :offset-assert 936) + (sound-id uint32 :offset-assert 980) + (path-player-u float :offset-assert 984) + (path-my-u float :offset-assert 988) + (path-y-offset float :offset-assert 992) + (path-stare-u float :offset-assert 996) + (tentacle-clock float :offset-assert 1000) + (tentacle-blend float :offset-assert 1004) + (last-attack-time time-frame :offset-assert 1008) + (last-fire-time time-frame :offset-assert 1016) + (charge-path-timer time-frame :offset-assert 1024) + (tentacles jellyfish-chain-physics 5 :offset-assert 1032) + (tentacles-initialized symbol :offset-assert 1052) + (stare-pos vector :inline :offset-assert 1056) + (charge-pos vector :inline :offset-assert 1072) + (grab-front symbol :offset-assert 1088) + (grab-offset vector :inline :offset-assert 1104) + (grab-start-pos vector :inline :offset-assert 1120) + (grab-start-quat quaternion :inline :offset-assert 1136) + (focus-rot quaternion :inline :offset-assert 1152) + (attach-lerp float :offset-assert 1168) + ) + :heap-base #x420 + :method-count-assert 165 + :size-assert #x494 + :flag-assert #xa504200494 + (:methods + (jellyfish-method-156 () none 156) + (threaten () _type_ :state 157) + (charge-attack () _type_ :state 158) + (grab-mech () _type_ :state 159) + (die-now () _type_ :state 160) + (jellyfish-method-161 (_type_ vector float) vector 161) + (jellyfish-method-162 (_type_) symbol 162) + (jellyfish-method-163 (_type_ process-focusable) symbol 163) + (jellyfish-method-164 (_type_ process-focusable) symbol 164) + ) + ) + + +(define *jellyfish-mech-reserved* #f) + +(deftype jellyfish-joint-mod-tentacle-info (structure) + ((axis vector :inline :offset-assert 0) + (angle float :offset-assert 16) + (period float :offset-assert 20) + (offset float :offset-assert 24) + ) + :method-count-assert 9 + :size-assert #x1c + :flag-assert #x90000001c + ) + + +(defskelgroup skel-jellyfish jellyfish jellyfish-lod0-jg jellyfish-idle-ja + ((jellyfish-lod0-mg (meters 999999))) + :bounds (static-spherem 0 -1.8 0 5) + ) + +(define *jellyfish-mainvein-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 11) + (new 'static 'chain-physics-setup :joint-index 12) + (new 'static 'chain-physics-setup :joint-index 13) + (new 'static 'chain-physics-setup :joint-index 14) + (new 'static 'chain-physics-setup :joint-index 15) + ) + ) + +(define *jellyfish-lfront-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 17) + (new 'static 'chain-physics-setup :joint-index 18) + (new 'static 'chain-physics-setup :joint-index 19) + (new 'static 'chain-physics-setup :joint-index 20) + ) + ) + +(define *jellyfish-rfront-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 22) + (new 'static 'chain-physics-setup :joint-index 23) + (new 'static 'chain-physics-setup :joint-index 24) + (new 'static 'chain-physics-setup :joint-index 25) + ) + ) + +(define *jellyfish-lrear-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 27) + (new 'static 'chain-physics-setup :joint-index 28) + (new 'static 'chain-physics-setup :joint-index 29) + (new 'static 'chain-physics-setup :joint-index 30) + ) + ) + +(define *jellyfish-rrear-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 32) + (new 'static 'chain-physics-setup :joint-index 33) + (new 'static 'chain-physics-setup :joint-index 34) + (new 'static 'chain-physics-setup :joint-index 35) + ) + ) + +(define *jellyfish-enemy-info* (new 'static 'enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #f + :hover-if-no-ground #f + :idle-anim-script #f + :idle-anim 2 + :notice-anim 2 + :hostile-anim 2 + :hit-anim 2 + :knocked-anim 2 + :knocked-land-anim 2 + :die-anim 3 + :die-falling-anim 3 + :victory-anim 2 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 36 + :look-at-joint 3 + :bullseye-joint 3 + :sound-hit (static-sound-name "jellyfish-hit") + :sound-die (static-sound-name "jellyfish-die") + :notice-distance (meters 45) + :notice-distance-delta (meters 4) + :proximity-notice-distance (meters 20) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 2730.6667 + :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 28672.0 + :knocked-medium-vxz-hi 65536.0 + :knocked-medium-vy-lo 12288.0 + :knocked-medium-vy-hi 36864.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 10) + :shadow-min-y (meters -20) + :shadow-locus-dist (meters 150) + :gem-joint 36 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y -409.6 :z 4751.36 :r 163840.0) + ) + ) + +(set! (-> *jellyfish-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod hover-enemy-method-151 jellyfish ((obj jellyfish)) + (new 'static 'hover-enemy-info + :fly-forward-anim 2 + :fly-backward-anim 2 + :fly-left-anim 2 + :fly-right-anim 2 + :shoot-anim 2 + :main-joint 3 + :gun-base 40 + :engine-left -1 + :engine-right -1 + ) + ) + +(defmethod hover-enemy-method-152 jellyfish ((obj jellyfish)) + (new 'static 'hover-nav-params :max-speed 32768.0 :max-acceleration 24576.0 :friction 0.8) + ) + +(defstate active (jellyfish) + :virtual #t + :enter (behavior () + (let ((gp-1 (jellyfish-method-161 self (new 'stack-no-clear 'vector) (get-norm! (-> self sync) 0))) + (v1-6 (jellyfish-method-161 + self + (new 'stack-no-clear 'vector) + (get-norm! (-> self sync) (the-as int (+ (-> self clock frame-counter) (seconds 1)))) + ) + ) + (s5-2 (new 'stack-no-clear 'vector)) + ) + (vector-! s5-2 v1-6 gp-1) + (vector-normalize! s5-2 1.0) + (hover-nav-control-method-10 (-> self hover) gp-1 s5-2 (the-as vector #t)) + ) + (set! (-> self restart-fly-anims) #t) + (none) + ) + :trans (behavior () + (local-vars (a0-8 vector) (gp-2 vector)) + (seek! (-> self tentacle-blend) 1.0 (-> self clock seconds-per-frame)) + (hover-nav-control-method-11 + (-> self hover) + (jellyfish-method-161 self (new 'stack-no-clear 'vector) (get-norm! (-> self sync) 0)) + ) + (when (and (jellyfish-method-164 self (the-as process-focusable #f)) + (begin + (set! gp-2 (jellyfish-method-161 self (new 'stack-no-clear 'vector) (get-norm! (-> self sync) 0))) + (set! a0-8 (jellyfish-method-161 self (new 'stack-no-clear 'vector) (-> self path-player-u))) + (-> self focus-pos) + (< (fabs (- (-> self root-override2 trans y) (-> gp-2 y))) 8192.0) + ) + (< (vector-vector-xz-distance a0-8 gp-2) 16384.0) + ) + (set! (-> self path-stare-u) (get-norm! (-> self sync) 0)) + (go-virtual stare) + ) + (none) + ) + :code (the-as (function none :behavior jellyfish) hover-enemy-fly-code) + :post (behavior () + (debug-draw (-> self path)) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate stare (jellyfish) + :virtual #t + :enter (behavior () + (let ((t9-1 (-> (the-as (state enemy) (find-parent-method jellyfish 35)) enter))) + (if t9-1 + (t9-1) + ) + ) + (jellyfish-method-161 self (-> self stare-pos) (-> self path-stare-u)) + (set! (-> self stare-pos y) (+ -32768.0 (-> self stare-pos y))) + (let ((gp-0 (new 'stack-no-clear 'collide-query))) + (set! (-> gp-0 start-pos quad) (-> self stare-pos quad)) + (set! (-> gp-0 start-pos y) (+ 8192.0 (-> gp-0 start-pos y))) + (set-vector! (-> gp-0 move-dist) 0.0 -81920.0 0.0 0.0) + (let ((v1-8 gp-0)) + (set! (-> v1-8 radius) 819.2) + (set! (-> v1-8 collide-with) (collide-spec backgnd)) + (set! (-> v1-8 ignore-process0) self) + (set! (-> v1-8 ignore-process1) #f) + (set! (-> v1-8 ignore-pat) (-> self root-override2 pat-ignore-mask)) + (set! (-> v1-8 action-mask) (collide-action solid)) + ) + (if (>= (fill-and-probe-using-line-sphere *collide-cache* gp-0) 0.0) + (set! (-> self stare-pos y) (fmax (-> self stare-pos y) (+ 24576.0 (-> gp-0 best-other-tri intersect y)))) + ) + ) + (set! (-> self charge-path-timer) 0) + (look-at-target! self (enemy-flag lock-focus)) + (none) + ) + :trans (behavior () + (local-vars (gp-0 vector)) + (seek! (-> self tentacle-blend) 1.0 (-> self clock seconds-per-frame)) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.1)) + (let ((v1-4 (-> self focus aware))) + (cond + ((>= 1 (the-as int v1-4)) + (go-virtual active) + ) + ((= v1-4 (enemy-aware unaware)) + (go-flee self) + ) + ) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 2)) + (not (jellyfish-method-164 self (the-as process-focusable #f))) + ) + (go-virtual active) + ) + (if (and (not *jellyfish-mech-reserved*) + (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1)) + (jellyfish-method-163 self (the-as process-focusable #f)) + (begin + (set! gp-0 (jellyfish-method-161 self (new 'stack-no-clear 'vector) (-> self path-stare-u))) + (< (vector-vector-xz-distance (-> self root-override2 trans) gp-0) 12288.0) + ) + (< (fabs (- (-> self root-override2 trans y) (-> gp-0 y))) 40960.0) + ) + (go-virtual threaten) + ) + ) + (none) + ) + :post (behavior () + (hover-nav-control-method-11 (-> self hover) (-> self stare-pos)) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate threaten (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :enter (behavior () + (set! *jellyfish-mech-reserved* #t) + (none) + ) + :exit (behavior () + (set! *jellyfish-mech-reserved* #f) + (none) + ) + :trans (behavior () + (seek! (-> self tentacle-blend) 0.0 (-> self clock seconds-per-frame)) + (none) + ) + :code (behavior () + (set! (-> self restart-fly-anims) #t) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! jellyfish-notice-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-notice-ja) frames num-frames) -1)) 1.4) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 1.4)) + ) + (let ((gp-0 (handle->process (-> self focus handle))) + (s5-0 (-> self root-override2 trans)) + ) + (cond + ((not (jellyfish-method-163 self (the-as process-focusable gp-0))) + (go-virtual stare) + ) + ((< (vector-vector-distance s5-0 (get-trans (the-as process-focusable gp-0) 3)) 20480.0) + (go-virtual grab-mech) + ) + ((jellyfish-method-162 self) + (go-virtual charge-attack) + ) + (else + (go-virtual stare) + ) + ) + ) + (none) + ) + :post (behavior () + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate charge-attack (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :enter (behavior () + (set! *jellyfish-mech-reserved* #t) + (look-at-target! self (enemy-flag death-start)) + (hover-nav-control-method-14 (-> self hover) 8.0 10.0) + (hover-nav-control-method-10 + (-> self hover) + (-> self charge-pos) + (vector-normalize! + (vector-! (new 'stack-no-clear 'vector) (-> self charge-pos) (-> self root-override2 trans)) + 1.0 + ) + (the-as vector #t) + ) + (logior! (-> self focus-status) (focus-status dangerous)) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :exit (behavior () + (hover-nav-control-method-14 (-> self hover) 1.0 1.0) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (hover-nav-control-method-20 (-> self hover)) + (set! *jellyfish-mech-reserved* #f) + (none) + ) + :trans (behavior () + (let ((gp-0 (-> self root-override2 trans))) + (if (< (vector-vector-distance gp-0 (-> self charge-pos)) 16384.0) + (go-virtual threaten) + ) + (let ((s5-0 (handle->process (-> self focus handle)))) + (cond + ((not (jellyfish-method-163 self (the-as process-focusable s5-0))) + (go-virtual stare) + ) + ((< (vector-vector-distance gp-0 (get-trans (the-as process-focusable s5-0) 3)) 20480.0) + (go-virtual grab-mech) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-no-eval :group! jellyfish-notice-charge-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-notice-charge-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (until #f + (ja-no-eval :group! jellyfish-notice-charge-loop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-notice-charge-loop-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (let* ((gp-0 (-> self root-override2 trans)) + (s5-1 (vector-! (new 'stack-no-clear 'vector) (-> self charge-pos) gp-0)) + ) + (let* ((s4-1 (vector-! (new 'stack-no-clear 'vector) (-> self focus-pos) gp-0)) + (f30-0 (vector-length s5-1)) + (f28-0 (vector-length s4-1)) + ) + (let ((s3-0 (new 'stack-no-clear 'quaternion))) + (vector-normalize! s5-1 1.0) + (vector-normalize! s4-1 1.0) + (quaternion-from-two-vectors-partial! s3-0 s5-1 s4-1 (* 8.0 (-> self clock seconds-per-frame))) + (vector-orient-by-quat! s5-1 s5-1 s3-0) + ) + (vector-normalize! s5-1 (fmin f30-0 (+ 16384.0 f28-0))) + ) + (vector+! (-> self charge-pos) gp-0 s5-1) + ) + (hover-nav-control-method-11 (-> self hover) (-> self charge-pos)) + (hover-enemy-dest-post) + (none) + ) + ) + +(defstate grab-mech (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :enter (behavior () + (set! *jellyfish-mech-reserved* #t) + (set! (-> self attach-lerp) 0.0) + (let ((gp-0 *target*)) + (if (and gp-0 + (logtest? (focus-status mech) (-> gp-0 focus-status)) + (zero? (logand (-> gp-0 focus-status) (focus-status dead ignore))) + ) + (set! (-> self grab-front) + (< (vector-dot + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat)) + (-> gp-0 manipy 0 node-list data 3 bone transform vector 2) + ) + 0.0 + ) + ) + ) + ) + (none) + ) + :exit (behavior () + (sound-stop (the-as sound-id (-> self sound-id))) + (hover-enemy-method-147 self) + (let ((v1-3 (-> self root-override2 root-prim))) + (set! (-> v1-3 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-3 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (dotimes (gp-0 3) + (initialize-chain-joints (-> self tentacles gp-0)) + ) + (set! *jellyfish-mech-reserved* #f) + (none) + ) + :trans (behavior () + (let ((gp-0 *target*)) + (cond + ((not (jellyfish-method-163 self gp-0)) + (set! (-> self last-attack-time) (-> self clock frame-counter)) + (go-virtual active) + ) + (else + (let ((gp-1 (-> gp-0 manipy 0 node-list data 3))) + (vector<-cspace! (-> self focus-pos) gp-1) + (matrix-with-scale->quaternion (-> self focus-rot) (-> gp-1 bone transform)) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (dotimes (gp-0 3) + (turn-off (-> self tentacles gp-0) (seconds 0.93)) + ) + (ja-channel-push! 1 (seconds 0.1)) + (set-vector! (-> self grab-offset) 0.0 14336.0 0.0 0.0) + (set! (-> self grab-start-pos quad) (-> self root-override2 trans quad)) + (quaternion-copy! (-> self grab-start-quat) (-> self root-override2 quat)) + (ja-no-eval :group! jellyfish-grab-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-grab-start-ja) frames num-frames) -1)) 1.2) + :frame-num 0.0 + ) + (until (ja-done? 0) + (set! (-> self attach-lerp) (lerp-scale 0.0 1.0 (ja-aframe-num 0) 0.0 14.0)) + (suspend) + (ja :num! (seek! max 1.2)) + ) + (let ((v1-34 (-> self root-override2 root-prim))) + (set! (-> v1-34 prim-core collide-as) (collide-spec)) + (set! (-> v1-34 prim-core collide-with) (collide-spec)) + ) + 0 + (if (-> self grab-front) + (set-vector! (-> self grab-offset) 0.0 9179.136 -3682.304 0.0) + (set-vector! (-> self grab-offset) 0.0 9179.136 4354.048 0.0) + ) + (set! (-> self grab-start-pos quad) (-> self root-override2 trans quad)) + (quaternion-copy! (-> self grab-start-quat) (-> self root-override2 quat)) + (ja-no-eval :group! jellyfish-grab-attach-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-grab-attach-ja) frames num-frames) -1)) 1.2) + :frame-num 0.0 + ) + (until (ja-done? 0) + (set! (-> self attach-lerp) (lerp-scale 0.0 1.0 (ja-aframe-num 0) 14.0 23.0)) + (suspend) + (ja :num! (seek! max 1.2)) + ) + (set! (-> self grab-start-pos quad) (-> self root-override2 trans quad)) + (quaternion-copy! (-> self grab-start-quat) (-> self root-override2 quat)) + (let ((a1-11 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-11 from) (process->ppointer self)) + (set! (-> a1-11 num-params) 2) + (set! (-> a1-11 message) 'shove) + (set! (-> a1-11 param 0) (the-as uint #f)) + (let ((v1-70 (new 'static 'attack-info :mask (attack-info-mask mode shove-back shove-up id)))) + (let* ((a0-29 *game-info*) + (a2-7 (+ (-> a0-29 attack-id) 1)) + ) + (set! (-> a0-29 attack-id) a2-7) + (set! (-> v1-70 id) a2-7) + ) + (set! (-> v1-70 shove-up) 12288.0) + (set! (-> v1-70 shove-back) 0.0) + (set! (-> v1-70 mode) 'shock) + (set! (-> a1-11 param 1) (the-as uint v1-70)) + ) + (send-event-function *target* a1-11) + ) + (let ((gp-3 *target*)) + (dotimes (s5-2 2) + (ja-no-eval :group! jellyfish-grab-attach-loop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-grab-attach-loop-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and gp-3 + (logtest? (focus-status mech) (-> gp-3 focus-status)) + (zero? (logand (-> gp-3 focus-status) (focus-status dead ignore))) + ) + (let ((a1-13 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-13 from) (process->ppointer self)) + (set! (-> a1-13 num-params) 2) + (set! (-> a1-13 message) 'attack) + (set! (-> a1-13 param 0) (the-as uint #f)) + (let ((v1-95 (new 'static 'attack-info :mask (attack-info-mask intersection mode id)))) + (let* ((a0-37 *game-info*) + (a2-10 (+ (-> a0-37 attack-id) 1)) + ) + (set! (-> a0-37 attack-id) a2-10) + (set! (-> v1-95 id) a2-10) + ) + (set! (-> v1-95 mode) 'shock) + (set! (-> v1-95 intersection quad) (-> self root-override2 trans quad)) + (set! (-> a1-13 param 1) (the-as uint v1-95)) + ) + (send-event-function gp-3 a1-13) + ) + ) + (sound-play "squid-attack" :id (the-as sound-id (-> self sound-id))) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (sound-stop (the-as sound-id (-> self sound-id))) + (set-vector! (-> self grab-offset) 0.0 20480.0 0.0 0.0) + (set! (-> self grab-start-pos quad) (-> self root-override2 trans quad)) + (quaternion-copy! (-> self grab-start-quat) (-> self root-override2 quat)) + (dotimes (gp-4 3) + (initialize-chain-joints (-> self tentacles gp-4)) + ) + (ja-no-eval :group! jellyfish-grab-detach-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-grab-detach-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (set! (-> self attach-lerp) (lerp-scale 0.0 1.0 (ja-aframe-num 0) 48.0 65.0)) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self last-attack-time) (-> self clock frame-counter)) + (go-virtual active) + (none) + ) + :post (behavior () + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> self grab-offset quad)) + (let ((s5-0 (quaternion-copy! (new 'stack-no-clear 'quaternion) (-> self focus-rot)))) + (vector-orient-by-quat! gp-0 gp-0 s5-0) + (vector+! gp-0 (-> self focus-pos) gp-0) + (if (-> self grab-front) + (quaternion-rotate-y! s5-0 s5-0 32768.0) + ) + (vector-lerp! (-> self root-override2 trans) (-> self grab-start-pos) gp-0 (-> self attach-lerp)) + (quaternion-slerp! (-> self root-override2 quat) (-> self grab-start-quat) s5-0 (-> self attach-lerp)) + ) + ) + (enemy-simple-post) + (none) + ) + ) + +(defstate die (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :code (behavior () + (dispose! self) + (logclear! (-> self focus-status) (focus-status dangerous)) + (enemy-method-52 self (-> self root-override2 transv)) + (let ((gp-0 (-> self clock frame-counter))) + (ja-no-eval :group! jellyfish-die-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-die-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((s5-0 (ja-group)) + (f0-4 (ja-aframe-num 0)) + ) + (when (and (= s5-0 jellyfish-die-ja) (>= f0-4 0.0) (>= 0.5 f0-4)) + (when (>= (- (-> self clock frame-counter) gp-0) (seconds 0.05)) + (process-drawable-shock-skel-effect + self + (-> *lightning-spec-id-table* 5) + lightning-probe-callback + (-> *part-id-table* 166) + 2048.0 + -1 + -1 + ) + (set! gp-0 (-> self clock frame-counter)) + ) + ) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (let ((v1-52 (-> self root-override2 root-prim))) + (set! (-> v1-52 prim-core collide-as) (collide-spec)) + (set! (-> v1-52 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (send-event self 'death-end) + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + :post (the-as (function none :behavior jellyfish) enemy-falling-post) + ) + +(defstate die-now (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :code (behavior () + (dispose! self) + (let ((v1-3 (-> self root-override2 root-prim))) + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + (set! (-> v1-3 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (ja-no-eval :group! jellyfish-die-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-die-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (send-event self 'death-end) + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + ) + +(defmethod general-event-handler jellyfish ((obj jellyfish) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('hit 'hit-knocked) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (go (method-of-object obj die)) + #t + ) + (else + ((method-of-type hover-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +(defmethod jellyfish-method-161 jellyfish ((obj jellyfish) (arg0 vector) (arg1 float)) + (get-point-in-path! (-> obj path) arg0 arg1 'interp) + (+! (-> arg0 y) (-> obj path-y-offset)) + arg0 + ) + +;; WARN: Return type mismatch object vs symbol. +(defmethod jellyfish-method-164 jellyfish ((obj jellyfish) (arg0 process-focusable)) + (local-vars (v1-10 object)) + (jellyfish-method-161 obj (new 'stack-no-clear 'vector) (get-norm! (-> obj sync) 0)) + (let ((s5-1 (jellyfish-method-161 obj (new 'stack-no-clear 'vector) (-> obj path-player-u))) + (gp-1 (-> obj focus-pos)) + ) + (-> obj root-override2 trans) + (the-as + symbol + (and (and (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + (logtest? (focus-status mech) (-> (the-as process-focusable (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + ) + focus-status + ) + ) + (begin + (let ((v1-13 #t)) + (set! arg0 (cond + (arg0 + (empty) + arg0 + ) + (else + (the-as process-focusable (handle->process (-> obj focus handle))) + ) + ) + ) + (let ((a0-18 (the-as focus-status (logand (-> arg0 focus-status) (focus-status dead ignore))))) + (cmove-#f-nonzero v1-10 a0-18 v1-13) + ) + ) + v1-10 + ) + ) + (< (vector-vector-xz-distance s5-1 gp-1) 122880.0) + (< (fabs (- (-> s5-1 y) (-> gp-1 y))) 65536.0) + ) + ) + ) + ) + +;; WARN: Return type mismatch object vs symbol. +(defmethod jellyfish-method-163 jellyfish ((obj jellyfish) (arg0 process-focusable)) + (local-vars (v1-8 object)) + (jellyfish-method-161 obj (new 'stack-no-clear 'vector) (-> obj path-stare-u)) + (let ((s5-0 (-> obj focus-pos))) + (-> obj root-override2 trans) + (the-as + symbol + (and (and (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + (logtest? (focus-status mech) (-> (the-as process-focusable (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + ) + focus-status + ) + ) + (begin + (let ((v1-11 #t)) + (set! arg0 (cond + (arg0 + (empty) + arg0 + ) + (else + (the-as process-focusable (handle->process (-> obj focus handle))) + ) + ) + ) + (let ((a0-16 (the-as focus-status (logand (-> arg0 focus-status) (focus-status dead ignore))))) + (cmove-#f-nonzero v1-8 a0-16 v1-11) + ) + ) + v1-8 + ) + ) + (< (vector-vector-xz-distance s5-0 (-> obj stare-pos)) 81920.0) + (< (fabs (- (-> s5-0 y) (-> obj stare-pos y))) 32768.0) + ) + ) + ) + ) + +(defmethod jellyfish-method-162 jellyfish ((obj jellyfish)) + (local-vars (sv-624 int)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + ) + (init-vf0-vector) + (let* ((s5-0 (-> obj root-override2 trans)) + (s3-1 (vector-! (new 'stack-no-clear 'vector) (-> obj focus-pos) s5-0)) + (s4-0 (vector-normalize-copy! (new 'stack-no-clear 'vector) s3-1 1.0)) + (f0-0 (vector-length s3-1)) + (f28-0 (+ 16384.0 f0-0)) + ) + (vector-normalize! s3-1 f28-0) + (vector+! (-> obj charge-pos) s5-0 s3-1) + (let ((f30-0 f28-0) + (f28-1 (* 0.000024414063 f28-0)) + (s3-2 0) + (s2-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack-no-clear 'collide-query)) + (f26-0 40960.0) + ) + (set! sv-624 0) + (while (< sv-624 (the int f28-1)) + (let ((a2-1 s2-0)) + (let ((v1-9 s5-0) + (a0-6 s4-0) + (a1-2 s3-2) + ) + (.lvf vf2 (&-> a0-6 quad)) + (.lvf vf1 (&-> v1-9 quad)) + (.mov vf3 a1-2) + ) + (.add.x.vf vf4 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf2 vf3) + (.add.mul.w.vf vf4 vf1 vf0 acc :mask #b111) + (.svf (&-> a2-1 quad) vf4) + ) + (when (> sv-624 0) + (set! (-> s0-0 start-pos quad) (-> s1-0 quad)) + (vector-! (-> s0-0 move-dist) s2-0 s1-0) + (let ((v1-14 s0-0)) + (set! (-> v1-14 radius) + (-> (the-as collide-shape-prim-group (-> obj root-override2 root-prim)) child 0 local-sphere w) + ) + (set! (-> v1-14 collide-with) (collide-spec backgnd enemy obstacle hit-by-others-list)) + (set! (-> v1-14 ignore-process0) obj) + (set! (-> v1-14 ignore-process1) #f) + (set! (-> v1-14 ignore-pat) (-> obj root-override2 pat-ignore-mask)) + (set! (-> v1-14 action-mask) (collide-action solid)) + ) + (if (>= (fill-and-probe-using-line-sphere *collide-cache* s0-0) 0.0) + (return #f) + ) + ) + (set! (-> s1-0 quad) (-> s2-0 quad)) + (set! f30-0 (fmax 0.0 (+ -40960.0 f30-0))) + (+! s3-2 (the int (fmin 40960.0 f30-0))) + (set! f26-0 (+ -4915.2 f26-0)) + (set! sv-624 (+ sv-624 1)) + ) + ) + ) + #t + ) + ) + +(defun jellyfish-joint-mod-tentacle ((arg0 cspace) (arg1 transformq)) + (let* ((s4-0 (-> arg0 param1)) + (s3-0 (the-as structure (-> arg0 param2))) + (f0-0 4.0) + (t9-0 sin) + (f1-0 65536.0) + (f2-1 + (+ (-> (the-as jellyfish s4-0) tentacle-clock) (-> (the-as jellyfish-joint-mod-tentacle-info s3-0) offset)) + ) + (f0-4 (* (t9-0 (* f1-0 (/ (- f2-1 (* (the float (the int (/ f2-1 f0-0))) f0-0)) f0-0))) + (-> (the-as jellyfish-joint-mod-tentacle-info s3-0) angle) + ) + ) + (s2-0 (new 'stack-no-clear 'quaternion)) + ) + (let ((a2-1 (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + (-> (the-as jellyfish-joint-mod-tentacle-info s3-0) axis) + f0-4 + ) + ) + ) + (quaternion-normalize! (quaternion*! s2-0 (-> arg1 quat) a2-1)) + ) + (quaternion-slerp! (-> arg1 quat) (-> arg1 quat) s2-0 (-> (the-as jellyfish s4-0) tentacle-blend)) + ) + (cspace<-parented-transformq-joint! arg0 arg1) + (none) + ) + +(defmethod track-target! jellyfish ((obj jellyfish)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (let ((v1-1 + (vector-inv-orient-by-quat! + (new 'stack-no-clear 'vector) + (-> obj main-joint-acc) + (-> obj root-override2 quat) + ) + ) + ) + (+! (-> obj tentacle-clock) + (* (lerp-scale 1.0 10.0 (fmax (fmax (fmax 0.0 (fabs (-> v1-1 x))) (-> v1-1 y)) (fabs (-> v1-1 z))) 0.0 24576.0) + (-> pp clock seconds-per-frame) + ) + ) + ) + (when (not (-> obj tentacles-initialized)) + (set! (-> obj tentacles-initialized) #t) + (dotimes (s5-0 5) + (initialize-chain-joints (-> obj tentacles s5-0)) + ) + ) + (dotimes (s5-1 5) + (update (-> obj tentacles s5-1) obj) + ) + (let ((a1-3 (handle->process (-> obj focus handle)))) + (if a1-3 + (los-control-method-9 (-> obj los) (the-as process-focusable a1-3) (the-as vector #f) 4096.0) + ) + ) + (let ((a0-10 (handle->process (-> obj focus handle)))) + (when (and a0-10 + (logtest? (focus-status mech) (-> (the-as process-focusable a0-10) focus-status)) + (zero? (logand (-> (the-as process-focusable a0-10) focus-status) (focus-status dead ignore))) + ) + (set! (-> obj focus-pos quad) (-> (get-trans (the-as process-focusable a0-10) 0) quad)) + (set! (-> obj path-player-u) (get-furthest-point-on-path (-> obj path) (-> obj focus-pos))) + ) + ) + (set! (-> obj path-my-u) (get-furthest-point-on-path (-> obj path) (-> obj root-override2 trans))) + ((method-of-type hover-enemy track-target!) obj) + (none) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-idle jellyfish ((obj jellyfish)) + (go (method-of-object obj active)) + (none) + ) + +(defmethod hover-enemy-method-149 jellyfish ((obj jellyfish)) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-jellyfish" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + 0 + (none) + ) + +(defmethod hover-enemy-method-150 jellyfish ((obj jellyfish)) + *jellyfish-enemy-info* + ) + +(defmethod init-enemy-collision! jellyfish ((obj jellyfish)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (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 4) 0))) + (set! (-> s5-0 total-prims) (the-as uint 5)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd jak bot enemy obstacle player-list)) + (set! (-> s4-0 prim-core action) (collide-action solid deadly)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 -7372.8 0.0 20480.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 enemy obstacle player-list)) + (set! (-> v1-14 prim-core action) (collide-action solid deadly)) + (set-vector! (-> v1-14 local-sphere) 0.0 1228.8 -2048.0 6144.0) + ) + (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 backgnd jak bot enemy obstacle player-list)) + (set! (-> v1-16 prim-core action) (collide-action solid deadly)) + (set-vector! (-> v1-16 local-sphere) 0.0 -819.2 -2048.0 4915.2) + ) + (let ((v1-18 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-18 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-18 prim-core collide-with) (collide-spec backgnd jak bot enemy obstacle player-list)) + (set! (-> v1-18 prim-core action) (collide-action solid deadly)) + (set-vector! (-> v1-18 local-sphere) 0.0 3276.8 -2048.0 4915.2) + ) + (let ((v1-20 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-20 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-20 prim-core action) (collide-action semi-solid)) + (set! (-> v1-20 transform-index) 3) + (set-vector! (-> v1-20 local-sphere) 0.0 0.0 1228.8 8192.0) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (let ((v1-23 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-23 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-23 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 hover-enemy vs jellyfish. +(defmethod relocate jellyfish ((obj jellyfish) (arg0 int)) + (dotimes (v1-0 5) + (if (nonzero? (-> obj tentacles v1-0)) + (&+! (-> obj tentacles v1-0) arg0) + ) + ) + (the-as jellyfish ((method-of-type hover-enemy relocate) obj arg0)) + ) + +(defmethod deactivate jellyfish ((obj jellyfish)) + (sound-stop (the-as sound-id (-> obj sound-id))) + ((the-as (function process-drawable none) (find-parent-method jellyfish 10)) obj) + (none) + ) + +(defmethod init-enemy! jellyfish ((obj jellyfish)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (with-pp + (hover-enemy-method-149 obj) + (init-enemy-behaviour-and-stats! obj (hover-enemy-method-150 obj)) + (hover-enemy-method-155 obj) + (set-vector! (-> obj offset) 0.0 6144.0 61440.0 1.0) + (set! (-> obj knocked-fall-dist) 0.0) + (let ((v1-8 (-> obj neck))) + (set! (-> v1-8 up) (the-as uint 1)) + (set! (-> v1-8 nose) (the-as uint 2)) + (set! (-> v1-8 ear) (the-as uint 0)) + (set! (-> v1-8 twist-speed-x) 0.05) + (set! (-> v1-8 twist-speed-y) 0.06) + (set! (-> v1-8 max-dist) 122880.0) + ) + (set! (-> obj root-override2 dynam gravity y) 40960.0) + (set! (-> obj root-override2 dynam gravity-length) 40960.0) + (set! (-> obj root-override2 dynam gravity-max) 40960.0) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + (new-source! (-> obj los) obj (seconds 1) (collide-spec backgnd enemy obstacle hit-by-others-list)) + (set! (-> obj last-fire-time) (-> pp clock frame-counter)) + (set! (-> obj last-attack-time) 0) + (set! (-> obj sound-id) (the-as uint (new-sound-id))) + (set! (-> obj path) (new 'process 'path-control obj 'path 0.0 (-> obj entity) #f)) + (set! (-> obj path-player-u) 0.0) + (set! (-> obj path-my-u) 0.0) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! (-> obj path-y-offset) (res-lump-float (-> obj entity) 'y-offset)) + (let ((a1-4 (new 'stack-no-clear 'sync-info-params))) + (let ((v1-32 0)) + (if #t + (set! v1-32 (logior v1-32 1)) + ) + (set! (-> a1-4 sync-type) 'sync-eased) + (set! (-> a1-4 sync-flags) (the-as sync-flags v1-32)) + ) + (set! (-> a1-4 period) (the-as uint 6000)) + (set! (-> a1-4 entity) (-> obj entity)) + (set! (-> a1-4 percent) 0.0) + (set! (-> a1-4 ease-in) 0.15) + (set! (-> a1-4 ease-out) 0.15) + (set! (-> a1-4 pause-in) 0.0) + (set! (-> a1-4 pause-out) 0.0) + (initialize! (-> obj sync) a1-4) + ) + (add-connection + *part-engine* + obj + 36 + obj + 318 + (new 'static 'vector :x 1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 36 + obj + 318 + (new 'static 'vector :x -1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection *part-engine* obj 36 obj 743 (new 'static 'vector :y 1433.6 :z 1228.8 :w 163840.0)) + (dotimes (s5-1 5) + (set! (-> obj tentacles s5-1) (new 'process 'jellyfish-chain-physics)) + ) + (chain-physics-initialize obj (-> obj tentacles 0) 10 4096.0 *jellyfish-mainvein-chain-setup*) + (chain-physics-initialize obj (-> obj tentacles 1) 16 4096.0 *jellyfish-lfront-chain-setup*) + (chain-physics-initialize obj (-> obj tentacles 2) 21 4096.0 *jellyfish-rfront-chain-setup*) + (chain-physics-initialize obj (-> obj tentacles 3) 26 4096.0 *jellyfish-lrear-chain-setup*) + (chain-physics-initialize obj (-> obj tentacles 4) 31 4096.0 *jellyfish-rrear-chain-setup*) + (set! (-> obj tentacles 2 negate-y) #t) + (set! (-> obj tentacles 4 negate-y) #t) + (let ((a0-35 (-> obj skel root-channel 0))) + (set! (-> a0-35 frame-group) (the-as art-joint-anim (-> obj draw art-group data 2))) + (set! (-> a0-35 frame-num) 0.0) + (joint-control-channel-group! a0-35 (the-as art-joint-anim (-> obj draw art-group data 2)) num-func-identity) + ) + (ja-post) + (dotimes (s5-2 5) + (initialize-chain-joints (-> obj tentacles s5-2)) + ) + (let ((a1-15 (-> obj node-list data 16)) + (v1-68 + (new 'static 'jellyfish-joint-mod-tentacle-info + :axis (new 'static 'vector :z 1.0 :w 1.0) + :angle 3094.7556 + :offset 30.0 + ) + ) + ) + (set! (-> a1-15 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-15 param1) obj) + (set! (-> a1-15 param2) (the-as basic v1-68)) + ) + (let ((a1-16 (-> obj node-list data 21)) + (v1-70 + (new 'static 'jellyfish-joint-mod-tentacle-info + :axis (new 'static 'vector :z 1.0 :w 1.0) + :angle 3094.7556 + :offset 30.0 + ) + ) + ) + (set! (-> a1-16 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-16 param1) obj) + (set! (-> a1-16 param2) (the-as basic v1-70)) + ) + (let ((a1-17 (-> obj node-list data 26)) + (v1-72 + (new 'static 'jellyfish-joint-mod-tentacle-info + :axis (new 'static 'vector :z 1.0 :w 1.0) + :angle 4369.067 + :offset 45.0 + ) + ) + ) + (set! (-> a1-17 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-17 param1) obj) + (set! (-> a1-17 param2) (the-as basic v1-72)) + ) + (let ((a1-18 (-> obj node-list data 31)) + (v1-74 + (new 'static 'jellyfish-joint-mod-tentacle-info + :axis (new 'static 'vector :z 1.0 :w 1.0) + :angle 4369.067 + :offset 45.0 + ) + ) + ) + (set! (-> a1-18 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-18 param1) obj) + (set! (-> a1-18 param2) (the-as basic v1-74)) + ) + (let ((a1-19 (-> obj node-list data 10)) + (v1-76 + (new 'static 'jellyfish-joint-mod-tentacle-info :axis (new 'static 'vector :x 1.0 :w 1.0) :angle 2730.6667) + ) + ) + (set! (-> a1-19 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-19 param1) obj) + (set! (-> a1-19 param2) (the-as basic v1-76)) + ) + (set! (-> obj tentacles-initialized) #f) + (set! (-> obj tentacle-clock) 0.0) + (set! (-> obj tentacle-blend) 1.0) + (add-connection + *part-engine* + obj + 36 + obj + 318 + (new 'static 'vector :x 1966.08 :y -1843.2 :z 2129.92 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 36 + obj + 318 + (new 'static 'vector :x -1966.08 :y -1843.2 :z 2129.92 :w 163840.0) + ) + 0 + (none) + ) + ) diff --git a/goal_src/jak2/levels/underport/under-obs.gc b/goal_src/jak2/levels/underport/under-obs.gc index 08592075db..764d2f4d9b 100644 --- a/goal_src/jak2/levels/underport/under-obs.gc +++ b/goal_src/jak2/levels/underport/under-obs.gc @@ -1395,16 +1395,9 @@ This commonly includes things such as: :code (the-as (function none :behavior under-mine) sleep-code) :post (behavior () (transform-post) - ;; TODO uncomment when hover-formation is in - ;; (when *nav-network* - ;; (let* ((a0-0 *nav-network*) - ;; (t9-1 (method-of-object a0-0 nav-network-method-25)) - ;; ) - ;; self - ;; (-> self root-override root-prim prim-core) - ;; (t9-1 a0-0) - ;; ) - ;; ) + (if *nav-network* + (nav-network-method-25 *nav-network* self (-> self root-override root-prim prim-core)) + ) (when (not (-> self chain-initialized)) (set! (-> self chain-initialized) #t) (initialize-chain-joints (-> self chain)) @@ -1462,7 +1455,7 @@ This commonly includes things such as: (set! (-> obj chain-initialized) #f) (set! (-> obj chain) (new 'process 'under-mine-chain-physics)) (chain-physics-initialize obj (-> obj chain) 15 1843.2 *under-mine-chain-setup*) - (set! (-> obj chain negate-y) (the-as basic #t)) + (set! (-> obj chain negate-y) #t) (set! (-> obj chain axial-slop) 1820.4445) (set! (-> obj chain maximum-stretch) 100.0) (set! (-> obj chain stretch-vel) 0.7) diff --git a/test/decompiler/reference/jak2/characters/ashelin/ash_REF.gc b/test/decompiler/reference/jak2/characters/ashelin/ash_REF.gc index aea4742e17..c7f6fc6b4b 100644 --- a/test/decompiler/reference/jak2/characters/ashelin/ash_REF.gc +++ b/test/decompiler/reference/jak2/characters/ashelin/ash_REF.gc @@ -802,7 +802,7 @@ (set! (-> v1-13 attack-id) a0-10) (set! (-> s4-0 attack-id) a0-10) ) - (set! (-> s4-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-0 timeout) (seconds 4)) (vector<-cspace! (-> s4-0 pos) (-> obj node-list data 22)) (set! (-> s4-0 vel quad) (-> arg0 quad)) (vector-! (-> s4-0 vel) (-> s4-0 vel) (-> s4-0 pos)) diff --git a/test/decompiler/reference/jak2/characters/sig/sig_REF.gc b/test/decompiler/reference/jak2/characters/sig/sig_REF.gc index b1750f0c1e..a5f737f0d6 100644 --- a/test/decompiler/reference/jak2/characters/sig/sig_REF.gc +++ b/test/decompiler/reference/jak2/characters/sig/sig_REF.gc @@ -828,7 +828,7 @@ (set! (-> v1-11 attack-id) a0-10) (set! (-> s5-0 attack-id) a0-10) ) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) (vector<-cspace! (-> s5-0 pos) (-> obj node-list data 24)) (set! (-> s5-0 vel quad) (-> arg0 quad)) (vector-! (-> s5-0 vel) (-> s5-0 vel) (-> s5-0 pos)) diff --git a/test/decompiler/reference/jak2/engine/camera/camera-h_REF.gc b/test/decompiler/reference/jak2/engine/camera/camera-h_REF.gc index 0300025671..bbe69488c8 100644 --- a/test/decompiler/reference/jak2/engine/camera/camera-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/camera/camera-h_REF.gc @@ -514,6 +514,7 @@ cam-standoff-read-entity cam-stick cam-string + cam-turret ) ) diff --git a/test/decompiler/reference/jak2/engine/common_objs/projectile-h_REF.gc b/test/decompiler/reference/jak2/engine/common_objs/projectile-h_REF.gc index cf163eea93..913576f5b5 100644 --- a/test/decompiler/reference/jak2/engine/common_objs/projectile-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/common_objs/projectile-h_REF.gc @@ -113,7 +113,7 @@ (ignore-handle handle :offset-assert 40) (pos vector :inline :offset-assert 48) (vel vector :inline :offset-assert 64) - (timeout handle :offset-assert 80) + (timeout time-frame :offset-assert 80) ) :method-count-assert 9 :size-assert #x58 diff --git a/test/decompiler/reference/jak2/engine/common_objs/projectile_REF.gc b/test/decompiler/reference/jak2/engine/common_objs/projectile_REF.gc index a681649124..0d752a1d20 100644 --- a/test/decompiler/reference/jak2/engine/common_objs/projectile_REF.gc +++ b/test/decompiler/reference/jak2/engine/common_objs/projectile_REF.gc @@ -507,7 +507,7 @@ If we've met or exceeded the projectiles maximum allowed hits, switch to the [[p (set! (-> self max-speed) 40960.0) (set! (-> self tween) 1.0) (set! (-> self last-target) (the-as handle #f)) - (set! (-> self timeout) (the-as time-frame (-> arg0 timeout))) + (set! (-> self timeout) (-> arg0 timeout)) (set! (-> self max-hits) 1) (set! (-> self spawn-time) (-> self clock frame-counter)) (set! (-> self update-velocity) #f) diff --git a/test/decompiler/reference/jak2/engine/entity/entity-table_REF.gc b/test/decompiler/reference/jak2/engine/entity/entity-table_REF.gc index 79dbb7650d..5c32cb257d 100644 --- a/test/decompiler/reference/jak2/engine/entity/entity-table_REF.gc +++ b/test/decompiler/reference/jak2/engine/entity/entity-table_REF.gc @@ -53,7 +53,7 @@ :heap-size #x4000 ) (new 'static 'entity-info - :ptype (type-ref jellyfish :method-count 167) + :ptype (type-ref jellyfish :method-count 165) :package "game" :art-group '() :pool '*16k-dead-pool* diff --git a/test/decompiler/reference/jak2/engine/physics/chain-physics-h_REF.gc b/test/decompiler/reference/jak2/engine/physics/chain-physics-h_REF.gc index 2ece3b96bf..42699ced45 100644 --- a/test/decompiler/reference/jak2/engine/physics/chain-physics-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/physics/chain-physics-h_REF.gc @@ -61,7 +61,7 @@ (stretch-vel-parallel float :offset-assert 1348) (compress-vel float :offset-assert 1352) (compress-vel-parallel float :offset-assert 1356) - (negate-y basic :offset-assert 1360) + (negate-y symbol :offset-assert 1360) (axial-slop float :offset-assert 1364) (maximum-stretch float :offset-assert 1368) (turn-off-start time-frame :offset-assert 1376) @@ -74,12 +74,12 @@ (initialize-chain-joints (_type_) symbol 9) (turn-off (_type_ time-frame) none :behavior process 10) (update (_type_ process-drawable) none :behavior process 11) - (gravity-update (_type_) none 12) + (gravity-update (_type_ process-drawable) none 12) (apply-gravity (_type_ vector int process-drawable) none :behavior process 13) (chain-physics-method-14 (_type_ vector int) none 14) (clamp-length (_type_ vector vector object process-drawable) vector 15) (chain-physics-method-16 (_type_ int) float 16) - (chain-physics-method-17 (_type_ vector) none 17) + (chain-physics-method-17 (_type_ vector int) none 17) ) ) diff --git a/test/decompiler/reference/jak2/engine/physics/chain-physics_REF.gc b/test/decompiler/reference/jak2/engine/physics/chain-physics_REF.gc index 95d552dc3a..45f9feec7e 100644 --- a/test/decompiler/reference/jak2/engine/physics/chain-physics_REF.gc +++ b/test/decompiler/reference/jak2/engine/physics/chain-physics_REF.gc @@ -3,7 +3,7 @@ ;; definition for method 12 of type chain-physics ;; WARN: Return type mismatch int vs none. -(defmethod gravity-update chain-physics ((obj chain-physics)) +(defmethod gravity-update chain-physics ((obj chain-physics) (arg0 process-drawable)) (vector-seek-3d-smooth! (-> obj gravity) (-> obj gravity-target) 0.05 0.1) 0 (none) @@ -49,7 +49,7 @@ ;; definition for method 17 of type chain-physics ;; WARN: Return type mismatch int vs none. -(defmethod chain-physics-method-17 chain-physics ((obj chain-physics) (arg0 vector)) +(defmethod chain-physics-method-17 chain-physics ((obj chain-physics) (arg0 vector) (arg1 int)) 0 (none) ) @@ -111,7 +111,7 @@ (vf6 :class vf) ) (init-vf0-vector) - (gravity-update obj) + (gravity-update obj arg0) (let ((s4-0 (new 'stack-no-clear 'matrix)) (s3-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> arg0 node-list data (-> obj root-joint-index)))) (s2-0 (vector-normalize-copy! @@ -217,7 +217,7 @@ (vector+float*! sv-528 s3-0 sv-400 f28-1) ) ) - (chain-physics-method-17 obj sv-528) + (chain-physics-method-17 obj sv-528 s0-0) (set! sv-432 (new 'stack-no-clear 'vector)) (let ((v1-61 s3-0) (a0-27 sv-528) diff --git a/test/decompiler/reference/jak2/engine/target/board/board-states_REF.gc b/test/decompiler/reference/jak2/engine/target/board/board-states_REF.gc index 472079a1c5..1f3de35cff 100644 --- a/test/decompiler/reference/jak2/engine/target/board/board-states_REF.gc +++ b/test/decompiler/reference/jak2/engine/target/board/board-states_REF.gc @@ -2534,7 +2534,7 @@ (set! (-> v1-24 attack-id) a0-13) (set! (-> s5-2 attack-id) a0-13) ) - (set! (-> s5-2 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-2 timeout) (seconds 4)) (vector<-cspace! (-> s5-2 pos) a1-5) (set! (-> s5-2 vel quad) (-> *zero-vector* quad)) (spawn-projectile grenade s5-2 self *default-dead-pool*) diff --git a/test/decompiler/reference/jak2/engine/target/gun/gun-blue-shot_REF.gc b/test/decompiler/reference/jak2/engine/target/gun/gun-blue-shot_REF.gc index d0d30a5bad..3332586774 100644 --- a/test/decompiler/reference/jak2/engine/target/gun/gun-blue-shot_REF.gc +++ b/test/decompiler/reference/jak2/engine/target/gun/gun-blue-shot_REF.gc @@ -28,7 +28,7 @@ (set! (-> v1-13 attack-id) a0-15) (set! (-> s4-1 attack-id) a0-15) ) - (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 timeout) (seconds 4)) (spawn-projectile gun-blue-shot s4-1 (ppointer->process (-> gp-0 gun)) *default-dead-pool*) ) ) diff --git a/test/decompiler/reference/jak2/engine/target/gun/gun-dark-shot_REF.gc b/test/decompiler/reference/jak2/engine/target/gun/gun-dark-shot_REF.gc index 6499ccc059..85baa001c8 100644 --- a/test/decompiler/reference/jak2/engine/target/gun/gun-dark-shot_REF.gc +++ b/test/decompiler/reference/jak2/engine/target/gun/gun-dark-shot_REF.gc @@ -152,7 +152,7 @@ (set! (-> v1-8 attack-id) a0-11) (set! (-> gp-0 attack-id) a0-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (let ((v0-1 (spawn-projectile gun-dark-shot gp-0 (ppointer->process (-> s5-0 gun)) *default-dead-pool*))) (when v0-1 (set! (-> (the-as gun-dark-shot (-> v0-1 0)) track-target) (-> self gun track-target 0 handle)) diff --git a/test/decompiler/reference/jak2/engine/target/gun/gun-util_REF.gc b/test/decompiler/reference/jak2/engine/target/gun/gun-util_REF.gc index 1c69e9ef1d..fb02254d51 100644 --- a/test/decompiler/reference/jak2/engine/target/gun/gun-util_REF.gc +++ b/test/decompiler/reference/jak2/engine/target/gun/gun-util_REF.gc @@ -449,7 +449,7 @@ (set! (-> v1-98 attack-id) a0-44) (set! (-> s5-2 attack-id) a0-44) ) - (set! (-> s5-2 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-2 timeout) (seconds 4)) (let ((t9-7 spawn-projectile) (v1-100 gp-1) ) @@ -989,7 +989,7 @@ (set! (-> v1-13 attack-id) a0-12) (set! (-> gp-0 attack-id) a0-12) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (spawn-projectile gun-eject gp-0 self *default-dead-pool*) ) (ja-channel-set! 0) diff --git a/test/decompiler/reference/jak2/engine/target/gun/gun-yellow-shot_REF.gc b/test/decompiler/reference/jak2/engine/target/gun/gun-yellow-shot_REF.gc index 1633f1754f..59579f8ec4 100644 --- a/test/decompiler/reference/jak2/engine/target/gun/gun-yellow-shot_REF.gc +++ b/test/decompiler/reference/jak2/engine/target/gun/gun-yellow-shot_REF.gc @@ -20,7 +20,7 @@ (set! (-> v1-9 attack-id) a0-9) (set! (-> gp-0 attack-id) a0-9) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (vector-float*! (-> gp-0 vel) (-> s5-0 fire-dir-out) 819200.0) (spawn-projectile gun-yellow-shot gp-0 (ppointer->process (-> s5-0 gun)) *default-dead-pool*) ) @@ -43,7 +43,7 @@ (set! (-> v1-7 attack-id) a0-8) (set! (-> gp-0 attack-id) a0-8) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (vector-normalize-copy! (-> gp-0 vel) arg2 819200.0) (spawn-projectile gun-yellow-shot gp-0 arg0 *default-dead-pool*) ) diff --git a/test/decompiler/reference/jak2/engine/target/target-h_REF.gc b/test/decompiler/reference/jak2/engine/target/target-h_REF.gc index 928605c621..82ee94f39c 100644 --- a/test/decompiler/reference/jak2/engine/target/target-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/target/target-h_REF.gc @@ -67,7 +67,7 @@ (pilot pilot-info :offset-assert 2208) (gun gun-info :offset-assert 2212) (mech mech-info :offset-assert 2216) - (turret basic :offset-assert 2220) + (turret turret-info :offset-assert 2220) (darkjak darkjak-info :offset-assert 2224) (indax indax-info :offset-assert 2228) ) @@ -225,7 +225,9 @@ (target-tube-jump float float) (target-tube-start handle) target-turn-around + target-turret-get-off (target-turret-get-on handle) + (target-turret-stance handle) target-wade-stance target-wade-walk target-walk diff --git a/test/decompiler/reference/jak2/engine/target/target-turret_REF.gc b/test/decompiler/reference/jak2/engine/target/target-turret_REF.gc new file mode 100644 index 0000000000..04013967bc --- /dev/null +++ b/test/decompiler/reference/jak2/engine/target/target-turret_REF.gc @@ -0,0 +1,2829 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defpartgroup group-turret-explode + :id 201 + :duration (seconds 0.5) + :linger-duration (seconds 1) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 15) + :parts ((sp-item 924 :period 1500 :length 25 :offset -10) + (sp-item 925 :fade-after (meters 60) :period 1500 :length 30) + (sp-item 926 :fade-after (meters 60) :falloff-to (meters 60) :period 1500 :length 100) + (sp-item 927 :fade-after (meters 200) :falloff-to (meters 200) :period 1500 :length 50) + (sp-item 928 :period 1500 :length 5 :offset -10) + (sp-item 929 :fade-after (meters 150) :falloff-to (meters 150) :period 1500 :length 50) + ) + ) + +;; failed to figure out what this is: +(defpart 927 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x34 :page #xc)) + (sp-rnd-flt spt-num 1.0 1.0 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-rot-z) + :flags (sp-flag spflag7) + :random-rangef 65536.0 + :random-multf 1.0 + ) + (sp-rnd-flt spt-scale-y (meters 0.8) (meters 0.2) 1.0) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.02) (meters 0.01) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-func spt-func 'sparticle-motion-blur) + (sp-int-plain-rnd spt-next-time 25 4 1) + (sp-launcher-by-id spt-next-launcher 930) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-conerot-x) + :flags (sp-flag from-pointer) + :func '*sp-temp* + ) + ) + ) + +;; failed to figure out what this is: +(defpart 929 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x33 :page #xc)) + (sp-rnd-flt spt-num 1.0 1.0 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (sp-flt spt-rot-z (degrees 0.0)) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 0.0) + (sp-rnd-flt spt-vel-y (meters 0.02) (meters 0.01) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a 0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int-plain-rnd spt-next-time 25 4 1) + (sp-launcher-by-id spt-next-launcher 930) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 930 + :init-specs ((sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.0) + (sp-flt spt-fade-b 0.0) + (sp-int-plain-rnd spt-next-time 5 19 1) + (sp-launcher-by-id spt-next-launcher 931) + ) + ) + +;; failed to figure out what this is: +(defpart 931 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.016666668) (meters 0.016666668) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.44) + (sp-flt spt-fade-g -2.36) + (sp-flt spt-fade-b -2.64) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 932) + ) + ) + +;; failed to figure out what this is: +(defpart 932 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.008333334) (meters 0.008333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -1.2944444) + (sp-flt spt-fade-g -0.7111111) + (sp-flt spt-fade-b -0.094444446) + (sp-rnd-flt spt-fade-a -0.06545454 -0.06545454 1.0) + (sp-int-plain-rnd spt-next-time 150 29 1) + (sp-launcher-by-id spt-next-launcher 933) + ) + ) + +;; failed to figure out what this is: +(defpart 933 + :init-specs ((sp-flt spt-fade-r 0.0) (sp-flt spt-fade-g 0.0) (sp-flt spt-fade-b 0.0)) + ) + +;; failed to figure out what this is: +(defpart 928 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x47 :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 5)) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 96.0) + (sp-flt spt-scalevel-x (meters 0.5)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -1.28) + (sp-flt spt-fade-b -5.1) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 100) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-int spt-next-time 50) + (sp-launcher-by-id spt-next-launcher 934) + ) + ) + +;; failed to figure out what this is: +(defpart 934 + :init-specs ((sp-flt spt-scalevel-x (meters -0.2)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -2.56) + (sp-flt spt-fade-b 0.0) + (sp-flt spt-fade-a -1.92) + ) + ) + +;; failed to figure out what this is: +(defpart 926 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x32 :page #xc)) + (sp-rnd-flt spt-num 5.0 3.0 1.0) + (sp-flt spt-x (meters 0.25)) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.25) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 16.0 48.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.083333336) (meters 0.083333336) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.006666667) (meters 0.0016666667) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.18) + (sp-flt spt-fade-b -2.12) + (sp-rnd-flt spt-accel-y -0.68266666 -1.3653333 1.0) + (sp-flt spt-friction 0.87) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 935) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 935 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0016666667)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.02) + (sp-flt spt-fade-b 0.23555556) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 936) + ) + ) + +;; failed to figure out what this is: +(defpart 936 + :init-specs ((sp-flt spt-fade-r -0.5543478) (sp-flt spt-fade-g -0.5543478) (sp-flt spt-fade-a -0.13913043)) + ) + +;; failed to figure out what this is: +(defpart 924 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 3.0 1.0 1.0) + (sp-rnd-flt spt-x (meters 0) (meters 0.6) 1.0) + (sp-rnd-flt spt-scale-x (meters 2) (meters 1.5) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 70.0 20.0 1.0) + (sp-rnd-flt spt-g 70.0 20.0 1.0) + (sp-rnd-flt spt-b 70.0 20.0 1.0) + (sp-rnd-flt spt-a 0.0 40.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0) (meters 0.1) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.033333335) (meters 0.016666668) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 3.3) + (sp-flt spt-fade-g 3.12) + (sp-flt spt-fade-b 1.18) + (sp-flt spt-fade-a 1.76) + (sp-flt spt-friction 0.88) + (sp-int spt-timer 710) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 937) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 937 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.53333336) + (sp-flt spt-fade-g -1.9666667) + (sp-flt spt-fade-b -2.2) + (sp-flt spt-fade-a -0.41666666) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 938) + ) + ) + +;; failed to figure out what this is: +(defpart 938 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.38833332) + (sp-flt spt-fade-g -0.21333334) + (sp-flt spt-fade-b -0.028333334) + (sp-flt spt-fade-a -0.38833332) + ) + ) + +;; failed to figure out what this is: +(defpart 925 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x31 :page #xc)) + (sp-rnd-flt spt-num 4.0 2.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.1) (meters 0.25) 1.0) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.2) (meters 0.1) 1.0) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-flt spt-g 96.0) + (sp-flt spt-b 64.0) + (sp-rnd-flt spt-a 64.0 64.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.13333334) (meters 0.02) 1.0) + (sp-flt spt-fade-g 1.6) + (sp-flt spt-fade-b 3.2) + (sp-flt spt-fade-a -1.6) + (sp-int spt-timer 80) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + ) + ) + +;; definition of type hud-turret-health +(deftype hud-turret-health (hud) + ((fade-interp float :offset-assert 2980) + ) + :heap-base #xb30 + :method-count-assert 27 + :size-assert #xba8 + :flag-assert #x1b0b300ba8 + ) + +;; definition for method 3 of type hud-turret-health +(defmethod inspect hud-turret-health ((obj hud-turret-health)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type hud inspect))) + (t9-0 obj) + ) + (format #t "~2Tfade-interp: ~f~%" (-> obj fade-interp)) + (label cfg-4) + obj + ) + +;; definition for method 15 of type hud-turret-health +;; WARN: Return type mismatch int vs none. +(defmethod draw hud-turret-health ((obj hud-turret-health)) + (with-pp + (seek! + (-> obj fade-interp) + (if (>= (-> *camera-combiner* interp-val) 1.0) + 80.0 + 0.0 + ) + (-> pp clock time-adjust-ratio) + ) + (dotimes (v1-3 30) + (set! (-> obj sprites v1-3 color w) (the int (* (-> obj fade-interp) (- 1.0 (-> obj offset))))) + ) + (set-as-offset-from! (-> obj sprites 1) (the-as vector4w (-> obj sprites)) 44 0) + (set-as-offset-from! (-> obj sprites 2) (the-as vector4w (-> obj sprites)) 0 44) + (set-as-offset-from! (-> obj sprites 3) (the-as vector4w (-> obj sprites)) 44 44) + (dotimes (v1-6 16) + (set! (-> obj sprites (- 19 v1-6) scale-x) (if (< v1-6 (-> obj values 0 current)) + 0.7 + 0.0 + ) + ) + ) + (set-as-offset-from! (-> obj sprites 4) (the-as vector4w (-> obj sprites)) 13 6) + (set-as-offset-from! (-> obj sprites 5) (the-as vector4w (-> obj sprites)) 25 10) + (set-as-offset-from! (-> obj sprites 6) (the-as vector4w (-> obj sprites)) 34 19) + (set-as-offset-from! (-> obj sprites 7) (the-as vector4w (-> obj sprites)) 39 32) + (set-as-offset-from! (-> obj sprites 8) (the-as vector4w (-> obj sprites)) 39 47) + (set-as-offset-from! (-> obj sprites 9) (the-as vector4w (-> obj sprites)) 34 59) + (set-as-offset-from! (-> obj sprites 10) (the-as vector4w (-> obj sprites)) 25 67) + (set-as-offset-from! (-> obj sprites 11) (the-as vector4w (-> obj sprites)) 13 71) + (set-as-offset-from! (-> obj sprites 12) (the-as vector4w (-> obj sprites)) -1 71) + (set-as-offset-from! (-> obj sprites 13) (the-as vector4w (-> obj sprites)) -14 67) + (set-as-offset-from! (-> obj sprites 14) (the-as vector4w (-> obj sprites)) -22 59) + (set-as-offset-from! (-> obj sprites 15) (the-as vector4w (-> obj sprites)) -27 47) + (set-as-offset-from! (-> obj sprites 16) (the-as vector4w (-> obj sprites)) -27 32) + (set-as-offset-from! (-> obj sprites 17) (the-as vector4w (-> obj sprites)) -22 19) + (set-as-offset-from! (-> obj sprites 18) (the-as vector4w (-> obj sprites)) -14 10) + (set-as-offset-from! (-> obj sprites 19) (the-as vector4w (-> obj sprites)) -1 6) + (let ((f0-9 (the float (-> obj values 1 current)))) + (cond + ((>= f0-9 100.0) + (let ((f0-10 (if (< 100 (mod (-> *display* game-clock frame-counter) 200)) + 0.0 + 90.0 + ) + ) + ) + (set! (-> obj sprites 26 angle) (* 182.04445 (- 270.0 f0-10))) + (set! (-> obj sprites 24 angle) (* 182.04445 (- f0-10))) + (set! (-> obj sprites 22 angle) (* 182.04445 (- 90.0 f0-10))) + (set! (-> obj sprites 20 angle) (* 182.04445 (- 180.0 f0-10))) + ) + ) + ((< 75.0 f0-9) + (set! (-> obj sprites 26 angle) (* 182.04445 (- 180.0 (* 3.6 (+ -75.0 f0-9))))) + (set! (-> obj sprites 24 angle) 32768.0) + (set! (-> obj sprites 22 angle) 49152.0) + (set! (-> obj sprites 20 angle) 0.0) + ) + ((< 50.0 f0-9) + (set! (-> obj sprites 26 angle) 32768.0) + (set! (-> obj sprites 24 angle) (* 182.04445 (- 270.0 (* 3.6 (+ -50.0 f0-9))))) + (set! (-> obj sprites 22 angle) 49152.0) + (set! (-> obj sprites 20 angle) 0.0) + ) + ((< 25.0 f0-9) + (set! (-> obj sprites 26 angle) 32768.0) + (set! (-> obj sprites 24 angle) 49152.0) + (set! (-> obj sprites 22 angle) (* 182.04445 (- (* 3.6 (+ -25.0 f0-9))))) + (set! (-> obj sprites 20 angle) 0.0) + ) + (else + (set! (-> obj sprites 26 angle) 32768.0) + (set! (-> obj sprites 24 angle) 49152.0) + (set! (-> obj sprites 22 angle) 0.0) + (set! (-> obj sprites 20 angle) (* 182.04445 (- 90.0 (* 3.6 f0-9)))) + ) + ) + ) + (set-as-offset-from! (-> obj sprites 20) (the-as vector4w (-> obj sprites)) 0 45) + (set-as-offset-from! (-> obj sprites 22) (the-as vector4w (-> obj sprites)) 0 44) + (set-as-offset-from! (-> obj sprites 24) (the-as vector4w (-> obj sprites)) 2 44) + (set-as-offset-from! (-> obj sprites 26) (the-as vector4w (-> obj sprites)) 2 45) + (set-as-offset-from! (-> obj sprites 21) (the-as vector4w (-> obj sprites)) 0 14) + (set-as-offset-from! (-> obj sprites 23) (the-as vector4w (-> obj sprites)) 0 44) + (set-as-offset-from! (-> obj sprites 25) (the-as vector4w (-> obj sprites)) -30 44) + (set-as-offset-from! (-> obj sprites 27) (the-as vector4w (-> obj sprites)) -30 14) + (set-as-offset-from! (-> obj sprites 29) (the-as vector4w (-> obj sprites)) -10 36) + (let ((f0-34 (if (and (= (-> obj values 4 current) 1) (< 25 (mod (-> *display* game-clock frame-counter) 50))) + 250.0 + 100.0 + ) + ) + ) + (set! (-> obj sprites 29 color x) (the int f0-34)) + (set! (-> obj sprites 29 color y) (the int (if (>= (-> obj values 1 current) 100) + 0.0 + f0-34 + ) + ) + ) + ) + (set! (-> obj sprites 29 color z) (-> obj sprites 29 color y)) + (let ((f30-0 (- (the float (-> obj values 3 current))))) + (let ((a1-31 (new 'stack-no-clear 'vector))) + (set! (-> a1-31 x) 128.0) + (set! (-> a1-31 y) 128.0) + (set! (-> a1-31 z) 128.0) + (set! (-> a1-31 w) 0.0) + (let ((a2-29 (new 'stack-no-clear 'vector))) + (set! (-> a2-29 x) 255.0) + (set! (-> a2-29 y) 24.0) + (set! (-> a2-29 z) 32.0) + (set! (-> a2-29 w) 0.0) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (vector-lerp! s5-0 a1-31 a2-29 (* 0.01 (the float (-> obj values 5 current)))) + (vector-cvt.w.s! (the-as vector (-> obj sprites 28 color2)) s5-0) + ) + ) + ) + (set! (-> obj sprites 28 color w) + (the int (* 0.00390625 (-> obj fade-interp) (the float (-> obj values 2 current)))) + ) + (set-as-offset-from! + (-> obj sprites 28) + (the-as vector4w (-> obj sprites)) + (the int (* -70.0 (sin f30-0))) + (+ (the int (* -70.0 (cos f30-0))) 44) + ) + (set! (-> obj sprites 28 angle) (+ -8192.0 f30-0)) + ) + ((method-of-type hud draw) obj) + 0 + (none) + ) + ) + +;; definition for method 16 of type hud-turret-health +;; WARN: Return type mismatch int vs none. +(defmethod update-values hud-turret-health ((obj hud-turret-health)) + (set! (-> obj values 0 target) (the int (-> *game-info* score))) + ((method-of-type hud update-values) obj) + 0 + (none) + ) + +;; definition for method 18 of type hud-turret-health +(defmethod event-callback hud-turret-health ((obj hud-turret-health) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('set-heat) + (set! (-> obj values 1 target) (the int (* 100.0 (the-as float (-> arg3 param 0))))) + ) + (('set-arrow-alpha) + (set! (-> obj values 2 target) (the int (* 256.0 (the-as float (-> arg3 param 0))))) + ) + (('set-arrow-angle) + (set! (-> obj values 3 target) (the int (the-as float (-> arg3 param 0)))) + ) + (('set-target-flash) + (set! (-> obj values 4 target) (if (-> arg3 param 0) + 1 + 0 + ) + ) + ) + (('set-arrow-red) + (set! (-> obj values 5 target) (the int (* 100.0 (the-as float (-> arg3 param 0))))) + ) + (('set-hud-pos) + (set-hud-piece-position! + (the-as hud-sprite (-> obj sprites)) + (the-as int (-> arg3 param 0)) + (the-as int (+ (-> arg3 param 1) -4)) + ) + ) + ) + ((method-of-type hud event-callback) obj arg0 arg1 arg2 arg3) + ) + +;; definition for function init-turret-hud +;; WARN: Return type mismatch int vs none. +(defun init-turret-hud ((arg0 hud-turret-health) (arg1 string)) + (set! (-> arg0 gui-id) + (add-process *gui-control* arg0 (gui-channel hud-middle-right) (gui-action hidden) (-> arg0 name) 81920.0 0) + ) + (logior! (-> arg0 flags) (hud-flags show)) + (set! (-> arg0 fade-interp) 0.0) + (dotimes (v1-4 30) + (set! (-> arg0 sprites v1-4 scale-x) 0.7) + (set! (-> arg0 sprites v1-4 scale-y) 0.7) + (set! (-> arg0 sprites v1-4 pos z) #xfffff0) + ) + (set! (-> arg0 sprites 0 tex) + (lookup-texture-by-name "drill-turret-hud-ring-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 0 flags) (the-as uint 4)) + (set! (-> arg0 sprites 1 tex) (-> arg0 sprites 0 tex)) + (set! (-> arg0 sprites 1 flags) (the-as uint 5)) + (set! (-> arg0 sprites 2 tex) (-> arg0 sprites 0 tex)) + (set! (-> arg0 sprites 2 flags) (the-as uint 6)) + (set! (-> arg0 sprites 3 tex) (-> arg0 sprites 0 tex)) + (set! (-> arg0 sprites 3 flags) (the-as uint 7)) + (set! (-> arg0 sprites 4 tex) + (lookup-texture-by-name "drill-turret-hud-health-04" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 4 flags) (the-as uint 5)) + (set! (-> arg0 sprites 5 tex) + (lookup-texture-by-name "drill-turret-hud-health-03" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 5 flags) (the-as uint 5)) + (set! (-> arg0 sprites 6 tex) + (lookup-texture-by-name "drill-turret-hud-health-02" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 6 flags) (the-as uint 5)) + (set! (-> arg0 sprites 7 tex) + (lookup-texture-by-name "drill-turret-hud-health-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 7 flags) (the-as uint 5)) + (set! (-> arg0 sprites 8 tex) (-> arg0 sprites 7 tex)) + (set! (-> arg0 sprites 8 flags) (the-as uint 7)) + (set! (-> arg0 sprites 9 tex) (-> arg0 sprites 6 tex)) + (set! (-> arg0 sprites 9 flags) (the-as uint 7)) + (set! (-> arg0 sprites 10 tex) (-> arg0 sprites 5 tex)) + (set! (-> arg0 sprites 10 flags) (the-as uint 7)) + (set! (-> arg0 sprites 11 tex) (-> arg0 sprites 4 tex)) + (set! (-> arg0 sprites 11 flags) (the-as uint 7)) + (set! (-> arg0 sprites 12 tex) (-> arg0 sprites 4 tex)) + (set! (-> arg0 sprites 12 flags) (the-as uint 6)) + (set! (-> arg0 sprites 13 tex) (-> arg0 sprites 5 tex)) + (set! (-> arg0 sprites 13 flags) (the-as uint 6)) + (set! (-> arg0 sprites 14 tex) (-> arg0 sprites 6 tex)) + (set! (-> arg0 sprites 14 flags) (the-as uint 6)) + (set! (-> arg0 sprites 15 tex) (-> arg0 sprites 7 tex)) + (set! (-> arg0 sprites 15 flags) (the-as uint 6)) + (set! (-> arg0 sprites 16 tex) (-> arg0 sprites 7 tex)) + (set! (-> arg0 sprites 16 flags) (the-as uint 4)) + (set! (-> arg0 sprites 17 tex) (-> arg0 sprites 6 tex)) + (set! (-> arg0 sprites 17 flags) (the-as uint 4)) + (set! (-> arg0 sprites 18 tex) (-> arg0 sprites 5 tex)) + (set! (-> arg0 sprites 18 flags) (the-as uint 4)) + (set! (-> arg0 sprites 19 tex) (-> arg0 sprites 4 tex)) + (set! (-> arg0 sprites 19 flags) (the-as uint 4)) + (set! (-> arg0 sprites 20 tex) + (lookup-texture-by-name "hud-transparent-01" (the-as string #f) (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 20 pos z) #xfffff1) + (set! (-> arg0 sprites 21 tex) + (lookup-texture-by-name "drill-turret-hud-heat-ring-02" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 21 pos z) #xfffff0) + (set! (-> arg0 sprites 22 tex) (-> arg0 sprites 20 tex)) + (set! (-> arg0 sprites 22 pos z) #xfffff3) + (set! (-> arg0 sprites 23 tex) + (lookup-texture-by-name "drill-turret-hud-heat-ring-04" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 23 pos z) #xfffff2) + (set! (-> arg0 sprites 24 tex) (-> arg0 sprites 20 tex)) + (set! (-> arg0 sprites 24 pos z) #xfffff5) + (set! (-> arg0 sprites 25 tex) + (lookup-texture-by-name "drill-turret-hud-heat-ring-03" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 25 pos z) #xfffff4) + (set! (-> arg0 sprites 26 tex) (-> arg0 sprites 20 tex)) + (set! (-> arg0 sprites 26 pos z) #xfffff7) + (set! (-> arg0 sprites 27 tex) + (lookup-texture-by-name "drill-turret-hud-heat-ring-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 27 pos z) #xfffff6) + (set! (-> arg0 sprites 28 tex) + (lookup-texture-by-name "drill-turret-hud-arrow-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 28 pos z) #xffffff) + (set! (-> arg0 sprites 29 tex) + (lookup-texture-by-name "drill-turret-hud-centre-01" arg1 (the-as (pointer texture-page) #f)) + ) + (set! (-> arg0 sprites 29 pos z) #xffffff) + (set! (-> arg0 sprites 20 scale-x) 8.0) + (set! (-> arg0 sprites 20 scale-y) 8.0) + (set! (-> arg0 sprites 22 scale-x) 8.0) + (set! (-> arg0 sprites 22 scale-y) 8.0) + (set! (-> arg0 sprites 24 scale-x) 8.0) + (set! (-> arg0 sprites 24 scale-y) 8.0) + (set! (-> arg0 sprites 26 scale-x) 8.0) + (set! (-> arg0 sprites 26 scale-y) 8.0) + 0 + (none) + ) + +;; definition of type hud-drill-turret-health +(deftype hud-drill-turret-health (hud-turret-health) + () + :heap-base #xb30 + :method-count-assert 27 + :size-assert #xba8 + :flag-assert #x1b0b300ba8 + ) + +;; definition for method 3 of type hud-drill-turret-health +(defmethod inspect hud-drill-turret-health ((obj hud-drill-turret-health)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type hud-turret-health inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition for method 17 of type hud-drill-turret-health +;; WARN: Return type mismatch int vs none. +(defmethod init-callback hud-drill-turret-health ((obj hud-drill-turret-health)) + (set! (-> obj level) (level-get *level* 'drillmid)) + (init-turret-hud obj "drillmid-minimap") + ((method-of-type hud init-callback) obj) + 0 + (none) + ) + +;; definition of type hud-port-turret-health +(deftype hud-port-turret-health (hud-turret-health) + () + :heap-base #xb30 + :method-count-assert 27 + :size-assert #xba8 + :flag-assert #x1b0b300ba8 + ) + +;; definition for method 3 of type hud-port-turret-health +(defmethod inspect hud-port-turret-health ((obj hud-port-turret-health)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type hud-turret-health inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition for method 17 of type hud-port-turret-health +;; WARN: Return type mismatch int vs none. +(defmethod init-callback hud-port-turret-health ((obj hud-port-turret-health)) + (set! (-> obj level) (level-get *level* 'portblmp)) + (init-turret-hud obj "portblmp-minimap") + ((method-of-type hud init-callback) obj) + 0 + (none) + ) + +;; definition of type turret-info +(deftype turret-info (basic) + ((process (pointer process) :offset-assert 4) + (handle handle :offset-assert 8) + (turret (pointer base-turret) :offset-assert 16) + (grabbed? symbol :offset-assert 20) + (quat quaternion :inline :offset-assert 32) + (trans vector :inline :offset-assert 48) + ) + :method-count-assert 9 + :size-assert #x40 + :flag-assert #x900000040 + ) + +;; definition for method 3 of type turret-info +(defmethod inspect turret-info ((obj turret-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tprocess: #x~X~%" (-> obj process)) + (format #t "~1Thandle: ~D~%" (-> obj handle)) + (format #t "~1Tturret: #x~X~%" (-> obj turret)) + (format #t "~1Tgrabbed?: ~A~%" (-> obj grabbed?)) + (format #t "~1Tquat: #~%" (-> obj quat)) + (format #t "~1Ttrans: ~`vector`P~%" (-> obj trans)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-turret drill-turret-ext drill-turret-ext-lod0-jg drill-turret-ext-idle-ja + ((drill-turret-ext-lod0-mg (meters 999999))) + :bounds (static-spherem 0 1.8 0 3.8) + :origin-joint-index 3 + ) + +;; failed to figure out what this is: +(defskelgroup skel-turret-explode drill-turret-ext drill-turret-ext-explode-lod0-jg drill-turret-ext-explode-idle-ja + ((drill-turret-ext-explode-lod0-mg (meters 999999))) + :bounds (static-spherem 0 1.8 0 3.8) + :origin-joint-index 3 + ) + +;; definition for symbol *turret-exploder-params*, type joint-exploder-static-params +(define *turret-exploder-params* + (new 'static 'joint-exploder-static-params + :joints (new 'static 'boxed-array :type joint-exploder-static-joint-params + (new 'static 'joint-exploder-static-joint-params :joint-index 3 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 4 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 5 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 6 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 7 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 8 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 9 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 10 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 11 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 12 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 13 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 14 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 15 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 16 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 17 :parent-joint-index -1) + ) + :collide-spec #x1 + ) + ) + +;; definition of type turret-path-event +(deftype turret-path-event (structure) + ((pos float :offset-assert 0) + (event-type symbol :offset-assert 4) + (param object :offset-assert 8) + ) + :method-count-assert 9 + :size-assert #xc + :flag-assert #x90000000c + ) + +;; definition for method 3 of type turret-path-event +(defmethod inspect turret-path-event ((obj turret-path-event)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'turret-path-event) + (format #t "~1Tpos: ~f~%" (-> obj pos)) + (format #t "~1Tevent-type: ~A~%" (-> obj event-type)) + (format #t "~1Tparam: ~A~%" (-> obj param)) + (label cfg-4) + obj + ) + +;; definition of type turret-path +(deftype turret-path (structure) + ((event-count int32 :offset-assert 0) + (event-tbl (inline-array turret-path-event) :offset-assert 4) + ) + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +;; definition for method 3 of type turret-path +(defmethod inspect turret-path ((obj turret-path)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'turret-path) + (format #t "~1Tevent-count: ~D~%" (-> obj event-count)) + (format #t "~1Tevent-tbl: #x~X~%" (-> obj event-tbl)) + (label cfg-4) + obj + ) + +;; definition of type base-turret +(deftype base-turret (process-focusable) + ((hud handle :offset-assert 208) + (condition int32 :offset-assert 216) + (shadow-backup symbol :offset-assert 220) + (rider handle :offset-assert 224) + (actor-group (pointer actor-group) :offset-assert 232) + (actor-group-count int32 :offset-assert 236) + (alt-actor symbol :offset-assert 240) + (smush-control smush-control :inline :offset-assert 248) + (sound-id sound-id 3 :offset-assert 280) + (sound-playing symbol 3 :offset-assert 292) + (cam-string-vector vector :inline :offset-assert 304) + (path-event turret-path :offset-assert 320) + (path-u float :offset-assert 324) + (path-u-prev float :offset-assert 328) + (path-mode uint16 :offset-assert 332) + (path-speed float :offset-assert 336) + (path-speed-mult float :offset-assert 340) + (path-speed-mult-final float :offset-assert 344) + (path-old-pos vector :inline :offset-assert 352) + (path-direction symbol :offset-assert 368) + (pause-proc (function base-turret symbol) :offset-assert 372) + (gun-recoil-jmod joint-mod-add-local 4 :offset-assert 376) + (gun-index int32 :offset-assert 392) + (shot-timeout time-frame :offset-assert 400) + (fire-time time-frame :offset-assert 408) + (fire-time-interval time-frame :offset-assert 416) + (enable-controls symbol :offset-assert 424) + (available-for-pickup symbol :offset-assert 428) + (roty degrees :offset-assert 432) + (rotyv degrees :offset-assert 436) + (rotyvv degrees :offset-assert 440) + (roty-min degrees :offset-assert 444) + (roty-max degrees :offset-assert 448) + (rotx degrees :offset-assert 452) + (rotxv degrees :offset-assert 456) + (rotxvv degrees :offset-assert 460) + (rotx-min degrees :offset-assert 464) + (rotx-max degrees :offset-assert 468) + (target-quat quaternion :inline :offset-assert 480) + (init-quat quaternion :inline :offset-assert 496) + (health float :offset-assert 512) + (track-handle handle :offset-assert 520) + (heat float :offset-assert 528) + (heat-target float :offset-assert 532) + (arrow-angle degrees :offset-assert 536) + (arrow-alpha float :offset-assert 540) + (arrow-red float :offset-assert 544) + (red-filter-timer time-frame :offset-assert 552) + (ride-height float :offset-assert 560) + ) + :heap-base #x1c0 + :method-count-assert 49 + :size-assert #x234 + :flag-assert #x3101c00234 + (:methods + (idle () _type_ :state 27) + (setup () _type_ :state 28) + (active () _type_ :state 29) + (shutdown () _type_ :state 30) + (dormant () _type_ :state 31) + (die () _type_ :state 32) + (turret-init! (_type_ entity-actor matrix) none 33) + (base-turret-method-34 (_type_ process) none 34) + (base-turret-method-35 (_type_) none 35) + (base-turret-method-36 (_type_) none 36) + (base-turret-method-37 (_type_) none 37) + (base-turret-method-38 (_type_) none 38) + (base-turret-method-39 (_type_ turret-path-event) none 39) + (base-turret-method-40 (_type_) none 40) + (base-turret-method-41 (_type_ vector) symbol 41) + (base-turret-method-42 (_type_ vector vector float) float 42) + (base-turret-method-43 (_type_) none 43) + (base-turret-method-44 (_type_ vector vector) none 44) + (base-turret-method-45 (_type_ object symbol) none 45) + (base-turret-method-46 (_type_ process) process 46) + (base-turret-method-47 (_type_) none 47) + (turret-event-handler (_type_ process int symbol event-message-block) object 48) + ) + ) + +;; definition for method 3 of type base-turret +(defmethod inspect base-turret ((obj base-turret)) + (when (not obj) + (set! obj obj) + (goto cfg-7) + ) + (let ((t9-0 (method-of-type process-focusable inspect))) + (t9-0 obj) + ) + (format #t "~2Thud: ~D~%" (-> obj hud)) + (format #t "~2Tcondition: ~D~%" (-> obj condition)) + (format #t "~2Tshadow-backup: ~A~%" (-> obj shadow-backup)) + (format #t "~2Trider: ~D~%" (-> obj rider)) + (format #t "~2Tactor-group: #x~X~%" (-> obj actor-group)) + (dotimes (s5-0 (-> obj actor-group-count)) + (format #t "~T [~D]~2Tactor-group: ~`actor-group`P~%" s5-0 (-> obj actor-group s5-0)) + ) + (format #t "~2Tactor-group-count: ~D~%" (-> obj actor-group-count)) + (format #t "~2Talt-actor: ~A~%" (-> obj alt-actor)) + (format #t "~2Tsmush-control: #~%" (-> obj smush-control)) + (format #t "~2Tsound-id[3] @ #x~X~%" (-> obj sound-id)) + (format #t "~2Tsound-playing[3] @ #x~X~%" (-> obj sound-playing)) + (format #t "~2Tcam-string-vector: #~%" (-> obj cam-string-vector)) + (format #t "~2Tpath-event: #~%" (-> obj path-event)) + (format #t "~2Tpath-u: ~f~%" (-> obj path-u)) + (format #t "~2Tpath-u-prev: ~f~%" (-> obj path-u-prev)) + (format #t "~2Tpath-mode: ~D~%" (-> obj path-mode)) + (format #t "~2Tpath-speed: ~f~%" (-> obj path-speed)) + (format #t "~2Tpath-speed-mult: ~f~%" (-> obj path-speed-mult)) + (format #t "~2Tpath-speed-mult-final: ~f~%" (-> obj path-speed-mult-final)) + (format #t "~2Tpath-old-pos: ~`vector`P~%" (-> obj path-old-pos)) + (format #t "~2Tpath-direction: ~A~%" (-> obj path-direction)) + (format #t "~2Tpause-proc: ~A~%" (-> obj pause-proc)) + (format #t "~2Tgun-recoil-jmod[4] @ #x~X~%" (-> obj gun-recoil-jmod)) + (format #t "~2Tgun-index: ~D~%" (-> obj gun-index)) + (format #t "~2Tshot-timeout: ~D~%" (-> obj shot-timeout)) + (format #t "~2Tfire-time: ~D~%" (-> obj fire-time)) + (format #t "~2Tfire-time-interval: ~D~%" (-> obj fire-time-interval)) + (format #t "~2Tenable-controls: ~A~%" (-> obj enable-controls)) + (format #t "~2Tavailable-for-pickup: ~A~%" (-> obj available-for-pickup)) + (format #t "~2Troty: (deg ~r)~%" (-> obj roty)) + (format #t "~2Trotyv: (deg ~r)~%" (-> obj rotyv)) + (format #t "~2Trotyvv: (deg ~r)~%" (-> obj rotyvv)) + (format #t "~2Troty-min: (deg ~r)~%" (-> obj roty-min)) + (format #t "~2Troty-max: (deg ~r)~%" (-> obj roty-max)) + (format #t "~2Trotx: (deg ~r)~%" (-> obj rotx)) + (format #t "~2Trotxv: (deg ~r)~%" (-> obj rotxv)) + (format #t "~2Trotxvv: (deg ~r)~%" (-> obj rotxvv)) + (format #t "~2Trotx-min: (deg ~r)~%" (-> obj rotx-min)) + (format #t "~2Trotx-max: (deg ~r)~%" (-> obj rotx-max)) + (format #t "~2Ttarget-quat: #~%" (-> obj target-quat)) + (format #t "~2Tinit-quat: #~%" (-> obj init-quat)) + (format #t "~2Thealth: ~f~%" (-> obj health)) + (format #t "~2Ttrack-handle: ~D~%" (-> obj track-handle)) + (format #t "~2Theat: ~f~%" (-> obj heat)) + (format #t "~2Theat-target: ~f~%" (-> obj heat-target)) + (format #t "~2Tarrow-angle: ~f~%" (-> obj arrow-angle)) + (format #t "~2Tarrow-alpha: ~f~%" (-> obj arrow-alpha)) + (format #t "~2Tarrow-red: ~f~%" (-> obj arrow-red)) + (format #t "~2Tred-filter-timer: ~D~%" (-> obj red-filter-timer)) + (format #t "~2Tride-height: ~f~%" (-> obj ride-height)) + (label cfg-7) + obj + ) + +;; definition for method 7 of type base-turret +;; WARN: Return type mismatch process-drawable vs base-turret. +(defmethod relocate base-turret ((obj base-turret) (arg0 int)) + (countdown (v1-0 4) + (if (-> obj gun-recoil-jmod v1-0) + (&+! (-> obj gun-recoil-jmod v1-0) arg0) + ) + ) + (the-as base-turret ((method-of-type process-drawable relocate) obj arg0)) + ) + +;; definition for method 34 of type base-turret +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-34 base-turret ((obj base-turret) (arg0 process)) + 0 + (none) + ) + +;; definition for method 35 of type base-turret +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-35 base-turret ((obj base-turret)) + (send-event (handle->process (-> obj hud)) 'force-show) + 0 + (none) + ) + +;; definition for method 36 of type base-turret +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-36 base-turret ((obj base-turret)) + (if (nonzero? (-> obj part)) + (spawn (-> obj part) (-> obj root-override trans)) + ) + 0 + (none) + ) + +;; definition for method 40 of type base-turret +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-40 base-turret ((obj base-turret)) + (let ((s3-0 (new 'stack-no-clear 'matrix)) + (s4-0 (new 'stack-no-clear 'matrix)) + (gp-0 (new 'stack-no-clear 'quaternion)) + ) + (matrix-rotate-y! s3-0 (-> obj roty)) + (matrix-rotate-x! s4-0 (-> obj rotx)) + (matrix*! s3-0 s4-0 s3-0) + (matrix->quaternion gp-0 s3-0) + (quaternion-smooth-seek! (-> obj target-quat) (-> obj target-quat) gp-0 0.33) + (let ((f0-2 (update! (-> obj smush-control)))) + (quaternion-rotate-local-x! (-> obj root-override quat) gp-0 (* -910.2222 f0-2)) + ) + ) + 0 + (none) + ) + +;; definition for method 37 of type base-turret +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-37 base-turret ((obj base-turret)) + (let ((f30-0 (fabs (* 0.00006866455 (-> obj rotyv)))) + (f28-0 (fabs (* 0.00010986328 (-> obj rotxv)))) + (f26-0 0.33333334) + (f24-0 0.5) + (s5-0 (-> obj sound-playing 0)) + (s4-0 (-> obj sound-playing 1)) + ) + (cond + ((and (-> obj sound-playing 0) (< f30-0 f26-0)) + (sound-stop (-> obj sound-id 0)) + (set! (-> obj sound-playing 0) #f) + ) + ((< (* 1.2 f26-0) f30-0) + (sound-play "drill-turret-lp" :id (-> obj sound-id 0) :position (-> obj root-override trans)) + (set! (-> obj sound-playing 0) #t) + ) + ) + (cond + ((and (-> obj sound-playing 1) (< f28-0 f24-0)) + (sound-stop (-> obj sound-id 1)) + (set! (-> obj sound-playing 1) #f) + ) + ((< (* 1.2 f24-0) f28-0) + (sound-play "drill-turret-l2" :id (-> obj sound-id 1) :position (-> obj root-override trans)) + (set! (-> obj sound-playing 1) #t) + ) + ) + (if (and (or s5-0 s4-0) (< f30-0 f26-0) (< f28-0 f24-0)) + (sound-play "drill-tur-stop" :position (-> obj root-override trans)) + ) + ) + (case (-> obj path-mode) + ((2 3 4) + (sound-play-by-name + (static-sound-name "turret-track") + (-> obj sound-id 2) + (the int (* 1024.0 (lerp-clamp 0.0 1.0 (-> obj path-speed-mult)))) + (the int (* 1524.0 (lerp-scale -0.3 0.3 (-> obj path-speed-mult) 0.0 4.0))) + 0 + (sound-group sfx) + (-> obj root-override trans) + ) + (set! (-> obj sound-playing 2) #t) + ) + (else + (when (-> obj sound-playing 2) + (sound-stop (-> obj sound-id 2)) + (set! (-> obj sound-playing 2) #f) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 48 of type base-turret +;; INFO: Used lq/sq +(defmethod turret-event-handler base-turret ((obj base-turret) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (local-vars (v0-0 object)) + (case arg2 + (('trans) + (set! v0-0 (-> arg3 param 0)) + (set! (-> (the-as vector v0-0) quad) (-> obj root-override trans quad)) + v0-0 + ) + (('quat) + (quaternion-copy! (the-as quaternion (-> arg3 param 0)) (-> obj target-quat)) + ) + (('path) + (if (not (logtest? (-> obj path flags) (path-control-flag not-found))) + (-> obj path) + #f + ) + ) + (('shadow) + (cond + ((-> arg3 param 0) + (set! v0-0 (-> obj shadow-backup)) + (set! (-> obj draw shadow) (the-as shadow-geo v0-0)) + v0-0 + ) + (else + (set! (-> obj draw shadow) #f) + #f + ) + ) + ) + ) + ) + +;; definition for function turret-handler +(defbehavior turret-handler base-turret ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (turret-event-handler self arg0 arg1 arg2 arg3) + ) + +;; definition for method 20 of type base-turret +(defmethod get-trans base-turret ((obj base-turret) (arg0 int)) + "@returns the `trans` [[vector]] from the process's `root` (typically either a [[trsqv]] or a [[collide-shape]])" + (if (= arg0 1) + (-> obj root-override trans) + ((method-of-type process-focusable get-trans) obj arg0) + ) + ) + +;; failed to figure out what this is: +(defstate idle (base-turret) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('attack 'bonk) + (send-event proc 'target-turret-get-off 90) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer self)) + (set! (-> a1-2 num-params) 2) + (set! (-> a1-2 message) 'shove) + (set! (-> a1-2 param 0) (the-as uint #f)) + (let ((v1-9 (new 'static 'attack-info :mask (attack-info-mask shove-back shove-up id)))) + (let* ((a0-7 *game-info*) + (a2-2 (+ (-> a0-7 attack-id) 1)) + ) + (set! (-> a0-7 attack-id) a2-2) + (set! (-> v1-9 id) a2-2) + ) + (set! (-> v1-9 shove-back) 12288.0) + (set! (-> v1-9 shove-up) 4096.0) + (set! (-> a1-2 param 1) (the-as uint v1-9)) + ) + (send-event-function proc a1-2) + ) + #f + ) + (('touch) + (send-event proc 'target-turret-get-off 90) + (send-shoves + (-> self root-override) + proc + (the-as touching-shapes-entry (-> event param 0)) + 0.7 + 6144.0 + 16384.0 + ) + #f + ) + (('exit) + #t + ) + (else + (turret-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set-zero! (-> self smush-control)) + (base-turret-method-43 self) + (set! (-> self focus-status) (focus-status disable ignore inactive)) + (none) + ) + :code (behavior () + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 2)) + 0.0 + (let ((f30-0 20480.0)) + (until #f + (when (and (and *target* + (and (>= f30-0 (vector-vector-distance (-> self root-override trans) (-> *target* control trans))) + (zero? (logand (focus-status teleporting) (-> *target* focus-status))) + ) + ) + (and (not (task-node-closed? (game-task-node drill-ship-resolution))) + (can-display-query? self (the-as string #f) -99.0) + (not (logtest? (focus-status in-head board mech dark) (-> *target* focus-status))) + (let ((f28-0 24576.0) + (s4-0 (-> self root-override)) + (s5-0 (target-pos 0)) + ) + (and (< f28-0 + (fabs + (deg-diff (y-angle s4-0) (vector-y-angle (vector-! (new 'stack-no-clear 'vector) s5-0 (-> s4-0 trans)))) + ) + ) + (-> self available-for-pickup) + ) + ) + ) + ) + (let ((gp-1 (new + 'stack + 'font-context + *font-default-matrix* + 32 + 320 + 0.0 + (font-color default-#cddbcd) + (font-flags shadow kerning) + ) + ) + ) + (let ((v1-21 gp-1)) + (set! (-> v1-21 width) (the float 340)) + ) + (let ((v1-22 gp-1)) + (set! (-> v1-22 height) (the float 80)) + ) + (let ((v1-23 gp-1)) + (set! (-> v1-23 scale) 0.9) + ) + (set! (-> gp-1 flags) (font-flags shadow kerning large)) + (print-game-text (lookup-text! *common-text* (game-text-id text-x182) #f) gp-1 #f 44 (bucket-id progress)) + ) + (when (and (cpad-pressed? 0 triangle) (send-event *target* 'change-mode 'turret self)) + (set! (-> self rider) (process->handle *target*)) + (let ((gp-2 (res-lump-struct (-> self entity) 'on-exit structure))) + (if (and gp-2 (not *scene-player*)) + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (the-as vector #f)) + (the-as pair gp-2) + ) + ) + ) + (go-virtual setup) + ) + ) + (if *target* + (look-at! + (-> *target* neck) + (vector+! + (new 'stack-no-clear 'vector) + (the-as vector (-> self root-override root-prim prim-core)) + (new 'static 'vector :y 2048.0 :w 1.0) + ) + 'nothing-special + self + ) + ) + (base-turret-method-36 self) + (suspend) + ) + ) + #f + (none) + ) + :post (behavior () + (cond + ((-> self enable-controls) + (quaternion-slerp! + (-> self root-override quat) + (-> self root-override quat) + (-> self init-quat) + (* 3.0 (-> self clock seconds-per-frame)) + ) + (quaternion-copy! (-> self target-quat) (-> self root-override quat)) + ) + (else + (let ((s4-0 (new 'stack-no-clear 'matrix)) + (s5-0 (new 'stack-no-clear 'matrix)) + (gp-0 (new 'stack-no-clear 'quaternion)) + ) + (matrix-rotate-y! s4-0 (-> self roty)) + (matrix-rotate-x! s5-0 (-> self rotx)) + (matrix*! s4-0 s5-0 s4-0) + (matrix->quaternion gp-0 s4-0) + (quaternion-smooth-seek! (-> self target-quat) (-> self target-quat) gp-0 0.33) + (let ((f0-4 (update! (-> self smush-control)))) + (quaternion-rotate-local-x! (-> self root-override quat) gp-0 (* -910.2222 f0-4)) + ) + ) + ) + ) + (transform-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate setup (base-turret) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('change-mode) + (go-virtual active) + ) + (else + (turret-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set-setting! 'mode-name 'cam-turret 0 0) + (none) + ) + :code (the-as (function none :behavior base-turret) sleep-code) + :post (the-as (function none :behavior base-turret) transform-post) + ) + +;; definition for function set-recoil +;; WARN: Return type mismatch symbol vs none. +(defun set-recoil ((arg0 joint-mod) (arg1 float) (arg2 symbol)) + (set! (-> arg0 target z) arg1) + (set! (-> arg0 twist-min-y) (the-as float #t)) + (none) + ) + +;; failed to figure out what this is: +(defstate active (base-turret) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (let ((v1-0 event-type)) + (the-as + object + (cond + ((= v1-0 'draw) + (cond + ((-> event param 0) + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 2)) + (transform-post) + ) + (else + (ja-channel-set! 0) + (transform-post) + ) + ) + ) + ((= v1-0 'fire-down) + (cond + ((>= (-> self heat) 1.0) + (let ((v1-8 (- (-> self clock frame-counter) (-> self fire-time))) + (a0-7 6) + (a1-1 (-> self fire-time-interval)) + ) + (when (>= v1-8 (* a0-7 a1-1)) + (set! (-> self fire-time) (-> self clock frame-counter)) + (the-as object (base-turret-method-45 self a1-1 event-type)) + ) + ) + ) + (else + (when (>= (- (-> self clock frame-counter) (-> self fire-time)) (-> self fire-time-interval)) + (set! (-> self fire-time) (-> self clock frame-counter)) + (the-as object (base-turret-method-45 self arg1 event-type)) + ) + ) + ) + ) + ((= v1-0 'fire-pressed) + (set! (-> self fire-time) (-> self clock frame-counter)) + (the-as object (base-turret-method-45 self arg1 event-type)) + ) + ((= v1-0 'bonk) + #f + ) + ((or (= v1-0 'touch) (= v1-0 'attack)) + (let* ((gp-0 (-> event param 0)) + (s5-0 (the-as object (-> event param 1))) + (s4-0 proc) + (v1-21 (if (type? s4-0 projectile) + s4-0 + ) + ) + ) + (when (and gp-0 v1-21) + (case (-> (the-as attack-info s5-0) mode) + (('wasp-shot 'guard-shot) + (seek! (-> self health) 0.0 0.25) + (activate! (-> self smush-control) 0.2 15 75 1.0 0.9 (-> *display* entity-clock)) + (sound-play "turret-take-hit") + (let ((v0-1 (the-as object (+ (-> self clock frame-counter) (seconds 0.08))))) + (set! (-> self red-filter-timer) (the-as time-frame v0-1)) + v0-1 + ) + ) + (('drill-ship-shot) + (seek! (-> self health) 0.0 0.5) + (activate! (-> self smush-control) 0.2 24 144 1.0 0.9 (-> *display* entity-clock)) + (sound-play "turret-take-hit") + ) + ) + ) + ) + ) + ((= v1-0 'test) + (set! (-> self health) (seek (-> self health) 0.0 (the-as float (-> event param 0)))) + ) + ((= v1-0 'exit-valid) + (let ((v1-33 (-> self path-mode))) + (cond + ((or (zero? v1-33) (= v1-33 5) (= v1-33 1)) + (base-turret-method-41 self (the-as vector (-> event param 0))) + #t + ) + (else + #f + ) + ) + ) + ) + ((= v1-0 'exit) + (let ((v1-37 (-> self path-mode))) + (when (if (or (zero? v1-37) (= v1-37 5) (= v1-37 1)) + #t + ) + (go-virtual shutdown) + #f + ) + ) + ) + (else + (turret-handler proc arg1 event-type event) + ) + ) + ) + ) + ) + :enter (behavior () + (logior! (-> self skel status) (joint-control-status sync-math)) + (process-entity-status! self (entity-perm-status no-kill) #t) + (set! (-> self focus-status) (focus-status)) + (set! (-> self red-filter-timer) 0) + (set! (-> self ride-height) 0.0) + (set! (-> self roty) (y-angle (-> self root-override))) + (set! (-> self rotyv) 0.0) + (set! (-> self rotx) 0.0) + (set! (-> self rotxv) 0.0) + (let ((a1-1 (handle->process (-> self rider)))) + (if a1-1 + (base-turret-method-34 self a1-1) + ) + ) + (let ((v1-14 (-> (the-as collide-shape-prim-group (-> self root-override root-prim)) child 1))) + (set! (-> v1-14 prim-core action) (collide-action solid)) + (set! (-> v1-14 prim-core collide-as) (collide-spec obstacle)) + ) + (none) + ) + :exit (behavior () + (set-filter-color! 1.0 1.0 1.0) + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override root-prim)) child 1))) + (set! (-> v1-3 prim-core action) (collide-action)) + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + ) + 0 + (send-event (handle->process (-> self hud)) 'hide-and-die) + (none) + ) + :trans (behavior () + (if (<= (the int (-> self health)) 0) + (go-virtual die) + ) + (none) + ) + :code (behavior () + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 2)) + (while (handle->process (-> self rider)) + (base-turret-method-35 self) + (base-turret-method-37 self) + (when (>= (-> *camera-combiner* interp-val) 1.0) + (seek! (-> self path-speed-mult) (-> self path-speed-mult-final) (-> self clock seconds-per-frame)) + (let ((gp-0 (-> self path-mode))) + (case gp-0 + ((1) + (set! (-> self path-mode) (the-as uint 2)) + ) + ((2 3 4) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (get-point-at-percent-along-path! (-> self path) s5-0 (-> self path-u) 'interp) + (set! (-> self root-override trans quad) (-> s5-0 quad)) + (set! (-> self root-override trans y) (+ (-> s5-0 y) (-> self ride-height))) + ) + (seek! (-> self ride-height) 2048.0 (* 2048.0 (-> self clock seconds-per-frame))) + (set! (-> self path-u-prev) (-> self path-u)) + (seek! + (-> self path-u) + (if (-> self path-direction) + 0.0 + 1.0 + ) + (* (-> self path-speed) (-> self path-speed-mult) (-> self clock seconds-per-frame)) + ) + (base-turret-method-38 self) + (when (= (-> self path-u) 1.0) + (get-point-at-percent-along-path! (-> self path) (-> self root-override trans) 1.0 'interp) + (let ((a1-9 (displacement-between-points-at-percent-normalized! (-> self path) (new 'stack-no-clear 'vector) 1.0))) + (forward-up-nopitch->quaternion (-> self init-quat) a1-9 *y-vector*) + ) + (activate! (-> self smush-control) 0.2 30 240 0.8 0.8 (-> *display* entity-clock)) + (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 255 (seconds 0.5)) + (set! (-> self path-mode) (the-as uint 5)) + (send-event *target* 'end-mode) + ) + ) + ((5) + (go-virtual shutdown) + ) + ) + (cond + ((= gp-0 3) + (when ((-> self pause-proc) self) + (set! (-> self path-mode) (the-as uint 2)) + (set! (-> self path-speed-mult-final) 1.0) + ) + ) + ((= gp-0 4) + (when (not ((-> self pause-proc) self)) + (set! (-> self path-mode) (the-as uint 2)) + (set! (-> self path-speed-mult-final) 1.0) + ) + ) + ) + ) + ) + (set! (-> self path-old-pos quad) (-> self root-override trans quad)) + (base-turret-method-36 self) + (suspend) + ) + (go-virtual shutdown) + (none) + ) + :post (behavior () + (when (nonzero? (-> self red-filter-timer)) + (cond + ((< (-> self clock frame-counter) (-> self red-filter-timer)) + (let* ((v1-5 (- (-> self red-filter-timer) (-> self clock frame-counter))) + (f0-1 (- 1.0 (* 0.041666668 (the float v1-5)))) + ) + (set-filter-color! 1.0 f0-1 f0-1) + ) + ) + (else + (set! (-> self red-filter-timer) 0) + (set-filter-color! 1.0 1.0 1.0) + ) + ) + ) + (dotimes (gp-0 4) + (let ((s5-0 (-> self gun-recoil-jmod gp-0))) + (when (-> s5-0 enable) + (let ((s4-0 (-> s5-0 transform))) + (let ((f0-3 (* 2.4 (fabs (-> s4-0 trans z))))) + (seek! (-> s4-0 trans z) 0.0 (* f0-3 (-> self clock seconds-per-frame))) + ) + (if (= (-> s4-0 trans z) 0.0) + (set! (-> s5-0 enable) #f) + ) + ) + ) + ) + ) + (when (and (-> self enable-controls) (>= (-> *camera-combiner* interp-val) 1.0)) + (set! (-> self rotyvv) (analog-input (the-as int (-> *cpad-list* cpads 0 leftx)) 128.0 32.0 110.0 -98304.0)) + (set! (-> self rotxvv) (analog-input (the-as int (-> *cpad-list* cpads 0 lefty)) 128.0 32.0 110.0 -65536.0)) + ) + (+! (-> self rotyv) (* (-> self rotyvv) (-> self clock seconds-per-frame))) + (seek! (-> self rotyv) 0.0 (* 32768.0 (-> self clock seconds-per-frame))) + (set! (-> self rotyv) (fmax -14563.556 (fmin 14563.556 (-> self rotyv)))) + (set! (-> self roty) + (the float + (sar (shl (the int (+ (-> self roty) (* (-> self rotyv) (-> self clock seconds-per-frame)))) 48) 48) + ) + ) + (+! (-> self rotxv) (* (-> self rotxvv) (-> self clock seconds-per-frame))) + (seek! (-> self rotxv) 0.0 (* 32768.0 (-> self clock seconds-per-frame))) + (set! (-> self rotxv) (fmax -9102.223 (fmin 9102.223 (-> self rotxv)))) + (set! (-> self rotx) + (the float + (sar (shl (the int (+ (-> self rotx) (* (-> self rotxv) (-> self clock seconds-per-frame)))) 48) 48) + ) + ) + (cond + ((>= (-> self rotx) (-> self rotx-max)) + (set! (-> self rotx) (-> self rotx-max)) + (set! (-> self rotxv) 0.0) + ) + ((>= (-> self rotx-min) (-> self rotx)) + (set! (-> self rotx) (-> self rotx-min)) + (set! (-> self rotxv) 0.0) + ) + ) + (when (!= (-> self roty-min) (-> self roty-max)) + (cond + ((>= (-> self roty) (-> self roty-max)) + (set! (-> self roty) (-> self roty-max)) + (set! (-> self rotyv) 0.0) + ) + ((>= (-> self roty-min) (-> self roty)) + (set! (-> self roty) (-> self roty-min)) + (set! (-> self rotyv) 0.0) + ) + ) + ) + (base-turret-method-40 self) + (base-turret-method-47 self) + (set! (-> *game-info* score) (-> self health)) + (send-event (handle->process (-> self hud)) 'set-heat (-> self heat)) + (send-event (handle->process (-> self hud)) 'set-arrow-alpha (-> self arrow-alpha)) + (send-event (handle->process (-> self hud)) 'set-arrow-angle (-> self arrow-angle)) + (send-event (handle->process (-> self hud)) 'set-arrow-red (-> self arrow-red)) + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 x) 0.0) + (set! (-> s5-1 y) 20480.0) + (set! (-> s5-1 z) 81920.0) + (set! (-> s5-1 w) 1.0) + (let ((gp-1 (new 'stack-no-clear 'vector4w))) + (set! (-> gp-1 quad) (the-as uint128 0)) + (vector-matrix*! s5-1 s5-1 (-> self node-list data 0 bone transform)) + (if (transform-point-qword! gp-1 s5-1) + (send-event + (handle->process (-> self hud)) + 'set-hud-pos + (+ (/ (-> gp-1 x) 16) -1792) + (+ (/ (-> gp-1 y) 16) -1840) + ) + ) + ) + ) + (seek! + (-> self heat) + (-> self heat-target) + (* (fmin 0.5 (fabs (- (-> self heat) (-> self heat-target)))) (-> self clock seconds-per-frame)) + ) + (seek! (-> self heat-target) 0.0 (* 0.4 (-> self clock seconds-per-frame))) + (transform-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate shutdown (base-turret) + :virtual #t + :event turret-handler + :exit (behavior () + (remove-setting! 'mode-name) + (sound-stop (-> self sound-id 0)) + (sound-stop (-> self sound-id 1)) + (sound-stop (-> self sound-id 2)) + (set-zero! (-> self smush-control)) + (logclear! (-> self skel status) (joint-control-status sync-math)) + (none) + ) + :trans (behavior () + (when (< 0.99 (vector-dot + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override quat)) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self init-quat)) + ) + ) + (cond + ((= (-> self path-mode) 5) + (if (= (-> self ride-height) 0.0) + (go-virtual dormant) + ) + ) + (else + (go-virtual idle) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 2)) + (until #f + (base-turret-method-37 self) + (if *target* + (look-at! + (-> *target* neck) + (vector+! + (new 'stack-no-clear 'vector) + (the-as vector (-> self root-override root-prim prim-core)) + (new 'static 'vector :y 2048.0 :w 1.0) + ) + 'nothing-special + self + ) + ) + (suspend) + ) + #f + (none) + ) + :post (behavior () + (when (= (-> self path-mode) 5) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (get-point-at-percent-along-path! (-> self path) gp-0 1.0 'interp) + (set! (-> self root-override trans quad) (-> gp-0 quad)) + (set! (-> self root-override trans y) (+ (-> gp-0 y) (-> self ride-height))) + ) + (seek! (-> self ride-height) 0.0 (* 2048.0 (-> self clock seconds-per-frame))) + ) + (dotimes (gp-1 4) + (let ((s5-0 (-> self gun-recoil-jmod gp-1))) + (when (-> s5-0 enable) + (let ((s4-0 (-> s5-0 transform))) + (let ((f0-7 (* 2.4 (fabs (-> s4-0 trans z))))) + (seek! (-> s4-0 trans z) 0.0 (* f0-7 (-> self clock seconds-per-frame))) + ) + (if (= (-> s4-0 trans z) 0.0) + (set! (-> s5-0 enable) #f) + ) + ) + ) + ) + ) + (set! (-> self rotxv) + (* (deg-diff + (-> self rotx) + (deg-seek-smooth (-> self rotx) 0.0 (* 16384.0 (-> self clock seconds-per-frame)) 0.1) + ) + (-> self clock frames-per-second) + ) + ) + (set! (-> self rotyv) + (* (deg-diff + (-> self roty) + (deg-seek-smooth + (-> self roty) + (the float (sar (shl (the int (quaternion-y-angle (-> self init-quat))) 48) 48)) + (* 21845.334 (-> self clock seconds-per-frame)) + 0.1 + ) + ) + (-> self clock frames-per-second) + ) + ) + (set! (-> self roty) + (the float + (sar (shl (the int (+ (-> self roty) (* (-> self rotyv) (-> self clock seconds-per-frame)))) 48) 48) + ) + ) + (set! (-> self rotx) + (the float + (sar (shl (the int (+ (-> self rotx) (* (-> self rotxv) (-> self clock seconds-per-frame)))) 48) 48) + ) + ) + (base-turret-method-40 self) + (transform-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate dormant (base-turret) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('attack 'bonk) + (send-event proc 'target-turret-get-off 90) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer self)) + (set! (-> a1-2 num-params) 2) + (set! (-> a1-2 message) 'shove) + (set! (-> a1-2 param 0) (the-as uint #f)) + (let ((v1-9 (new 'static 'attack-info :mask (attack-info-mask shove-back shove-up id)))) + (let* ((a0-7 *game-info*) + (a2-2 (+ (-> a0-7 attack-id) 1)) + ) + (set! (-> a0-7 attack-id) a2-2) + (set! (-> v1-9 id) a2-2) + ) + (set! (-> v1-9 shove-back) 12288.0) + (set! (-> v1-9 shove-up) 4096.0) + (set! (-> a1-2 param 1) (the-as uint v1-9)) + ) + (send-event-function proc a1-2) + ) + #f + ) + (('touch) + (send-event proc 'target-turret-get-off 90) + (send-shoves + (-> self root-override) + proc + (the-as touching-shapes-entry (-> event param 0)) + 0.7 + 6144.0 + 16384.0 + ) + #f + ) + (('exit) + #t + ) + (else + (turret-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set-zero! (-> self smush-control)) + (base-turret-method-43 self) + (set! (-> self focus-status) (focus-status disable ignore inactive)) + (none) + ) + :code (the-as (function none :behavior base-turret) sleep-code) + ) + +;; failed to figure out what this is: +(defstate die (base-turret) + :virtual #t + :code (behavior () + (remove-setting! 'mode-name) + (sound-stop (-> self sound-id 0)) + (sound-stop (-> self sound-id 1)) + (sound-stop (-> self sound-id 2)) + (set! (-> self focus-status) (focus-status disable ignore inactive)) + (let ((gp-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-0) (seconds 0.8)) + (suspend) + ) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer self)) + (set! (-> a1-1 num-params) 2) + (set! (-> a1-1 message) 'attack) + (set! (-> a1-1 param 0) (the-as uint #f)) + (let ((v1-11 (new 'static 'attack-info :mask (attack-info-mask mode id)))) + (let* ((a0-4 *game-info*) + (a2-2 (+ (-> a0-4 attack-id) 1)) + ) + (set! (-> a0-4 attack-id) a2-2) + (set! (-> v1-11 id) a2-2) + ) + (set! (-> v1-11 mode) 'turret) + (set! (-> a1-1 param 1) (the-as uint v1-11)) + ) + (send-event-function (handle->process (-> self rider)) a1-1) + ) + (let ((v1-17 (-> self root-override root-prim))) + (set! (-> v1-17 prim-core collide-as) (collide-spec)) + (set! (-> v1-17 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (sound-play "turret-die" :position (-> self root-override trans)) + (let ((gp-2 (new 'stack 'joint-exploder-tuning (the-as uint 0)))) + (process-spawn + joint-exploder + (art-group-get-by-name *level* "skel-turret-explode" (the-as (pointer uint32) #f)) + 6 + gp-2 + *turret-exploder-params* + :to self + ) + ) + (let ((gp-3 (new 'stack-no-clear 'vector))) + (set! (-> gp-3 quad) (-> self root-override trans quad)) + (set! (-> gp-3 y) (+ 8192.0 (-> gp-3 y))) + (let ((s5-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when s5-2 + (let ((t9-13 (method-of-type part-tracker activate))) + (t9-13 (the-as part-tracker s5-2) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-14 run-function-in-process) + (a0-20 s5-2) + (a1-14 part-tracker-init) + (a2-12 (-> *part-group-id-table* 201)) + (a3-4 0) + (t0-2 #f) + (t1-2 #f) + (t2-1 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> gp-3 quad)) + ((the-as (function object object object object object object object object none) t9-14) + a0-20 + a1-14 + a2-12 + a3-4 + t0-2 + t1-2 + t2-1 + t3-0 + ) + ) + (-> s5-2 ppointer) + ) + ) + ) + (while (-> self child) + (suspend) + ) + (none) + ) + ) + +;; definition for method 46 of type base-turret +;; WARN: Return type mismatch symbol vs process. +(defmethod base-turret-method-46 base-turret ((obj base-turret) (arg0 process)) + (the-as process #t) + ) + +;; definition for method 47 of type base-turret +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-47 base-turret ((obj base-turret)) + (with-pp + (let ((a0-1 (-> obj root-override trans)) + (f30-0 0.0) + (s4-0 (the-as process-drawable #f)) + ) + (let ((s5-0 (new 'stack-no-clear 'array 'collide-shape 32)) + (a1-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> a1-0 quad) (-> a0-1 quad)) + (set! (-> a1-0 w) 409600.0) + (countdown (s3-0 (fill-actor-list-for-sphere *actor-hash* (the-as sphere a1-0) s5-0 32)) + (let* ((s2-0 (-> s5-0 s3-0)) + (a0-5 (if (type? s2-0 collide-shape) + s2-0 + ) + ) + ) + (when a0-5 + (let* ((s1-0 (-> a0-5 process)) + (s2-1 (if (type? s1-0 process-focusable) + s1-0 + ) + ) + ) + (when (and s2-1 + (logtest? (process-mask enemy) (-> s2-1 mask)) + (logtest? (process-mask collectable) (-> s2-1 mask)) + (not (logtest? (-> (the-as process-focusable s2-1) focus-status) (focus-status disable dead ignore inactive))) + (!= s2-1 obj) + (!= s2-1 *target*) + (base-turret-method-46 obj s2-1) + ) + (let ((f0-1 (vector-vector-xz-distance (-> obj root-override trans) (-> s2-1 root trans)))) + (when (or (not s4-0) (< f0-1 f30-0)) + (set! s4-0 s2-1) + (set! f30-0 f0-1) + ) + ) + ) + ) + ) + ) + ) + ) + (cond + (s4-0 + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 x) 0.0) + (set! (-> s5-1 y) 10240.0) + (set! (-> s5-1 z) 0.0) + (set! (-> s5-1 w) 1.0) + (let ((s1-1 (new 'stack-no-clear 'vector)) + (s3-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 12))) + (s2-2 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override quat))) + ) + (vector-matrix*! s5-1 s5-1 (-> (the-as process-focusable s4-0) node-list data 0 bone transform)) + (vector-line-distance-point! s5-1 s3-1 (vector+float*! (new 'stack-no-clear 'vector) s3-1 s2-2 4096.0) s1-1) + (let* ((a1-10 (vector-! (new 'stack-no-clear 'vector) s5-1 s1-1)) + (s4-1 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) a1-10 (-> obj root-override quat))) + (f30-1 (vector-vector-angle-safe s2-2 (vector-! (new 'stack-no-clear 'vector) s5-1 s3-1))) + ) + (let ((f0-10 (- (atan (-> s4-1 x) (-> s4-1 y))))) + (if (logtest? (-> *game-info* secrets) (game-secrets hflip-screen)) + (set! f0-10 (* -1.0 f0-10)) + ) + (set! (-> obj arrow-angle) (deg-seek (-> obj arrow-angle) f0-10 (* 65536.0 (-> pp clock seconds-per-frame)))) + ) + (cond + ((< 910.2222 f30-1) + (seek! (-> obj arrow-alpha) 1.0 (-> pp clock seconds-per-frame)) + (send-event (handle->process (-> obj hud)) 'set-target-flash #f) + ) + (else + (seek! (-> obj arrow-alpha) 0.0 (* 4.0 (-> pp clock seconds-per-frame))) + (send-event (handle->process (-> obj hud)) 'set-target-flash #t) + ) + ) + ) + ) + (seek! + (-> obj arrow-red) + (lerp-scale 1.0 0.0 (vector-vector-distance s5-1 (-> obj root-override trans)) 122880.0 245760.0) + (-> pp clock seconds-per-frame) + ) + ) + ) + (else + (seek! (-> obj arrow-alpha) 0.0 (-> pp clock seconds-per-frame)) + (send-event (handle->process (-> obj hud)) 'set-target-flash #f) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 43 of type base-turret +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-43 base-turret ((obj base-turret)) + (set! (-> obj roty) (y-angle (-> obj root-override))) + (set! (-> obj rotyv) 0.0) + (set! (-> obj rotyvv) 0.0) + (set! (-> obj rotx) 0.0) + (set! (-> obj rotxv) 0.0) + (set! (-> obj rotxvv) 0.0) + 0 + (none) + ) + +;; definition for method 33 of type base-turret +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod turret-init! base-turret ((obj base-turret) (arg0 entity-actor) (arg1 matrix)) + (local-vars (sv-16 res-tag)) + (stack-size-set! (-> obj main-thread) 512) + (let ((s3-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-others)))) + (set! (-> s3-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s3-0 reaction) cshape-reaction-default) + (set! (-> s3-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (let ((s2-0 (new 'process 'collide-shape-prim-group s3-0 (the-as uint 2) 0))) + (set! (-> s3-0 total-prims) (the-as uint 3)) + (set! (-> s2-0 prim-core collide-as) (collide-spec bot)) + (set! (-> s2-0 prim-core action) (collide-action solid)) + (set! (-> s2-0 transform-index) 3) + (set-vector! (-> s2-0 local-sphere) 0.0 7372.8 0.0 14745.6) + (set! (-> s3-0 root-prim) s2-0) + ) + (let ((v1-14 (new 'process 'collide-shape-prim-sphere s3-0 (the-as uint 0)))) + (set! (-> v1-14 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> v1-14 prim-core action) (collide-action solid)) + (set! (-> v1-14 transform-index) 3) + (set-vector! (-> v1-14 local-sphere) 0.0 8192.0 0.0 9830.4) + ) + (let ((v1-16 (new 'process 'collide-shape-prim-sphere s3-0 (the-as uint 0)))) + (set! (-> v1-16 transform-index) 3) + (set-vector! (-> v1-16 local-sphere) 0.0 6553.6 0.0 12288.0) + ) + (set! (-> s3-0 nav-radius) (* 0.75 (-> s3-0 root-prim local-sphere w))) + (let ((v1-19 (-> s3-0 root-prim))) + (set! (-> s3-0 backup-collide-as) (-> v1-19 prim-core collide-as)) + (set! (-> s3-0 backup-collide-with) (-> v1-19 prim-core collide-with)) + ) + (set! (-> obj root-override) s3-0) + ) + (when arg0 + (process-drawable-from-entity! obj arg0) + (set-yaw-angle-clear-roll-pitch! (-> obj root-override) (res-lump-float arg0 'rotoffset)) + ) + (when arg1 + (set! (-> obj root-override trans quad) (-> arg1 vector 0 quad)) + (quaternion-copy! (-> obj root-override quat) (the-as quaternion (-> arg1 vector 1))) + ) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-turret" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj shadow-backup) (the-as symbol (-> obj draw shadow))) + (logclear! (-> obj mask) (process-mask actor-pause)) + (set! (-> obj condition) (res-lump-value arg0 'index int :time -1000000000.0)) + (set! (-> obj fact) + (new 'process 'fact-info obj (pickup-type eco-pill-random) (-> *FACT-bank* default-eco-pill-green-inc)) + ) + (if (-> obj entity) + (move-to-ground + (the-as collide-shape-moving (-> obj root-override)) + 40960.0 + 40960.0 + #t + (collide-spec backgnd) + ) + ) + (set-zero! (-> obj smush-control)) + (set! (-> obj hud) (the-as handle #f)) + (base-turret-method-43 obj) + (set! (-> obj alt-actor) (the-as symbol (entity-actor-lookup (-> obj entity) 'alt-actor 0))) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-49 (res-lump-data (-> obj entity) 'actor-groups pointer :tag-ptr (& sv-16)))) + (cond + ((and v1-49 (nonzero? (-> sv-16 elt-count))) + (set! (-> obj actor-group) (the-as (pointer actor-group) v1-49)) + (set! (-> obj actor-group-count) (the-as int (-> sv-16 elt-count))) + ) + (else + (set! (-> obj actor-group) (the-as (pointer actor-group) #f)) + (set! (-> obj actor-group-count) 0) + 0 + ) + ) + ) + (set! (-> obj sound-id 0) (new-sound-id)) + (set! (-> obj sound-id 1) (new-sound-id)) + (set! (-> obj sound-id 2) (new-sound-id)) + (set! (-> obj sound-playing 0) #f) + (set! (-> obj sound-playing 1) #f) + (set! (-> obj sound-playing 2) #f) + (let ((s5-1 (new 'process 'curve-control obj 'path -1000000000.0))) + (set! (-> obj path) s5-1) + (set! (-> obj path-u) 0.0) + (set! (-> obj path-u-prev) 0.0) + (set! (-> obj path-speed) (/ 16384.0 (total-distance s5-1))) + (set! (-> obj path-speed-mult) 0.0) + (set! (-> obj path-speed-mult-final) 1.0) + (set! (-> obj path-direction) #f) + (cond + ((logtest? (-> s5-1 flags) (path-control-flag not-found)) + (set! (-> obj path-mode) (the-as uint 0)) + 0 + ) + (else + (set! (-> obj path-mode) (the-as uint 1)) + ) + ) + (logior! (-> s5-1 flags) (path-control-flag display draw-line draw-point draw-text)) + ) + (when (not (logtest? (-> obj path flags) (path-control-flag not-found))) + (get-point-at-percent-along-path! (-> obj path) (-> obj root-override trans) 0.0 'interp) + (set! (-> obj path-old-pos quad) (-> obj root-override trans quad)) + ) + (set! (-> obj path-speed-mult) 1.0) + (quaternion-copy! (-> obj target-quat) *unity-quaternion*) + (quaternion-copy! (-> obj init-quat) (-> obj root-override quat)) + (set! (-> obj gun-index) 0) + (set! (-> obj shot-timeout) (seconds 0.667)) + (set! (-> obj gun-recoil-jmod 0) (new 'process 'joint-mod-add-local obj 5 #t #f #f)) + (set! (-> obj gun-recoil-jmod 0 enable) #f) + (set! (-> obj gun-recoil-jmod 1) (new 'process 'joint-mod-add-local obj 11 #t #f #f)) + (set! (-> obj gun-recoil-jmod 1 enable) #f) + (set! (-> obj gun-recoil-jmod 2) (new 'process 'joint-mod-add-local obj 7 #t #f #f)) + (set! (-> obj gun-recoil-jmod 2 enable) #f) + (set! (-> obj gun-recoil-jmod 3) (new 'process 'joint-mod-add-local obj 9 #t #f #f)) + (set! (-> obj gun-recoil-jmod 3 enable) #f) + (set! (-> obj health) 16.0) + (set! (-> obj heat) 0.0) + (set! (-> obj heat-target) 0.0) + (set! (-> obj arrow-angle) 0.0) + (set! (-> obj enable-controls) #t) + (set! (-> obj available-for-pickup) #t) + (set! (-> obj rotx-min) -10922.667) + (set! (-> obj rotx-max) 5461.3335) + (set! (-> obj roty-min) 0.0) + (set! (-> obj roty-max) 0.0) + (set! (-> obj fire-time-interval) (seconds 0.15)) + 0 + (none) + ) + +;; definition for method 41 of type base-turret +;; INFO: Used lq/sq +(defmethod base-turret-method-41 base-turret ((obj base-turret) (arg0 vector)) + (local-vars (sv-592 int)) + (let* ((s3-0 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj init-quat))) + (s1-0 (-> obj root-override trans)) + (s5-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack 'collide-query)) + (s0-0 8) + (f30-0 (/ 65536.0 (+ -1.0 (the float s0-0)))) + ) + (set! (-> s3-0 y) 0.0) + (vector-xz-normalize! s3-0 -18432.0) + (set! sv-592 0) + (while (< sv-592 s0-0) + (vector+! s5-0 s1-0 s3-0) + (vector-rotate-y! s3-0 s3-0 f30-0) + (set! (-> s2-0 start-pos quad) (-> s5-0 quad)) + (set-vector! (-> s2-0 move-dist) 0.0 -24576.0 0.0 0.0) + (set! (-> s2-0 start-pos y) (+ 2048.0 (-> s2-0 start-pos y))) + (let ((v1-9 s2-0)) + (set! (-> v1-9 radius) 409.6) + (set! (-> v1-9 collide-with) (collide-spec backgnd)) + (set! (-> v1-9 ignore-process0) obj) + (set! (-> v1-9 ignore-process1) #f) + (set! (-> v1-9 ignore-pat) (-> obj root-override pat-ignore-mask)) + (set! (-> v1-9 action-mask) (collide-action solid)) + ) + (when (>= (fill-and-probe-using-line-sphere *collide-cache* s2-0) 0.0) + (set! (-> s5-0 y) (+ 4096.0 (-> s2-0 best-other-tri intersect y))) + (set! (-> arg0 quad) (-> s5-0 quad)) + (return #t) + ) + (set! sv-592 (+ sv-592 1)) + ) + ) + #f + ) + +;; definition for method 44 of type base-turret +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-44 base-turret ((obj base-turret) (arg0 vector) (arg1 vector)) + (let ((gp-0 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> gp-0 ent) (-> obj entity)) + (set! (-> gp-0 charge) 1.0) + (set! (-> gp-0 options) (projectile-options account-for-target-velocity proj-options-8000)) + (set! (-> gp-0 pos quad) (-> arg0 quad)) + (set! (-> gp-0 vel quad) (-> (vector-normalize-copy! (new 'stack-no-clear 'vector) arg1 1228800.0) quad)) + (set! (-> gp-0 notify-handle) (the-as handle #f)) + (set! (-> gp-0 owner-handle) (the-as handle #f)) + (set! (-> gp-0 ignore-handle) (process->handle obj)) + (let* ((v1-9 *game-info*) + (a0-9 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-9) + (set! (-> gp-0 attack-id) a0-9) + ) + (set! (-> gp-0 timeout) (-> obj shot-timeout)) + (spawn-projectile turret-shot gp-0 obj *default-dead-pool*) + ) + 0 + (none) + ) + +;; definition for method 42 of type base-turret +;; INFO: Used lq/sq +(defmethod base-turret-method-42 base-turret ((obj base-turret) (arg0 vector) (arg1 vector) (arg2 float)) + (let ((s5-0 (new 'stack-no-clear 'collide-query))) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (vector-normalize-copy! (-> s5-0 move-dist) arg1 819200.0) + (let ((v1-1 s5-0)) + (set! (-> v1-1 radius) 2048.0) + (set! (-> v1-1 collide-with) (collide-spec backgnd enemy obstacle hit-by-others-list)) + (set! (-> v1-1 ignore-process0) obj) + (set! (-> v1-1 ignore-process1) #f) + (set! (-> v1-1 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-1 action-mask) (collide-action solid)) + ) + (let ((f0-1 (fill-and-probe-using-line-sphere *collide-cache* s5-0))) + (cond + ((>= f0-1 0.0) + (* arg2 f0-1) + ) + (else + (empty) + arg2 + ) + ) + ) + ) + ) + +;; definition for method 45 of type base-turret +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-45 base-turret ((obj base-turret) (arg0 object) (arg1 symbol)) + (local-vars (sv-112 vector) (sv-128 vector) (sv-144 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + ) + (init-vf0-vector) + (when (< (-> obj heat) 1.0) + (let ((s3-0 (new 'static 'array int32 4 5 11 7 9)) + (s4-0 (* (-> obj gun-index) 2)) + (s2-0 (+ (* (-> obj gun-index) 2) 1)) + (s5-0 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override quat))) + ) + (set-recoil (the-as joint-mod (-> obj gun-recoil-jmod s4-0)) -819.2 arg1) + (set-recoil (the-as joint-mod (-> obj gun-recoil-jmod s2-0)) 819.2 arg1) + (let ((s4-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data (-> s3-0 s4-0)))) + (s3-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data (-> s3-0 s2-0)))) + (s0-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 12))) + (s1-0 (new 'stack-no-clear 'vector)) + (s2-1 (new 'stack-no-clear 'vector)) + ) + (set! sv-144 s0-0) + (set! sv-112 s0-0) + (set! sv-128 s5-0) + (let ((f0-2 (+ 20480.0 (base-turret-method-42 obj s0-0 s5-0 819200.0)))) + (.lvf vf2 (&-> sv-128 quad)) + (.lvf vf1 (&-> sv-112 quad)) + (let ((v1-25 f0-2)) + (.mov vf3 v1-25) + ) + ) + (.add.x.vf vf4 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf2 vf3) + (.add.mul.w.vf vf4 vf1 vf0 acc :mask #b111) + (.svf (&-> sv-144 quad) vf4) + (vector-! s1-0 s0-0 s4-1) + (vector-! s2-1 s0-0 s3-1) + (vector-normalize! s1-0 1.0) + (vector-normalize! s2-1 1.0) + (base-turret-method-44 obj s4-1 s1-0) + (base-turret-method-44 obj s3-1 s2-1) + ) + ) + (set! (-> obj gun-index) (- 1 (-> obj gun-index))) + (activate! (-> obj smush-control) 0.1 30 120 0.8 0.9 (-> *display* entity-clock)) + ) + (seek! (-> obj heat-target) 1.05 0.1) + 0 + (none) + ) + ) + +;; definition for method 39 of type base-turret +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-39 base-turret ((obj base-turret) (arg0 turret-path-event)) + (with-pp + (case (-> arg0 event-type) + (('script) + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (the-as vector #f)) + (the-as pair (-> arg0 param)) + ) + ) + (('cue-chase) + (let ((a0-4 (process-by-name (the-as string (-> arg0 param)) *active-pool*))) + (if a0-4 + (send-event a0-4 'cue-chase) + ) + ) + ) + (('pause-until) + (set! (-> obj path-mode) (the-as uint 3)) + (set! (-> obj pause-proc) (the-as (function base-turret symbol) (-> arg0 param))) + (set! (-> obj path-speed-mult-final) 0.0) + ) + (('pause-while) + (set! (-> obj path-mode) (the-as uint 4)) + (set! (-> obj pause-proc) (the-as (function base-turret symbol) (-> arg0 param))) + (set! (-> obj path-speed-mult-final) 0.0) + ) + (('set-speed-mult) + (set! (-> obj path-speed-mult-final) (* 0.1 (the float (/ (the-as int (-> arg0 param)) 8)))) + ) + (('enable-controls) + (set! (-> obj enable-controls) #t) + ) + (('disable-controls) + (set! (-> obj enable-controls) #f) + ) + (('set-roty-min) + (set! (-> obj roty-min) (* 182.04445 (the float (/ (the-as int (-> arg0 param)) 8)))) + ) + (('set-roty-max) + (set! (-> obj roty-max) (* 182.04445 (the float (/ (the-as int (-> arg0 param)) 8)))) + ) + (('set-rotyvv) + (set! (-> obj rotyvv) (* 182.04445 (the float (/ (the-as int (-> arg0 param)) 8)))) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 38 of type base-turret +;; WARN: Return type mismatch int vs none. +(defmethod base-turret-method-38 base-turret ((obj base-turret)) + (when (nonzero? (-> obj path-event)) + (let* ((s5-0 (-> obj path-event)) + (f0-0 (get-num-segments (-> obj path))) + (f30-0 (* f0-0 (-> obj path-u))) + (f28-0 (* f0-0 (-> obj path-u-prev))) + ) + (dotimes (s4-0 (-> s5-0 event-count)) + (let ((a1-0 (-> s5-0 event-tbl s4-0))) + (if (and (>= f30-0 (-> a1-0 pos)) (< f28-0 (-> a1-0 pos))) + (base-turret-method-39 obj a1-0) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 10 of type base-turret +(defmethod deactivate base-turret ((obj base-turret)) + (if (valid? (-> obj hud) (the-as type #f) (the-as symbol "") #t 0) + (send-event (handle->process (-> obj hud)) 'hide-and-die) + ) + (sound-stop (-> obj sound-id 0)) + (sound-stop (-> obj sound-id 1)) + (sound-stop (-> obj sound-id 2)) + ((method-of-type process-drawable deactivate) obj) + (none) + ) + +;; definition for method 11 of type base-turret +;; WARN: Return type mismatch object vs none. +(defmethod init-from-entity! base-turret ((obj base-turret) (arg0 entity-actor)) + "Typically the method that does the initial setup on the process, potentially using the [[entity-actor]] provided as part of that. +This commonly includes things such as: +- stack size +- collision information +- loading the skeleton group / bones +- sounds" + (turret-init! obj arg0 (the-as matrix #f)) + (go (method-of-object obj idle)) + (none) + ) + +;; failed to figure out what this is: +(defstate cam-turret (camera-slave) + :event (the-as + (function process int symbol event-message-block object :behavior camera-slave) + cam-standard-event-handler + ) + :enter (behavior () + (when (not (-> self enter-has-run)) + (set! (-> self saved-pt quad) (-> self trans quad)) + (set! (-> self blend-from-type) (the-as uint 1)) + (set! (-> self blend-to-type) (camera-blend-to-type unknown-0)) + 0 + ) + (none) + ) + :trans (behavior () + (if (not (logtest? (-> *camera* master-options) (cam-master-options-u32 HAVE_TARGET))) + (cam-slave-go cam-free-floating) + ) + (none) + ) + :code (behavior () + (until #f + (when (not (paused?)) + (let ((gp-0 (handle->process (-> *camera* focus handle)))) + (when gp-0 + (quaternion->matrix (the-as matrix (-> self tracking)) (get-quat (the-as process-focusable gp-0) 1)) + (let ((v1-9 (handle->process (-> (the-as target gp-0) turret handle)))) + (if v1-9 + (vector<-cspace! (-> self trans) (-> (the-as process-focusable v1-9) node-list data 12)) + ) + ) + ) + ) + ) + (suspend) + ) + #f + (none) + ) + ) + +;; definition for function target-turret-post +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defbehavior target-turret-post target () + (send-event (handle->process (-> self turret handle)) 'trans (-> self turret trans)) + (send-event (handle->process (-> self turret handle)) 'quat (-> self control dir-targ)) + (set-quaternion! (-> self control) (-> self control dir-targ)) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> self turret trans quad)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 x) 0.0) + (set! (-> s5-0 y) 0.0) + (set! (-> s5-0 z) -10649.6) + (set! (-> s5-0 w) 1.0) + (vector-orient-by-quat! s5-0 s5-0 (-> self control dir-targ)) + (vector+! gp-0 gp-0 s5-0) + ) + (move-to-point! (-> self control) gp-0) + ) + (update-transforms (-> self control)) + (target-no-move-post) + (cond + ((cpad-pressed? (-> self control cpad number) r1) + (send-event (handle->process (-> self turret handle)) 'fire-pressed) + ) + ((cpad-hold? (-> self control cpad number) r1) + (send-event (handle->process (-> self turret handle)) 'fire-down) + ) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate target-turret-stance (target) + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('change-mode) + (case (-> event param 0) + (('grab) + (when (not (logtest? (-> self focus-status) (focus-status dead))) + (if (-> event param 1) + (set! (-> self turret grabbed?) #t) + ) + #t + ) + ) + ) + ) + (('end-mode) + (cond + ((-> self turret grabbed?) + (set! (-> self turret grabbed?) #f) + #t + ) + (else + (when (-> self control unknown-handle02) + (set! (-> self control unknown-handle02) (the-as handle #f)) + #t + ) + ) + ) + ) + (('attack 'attack-invinc) + (let ((gp-0 + (the-as object (mem-copy! (the-as pointer (-> self attack-info-rec)) (the-as pointer (-> event param 1)) 160)) + ) + ) + ((method-of-type attack-info compute-intersect-info) + (the-as attack-info gp-0) + (-> event param 1) + self + (if (type? proc process-drawable) + proc + ) + (the-as touching-shapes-entry (-> event param 0)) + ) + (case (-> (the-as attack-info gp-0) mode) + (('turret) + (let ((a0-12 (-> self attack-info))) + (let ((v1-17 a0-12)) + (set! (-> v1-17 attacker) (the-as handle #f)) + (set! (-> v1-17 mode) 'generic) + (set! (-> v1-17 shove-back) 6144.0) + (set! (-> v1-17 shove-up) 4915.2) + (set! (-> v1-17 angle) #f) + (set! (-> v1-17 trans quad) (-> self control trans quad)) + (set! (-> v1-17 control) 0.0) + (set! (-> v1-17 invinc-time) (the-as time-frame (-> *TARGET-bank* hit-invulnerable-timeout))) + (set! (-> v1-17 damage) (-> *FACT-bank* health-default-inc)) + ) + (combine! a0-12 (the-as attack-info gp-0) self) + ) + (cond + ((= (-> self game mode) 'play) + (send-event (handle->process (-> self turret handle)) 'trans (-> self control trans)) + (go target-death 'turret) + #t + ) + (else + (go target-turret-get-off) + #f + ) + ) + ) + (('bot) + (let ((a0-22 (-> self attack-info))) + (let ((v1-33 a0-22)) + (set! (-> v1-33 attacker) (the-as handle #f)) + (set! (-> v1-33 mode) 'generic) + (set! (-> v1-33 shove-back) 6144.0) + (set! (-> v1-33 shove-up) 4915.2) + (set! (-> v1-33 angle) #f) + (set! (-> v1-33 trans quad) (-> self control trans quad)) + (set! (-> v1-33 control) 0.0) + (set! (-> v1-33 invinc-time) (the-as time-frame (-> *TARGET-bank* hit-invulnerable-timeout))) + (set! (-> v1-33 damage) (-> *FACT-bank* health-default-inc)) + ) + (combine! a0-22 (the-as attack-info gp-0) self) + ) + (go target-death 'bot) + ) + ) + ) + ) + (else + (target-generic-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior ((arg0 handle)) + (send-event (handle->process arg0) 'change-mode) + (set! (-> self turret trans quad) (-> self control trans quad)) + (set! (-> self turret turret) (the-as (pointer base-turret) #f)) + (target-exit) + (set! (-> self neck flex-blend) 0.0) + (logior! (-> self state-flags) (state-flags sf2 sf5)) + (logior! (-> self focus-status) (focus-status disable grabbed)) + (set! (-> self control mod-surface) *empty-mods*) + (none) + ) + :exit (behavior () + (target-exit) + (logclear! (-> self state-flags) (state-flags sf2 sf5)) + (logclear! (-> self focus-status) (focus-status disable grabbed)) + (set! (-> self turret grabbed?) #f) + (let ((v1-6 (-> self turret turret))) + (if v1-6 + (deactivate (-> v1-6 0)) + ) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior ((arg0 handle)) + (local-vars + (v1-19 object) + (a0-28 process) + (a1-6 event-message-block) + (t9-5 (function process-tree event-message-block object)) + ) + (let ((v1-2 (handle->process (-> self turret handle)))) + (if v1-2 + (quaternion<-rotate-y-vector + (-> self control dir-targ) + (vector-! + (new 'stack-no-clear 'vector) + (-> (the-as process-focusable v1-2) root-override trans) + (-> self control trans) + ) + ) + ) + ) + (set! (-> self control unknown-handle02) (-> self turret handle)) + (ja-channel-set! 1) + (ja :group! (-> self draw art-group data 359)) + (until v1-19 + (suspend) + (can-play-stance-amibent?) + (ja :num! (loop! 0.5)) + (set! v1-19 + (and (or (not (-> self control unknown-handle02)) (cpad-pressed? (-> self control cpad number) triangle)) + (send-event (handle->process (-> self turret handle)) 'exit-valid (-> self control unknown-vector38)) + ) + ) + ) + (until (t9-5 a0-28 a1-6) + (suspend) + (set! a1-6 (new 'stack-no-clear 'event-message-block)) + (set! (-> a1-6 from) (process->ppointer self)) + (set! (-> a1-6 num-params) 0) + (set! (-> a1-6 message) 'exit) + (set! t9-5 send-event-function) + (set! a0-28 (handle->process (-> self turret handle))) + ) + (send-event self 'end-mode) + (go target-turret-get-off) + (none) + ) + :post (behavior () + (target-turret-post) + (none) + ) + ) + +;; failed to figure out what this is: +(let ((a0-74 (copy *empty-mods* 'loading-level))) + (set! (-> a0-74 flags) (surface-flag gun-off gun-fast-exit)) + (set! *turret-get-on-mods* a0-74) + ) + +;; failed to figure out what this is: +(defstate target-turret-get-on (target) + :event target-generic-event-handler + :exit (behavior () + (logclear! (-> self state-flags) (state-flags sf6)) + (none) + ) + :code (behavior ((arg0 handle)) + (when (zero? (-> self turret)) + (set! (-> self turret) (new 'process 'turret-info)) + (set! (-> self turret process) (process->ppointer self)) + ) + (set! (-> self turret handle) arg0) + (set! (-> self turret grabbed?) #f) + (ja-channel-set! 1) + (set! (-> self control mod-surface) *turret-get-on-mods*) + (set! (-> self neck flex-blend) 0.0) + (set! (-> self control unknown-vector37 quad) (-> self control trans quad)) + (set! (-> self control unknown-vector38 quad) (-> self control trans quad)) + (set! (-> self control unknown-vector39 quad) (-> self control quat quad)) + (set! (-> self control unknown-vector40 quad) (-> self control quat quad)) + (let* ((s4-0 (handle->process arg0)) + (s5-0 (if (type? s4-0 process-drawable) + s4-0 + ) + ) + ) + (when s5-0 + (vector-matrix*! + (-> self control unknown-vector38) + (new 'static 'vector :z -10649.6 :w 1.0) + (-> (the-as process-focusable s5-0) node-list data 0 bone transform) + ) + (set! (-> self control unknown-vector40 quad) (-> (the-as process-focusable s5-0) root-override quat quad)) + ) + ) + (set! (-> self alt-cam-pos quad) (-> self control camera-pos quad)) + (ja-no-eval :group! (-> self draw art-group data 361) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 361)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((f30-0 (sin (lerp-scale 0.0 16384.0 (ja-aframe-num 0) 0.0 12.0)))) + (let ((f28-0 (lerp-scale 0.0 1.0 (ja-aframe-num 0) 0.0 12.0))) + (let* ((s5-3 (handle->process arg0)) + (a0-39 (if (type? s5-3 process-drawable) + s5-3 + ) + ) + ) + (if a0-39 + (set! (-> self alt-cam-pos quad) (-> (the-as process-focusable a0-39) root-override trans quad)) + ) + ) + (vector-lerp! + (-> self control trans) + (-> self control unknown-vector37) + (-> self control unknown-vector38) + f30-0 + ) + (set! (-> self control trans y) + (lerp (-> self control unknown-vector37 y) (-> self control unknown-vector38 y) f28-0) + ) + ) + (quaternion-slerp! + (-> self control quat-for-control) + (the-as quaternion (-> self control unknown-vector39)) + (the-as quaternion (-> self control unknown-vector40)) + f30-0 + ) + ) + (rot->dir-targ! (-> self control)) + (suspend) + (ja :num! (seek!)) + ) + (go target-turret-stance arg0) + (none) + ) + :post target-no-move-post + ) + +;; failed to figure out what this is: +(defstate target-turret-get-off (target) + :event target-generic-event-handler + :exit (behavior () + (target-exit) + (logclear! (-> self state-flags) (state-flags sf6)) + (none) + ) + :code (behavior () + (set! (-> self control mod-surface) *empty-mods*) + (rot->dir-targ! (-> self control)) + (set! (-> self neck flex-blend) 0.0) + (send-event (handle->process (-> self turret handle)) 'trans (-> self turret trans)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'quaternion)) + ) + (vector-! s5-0 (-> self turret trans) (-> self control unknown-vector38)) + (vector-normalize! s5-0 1.0) + (forward-up-nopitch->quaternion gp-0 s5-0 *y-vector*) + (set! (-> self control unknown-vector40 quad) (-> gp-0 quad)) + ) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 360) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 360)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (cond + ((< (ja-aframe-num 0) 88.0) + (send-event (handle->process (-> self turret handle)) 'quat (-> self control dir-targ)) + (set-quaternion! (-> self control) (-> self control dir-targ)) + (quaternion-copy! (the-as quaternion (-> self control unknown-vector39)) (-> self control quat-for-control)) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (set! (-> gp-1 quad) (-> self turret trans quad)) + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 x) 0.0) + (set! (-> s5-1 y) 0.0) + (set! (-> s5-1 z) -10649.6) + (set! (-> s5-1 w) 1.0) + (vector-orient-by-quat! s5-1 s5-1 (-> self control dir-targ)) + (vector+! gp-1 gp-1 s5-1) + ) + (move-to-point! (-> self control) gp-1) + ) + (set! (-> self control unknown-vector37 quad) (-> self control trans quad)) + ) + (else + (let ((f30-0 (sin (lerp-scale 0.0 16384.0 (ja-aframe-num 0) 88.0 102.0)))) + (let ((f28-0 (lerp-scale 0.0 1.0 (ja-aframe-num 0) 88.0 102.0))) + (vector-lerp! + (-> self control trans) + (-> self control unknown-vector37) + (-> self control unknown-vector38) + f30-0 + ) + (set! (-> self control trans y) + (lerp (-> self control unknown-vector37 y) (-> self control unknown-vector38 y) f28-0) + ) + ) + (quaternion-slerp! + (-> self control quat-for-control) + (the-as quaternion (-> self control unknown-vector39)) + (the-as quaternion (-> self control unknown-vector40)) + f30-0 + ) + ) + ) + ) + (rot->dir-targ! (-> self control)) + (if (< 86.0 (ja-aframe-num 0)) + (vector<-cspace! (-> self alt-cam-pos) (-> self node-list data 36)) + ) + (suspend) + (ja :num! (seek!)) + ) + (rot->dir-targ! (-> self control)) + (ja-post) + (let ((gp-4 (new 'stack-no-clear 'vector))) + (vector<-cspace! gp-4 (-> self node-list data 3)) + (set! (-> gp-4 y) (+ -9011.2 (-> gp-4 y))) + (move-to-point! (-> self control) gp-4) + ) + (send-event *camera* 'ease-in) + (ja-channel-set! 0) + (logclear! (-> self control status) (collide-status on-surface on-ground touch-surface)) + (let ((v1-96 (new-stack-vector0))) + (let ((f0-20 (vector-dot (-> self control dynam gravity-normal) (-> self control transv)))) + 0.0 + (vector-! v1-96 (-> self control transv) (vector-float*! v1-96 (-> self control dynam gravity-normal) f0-20)) + ) + (let* ((f0-21 (vector-length v1-96)) + (f1-3 f0-21) + (f2-0 -49152.0) + (a0-61 (vector+! + (-> self control transv) + (vector-float*! (-> self control transv) (-> self control dynam gravity-normal) f2-0) + (vector-float*! v1-96 v1-96 (/ f0-21 f1-3)) + ) + ) + ) + (go target-falling (the-as symbol a0-61)) + ) + ) + (none) + ) + :post (behavior () + (target-no-move-post) + (none) + ) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/atoll/juicer_REF.gc b/test/decompiler/reference/jak2/levels/atoll/juicer_REF.gc index 291b1f4573..ccd00bfadd 100644 --- a/test/decompiler/reference/jak2/levels/atoll/juicer_REF.gc +++ b/test/decompiler/reference/jak2/levels/atoll/juicer_REF.gc @@ -842,6 +842,7 @@ ) ;; definition for method 180 of type juicer +;; WARN: Return type mismatch object vs none. (defmethod juicer-method-180 juicer ((obj juicer)) (if (and (= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) (not (and (-> obj next-state) (let ((v1-6 (-> obj next-state name))) @@ -1391,7 +1392,7 @@ (set! (-> s5-0 owner-handle) (the-as handle #f)) (set! (-> s5-0 ignore-handle) (process->handle obj)) (set! (-> s5-0 attack-id) arg1) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) ) (vector-normalize! (vector-! (-> s5-0 pos) (get-trans arg0 3) s4-0) 1.0) (vector-float*! (-> s5-0 vel) (-> s5-0 pos) (* 24576.0 (-> pp clock frames-per-second))) diff --git a/test/decompiler/reference/jak2/levels/city/common/guard_REF.gc b/test/decompiler/reference/jak2/levels/city/common/guard_REF.gc index 2d52711221..849f8cd79d 100644 --- a/test/decompiler/reference/jak2/levels/city/common/guard_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/guard_REF.gc @@ -1410,7 +1410,7 @@ (set! (-> a0-13 attack-id) a1-12) (set! (-> s4-1 attack-id) a1-12) ) - (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 timeout) (seconds 4)) (set! (-> s4-1 pos quad) (-> s5-0 quad)) (set! (-> s4-1 vel quad) (-> v1-3 quad)) (vector-normalize! (-> s4-1 vel) 819200.0) @@ -3229,7 +3229,7 @@ (set! (-> s0-1 owner-handle) (the-as handle #f)) (set! (-> s0-1 ignore-handle) (process->handle obj)) (set! (-> s0-1 attack-id) (-> obj attack-id)) - (set! (-> s0-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s0-1 timeout) (seconds 4)) (set! (-> s0-1 pos quad) (-> s4-0 quad)) (vector-! (-> s0-1 vel) s5-0 s4-0) (vector-normalize! (-> s0-1 vel) 131072.0) @@ -4234,7 +4234,3 @@ 0 (none) ) - - - - diff --git a/test/decompiler/reference/jak2/levels/city/common/vehicle-guard_REF.gc b/test/decompiler/reference/jak2/levels/city/common/vehicle-guard_REF.gc index 14cf2d7b38..f45dfb2986 100644 --- a/test/decompiler/reference/jak2/levels/city/common/vehicle-guard_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/vehicle-guard_REF.gc @@ -588,7 +588,7 @@ (set! (-> v1-14 attack-id) a0-16) (set! (-> s4-0 proj-params attack-id) a0-16) ) - (set! (-> s4-0 proj-params timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-0 proj-params timeout) (seconds 4)) (let* ((v1-16 (-> s4-0 mat-1)) (a3-0 (-> arg0 node-list data (-> obj info joint-index) bone transform)) (a0-20 (-> a3-0 quad 0)) @@ -954,7 +954,7 @@ (set! (-> v1-15 attack-id) a0-14) (set! (-> a1-1 attack-id) a0-14) ) - (set! (-> a1-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> a1-1 timeout) (seconds 4)) (spawn-projectile vehicle-grenade a1-1 obj *default-dead-pool*) ) (let ((a1-2 (new 'stack-no-clear 'traffic-danger-info))) @@ -989,7 +989,7 @@ (set! (-> v1-38 attack-id) a0-36) (set! (-> s5-1 proj-params attack-id) a0-36) ) - (set! (-> s5-1 proj-params timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-1 proj-params timeout) (seconds 4)) (vector+float*! (-> s5-1 proj-params pos) (the-as vector (-> s5-1 mat-1)) (-> s5-1 mat-1 vector 1) 16384.0) (vector-float*! (-> s5-1 proj-params vel) (-> s5-1 mat-1 vector 1) 819200.0) (spawn-projectile guard-shot (-> s5-1 proj-params) obj *default-dead-pool*) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/bombots/bombbot_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/bombots/bombbot_REF.gc index 6a1eafff3e..ece322a51a 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/bombots/bombbot_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/bombots/bombbot_REF.gc @@ -1950,7 +1950,7 @@ (set! (-> v1-69 attack-id) a0-67) (set! (-> s2-1 attack-id) a0-67) ) - (set! (-> s2-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s2-1 timeout) (seconds 4)) (set! (-> s2-1 pos quad) (-> s3-0 start-pos quad)) (vector+! (-> s2-1 vel) (-> s3-0 start-pos) s5-0) (vector-normalize-copy! (-> s2-1 vel) (-> s3-0 move-dist) 40960000.0) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/guards/crimson-guard-level_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/guards/crimson-guard-level_REF.gc index 1f4ecb6f38..4ca6b94beb 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/guards/crimson-guard-level_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/guards/crimson-guard-level_REF.gc @@ -1306,7 +1306,7 @@ (set! (-> a0-13 attack-id) a1-12) (set! (-> s4-1 attack-id) a1-12) ) - (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 timeout) (seconds 4)) (set! (-> s4-1 pos quad) (-> s5-0 quad)) (set! (-> s4-1 vel quad) (-> v1-3 quad)) (vector-normalize! (-> s4-1 vel) 819200.0) @@ -2939,7 +2939,7 @@ (set! (-> v1-24 attack-id) a0-23) (set! (-> a1-9 attack-id) a0-23) ) - (set! (-> a1-9 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> a1-9 timeout) (seconds 4)) (spawn-projectile vehicle-grenade a1-9 obj *default-dead-pool*) ) ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/crimson-guard-hover_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/crimson-guard-hover_REF.gc new file mode 100644 index 0000000000..ff246d32b8 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/crimson-guard-hover_REF.gc @@ -0,0 +1,2050 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defpartgroup group-crimson-guard-hover-explosion + :id 158 + :duration (seconds 2) + :linger-duration (seconds 1) + :flags (use-local-clock unk-5 unk-6 unk-7) + :bounds (static-bspherem 0 0 0 15) + :rotate ((degrees 0) (degrees 4) (degrees 0)) + :scale (0.0 16384.0 0.0) + :parts ((sp-item 744 :flags (bit6) :period 900 :length 5) + (sp-item 745 :flags (bit6) :period 900 :length 5) + (sp-item 746 :period 900 :length 15) + (sp-item 747 :fade-after (meters 60) :period 900 :length 10 :offset 10) + (sp-item 748 :fade-after (meters 60) :falloff-to (meters 60) :period 900 :length 50 :offset 20) + (sp-item 749 :fade-after (meters 200) :falloff-to (meters 200) :period 900 :length 25 :offset 20) + (sp-item 750 :fade-after (meters 150) :falloff-to (meters 150) :period 900 :length 20 :offset 30) + ) + ) + +;; failed to figure out what this is: +(defpartgroup group-crimson-guard-hover-jet-explosion + :id 159 + :duration (seconds 2) + :linger-duration (seconds 1) + :flags (use-local-clock unk-5 unk-6 unk-7) + :bounds (static-bspherem 0 0 0 15) + :rotate ((degrees 0) (degrees 4) (degrees 0)) + :scale (0.0 16384.0 0.0) + :parts ((sp-item 744 :flags (bit6) :period 900 :length 5) + (sp-item 745 :flags (bit6) :period 900 :length 5) + (sp-item 746 :period 900 :length 15) + (sp-item 747 :fade-after (meters 60) :period 900 :length 10 :offset 10) + (sp-item 748 :fade-after (meters 60) :falloff-to (meters 60) :period 900 :length 50 :offset 20) + (sp-item 749 :fade-after (meters 200) :falloff-to (meters 200) :period 900 :length 25 :offset 20) + (sp-item 750 :fade-after (meters 150) :falloff-to (meters 150) :period 900 :length 20 :offset 30) + ) + ) + +;; failed to figure out what this is: +(defpart 745 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 2)) + (sp-flt spt-rot-x 2048.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 24.0) + (sp-flt spt-scalevel-x (meters 0.10666667)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -4.266667) + (sp-flt spt-fade-b -4.266667) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 150) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 glow) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 751) + ) + ) + +;; failed to figure out what this is: +(defpart 751 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.85333335) + (sp-flt spt-fade-g -1.7066667) + (sp-flt spt-fade-b -1.7066667) + (sp-flt spt-fade-a -0.64) + ) + ) + +;; failed to figure out what this is: +(defpart 750 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x34 :page #xc)) + (sp-rnd-flt spt-num 2.0 0.2 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-rot-z) + :flags (sp-flag spflag7) + :random-rangef 655360.0 + :random-multf 1.0 + ) + (sp-rnd-flt spt-scale-y (meters 0.8) (meters 0.2) 1.0) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 752) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-conerot-x) + :flags (sp-flag from-pointer) + :func '*sp-temp* + ) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 749 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x33 :page #xc)) + (sp-func spt-birth-func 'birth-func-texture-group) + (sp-flt spt-num 3.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (sp-flt spt-rot-z (degrees 0.0)) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.02) (meters 0.01) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-userdata) + :flags (sp-flag plain-v2) + :object (new 'static 'boxed-array :type int32 40 1 0 #xc00000 #xc03300) + ) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 752) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 752 + :init-specs ((sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.0) + (sp-flt spt-fade-b 0.0) + (sp-int-plain-rnd spt-next-time 5 19 1) + (sp-launcher-by-id spt-next-launcher 753) + ) + ) + +;; failed to figure out what this is: +(defpart 753 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.016666668) (meters 0.016666668) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.44) + (sp-flt spt-fade-g -2.36) + (sp-flt spt-fade-b -2.64) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 754) + ) + ) + +;; failed to figure out what this is: +(defpart 754 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.008333334) (meters 0.008333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -1.2944444) + (sp-flt spt-fade-g -0.7111111) + (sp-flt spt-fade-b -0.094444446) + (sp-rnd-flt spt-fade-a -0.06545454 -0.06545454 1.0) + (sp-int-plain-rnd spt-next-time 150 29 1) + (sp-launcher-by-id spt-next-launcher 755) + ) + ) + +;; failed to figure out what this is: +(defpart 755 + :init-specs ((sp-flt spt-fade-r 0.0) (sp-flt spt-fade-g 0.0) (sp-flt spt-fade-b 0.0) (sp-flt spt-fade-a -0.1125)) + ) + +;; failed to figure out what this is: +(defpart 744 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 5)) + (sp-flt spt-rot-x 2048.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 96.0) + (sp-flt spt-scalevel-x (meters 0.5)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -1.28) + (sp-flt spt-fade-b -5.1) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 65) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-int spt-next-time 30) + (sp-launcher-by-id spt-next-launcher 756) + ) + ) + +;; failed to figure out what this is: +(defpart 756 + :init-specs ((sp-flt spt-scalevel-x (meters -0.2857143)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -3.6571429) + (sp-flt spt-fade-b 0.0) + (sp-flt spt-fade-a -2.7428572) + ) + ) + +;; failed to figure out what this is: +(defpart 748 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x32 :page #xc)) + (sp-rnd-flt spt-num 8.0 2.0 1.0) + (sp-flt spt-x (meters 0.25)) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.25) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 16.0 48.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.083333336) (meters 0.083333336) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.006666667) (meters 0.0016666667) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.18) + (sp-flt spt-fade-b -2.12) + (sp-rnd-flt spt-accel-y -0.68266666 -1.3653333 1.0) + (sp-flt spt-friction 0.87) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 757) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 757 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0016666667)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.02) + (sp-flt spt-fade-b 0.23555556) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 758) + ) + ) + +;; failed to figure out what this is: +(defpart 758 + :init-specs ((sp-flt spt-fade-r -0.5543478) (sp-flt spt-fade-g -0.5543478) (sp-flt spt-fade-a -0.13913043)) + ) + +;; failed to figure out what this is: +(defpart 746 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 8.0 1.0 1.0) + (sp-rnd-flt spt-x (meters 0) (meters 0.6) 1.0) + (sp-rnd-flt spt-scale-x (meters 2.5) (meters 2) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 70.0 20.0 1.0) + (sp-rnd-flt spt-g 70.0 20.0 1.0) + (sp-rnd-flt spt-b 70.0 20.0 1.0) + (sp-rnd-flt spt-a 0.0 40.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0) (meters 0.1) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.033333335) (meters 0.02) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 3.3) + (sp-flt spt-fade-g 3.12) + (sp-flt spt-fade-b 1.18) + (sp-flt spt-fade-a 1.76) + (sp-flt spt-friction 0.88) + (sp-int spt-timer 710) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 759) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 759 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.53333336) + (sp-flt spt-fade-g -1.9666667) + (sp-flt spt-fade-b -2.2) + (sp-flt spt-fade-a -0.41666666) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 760) + ) + ) + +;; failed to figure out what this is: +(defpart 760 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.38833332) + (sp-flt spt-fade-g -0.21333334) + (sp-flt spt-fade-b -0.028333334) + (sp-flt spt-fade-a -0.38833332) + ) + ) + +;; failed to figure out what this is: +(defpart 747 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x31 :page #xc)) + (sp-rnd-flt spt-num 4.0 2.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.2) (meters 0.5) 1.0) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.2) (meters 0.1) 1.0) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-flt spt-g 96.0) + (sp-flt spt-b 64.0) + (sp-rnd-flt spt-a 64.0 64.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.13333334) (meters 0.02) 1.0) + (sp-flt spt-fade-g 1.6) + (sp-flt spt-fade-b 3.2) + (sp-flt spt-fade-a -1.6) + (sp-int spt-timer 90) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + ) + ) + +;; failed to figure out what this is: +(defpart 761 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-flt spt-num 16.0) + (sp-rnd-flt spt-y (meters 0.5) (meters 1) 1.0) + (sp-rnd-flt spt-scale-x (meters 1.5) (meters 1.5) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 128.0 32.0 1.0) + (sp-rnd-flt spt-g 128.0 32.0 1.0) + (sp-rnd-flt spt-b 128.0 32.0 1.0) + (sp-rnd-flt spt-a 32.0 16.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.016666668) (meters 0.033333335) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -1.2) (degrees 1.2) 1.0) + (sp-flt spt-accel-y 2.7306666) + (sp-int spt-timer 120) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14 sp-cpuinfo-flag-21) + (sp-int-plain-rnd spt-next-time 30 59 1) + (sp-launcher-by-id spt-next-launcher 762) + (sp-rnd-flt spt-conerot-x (degrees 70.0) (degrees 20.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 762 + :init-specs ((sp-flt spt-fade-a -1.0666667)) + ) + +;; failed to figure out what this is: +(defpart 763 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x92 :page #xc)) + (sp-flt spt-num 4.0) + (sp-flt spt-y (meters 0.75)) + (sp-flt spt-scale-x (meters 6)) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.3) (meters 1) 1.0) + (sp-flt spt-r 192.0) + (sp-flt spt-g 192.0) + (sp-rnd-flt spt-b 64.0 128.0 1.0) + (sp-flt spt-a 0.0) + (sp-flt spt-scalevel-x (meters 0.009765625)) + (sp-rnd-flt spt-rotvel-z (degrees -0.15) (degrees 0.3) 1.0) + (sp-flt spt-scalevel-y (meters 0.009765625)) + (sp-flt spt-fade-a 2.1333334) + (sp-int spt-timer 30) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 sp-cpuinfo-flag-21) + (sp-int spt-next-time 15) + (sp-launcher-by-id spt-next-launcher 764) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +;; failed to figure out what this is: +(defpart 764 + :init-specs ((sp-flt spt-fade-a -2.1333334)) + ) + +;; failed to figure out what this is: +(defpart 765 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x29 :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 1)) + (sp-flt spt-scale-x (meters 8)) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 196.0) + (sp-flt spt-g 196.0) + (sp-flt spt-b 196.0) + (sp-flt spt-a 28.0) + (sp-int spt-timer 10) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 sp-cpuinfo-flag-21) + ) + ) + +;; failed to figure out what this is: +(defpart 766 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xb :page #xc)) + (sp-flt spt-num 4.5) + (sp-rnd-flt spt-x (meters -0.5) (meters 1) 1.0) + (sp-rnd-flt spt-y (meters 0.25) (meters 1.5) 1.0) + (sp-rnd-flt spt-z (meters -0.5) (meters 1) 1.0) + (sp-rnd-int-flt spt-scale-x (meters 0.3) 1 4096.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-scale-y (meters 0.3)) + (sp-flt spt-r 100.0) + (sp-flt spt-g 100.0) + (sp-flt spt-b 100.0) + (sp-flt spt-a 128.0) + (sp-rnd-flt spt-vel-y (meters 0.06666667) (meters 0.06666667) 1.0) + (sp-flt spt-rotvel-x (degrees 1.2)) + (sp-flt spt-rotvel-y (degrees 2.4)) + (sp-rnd-int-flt spt-rotvel-z (degrees 0.0) 3 436.90668) + (sp-flt spt-accel-y -13.653334) + (sp-flt spt-friction 0.97) + (sp-int spt-timer 150) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14 sp-cpuinfo-flag-21) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 767) + (sp-rnd-flt spt-conerot-x (degrees 40.0) (degrees 30.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpartgroup group-crimson-guard-hover-explode + :id 160 + :duration (seconds 0.017) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 12) + :parts ((sp-item 761) (sp-item 763) (sp-item 765) (sp-item 766) (sp-item 766) (sp-item 766)) + ) + +;; definition of type crimson-guard-hover-shot +(deftype crimson-guard-hover-shot (guard-shot) + () + :heap-base #x170 + :method-count-assert 40 + :size-assert #x1f0 + :flag-assert #x28017001f0 + ) + +;; definition for method 3 of type crimson-guard-hover-shot +(defmethod inspect crimson-guard-hover-shot ((obj crimson-guard-hover-shot)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type guard-shot inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition for method 28 of type crimson-guard-hover-shot +;; WARN: Return type mismatch int vs none. +(defmethod play-impact-sound crimson-guard-hover-shot ((obj crimson-guard-hover-shot) (arg0 projectile-options)) + (cond + ((zero? arg0) + ) + (else + ((method-of-type guard-shot play-impact-sound) obj arg0) + ) + ) + 0 + (none) + ) + +;; definition of type crimson-guard-hover +(deftype crimson-guard-hover (hover-enemy) + ((gun-jmod joint-mod :offset-assert 784) + (hips-jmod joint-mod :offset-assert 788) + (entity-group actor-group :offset-assert 792) + (los los-control :inline :offset-assert 800) + (smoke-part sparticle-launch-control :offset-assert 948) + (engine-part sparticle-launch-control :offset-assert 952) + (last-fire-time time-frame :offset-assert 960) + (gun-x-angle float :offset-assert 968) + (gun-x-angle-final float :offset-assert 972) + (path-u float :offset-assert 976) + (path-du float :offset-assert 980) + (path-du-final float :offset-assert 984) + (path-dest float :offset-assert 988) + (sound-id sound-id :offset-assert 992) + (knocked-recover-anim int32 :offset-assert 996) + (attack-wait-min float :offset-assert 1000) + (attack-wait-max float :offset-assert 1004) + (attack-miss-dist-min float :offset-assert 1008) + (attack-miss-dist-max float :offset-assert 1012) + (attack-miss-dist-curr float :offset-assert 1016) + (shots-fired int32 :offset-assert 1020) + ) + :heap-base #x380 + :method-count-assert 163 + :size-assert #x400 + :flag-assert #xa303800400 + (:methods + (ambush-fly () _type_ :state 156) + (ambush-attack () _type_ :state 157) + (kick-attack () _type_ :state 158) + (attack () _type_ :state 159) + (die-now () _type_ :state 160) + (shoot (_type_ vector projectile-init-by-other-params int float float) none 161) + (crimson-guard-hover-method-162 (_type_ process-focusable) symbol 162) + ) + ) + +;; definition for method 3 of type crimson-guard-hover +(defmethod inspect crimson-guard-hover ((obj crimson-guard-hover)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type hover-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tgun-jmod: ~A~%" (-> obj gun-jmod)) + (format #t "~2Thips-jmod: ~A~%" (-> obj hips-jmod)) + (format #t "~2Tentity-group: ~A~%" (-> obj entity-group)) + (format #t "~2Tlos: #~%" (-> obj los)) + (format #t "~2Tsmoke-part: ~A~%" (-> obj smoke-part)) + (format #t "~2Tengine-part: ~A~%" (-> obj engine-part)) + (format #t "~2Tlast-fire-time: ~D~%" (-> obj last-fire-time)) + (format #t "~2Tgun-x-angle: ~f~%" (-> obj gun-x-angle)) + (format #t "~2Tgun-x-angle-final: ~f~%" (-> obj gun-x-angle-final)) + (format #t "~2Tpath-u: ~f~%" (-> obj path-u)) + (format #t "~2Tpath-du: ~f~%" (-> obj path-du)) + (format #t "~2Tpath-du-final: ~f~%" (-> obj path-du-final)) + (format #t "~2Tpath-dest: ~f~%" (-> obj path-dest)) + (format #t "~2Tsound-id: ~D~%" (-> obj sound-id)) + (format #t "~2Tknocked-recover-anim: ~D~%" (-> obj knocked-recover-anim)) + (format #t "~2Tattack-wait-min: ~f~%" (-> obj attack-wait-min)) + (format #t "~2Tattack-wait-max: ~f~%" (-> obj attack-wait-max)) + (format #t "~2Tattack-miss-dist-min: ~f~%" (-> obj attack-miss-dist-min)) + (format #t "~2Tattack-miss-dist-max: ~f~%" (-> obj attack-miss-dist-max)) + (format #t "~2Tattack-miss-dist-curr: ~f~%" (-> obj attack-miss-dist-curr)) + (format #t "~2Tshots-fired: ~D~%" (-> obj shots-fired)) + (label cfg-4) + obj + ) + +;; definition for symbol *crimson-guard-hover-enemy-info*, type enemy-info +(define *crimson-guard-hover-enemy-info* + (new 'static 'enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #f + :hover-if-no-ground #f + :idle-anim-script #f + :idle-anim 4 + :notice-anim 4 + :hostile-anim 4 + :hit-anim 12 + :knocked-anim 10 + :knocked-land-anim 19 + :die-anim -1 + :die-falling-anim -1 + :victory-anim 4 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 26 + :look-at-joint 26 + :bullseye-joint 4 + :sound-hit (static-sound-name "crimson-guard-h") + :sound-die (static-sound-name "crimson-guard-h") + :notice-distance (meters 70) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 55) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 2730.6667 + :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 32768.0 + :knocked-hard-vxz-hi 77004.8 + :knocked-hard-vy-lo 60620.8 + :knocked-hard-vy-hi 95027.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 10) + :shadow-min-y (meters -20) + :shadow-locus-dist (meters 150) + :gem-joint -1 + :gem-offset (new 'static 'sphere :r 163840.0) + ) + ) + +;; failed to figure out what this is: +(set! (-> *crimson-guard-hover-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; failed to figure out what this is: +(defskelgroup skel-crimson-guard-hover-explode crimson-guard-hover crimson-guard-hover-explode-lod0-jg crimson-guard-hover-explode-idle-ja + ((crimson-guard-hover-explode-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :origin-joint-index 3 + ) + +;; definition for symbol *crimson-guard-hover-exploder-params*, type joint-exploder-static-params +(define *crimson-guard-hover-exploder-params* + (new 'static 'joint-exploder-static-params + :joints (new 'static 'boxed-array :type joint-exploder-static-joint-params + (new 'static 'joint-exploder-static-joint-params :joint-index 3 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 4 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 5 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 6 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 7 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 8 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 9 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 10 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 11 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 12 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 13 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 14 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 15 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 16 :parent-joint-index -1) + ) + :collide-spec #x1 + ) + ) + +;; definition for method 135 of type crimson-guard-hover +;; WARN: Return type mismatch int vs sound-id. +(defmethod enemy-method-135 crimson-guard-hover ((obj crimson-guard-hover) (arg0 int)) + (if (and (zero? arg0) (logtest? #x4000000 (-> obj incoming penetrate-using))) + (sound-play "hover-take-hit") + ((the-as (function enemy int sound-id) (find-parent-method crimson-guard-hover 135)) obj arg0) + ) + (the-as sound-id 0) + ) + +;; failed to figure out what this is: +(defstate ambush (crimson-guard-hover) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy ambush) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self last-fire-time) + (+ (-> self clock frame-counter) (the int (* 300.0 (get-rand-float-range self 2.0 3.0)))) + ) + (go-virtual ambush-fly) + (none) + ) + :exit (behavior () + '() + (none) + ) + ) + +;; failed to figure out what this is: +(defstate ambush-fly (crimson-guard-hover) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior crimson-guard-hover) + enemy-event-handler + ) + :trans (behavior () + (when (hover-nav-control-method-23 (-> self hover)) + (hover-enemy-method-153 self) + (if (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (hover-enemy-method-141 self 1.0) + ) + ((-> (method-of-type hover-enemy ambush) exit)) + (go-virtual hostile) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (when gp-0 + (if (< (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable gp-0) 0)) + 450560.0 + ) + (speech-control-method-15 *speech-control* self) + ) + (if (crimson-guard-hover-method-162 self (the-as process-focusable gp-0)) + (go-virtual ambush-attack) + ) + ) + ) + (none) + ) + :code (the-as (function none :behavior crimson-guard-hover) hover-enemy-fly-code) + :post (-> (method-of-type hover-enemy ambush) post) + ) + +;; failed to figure out what this is: +(defstate ambush-attack (crimson-guard-hover) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (when (< (-> self shots-fired) 2) + (let ((s5-0 (new 'stack-no-clear 'projectile-init-by-other-params)) + (gp-0 (-> self focus-pos)) + ) + (set! (-> s5-0 ent) (-> self entity)) + (set! (-> s5-0 charge) 1.0) + (set! (-> s5-0 options) (projectile-options)) + (set! (-> s5-0 notify-handle) (the-as handle #f)) + (set! (-> s5-0 owner-handle) (the-as handle #f)) + (set! (-> s5-0 ignore-handle) (process->handle self)) + (let* ((v1-7 *game-info*) + (a0-6 (+ (-> v1-7 attack-id) 1)) + ) + (set! (-> v1-7 attack-id) a0-6) + (set! (-> s5-0 attack-id) a0-6) + ) + (set! (-> s5-0 timeout) (seconds 4)) + (shoot self gp-0 s5-0 9 0.000000000000000000000000000000000000000000017 1.0) + (shoot self gp-0 s5-0 11 0.000000000000000000000000000000000000000000017 -1.0) + ) + (sound-play "hover-fire") + (let ((v0-0 (the-as object (+ (-> self shots-fired) 1)))) + (set! (-> self shots-fired) (the-as int v0-0)) + v0-0 + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self attack-miss-dist-curr) (-> self attack-miss-dist-min)) + (let ((f0-1 (vector-vector-distance-squared (-> self root-override2 trans) (-> self focus-pos))) + (f1-0 122880.0) + ) + (if (< f0-1 (* f1-0 f1-0)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-3)) + ) + ) + (set! (-> self shots-fired) 0) + 0 + (none) + ) + :exit (behavior () + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self restart-fly-anims) #t) + (none) + ) + :trans (behavior () + ((-> (method-of-type crimson-guard-hover ambush) trans)) + (if (or (skip-check-los? (-> self los) 60) (not (enemy-method-95 self (-> self focus-pos) 9102.223))) + (go-virtual ambush-fly) + ) + (none) + ) + :code (behavior () + (sound-play "hover-warn") + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self hover-info shoot-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self hover-info shoot-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual ambush-fly) + (none) + ) + :post (behavior () + (let* ((a1-0 (-> self node-list data (-> self hover-info gun-base))) + (a0-2 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-4 (new 'stack-no-clear 'vector))) + (set! (-> v1-4 quad) (-> self focus-pos quad)) + (+! (-> v1-4 y) (-> self attack-miss-dist-curr)) + (vector-! gp-0 v1-4 a0-2) + ) + (vector-normalize! gp-0 1.0) + (set! (-> self gun-x-angle-final) (fmax -5461.3335 (fmin 8192.0 (- (vector-x-angle gp-0))))) + ) + (quaternion-vector-angle! (the-as quaternion (-> self gun-jmod target)) *x-vector* (-> self gun-x-angle)) + (seek! + (-> self attack-miss-dist-curr) + (-> self attack-miss-dist-max) + (* 0.5 (-> self clock seconds-per-frame) (- (-> self attack-miss-dist-max) (-> self attack-miss-dist-min))) + ) + ((the-as (function none) (-> (method-of-type crimson-guard-hover ambush) post))) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate notice (crimson-guard-hover) + :virtual #t + :post (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy notice) post))) + (if t9-0 + ((the-as (function none) t9-0)) + ) + ) + (talker-spawn-func (-> *talker-speech* 10) *entity-pool* (target-pos 0) (the-as region #f)) + (set! (-> self last-fire-time) (+ (-> self clock frame-counter) (seconds -1.5))) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (crimson-guard-hover) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (when gp-0 + (if (< (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable gp-0) 0)) + 450560.0 + ) + (speech-control-method-15 *speech-control* self) + ) + (if (crimson-guard-hover-method-162 self (the-as process-focusable gp-0)) + (go-virtual attack) + ) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate kick-attack (crimson-guard-hover) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior crimson-guard-hover) + enemy-event-handler + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :trans (behavior () + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 4)) + (go-hostile self) + ) + (none) + ) + :code (the-as (function none :behavior crimson-guard-hover) hover-enemy-fly-code) + :post (behavior () + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) (process->ppointer self)) + (set! (-> a1-0 num-params) 0) + (set! (-> a1-0 message) 'get-formation) + (let ((t9-0 send-event-function) + (v1-2 (-> self formation-entity)) + ) + (t9-0 + (if v1-2 + (-> v1-2 extra process) + ) + a1-0 + ) + ) + ) + (let ((gp-0 (-> self dest-pos))) + (let* ((s5-0 (handle->process (-> self focus handle))) + (a0-6 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-6) 0) quad)) + ) + (set! (-> gp-0 y) (+ -20480.0 (-> gp-0 y))) + (hover-nav-control-method-11 (-> self hover) gp-0) + ) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (crimson-guard-hover) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (when (< (-> self shots-fired) 2) + (let ((s5-0 (new 'stack-no-clear 'projectile-init-by-other-params)) + (gp-0 (-> self focus-pos)) + ) + (set! (-> s5-0 ent) (-> self entity)) + (set! (-> s5-0 charge) 1.0) + (set! (-> s5-0 options) (projectile-options)) + (set! (-> s5-0 notify-handle) (the-as handle #f)) + (set! (-> s5-0 owner-handle) (the-as handle #f)) + (set! (-> s5-0 ignore-handle) (process->handle self)) + (let* ((v1-7 *game-info*) + (a0-6 (+ (-> v1-7 attack-id) 1)) + ) + (set! (-> v1-7 attack-id) a0-6) + (set! (-> s5-0 attack-id) a0-6) + ) + (set! (-> s5-0 timeout) (seconds 4)) + (shoot self gp-0 s5-0 9 0.000000000000000000000000000000000000000000017 1.0) + (shoot self gp-0 s5-0 11 0.000000000000000000000000000000000000000000017 -1.0) + ) + (sound-play "hover-fire") + (let ((v0-0 (the-as object (+ (-> self shots-fired) 1)))) + (set! (-> self shots-fired) (the-as int v0-0)) + v0-0 + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self attack-miss-dist-curr) (-> self attack-miss-dist-min)) + (set! (-> self shots-fired) 0) + 0 + (none) + ) + :exit (behavior () + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self restart-fly-anims) #t) + (none) + ) + :trans (behavior () + (if (or (skip-check-los? (-> self los) 60) (not (enemy-method-95 self (-> self focus-pos) 9102.223))) + (go-hostile self) + ) + (none) + ) + :code (behavior () + (sound-play "hover-warn") + (let ((f0-0 (vector-vector-distance-squared (-> self root-override2 trans) (-> self focus-pos))) + (f1-0 122880.0) + ) + (if (< f0-0 (* f1-0 f1-0)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-3)) + ) + ) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self hover-info shoot-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self hover-info shoot-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (let* ((a1-0 (-> self node-list data (-> self hover-info gun-base))) + (a0-2 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-4 (new 'stack-no-clear 'vector))) + (set! (-> v1-4 quad) (-> self focus-pos quad)) + (+! (-> v1-4 y) (-> self attack-miss-dist-curr)) + (vector-! gp-0 v1-4 a0-2) + ) + (vector-normalize! gp-0 1.0) + (set! (-> self gun-x-angle-final) (fmax -5461.3335 (fmin 8192.0 (- (vector-x-angle gp-0))))) + ) + (quaternion-vector-angle! (the-as quaternion (-> self gun-jmod target)) *x-vector* (-> self gun-x-angle)) + (seek! + (-> self attack-miss-dist-curr) + (-> self attack-miss-dist-max) + (* 0.5 (-> self clock seconds-per-frame) (- (-> self attack-miss-dist-max) (-> self attack-miss-dist-min))) + ) + (hover-enemy-hostile-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate knocked (crimson-guard-hover) + :virtual #t + :enter (behavior () + (let ((t9-1 (-> (the-as (state hover-enemy) (find-parent-method crimson-guard-hover 30)) enter))) + (if t9-1 + (t9-1) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate knocked-recover (crimson-guard-hover) + :virtual #t + :code (behavior () + (local-vars (v1-35 enemy-flag) (v1-43 enemy-flag)) + (ja-channel-push! 1 (seconds 0.5)) + (ja-no-eval :group! (-> self draw art-group data (-> self knocked-recover-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self knocked-recover-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self restart-fly-anims) #t) + (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-34 (-> self enemy-flags))) + (if (logtest? v1-34 (enemy-flag checking-water)) + (set! v1-35 (logior v1-34 (enemy-flag enable-on-active))) + (set! v1-35 (logclear v1-34 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-35) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-move-dest)) + (set! (-> self mask) (logior (process-mask collectable) (-> self mask))) + (logclear! (-> self mask) (process-mask collectable)) + ) + (let ((v1-42 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-42) + (set! v1-43 (logior (enemy-flag check-water-backup) v1-42)) + (set! v1-43 (logclear v1-42 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-43) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (hover-nav-control-method-21 (-> self hover)) + (go-hostile self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate die-now (crimson-guard-hover) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior crimson-guard-hover) + enemy-event-handler + ) + :code (behavior () + (dispose! self) + (let ((v1-3 (-> self root-override2 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) + (do-effect (-> self skel effect) 'death-default 0.0 -1) + (let ((gp-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-0) (seconds 1)) + (suspend) + ) + ) + (send-event self 'death-end) + (cleanup-for-death self) + (none) + ) + :post (the-as (function none :behavior crimson-guard-hover) transform-post) + ) + +;; failed to figure out what this is: +(defstate flying-death (crimson-guard-hover) + :virtual #t + :enter (behavior () + (let ((t9-1 (-> (the-as (state hover-enemy) (find-parent-method crimson-guard-hover 138)) enter))) + (if t9-1 + (t9-1) + ) + ) + (let ((gp-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-0 + (let ((t9-3 (method-of-type part-tracker activate))) + (t9-3 (the-as part-tracker gp-0) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-4 run-function-in-process) + (a0-3 gp-0) + (a1-3 part-tracker-init) + (a2-4 (-> *part-group-id-table* 159)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-4) + a0-3 + a1-3 + a2-4 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> gp-0 ppointer) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (cond + ((< (-> self flying-death-spin-dest) 0.0) + (ja-no-eval :group! crimson-guard-hover-death-left-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim crimson-guard-hover-death-left-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (ja-no-eval :group! crimson-guard-hover-death-right-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim crimson-guard-hover-death-right-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (sleep-code) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate flying-death-explode (crimson-guard-hover) + :virtual #t + :enter (behavior () + (let ((t9-1 (-> (the-as (state hover-enemy) (find-parent-method crimson-guard-hover 139)) enter))) + (if t9-1 + (t9-1) + ) + ) + (sound-play "hover-explode") + (let ((gp-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-1 + (let ((t9-5 (method-of-type part-tracker activate))) + (t9-5 (the-as part-tracker gp-1) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-6 run-function-in-process) + (a0-5 gp-1) + (a1-4 part-tracker-init) + (a2-5 (-> *part-group-id-table* 158)) + (a3-2 0) + (t0-1 #f) + (t1-1 #f) + (t2-1 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-6) + a0-5 + a1-4 + a2-5 + a3-2 + t0-1 + t1-1 + t2-1 + t3-0 + ) + ) + (-> gp-1 ppointer) + ) + ) + (let ((gp-2 (new 'stack 'joint-exploder-tuning (the-as uint 0)))) + (process-spawn + joint-exploder + (art-group-get-by-name *level* "skel-crimson-guard-hover-explode" (the-as (pointer uint32) #f)) + 25 + gp-2 + *crimson-guard-hover-exploder-params* + :to self + ) + ) + (sound-stop (-> self sound-id)) + (none) + ) + ) + +;; definition for method 74 of type crimson-guard-hover +(defmethod general-event-handler crimson-guard-hover ((obj crimson-guard-hover) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (local-vars (v1-15 enemy-flag)) + (case arg2 + (('attack-invinc) + (case (-> (the-as attack-info (-> arg3 param 1)) mode) + (('endlessfall) + #f + ) + ) + ) + (('hit 'hit-flinch 'hit-knocked) + (speech-control-method-13 *speech-control* (the-as handle obj)) + (when (and (-> obj next-state) (let ((v1-8 (-> obj next-state name))) + (or (= v1-8 'ambush-fly) (= v1-8 'ambush-attack)) + ) + ) + (hover-nav-control-method-20 (-> obj hover)) + (hover-enemy-method-140 obj #t) + (let ((v1-14 (-> obj enemy-flags))) + (if (logtest? v1-14 (enemy-flag checking-water)) + (set! v1-15 (logior v1-14 (enemy-flag enable-on-active))) + (set! v1-15 (logclear v1-14 (enemy-flag enable-on-active))) + ) + ) + (set! (-> obj enemy-flags) v1-15) + (hover-enemy-method-153 obj) + ) + (when (> (-> obj hit-points) 0) + (let* ((s1-0 (handle->process (-> obj incoming attacker-handle))) + (v1-23 (if (type? s1-0 process-focusable) + s1-0 + ) + ) + ) + (if (and *target* + v1-23 + (let ((f0-0 (vector-vector-distance-squared (-> obj root-override2 trans) (-> obj focus-pos))) + (f1-0 122880.0) + ) + (< f0-0 (* f1-0 f1-0)) + ) + ) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-0 speech-type-1 speech-type-3)) + ) + ) + ) + ((the-as + (function enemy process int symbol event-message-block object) + (find-parent-method crimson-guard-hover 74) + ) + obj + arg0 + arg1 + arg2 + arg3 + ) + ) + (('notify) + (let ((a0-27 (the-as object (-> arg3 param 0))) + (v1-31 (the-as object (-> arg3 param 1))) + ) + (when (= (the-as symbol a0-27) 'attack) + (when (logtest? (-> (the-as process-focusable v1-31) mask) (process-mask target)) + (if (and (logtest? (-> (the-as process-focusable v1-31) focus-status) (focus-status dead)) + (let ((f0-1 (vector-vector-distance-squared (-> obj root-override2 trans) (-> obj focus-pos))) + (f1-3 122880.0) + ) + (< f0-1 (* f1-3 f1-3)) + ) + ) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-1 speech-type-3)) + ) + ) + ) + ) + ((the-as + (function enemy process int symbol event-message-block object) + (find-parent-method crimson-guard-hover 74) + ) + obj + arg0 + arg1 + arg2 + arg3 + ) + ) + (else + ((the-as + (function enemy process int symbol event-message-block object) + (find-parent-method crimson-guard-hover 74) + ) + obj + arg0 + arg1 + arg2 + arg3 + ) + ) + ) + ) + +;; definition for method 162 of type crimson-guard-hover +;; WARN: Return type mismatch object vs symbol. +(defmethod crimson-guard-hover-method-162 crimson-guard-hover ((obj crimson-guard-hover) (arg0 process-focusable)) + (with-pp + (let* ((v1-1 (vector+! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) (-> obj root-override2 transv))) + (s5-1 (vector-! (new 'stack-no-clear 'vector) v1-1 (-> obj focus-pos))) + (f30-0 (vector-length s5-1)) + (a0-4 (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + ) + ) + (the-as + symbol + (when a0-4 + (let ((s4-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (get-quat (the-as process-focusable a0-4) 0))) + (s5-2 (vector-normalize-copy! (new 'stack-no-clear 'vector) s5-1 1.0)) + ) + (and (< 0.0 (vector-dot s4-1 s5-2)) + (and (>= (- (-> pp clock frame-counter) (-> obj last-fire-time)) + (the int (* 300.0 (rand-vu-float-range (-> obj attack-wait-min) (-> obj attack-wait-max)))) + ) + (get-enemy-target obj) + (< f30-0 225280.0) + (and (< (fabs (vector-x-angle s5-2)) 3640.889) + (enemy-method-95 obj (-> obj focus-pos) 5461.3335) + (check-los? (-> obj los) (seconds 0.4)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + +;; definition for method 145 of type crimson-guard-hover +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-145 crimson-guard-hover ((obj crimson-guard-hover) (arg0 int) (arg1 float) (arg2 int) (arg3 int)) + (local-vars (v1-1 int)) + 0 + (if (< 0.0 arg1) + (set! v1-1 arg2) + (set! v1-1 arg3) + ) + (let* ((f0-2 (- 1.0 arg1)) + (a2-2 (- 1.0 (* f0-2 f0-2 f0-2))) + (a3-7 (-> obj skel root-channel arg0)) + ) + (let ((f0-6 (fabs a2-2))) + (set! (-> a3-7 frame-interp 1) f0-6) + (set! (-> a3-7 frame-interp 0) f0-6) + ) + (set! (-> a3-7 frame-group) (the-as art-joint-anim (-> obj draw art-group data v1-1))) + (set! (-> a3-7 param 0) 0.0) + (set! (-> a3-7 frame-num) (-> obj skel root-channel 0 frame-num)) + (joint-control-channel-group! a3-7 (the-as art-joint-anim (-> obj draw art-group data v1-1)) num-func-chan) + ) + (none) + ) + +;; definition for method 52 of type crimson-guard-hover +(defmethod enemy-method-52 crimson-guard-hover ((obj crimson-guard-hover) (arg0 vector)) + (let ((s4-0 (-> obj root-override2))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-2)) + (let ((gp-1 (-> obj root-override2 transv))) + (let ((a1-1 (handle->process (-> obj incoming attacker-handle)))) + (if a1-1 + (vector-! gp-1 (-> (the-as process-focusable a1-1) root-override trans) (-> obj root-override2 trans)) + (vector-! gp-1 (-> obj incoming attacker-pos) (-> obj root-override2 trans)) + ) + ) + (set! (-> gp-1 y) 0.0) + (vector-normalize! gp-1 1.0) + (vector-rotate90-around-y! gp-1 gp-1) + (if (< 0.0 (vector-dot + (vector-! (new 'stack-no-clear 'vector) (-> obj incoming attacker-pos) (-> s4-0 trans)) + (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> s4-0 quat)) + ) + ) + (vector-negate! gp-1 gp-1) + ) + (let ((f30-1 (get-rand-float-range obj 0.0 1.0)) + (s5-1 (-> obj enemy-info)) + ) + (vector-float*! gp-1 gp-1 (lerp (-> s5-1 knocked-hard-vxz-lo) (-> s5-1 knocked-hard-vxz-hi) f30-1)) + (set! (-> gp-1 y) (lerp (-> s5-1 knocked-hard-vy-lo) (-> s5-1 knocked-hard-vy-hi) f30-1)) + ) + ) + ) + (else + ((the-as (function hover-enemy vector none) (find-parent-method crimson-guard-hover 52)) obj arg0) + ) + ) + ) + (none) + ) + +;; definition for method 77 of type crimson-guard-hover +(defmethod enemy-method-77 crimson-guard-hover ((obj crimson-guard-hover) (arg0 (pointer float))) + (ja-channel-push! 1 0) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-5)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 12))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 12)) 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 (-> obj draw art-group data 12)) num-func-seek!) + ) + (set! (-> obj knocked-recover-anim) 13) + ) + (else + (let ((a0-4 (-> obj skel root-channel 0))) + (set! (-> a0-4 frame-group) (the-as art-joint-anim (-> obj draw art-group data 10))) + (set! (-> a0-4 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 10)) frames num-frames) -1)) + ) + (set! (-> a0-4 param 1) (-> arg0 0)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim (-> obj draw art-group data 10)) num-func-seek!) + ) + (set! (-> obj knocked-recover-anim) 11) + ) + ) + #t + ) + +;; definition for method 78 of type crimson-guard-hover +(defmethod enemy-method-78 crimson-guard-hover ((obj crimson-guard-hover) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (ja-channel-push! 1 (seconds 0.4)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 19))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 19)) frames num-frames) -1)) + ) + (set! (-> a0-2 param 1) (-> arg0 0)) + (set! (-> a0-2 frame-num) 0.0) + (joint-control-channel-group! a0-2 (the-as art-joint-anim (-> obj draw art-group data 19)) num-func-seek!) + ) + #t + ) + (else + #f + ) + ) + ) + +;; definition for method 55 of type crimson-guard-hover +;; WARN: Return type mismatch int vs none. +(defmethod track-target! crimson-guard-hover ((obj crimson-guard-hover)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (seek! (-> obj gun-x-angle) (-> obj gun-x-angle-final) (* 21845.334 (-> pp clock seconds-per-frame))) + (let* ((s5-0 (hover-nav-control-method-16 (-> obj hover) (new 'stack-no-clear 'vector))) + (s4-0 + (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + *x-vector* + (fmax -8192.0 (fmin 8192.0 (* 14563.556 (-> s5-0 z)))) + ) + ) + (a1-4 + (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + *z-vector* + (fmax -8192.0 (fmin 8192.0 (* 14563.556 (-> s5-0 x)))) + ) + ) + (s5-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion*! s5-1 a1-4 s4-0) + (quaternion-slerp! + (the-as quaternion (-> obj hips-jmod target)) + (the-as quaternion (-> obj hips-jmod target)) + s5-1 + (* 2.0 (-> pp clock seconds-per-frame)) + ) + ) + (let ((t9-6 (method-of-type hover-enemy track-target!))) + (t9-6 obj) + ) + (los-control-method-9 (-> obj los) (the-as process-focusable #f) (the-as vector #f) 2048.0) + 0 + (none) + ) + ) + +;; definition for method 142 of type crimson-guard-hover +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-142 crimson-guard-hover ((obj crimson-guard-hover)) + (let ((s5-0 (-> obj main-joint-acc)) + (s4-0 (-> obj main-joint-vel)) + (gp-0 + (lambda ((arg0 crimson-guard-hover) (arg1 cspace) (arg2 float) (arg3 float) (arg4 vector) (arg5 vector) (arg6 int)) + (local-vars (sv-192 float) (sv-208 quaternion) (sv-224 vector)) + (with-pp + (set! sv-192 arg2) + (let ((s0-0 arg3)) + (set! sv-224 arg4) + (let ((s1-0 arg5) + (s3-0 arg6) + (s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) arg1)) + (s5-0 (new 'stack-no-clear 'matrix)) + (a1-3 (matrix-with-scale->quaternion (new 'stack-no-clear 'quaternion) (-> arg1 bone transform))) + ) + (set! sv-208 (new 'stack-no-clear 'quaternion)) + (let ((s2-1 (new 'stack-no-clear 'vector))) + (-> arg0 scale) + (quaternion-rotate-local-z! sv-208 a1-3 sv-192) + (quaternion->matrix s5-0 sv-208) + (set! (-> s2-1 quad) (-> arg0 root-override2 scale quad)) + (scale-matrix! s5-0 s2-1 s5-0) + (let* ((s1-1 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) s1-0 (-> arg0 root-override2 quat))) + (t9-6 vector-inv-orient-by-quat!) + (a0-10 (new 'stack-no-clear 'vector)) + (a2-4 (-> arg0 root-override2 quat)) + (v0-6 (t9-6 a0-10 sv-224 a2-4)) + (f30-0 (* 2867200.0 (-> pp clock seconds-per-frame))) + (f28-0 + (seek + (-> arg0 thrust s3-0) + (+ (* 0.4 (fmax 0.0 (* (-> v0-6 x) s0-0))) + (fmax 0.0 (-> v0-6 y)) + (fabs (* 0.2 (-> v0-6 z))) + (fmax 0.0 (-> s1-1 y)) + ) + (* 0.2 f30-0) + ) + ) + ) + (let ((f20-0 (lerp-scale 819.2 4096.0 f28-0 1638.4 f30-0)) + (f26-0 (lerp-scale 4915.2 11468.8 f28-0 1638.4 f30-0)) + (f22-0 (lerp-scale 0.5 1.5 f28-0 1638.4 f30-0)) + (f24-0 (lerp-scale 0.1 1.0 f28-0 1638.4 f30-0)) + ) + (lerp-scale 0.1 1.0 f28-0 1638.4 f30-0) + (let ((f1-10 (lerp-scale 0.02 0.6 f28-0 1638.4 f30-0)) + (f2-6 (fmin 1.0 (-> s2-1 x))) + (f0-14 (fmin 1.0 (-> s2-1 y))) + ) + (set! (-> *part-id-table* 718 init-specs 4 initial-valuef) (* f20-0 f2-6)) + (set! (-> *part-id-table* 718 init-specs 5 initial-valuef) (* f26-0 f0-14)) + (set! (-> *part-id-table* 722 init-specs 3 initial-valuef) (* f22-0 f2-6)) + (set! (-> *part-id-table* 719 init-specs 1 initial-valuef) (* f24-0 f0-14)) + (set! (-> *part-id-table* 720 init-specs 1 initial-valuef) (* f1-10 f0-14)) + (set! (-> *part-id-table* 721 init-specs 0 initial-valuef) (* f24-0 f0-14)) + (set! (-> arg0 thrust s3-0) f28-0) + (let ((f0-15 (* f26-0 f0-14))) + (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 vector 1) (* -0.5 f0-15)) + ) + ) + ) + (set! (-> s5-0 trans quad) (-> s4-0 quad)) + (spawn-with-matrix (-> arg0 engine-part) s5-0) + (let ((f0-17 (lerp-scale 0.4 1.0 f28-0 1638.4 f30-0))) + (sound-play-by-name + (static-sound-name "hover-jets") + (-> arg0 sound-id) + (the int (* 1024.0 f0-17)) + 0 + 0 + (sound-group sfx) + #t + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + ) + ) + (gp-0 + obj + (-> obj node-list data (-> obj hover-info engine-left)) + (-> obj hover-info thrust-rotate-left) + -1.0 + s5-0 + s4-0 + 0 + ) + (gp-0 + obj + (-> obj node-list data (-> obj hover-info engine-right)) + (-> obj hover-info thrust-rotate-right) + 1.0 + s5-0 + s4-0 + 1 + ) + ) + 0 + (none) + ) + +;; definition for method 143 of type crimson-guard-hover +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-143 crimson-guard-hover ((obj crimson-guard-hover) (arg0 int) (arg1 float)) + (let* ((s2-0 (-> obj node-list data arg0)) + (s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) s2-0)) + (s5-0 (new 'stack-no-clear 'matrix)) + ) + (let ((a1-3 (matrix-with-scale->quaternion (new 'stack-no-clear 'quaternion) (-> s2-0 bone transform))) + (s2-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-rotate-local-z! s2-1 a1-3 arg1) + (quaternion->matrix s5-0 s2-1) + ) + (let ((f4-0 6144.0) + (f0-0 17203.2) + ) + (let ((f3-0 2.0) + (f1-0 1.5) + ) + 1.5 + (let ((f2-1 1.0)) + (set! (-> *part-id-table* 718 init-specs 4 initial-valuef) f4-0) + (set! (-> *part-id-table* 718 init-specs 5 initial-valuef) f0-0) + (set! (-> *part-id-table* 722 init-specs 3 initial-valuef) f3-0) + (set! (-> *part-id-table* 719 init-specs 1 initial-valuef) f1-0) + (set! (-> *part-id-table* 720 init-specs 1 initial-valuef) f2-1) + ) + (set! (-> *part-id-table* 721 init-specs 0 initial-valuef) f1-0) + ) + (let ((v1-29 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 vector 1) (* -0.5 f0-0)))) + (vector+! (-> s5-0 trans) s4-0 v1-29) + ) + ) + (spawn-with-matrix (-> obj engine-part) s5-0) + ) + (sound-play "hover-jets" :id (-> obj sound-id)) + 0 + (none) + ) + +;; definition for method 161 of type crimson-guard-hover +;; WARN: Return type mismatch int vs none. +(defmethod shoot crimson-guard-hover ((obj crimson-guard-hover) + (arg0 vector) + (arg1 projectile-init-by-other-params) + (arg2 int) + (arg3 float) + (arg4 float) + ) + (vector<-cspace! (-> arg1 pos) (-> obj node-list data arg2)) + (let ((s2-1 (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> obj node-list data arg2 bone transform vector 1) + 1.0 + ) + (* 273.06668 arg4) + ) + ) + (a1-8 (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> obj node-list data arg2 bone transform vector 2) + 1.0 + ) + ) + ) + (vector-orient-by-quat! (-> arg1 vel) a1-8 s2-1) + ) + (vector-normalize! (-> arg1 vel) (* 819200.0 arg4)) + (spawn-projectile crimson-guard-hover-shot arg1 obj *default-dead-pool*) + 0 + (none) + ) + +;; definition for method 73 of type crimson-guard-hover +(defmethod kill-prefer-falling crimson-guard-hover ((obj crimson-guard-hover)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + (cond + ((and (-> obj next-state) (= (-> obj next-state name) 'knocked)) + (go (method-of-object obj die-now)) + ) + ((-> obj enemy-info use-die-falling) + (go (method-of-object obj die-falling)) + ) + (else + (go (method-of-object obj die)) + ) + ) + ) + +;; definition for method 63 of type crimson-guard-hover +;; WARN: Return type mismatch none vs symbol. +(defmethod enemy-method-63 crimson-guard-hover ((obj crimson-guard-hover) (arg0 process-focusable) (arg1 enemy-aware)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-63))) + (the-as symbol (if (t9-0 (the-as nav-enemy obj) arg0 arg1) + (set-dst-proc! (-> obj los) (-> obj focus handle)) + ) + ) + ) + ) + +;; definition for method 149 of type crimson-guard-hover +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-149 crimson-guard-hover ((obj crimson-guard-hover)) + (initialize-skeleton + obj + (the-as + skeleton-group + (art-group-get-by-name *level* "skel-crimson-guard-hover" (the-as (pointer uint32) #f)) + ) + (the-as pair 0) + ) + 0 + (none) + ) + +;; definition for method 114 of type crimson-guard-hover +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! crimson-guard-hover ((obj crimson-guard-hover)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (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 8) 0))) + (set! (-> s5-0 total-prims) (the-as uint 9)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd)) + (set! (-> s4-0 prim-core action) (collide-action solid semi-solid deadly)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 -5734.4 0.0 16384.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)) + (set! (-> v1-14 prim-core action) (collide-action solid deadly)) + (set! (-> v1-14 transform-index) 0) + (set-vector! (-> v1-14 local-sphere) 0.0 10240.0 -2048.0 6144.0) + ) + (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 backgnd)) + (set! (-> v1-16 prim-core action) (collide-action solid deadly)) + (set! (-> v1-16 transform-index) 0) + (set-vector! (-> v1-16 local-sphere) 0.0 8192.0 -2048.0 4915.2) + ) + (let ((v1-18 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-18 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-18 prim-core collide-with) (collide-spec backgnd)) + (set! (-> v1-18 prim-core action) (collide-action solid deadly)) + (set! (-> v1-18 transform-index) 0) + (set-vector! (-> v1-18 local-sphere) 0.0 12288.0 -2048.0 4915.2) + ) + (let ((v1-20 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-20 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-20 prim-core action) (collide-action semi-solid deadly)) + (set! (-> v1-20 transform-index) 21) + (set-vector! (-> v1-20 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (let ((v1-22 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-22 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-22 prim-core action) (collide-action semi-solid deadly)) + (set! (-> v1-22 transform-index) 24) + (set-vector! (-> v1-22 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (let ((v1-24 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-24 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-24 prim-core action) (collide-action semi-solid)) + (set! (-> v1-24 transform-index) 8) + (set-vector! (-> v1-24 local-sphere) 0.0 0.0 0.0 2457.6) + ) + (let ((v1-26 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-26 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-26 prim-core action) (collide-action semi-solid)) + (set! (-> v1-26 transform-index) 10) + (set-vector! (-> v1-26 local-sphere) 0.0 0.0 0.0 2457.6) + ) + (let ((v1-28 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-28 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-28 prim-core action) (collide-action semi-solid)) + (set! (-> v1-28 transform-index) 7) + (set-vector! (-> v1-28 local-sphere) 0.0 0.0 0.0 2457.6) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (let ((v1-31 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-31 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-31 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 150 of type crimson-guard-hover +(defmethod hover-enemy-method-150 crimson-guard-hover ((obj crimson-guard-hover)) + *crimson-guard-hover-enemy-info* + ) + +;; definition for method 151 of type crimson-guard-hover +(defmethod hover-enemy-method-151 crimson-guard-hover ((obj crimson-guard-hover)) + (new 'static 'hover-enemy-info + :fly-forward-anim 7 + :fly-backward-anim 8 + :fly-left-anim 6 + :fly-right-anim 5 + :shoot-anim 9 + :main-joint 3 + :gun-base 7 + :engine-left 15 + :engine-right 17 + :thrust-rotate-left 32768.0 + :thrust-rotate-right -32768.0 + ) + ) + +;; definition for method 152 of type crimson-guard-hover +(defmethod hover-enemy-method-152 crimson-guard-hover ((obj crimson-guard-hover)) + (new 'static 'hover-nav-params :max-speed 102400.0 :max-acceleration 143360.0 :friction 0.05) + ) + +;; definition for method 7 of type crimson-guard-hover +;; WARN: Return type mismatch hover-enemy vs crimson-guard-hover. +(defmethod relocate crimson-guard-hover ((obj crimson-guard-hover) (arg0 int)) + (if (nonzero? (-> obj gun-jmod)) + (&+! (-> obj gun-jmod) arg0) + ) + (if (nonzero? (-> obj hips-jmod)) + (&+! (-> obj hips-jmod) arg0) + ) + (if (nonzero? (-> obj smoke-part)) + (&+! (-> obj smoke-part) arg0) + ) + (if (nonzero? (-> obj engine-part)) + (&+! (-> obj engine-part) arg0) + ) + (the-as crimson-guard-hover ((method-of-type hover-enemy relocate) obj arg0)) + ) + +;; definition for method 10 of type crimson-guard-hover +(defmethod deactivate crimson-guard-hover ((obj crimson-guard-hover)) + (if (nonzero? (-> obj smoke-part)) + (kill-and-free-particles (-> obj smoke-part)) + ) + (if (nonzero? (-> obj engine-part)) + (kill-and-free-particles (-> obj engine-part)) + ) + (sound-stop (-> obj sound-id)) + ((method-of-type hover-enemy deactivate) obj) + (none) + ) + +;; definition for method 115 of type crimson-guard-hover +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! crimson-guard-hover ((obj crimson-guard-hover)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (local-vars (sv-16 res-tag) (sv-32 res-tag) (sv-48 res-tag) (sv-64 res-tag)) + (hover-enemy-method-149 obj) + (init-enemy-behaviour-and-stats! obj (hover-enemy-method-150 obj)) + (hover-enemy-method-155 obj) + (new-source! (-> obj los) obj (seconds 2) (collide-spec backgnd enemy obstacle)) + (set! (-> obj neck up) (the-as uint 1)) + (set! (-> obj neck nose) (the-as uint 2)) + (set! (-> obj neck ear) (the-as uint 0)) + (set! (-> obj scale) 1.2) + (set! (-> obj sound-id) (new-sound-id)) + (set! (-> obj root-override2 dynam gravity y) 327680.0) + (set! (-> obj root-override2 dynam gravity-length) 327680.0) + (set! (-> obj root-override2 dynam gravity-max) 327680.0) + (set! (-> obj gun-jmod) + (the-as joint-mod (new 'process 'joint-mod-rotate-local obj (-> obj hover-info gun-base) #t)) + ) + (set! (-> obj gun-x-angle) 0.0) + (set! (-> obj gun-x-angle-final) 0.0) + (set! (-> obj hips-jmod) (the-as joint-mod (new 'process 'joint-mod-rotate-local obj 18 #t))) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-30 (res-lump-data (-> obj entity) 'actor-groups (pointer actor-group) :tag-ptr (& sv-16)))) + (if (and v1-30 (= (-> sv-16 elt-count) 1)) + (set! (-> obj entity-group) (-> v1-30 0)) + (set! (-> obj entity-group) #f) + ) + ) + (set! sv-32 (new 'static 'res-tag)) + (let ((v1-34 (res-lump-data (-> obj entity) 'timeout (pointer float) :tag-ptr (& sv-32)))) + (cond + ((and v1-34 (= (-> sv-32 elt-count) 2)) + (set! (-> obj attack-wait-min) (-> v1-34 0)) + (set! (-> obj attack-wait-max) (-> v1-34 1)) + ) + (else + (set! (-> obj attack-wait-min) 1.0) + (set! (-> obj attack-wait-max) 3.0) + ) + ) + ) + (set! sv-48 (new 'static 'res-tag)) + (let ((v1-40 (res-lump-data (-> obj entity) 'min-max (pointer float) :tag-ptr (& sv-48)))) + (set! (-> obj attack-miss-dist-min) (if (and v1-40 (> (the-as int (-> sv-48 elt-count)) 0)) + (-> v1-40 0) + -40960.0 + ) + ) + ) + (set! sv-64 (new 'static 'res-tag)) + (let ((v1-43 (res-lump-data (-> obj entity) 'min-max (pointer float) :tag-ptr (& sv-64)))) + (set! (-> obj attack-miss-dist-max) (if (and v1-43 (< 1 (the-as int (-> sv-64 elt-count)))) + (-> v1-43 1) + 40960.0 + ) + ) + ) + (set! (-> obj attack-miss-dist-curr) 0.0) + (set! (-> obj path) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (set! (-> obj path-u) 0.0) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! (-> obj smoke-part) (create-launch-control (-> *part-group-id-table* 154) obj)) + (set! (-> obj engine-part) (create-launch-control (-> *part-group-id-table* 156) obj)) + (add-connection + *part-engine* + obj + 26 + obj + 318 + (new 'static 'vector :x 1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 26 + obj + 318 + (new 'static 'vector :x -1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection *part-engine* obj 26 obj 743 (new 'static 'vector :y 1433.6 :z 1228.8 :w 163840.0)) + 0 + (none) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/flamer_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/flamer_REF.gc new file mode 100644 index 0000000000..34b9d5c1d6 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/flamer_REF.gc @@ -0,0 +1,1653 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type flying-formation +(deftype flying-formation (hover-formation) + () + :heap-base #x10 + :method-count-assert 16 + :size-assert #x90 + :flag-assert #x1000100090 + ) + +;; definition for method 3 of type flying-formation +(defmethod inspect flying-formation ((obj flying-formation)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type hover-formation inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition of type flamer +(deftype flamer (nav-enemy) + ((shot-trajectory trajectory :inline :offset-assert 608) + (last-fire-time time-frame :offset-assert 648) + (sync-off uint32 :offset-assert 656) + (base-pos vector :inline :offset-assert 672) + (idle-pos vector :inline :offset-assert 688) + (offset vector :inline :offset-assert 704) + (dest-pos vector :inline :offset-assert 720) + (zone-to-world matrix :inline :offset-assert 736) + (world-to-zone matrix :inline :offset-assert 800) + (formation-entity entity-actor :offset-assert 864) + (flit-joint joint-mod :offset-assert 868) + (flit-angle float :offset-assert 872) + (flit-timer time-frame :offset-assert 880) + (path-pos float :offset-assert 888) + (sound-volume float :offset-assert 892) + (scale float :offset-assert 896) + (hit-surface? symbol :offset-assert 900) + (ground-mode int8 :offset-assert 904) + (init-quat quaternion :inline :offset-assert 912) + (surface-normal vector :inline :offset-assert 928) + (main-joint-pos vector :inline :offset-assert 944) + (main-joint-vel vector :inline :offset-assert 960) + (main-joint-acc vector :inline :offset-assert 976) + (main-acceleration float :offset-assert 992) + (fly-dir vector :inline :offset-assert 1008) + ) + :heap-base #x380 + :method-count-assert 192 + :size-assert #x400 + :flag-assert #xc003800400 + (:methods + (attack () _type_ :state 178) + (wait-for-formation () _type_ :state 179) + (exit-ambush () _type_ :state 180) + (exit-ambush-path () _type_ :state 181) + (flamer-method-182 (_type_ vector process-focusable) none 182) + (flamer-method-183 (_type_) symbol 183) + (flamer-method-184 (_type_) none 184) + (flamer-method-185 (_type_) none 185) + (flamer-method-186 (_type_ float) vector 186) + (flamer-method-187 (_type_) none 187) + (flamer-method-188 (_type_ int float int int) none 188) + (flamer-method-189 (_type_) none 189) + (flamer-method-190 (_type_) none 190) + (flamer-method-191 (_type_) none 191) + ) + ) + +;; definition for method 3 of type flamer +(defmethod inspect flamer ((obj flamer)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tshot-trajectory: #~%" (-> obj shot-trajectory)) + (format #t "~2Tlast-fire-time: ~D~%" (-> obj last-fire-time)) + (format #t "~2Tsync-off: ~D~%" (-> obj sync-off)) + (format #t "~2Tbase-pos: #~%" (-> obj base-pos)) + (format #t "~2Tidle-pos: #~%" (-> obj idle-pos)) + (format #t "~2Toffset: #~%" (-> obj offset)) + (format #t "~2Tdest-pos: #~%" (-> obj dest-pos)) + (format #t "~2Tzone-to-world: #~%" (-> obj zone-to-world)) + (format #t "~2Tworld-to-zone: #~%" (-> obj world-to-zone)) + (format #t "~2Tformation-entity: ~A~%" (-> obj formation-entity)) + (format #t "~2Tflit-joint: ~A~%" (-> obj flit-joint)) + (format #t "~2Tflit-angle: ~f~%" (-> obj flit-angle)) + (format #t "~2Tflit-timer: ~D~%" (-> obj flit-timer)) + (format #t "~2Tpath-pos: ~f~%" (-> obj path-pos)) + (format #t "~2Tsound-volume: ~f~%" (-> obj sound-volume)) + (format #t "~2Tscale: ~f~%" (-> obj scale)) + (format #t "~2Thit-surface?: ~A~%" (-> obj hit-surface?)) + (format #t "~2Tground-mode: ~D~%" (-> obj ground-mode)) + (format #t "~2Tinit-quat: #~%" (-> obj init-quat)) + (format #t "~2Tsurface-normal: #~%" (-> obj surface-normal)) + (format #t "~2Tmain-joint-pos: #~%" (-> obj main-joint-pos)) + (format #t "~2Tmain-joint-vel: #~%" (-> obj main-joint-vel)) + (format #t "~2Tmain-joint-acc: #~%" (-> obj main-joint-acc)) + (format #t "~2Tmain-acceleration: ~f~%" (-> obj main-acceleration)) + (format #t "~2Tfly-dir: #~%" (-> obj fly-dir)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-flamer flamer flamer-lod0-jg -1 + ((flamer-lod0-mg (meters 20)) (flamer-lod1-mg (meters 40)) (flamer-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :shadow flamer-shadow-mg + :origin-joint-index 3 + :shadow-joint-index 3 + ) + +;; failed to figure out what this is: +(defskelgroup skel-flamer-explode flamer flamer-explode-lod0-jg flamer-explode-idle-ja + ((flamer-explode-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :origin-joint-index 3 + ) + +;; definition for symbol *flamer-exploder-params*, type joint-exploder-static-params +(define *flamer-exploder-params* + (new 'static 'joint-exploder-static-params + :joints (new 'static 'boxed-array :type joint-exploder-static-joint-params + (new 'static 'joint-exploder-static-joint-params :joint-index 3 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 4 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 5 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 6 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 7 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 8 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 9 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 10 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 11 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 12 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 13 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 14 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 15 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 16 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 17 :parent-joint-index -1) + ) + :collide-spec #x1 + ) + ) + +;; definition for symbol *flamer-fact-defaults*, type fact-info-enemy-defaults +(define *flamer-fact-defaults* (new 'static 'fact-info-enemy-defaults :idle-distance (meters 80))) + +;; definition for symbol *flamer-nav-enemy-info*, type nav-enemy-info +(define *flamer-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #f + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 5 + :notice-anim 5 + :hostile-anim 5 + :hit-anim 13 + :knocked-anim 14 + :knocked-land-anim 16 + :die-anim 17 + :die-falling-anim 17 + :victory-anim 5 + :jump-wind-up-anim 5 + :jump-in-air-anim 5 + :jump-land-anim 5 + :neck-joint 19 + :look-at-joint 19 + :bullseye-joint 3 + :sound-hit (static-sound-name "flamer-hit") + :sound-die (static-sound-name "flamer-die") + :notice-distance (meters 70) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 55) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :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-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 90112.0 + :knocked-blue-vy-lo 90112.0 + :knocked-blue-vy-hi 172032.0 + :shadow-size (meters 2) + :shadow-max-y (meters 10) + :shadow-min-y (meters -40) + :shadow-locus-dist (meters 150) + :gem-joint 19 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 450.56 :z 1638.4 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 5 + :turn-anim 5 + :run-anim 5 + :taunt-anim -1 + :run-travel-speed (meters 16) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 50) + :walk-travel-speed (meters 12) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 50) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 55) + :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 + ) + ) + +;; failed to figure out what this is: +(set! (-> *flamer-nav-enemy-info* fact-defaults) *flamer-fact-defaults*) + +;; definition for method 74 of type flamer +;; INFO: Used lq/sq +(defmethod general-event-handler flamer ((obj flamer) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('hit 'hit-flinch 'hit-knocked) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (go (method-of-object obj knocked)) + ) + (('update-formation) + (let ((v0-3 (the-as object (-> obj offset)))) + (set! (-> (the-as vector v0-3) quad) (-> (the-as vector (-> arg3 param 0)) quad)) + v0-3 + ) + ) + (else + ((method-of-type nav-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +;; definition for method 189 of type flamer +;; WARN: Return type mismatch int vs none. +(defmethod flamer-method-189 flamer ((obj flamer)) + (with-pp + (let ((v1-0 (-> obj formation-entity))) + (when (if v1-0 + (-> v1-0 extra process) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer pp)) + (set! (-> a1-1 num-params) 0) + (set! (-> a1-1 message) 'join) + (let ((t9-0 send-event-function) + (v1-5 (-> obj formation-entity)) + ) + (t9-0 + (if v1-5 + (-> v1-5 extra process) + ) + a1-1 + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 190 of type flamer +;; WARN: Return type mismatch int vs none. +(defmethod flamer-method-190 flamer ((obj flamer)) + (with-pp + (let ((v1-0 (-> obj formation-entity))) + (when (if v1-0 + (-> v1-0 extra process) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer pp)) + (set! (-> a1-1 num-params) 0) + (set! (-> a1-1 message) 'leave) + (let ((t9-0 send-event-function) + (v1-5 (-> obj formation-entity)) + ) + (t9-0 + (if v1-5 + (-> v1-5 extra process) + ) + a1-1 + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 142 of type flamer +;; WARN: Return type mismatch int vs none. +(defmethod nav-enemy-method-142 flamer ((obj flamer) (arg0 nav-control)) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (vector-! gp-0 (target-pos 0) (-> obj root-override2 trans)) + (seek-toward-heading-vec! (-> obj root-override2) gp-0 131072.0 (seconds 0.5)) + ) + 0 + (none) + ) + +;; definition for method 182 of type flamer +;; INFO: Used lq/sq +;; WARN: Return type mismatch object vs none. +(defmethod flamer-method-182 flamer ((obj flamer) (arg0 vector) (arg1 process-focusable)) + (with-pp + (set! arg0 (cond + ((and *target* (-> obj next-state) (let ((v1-4 (-> obj next-state name))) + (or (= v1-4 'hostile) (= v1-4 'attack) (= v1-4 'hit)) + ) + ) + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) (process->ppointer pp)) + (set! (-> a1-3 num-params) 0) + (set! (-> a1-3 message) 'get-formation) + (let* ((t9-0 send-event-function) + (v1-7 (-> obj formation-entity)) + (s2-0 (the-as hover-formation-control (t9-0 + (if v1-7 + (-> v1-7 extra process) + ) + a1-3 + ) + ) + ) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (cond + ((and s2-0 (not (is-formation-type-in-range s2-0))) + (hover-formation-control-method-15 s2-0 arg0 (-> obj offset)) + ) + (else + (cond + (s2-0 + (hover-formation-control-method-13 s2-0 s4-0) + ) + (else + (let ((s1-0 (new 'stack-no-clear 'vector))) + (set! (-> s1-0 quad) (-> (get-trans arg1 0) quad)) + (let ((s3-1 (new 'stack-no-clear 'vector))) + (let ((s2-1 (new 'stack-no-clear 'vector))) + (vector-! s3-1 s1-0 (-> obj root-override2 trans)) + (vector-flatten! s2-1 s3-1 (-> obj zone-to-world vector 2)) + (vector-float*! s2-1 s2-1 -0.9) + (vector+! s3-1 s3-1 s2-1) + ) + (vector+! s4-0 (-> obj root-override2 trans) s3-1) + ) + ) + ) + ) + (vector-matrix*! arg0 s4-0 (-> obj world-to-zone)) + (vector+! arg0 arg0 (-> obj offset)) + (vector-matrix*! arg0 arg0 (-> obj zone-to-world)) + ) + ) + ) + ) + (let* ((v1-30 (+ (-> pp clock frame-counter) (the-as time-frame (-> obj sync-off)))) + (f0-5 (+ (-> arg0 x) (* 614.4 (cos (* 54.613335 (the float (mod v1-30 1200))))))) + ) + (set! (-> arg0 x) f0-5) + (the-as vector f0-5) + ) + ) + (else + (set! (-> arg0 quad) (-> obj idle-pos quad)) + arg0 + ) + ) + ) + (none) + ) + ) + +;; definition for function flamer-attack-post +;; INFO: Used lq/sq +(defbehavior flamer-attack-post flamer () + (let ((a2-0 (handle->process (-> self focus handle)))) + (when a2-0 + (flamer-method-182 self (-> self dest-pos) (the-as process-focusable a2-0)) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (vector-matrix*! gp-0 (-> self dest-pos) (-> self world-to-zone)) + (if (< (-> gp-0 z) 0.0) + (set! (-> gp-0 z) 0.0) + ) + (vector-matrix*! (-> self dest-pos) gp-0 (-> self zone-to-world)) + ) + ) + ) + (cloest-point-on-mesh (-> self nav) (-> self dest-pos) (-> self dest-pos) (the-as nav-poly #f)) + (if #f + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (-> self dest-pos) + (new 'static 'rgba :r #xff :g #xff :b #xff :a #xff) + #f + (the-as rgba -1) + ) + ) + (let ((a0-8 (-> self nav state)) + (v1-16 (-> self dest-pos)) + ) + (logclear! (-> a0-8 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-8 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-8 target-post quad) (-> v1-16 quad)) + ) + 0 + (flamer-method-184 self) + (nav-enemy-travel-post) + (none) + ) + +;; definition for function flamer-flit-post +(defbehavior flamer-flit-post flamer () + (when (>= (- (-> self clock frame-counter) (-> self flit-timer)) (rand-vu-int-range (seconds 1.2) (seconds 3))) + (set! (-> self flit-angle) + (the float + (sar (shl (the int (+ (-> self flit-angle) (* 182.04445 (rand-vu-float-range 160.0 200.0)))) 48) 48) + ) + ) + (set! (-> self flit-timer) (-> self clock frame-counter)) + ) + (flamer-attack-post) + (none) + ) + +;; definition for method 183 of type flamer +;; WARN: Return type mismatch object vs symbol. +;; WARN: disable def twice: 22. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. +;; WARN: disable def twice: 45. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. +(defmethod flamer-method-183 flamer ((obj flamer)) + (with-pp + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) (process->ppointer pp)) + (set! (-> a1-0 num-params) 0) + (set! (-> a1-0 message) 'get-formation) + (let* ((t9-0 send-event-function) + (v1-2 (-> obj formation-entity)) + (a0-3 (the-as hover-formation-control (t9-0 + (if v1-2 + (-> v1-2 extra process) + ) + a1-0 + ) + ) + ) + ) + (the-as + symbol + (cond + (a0-3 + (and (hover-formation-control-method-16 a0-3) (>= (the-as int (-> obj focus aware)) 3)) + ) + (*target* + (let ((a1-1 (target-pos 0))) + (-> obj root-override2 trans) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (vector-matrix*! s5-0 a1-1 (-> obj world-to-zone)) + (and (>= (-> obj enemy-info-override notice-distance) (-> s5-0 z)) (>= (the-as int (-> obj focus aware)) 3)) + ) + ) + ) + (else + #f + ) + ) + ) + ) + ) + ) + ) + +;; definition for method 188 of type flamer +;; WARN: Return type mismatch int vs none. +(defmethod flamer-method-188 flamer ((obj flamer) (arg0 int) (arg1 float) (arg2 int) (arg3 int)) + (local-vars (v1-1 int)) + 0 + (if (< 0.0 arg1) + (set! v1-1 arg2) + (set! v1-1 arg3) + ) + (let ((a3-5 (-> obj skel root-channel arg0))) + (let ((f0-2 (fabs arg1))) + (set! (-> a3-5 frame-interp 1) f0-2) + (set! (-> a3-5 frame-interp 0) f0-2) + ) + (set! (-> a3-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data v1-1))) + (set! (-> a3-5 param 0) 0.0) + (set! (-> a3-5 frame-num) (-> obj skel root-channel 0 frame-num)) + (joint-control-channel-group! a3-5 (the-as art-joint-anim (-> obj draw art-group data v1-1)) num-func-chan) + ) + (none) + ) + +;; definition for method 187 of type flamer +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod flamer-method-187 flamer ((obj flamer)) + (local-vars (at-0 int) (at-1 int)) + (with-pp + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (let ((a1-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 3))) + (a0-2 (new 'stack-no-clear 'vector)) + (v1-1 (new 'stack-no-clear 'vector)) + ) + (new 'stack-no-clear 'vector) + (vector-! a0-2 a1-1 (-> obj main-joint-pos)) + (let ((a2-2 a0-2)) + (.lvf vf1 (&-> a0-2 quad)) + (let ((f0-0 (-> pp clock frames-per-second))) + (.mov at-0 f0-0) + ) + (.mov vf2 at-0) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a2-2 quad) vf1) + ) + (vector-! v1-1 a0-2 (-> obj main-joint-vel)) + (let ((a2-4 v1-1)) + (.lvf vf1 (&-> v1-1 quad)) + (let ((f0-1 (-> pp clock frames-per-second))) + (.mov at-1 f0-1) + ) + (.mov vf2 at-1) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a2-4 quad) vf1) + ) + (set! (-> obj main-joint-pos quad) (-> a1-1 quad)) + (let* ((f0-2 0.4) + (f1-1 (- 1.0 f0-2)) + (a1-5 (-> obj main-joint-vel)) + ) + (set! (-> a1-5 x) (+ (* f0-2 (-> a0-2 x)) (* f1-1 (-> a1-5 x)))) + (set! (-> a1-5 y) (+ (* f0-2 (-> a0-2 y)) (* f1-1 (-> a1-5 y)))) + (set! (-> a1-5 z) (+ (* f0-2 (-> a0-2 z)) (* f1-1 (-> a1-5 z)))) + ) + (set! (-> obj main-joint-acc quad) (-> v1-1 quad)) + ) + 0 + 0 + (none) + ) + ) + ) + +;; definition for method 55 of type flamer +(defmethod track-target! flamer ((obj flamer)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (update-vol! (-> obj sound) (-> obj sound-volume)) + (flamer-method-191 obj) + ((method-of-type nav-enemy track-target!) obj) + (none) + ) + +;; definition for method 191 of type flamer +;; INFO: Used lq/sq +(defmethod flamer-method-191 flamer ((obj flamer)) + (cond + ((and (-> obj draw shadow) + (zero? (-> obj draw cur-lod)) + (logtest? (-> obj draw status) (draw-control-status on-screen)) + ) + (new 'stack-no-clear 'vector) + (new 'stack-no-clear 'vector) + (let ((s4-0 (new 'stack-no-clear 'collide-query)) + (gp-0 (-> obj draw shadow-ctrl settings shadow-dir)) + (f30-0 122880.0) + ) + (set! (-> s4-0 start-pos quad) (-> obj root-override2 trans quad)) + (vector-normalize-copy! (-> s4-0 move-dist) gp-0 f30-0) + (let ((v1-12 s4-0)) + (set! (-> v1-12 radius) 3276.8) + (set! (-> v1-12 collide-with) (collide-spec backgnd)) + (set! (-> v1-12 ignore-process0) obj) + (set! (-> v1-12 ignore-process1) #f) + (set! (-> v1-12 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-12 action-mask) (collide-action solid)) + ) + (let ((f0-1 (fill-and-probe-using-line-sphere *collide-cache* s4-0))) + (cond + ((>= f0-1 0.0) + (let ((v1-16 (-> obj draw shadow-ctrl))) + (logclear! (-> v1-16 settings flags) (shadow-flags disable-draw)) + ) + 0 + (-> s4-0 best-other-tri intersect) + (let ((a1-3 (-> obj root-override2 trans))) + (-> a1-3 y) + (let ((f1-2 (* f0-1 f30-0))) + (shadow-control-method-14 + (-> obj draw shadow-ctrl) + a1-3 + gp-0 + (fmax 32768.0 (* 409600.0 f0-1)) + (+ -12288.0 f1-2) + (+ 12288.0 f1-2) + ) + ) + ) + ) + (else + (let ((v1-27 (-> obj draw shadow-ctrl))) + (logior! (-> v1-27 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + ) + ) + ) + (else + (let ((v1-29 (-> obj draw shadow-ctrl))) + (logior! (-> v1-29 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + (none) + ) + +;; definition for function flamer-fly-code +;; WARN: new jak 2 until loop case, check carefully +(defbehavior flamer-fly-code flamer () + (let ((v1-2 (ja-group))) + (if (not (and v1-2 (= v1-2 flamer-idle-ja))) + (ja-channel-push! 3 (seconds 0.2)) + (ja-channel-set! 3) + ) + ) + (ja-no-eval :group! flamer-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim flamer-idle-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (let ((a0-7 (-> self skel root-channel 1))) + (let ((f0-4 0.0)) + (set! (-> a0-7 frame-interp 1) f0-4) + (set! (-> a0-7 frame-interp 0) f0-4) + ) + (set! (-> a0-7 frame-group) (the-as art-joint-anim flamer-idle-ja)) + (set! (-> a0-7 param 0) (the float (+ (-> (the-as art-joint-anim flamer-idle-ja) frames num-frames) -1))) + (set! (-> a0-7 param 1) 1.0) + (set! (-> a0-7 frame-num) 0.0) + (joint-control-channel-group! a0-7 (the-as art-joint-anim flamer-idle-ja) num-func-seek!) + ) + (let ((a0-8 (-> self skel root-channel 2))) + (let ((f0-9 0.0)) + (set! (-> a0-8 frame-interp 1) f0-9) + (set! (-> a0-8 frame-interp 0) f0-9) + ) + (set! (-> a0-8 frame-group) (the-as art-joint-anim flamer-idle-ja)) + (set! (-> a0-8 param 0) (the float (+ (-> (the-as art-joint-anim flamer-idle-ja) frames num-frames) -1))) + (set! (-> a0-8 param 1) 1.0) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim flamer-idle-ja) num-func-seek!) + ) + (until #f + (let ((gp-0 (vector-inv-orient-by-quat! + (new 'stack-no-clear 'vector) + (-> self main-joint-vel) + (-> self root-override2 quat) + ) + ) + ) + (vector-float*! gp-0 gp-0 (/ 1.0 (-> self enemy-info-override run-travel-speed))) + (flamer-method-188 self 1 (-> gp-0 x) 7 6) + (flamer-method-188 self 2 (-> gp-0 z) 8 9) + ) + (suspend) + (ja :num! (loop!)) + (seek! (-> self sound-volume) 1.0 (* 0.5 (-> self clock seconds-per-frame))) + ) + #f + ) + +;; definition for method 184 of type flamer +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod flamer-method-184 flamer ((obj flamer)) + (with-pp + (let ((v1-0 (-> obj ground-mode))) + (cond + ((= v1-0 1) + (seek! (-> obj base-pos y) (-> obj dest-pos y) (* 40960.0 (-> pp clock seconds-per-frame))) + ) + ((zero? v1-0) + (let ((a1-1 (new 'stack-no-clear 'collide-query))) + (cond + ((enemy-method-125 obj a1-1 (collide-spec backgnd) 8192.0 26624.0 1024.0) + (set! (-> obj base-pos y) (+ 22528.0 (-> obj root-override2 gspot-pos y))) + ) + (else + (let ((s4-0 (-> obj nav)) + (s3-0 (-> obj base-pos)) + (s5-0 (new 'stack 'nav-find-poly-parms)) + ) + (vector-! (-> s5-0 point) s3-0 (-> s4-0 state mesh bounds)) + (set! (-> s5-0 y-threshold) (-> s4-0 nearest-y-threshold)) + (set! (-> s5-0 ignore) (the-as uint 2)) + (find-nearest-poly-to-point-local (-> s4-0 state mesh) s5-0) + (let ((v1-13 (-> s5-0 poly))) + (if v1-13 + (set! (-> obj base-pos y) (+ 22528.0 (-> obj nav state mesh bounds y) (-> v1-13 vertex0 y))) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (let ((v1-16 (+ (-> pp clock frame-counter) (the-as time-frame (-> obj sync-off))))) + (seek! + (-> obj root-override2 trans y) + (+ (-> obj base-pos y) (* 1228.8 (cos (* 100.66974 (the float (mod v1-16 651)))))) + (* 16384.0 (-> pp clock seconds-per-frame)) + ) + ) + (let ((s5-2 (new 'stack-no-clear 'vector))) + (set! (-> s5-2 quad) (-> *up-vector* quad)) + (vector-normalize! s5-2 6144.0) + (vector/! s5-2 s5-2 (-> obj root-override2 scale)) + (vector-rotate-around-z! s5-2 s5-2 (-> obj flit-angle)) + (vector-seek! (-> obj flit-joint target) s5-2 (* 32768.0 (-> pp clock seconds-per-frame))) + ) + (update-trans! (-> obj sound) (-> obj root-override2 trans)) + (update! (-> obj sound)) + (none) + ) + ) + +;; definition for method 67 of type flamer +(defmethod go-stare flamer ((obj flamer)) + (go-hostile obj) + (none) + ) + +;; failed to figure out what this is: +(defstate wait-for-formation (flamer) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior flamer) enemy-event-handler) + :enter (-> (method-of-type flamer idle) enter) + :trans (-> (method-of-type flamer idle) trans) + :code (behavior () + (until #f + (let ((v1-0 (-> self formation-entity))) + (if (if v1-0 + (-> v1-0 extra process) + ) + (go-virtual idle) + ) + ) + (suspend) + ) + #f + (none) + ) + :post (-> (method-of-type flamer idle) post) + ) + +;; failed to figure out what this is: +(defstate dormant (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy dormant) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self root-override2 trans quad) (-> self idle-pos quad)) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate dormant-aware (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy dormant-aware) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self root-override2 trans quad) (-> self idle-pos quad)) + (none) + ) + :trans (behavior () + (when (and (>= (- (-> self clock frame-counter) (-> self state-time)) (-> self state-timeout)) + (flamer-method-183 self) + ) + (if (logtest? (enemy-option ambush) (-> self fact-info-override enemy-options)) + (go-virtual ambush) + (go-virtual active) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate idle (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy idle) enter))) + (if t9-0 + (t9-0) + ) + ) + (flamer-method-190 self) + (set! (-> self ground-mode) 0) + 0 + (none) + ) + :trans (behavior () + (if (flamer-method-183 self) + (go-virtual active) + ) + (flamer-method-184 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate active (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self ground-mode) 0) + 0 + (none) + ) + :trans (behavior () + (if (flamer-method-183 self) + (go-virtual hostile) + ) + (if (>= 819.2 (vector-vector-xz-distance (-> self root-override2 trans) (-> self idle-pos))) + (go-virtual idle) + ) + (none) + ) + :post flamer-attack-post + ) + +;; failed to figure out what this is: +(defstate ambush (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy ambush) enter))) + (if t9-0 + (t9-0) + ) + ) + (logclear! (-> self mask) (process-mask actor-pause)) + (logclear! (-> self enemy-flags) (enemy-flag notice)) + (if (not (-> self path)) + (go-virtual notice) + ) + (let ((v1-13 self)) + (set! (-> v1-13 enemy-flags) (the-as enemy-flag (logclear (-> v1-13 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-13 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-16 self)) + (set! (-> v1-16 enemy-flags) (the-as enemy-flag (logclear (-> v1-16 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self flit-joint twist-min-y) (the-as float #f)) + (vector-reset! (-> self flit-joint target)) + (vector<-cspace! (-> self main-joint-pos) (-> self node-list data 3)) + (vector-reset! (-> self main-joint-vel)) + (vector-reset! (-> self main-joint-acc)) + (set! (-> self main-acceleration) 0.0) + (vector-reset! (-> self fly-dir)) + (sound-play "flamer-ambush") + (quaternion-copy! (-> self root-override2 quat) (-> self init-quat)) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy ambush) exit))) + (if t9-0 + (t9-0) + ) + ) + (logior! (-> self mask) (process-mask actor-pause)) + (logior! (-> self enemy-flags) (enemy-flag notice)) + (set! (-> self flit-joint twist-min-y) (the-as float #t)) + (set! (-> self last-fire-time) (+ (-> self clock frame-counter) (seconds -1.5))) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy ambush) trans))) + (if t9-0 + (t9-0) + ) + ) + (+! (-> self path-pos) (* 0.85 (-> self clock seconds-per-frame))) + (let ((f30-0 (-> self path-pos))) + (when (>= f30-0 1.0) + (set! (-> self path-pos) 1.0) + (get-point-at-percent-along-path! (-> self path) (-> self root-override2 trans) f30-0 'interp) + (go-virtual notice) + ) + (get-point-at-percent-along-path! (-> self path) (-> self root-override2 trans) f30-0 'interp) + (let ((a1-3 (displacement-between-points-at-percent-normalized! (-> self path) (new 'stack-no-clear 'vector) f30-0)) + ) + (forward-up->quaternion (-> self root-override2 quat) a1-3 *up-vector*) + ) + (flamer-method-186 self f30-0) + ) + (none) + ) + :code (the-as (function none :behavior flamer) flamer-fly-code) + :post (behavior () + (flamer-method-187 self) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate exit-ambush (flamer) + :virtual #t + :enter (behavior () + (logclear! (-> self mask) (process-mask actor-pause)) + (logclear! (-> self enemy-flags) (enemy-flag notice)) + (if (not (-> self path)) + (go-virtual active) + ) + (let ((v1-9 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-9 enemy-flags))) + (set! (-> v1-9 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-9 enemy-flags)))) + ) + (set! (-> v1-9 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-9 enemy-flags)))) + (set! (-> v1-9 nav callback-info) (-> v1-9 enemy-info-override callback-info)) + ) + 0 + (let ((v1-12 self)) + (set! (-> v1-12 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-12 enemy-flags)))) + ) + 0 + (get-point-at-percent-along-path! (-> self path) (-> self dest-pos) 1.0 'interp) + (let ((a0-18 (-> self nav state)) + (v1-17 (-> self dest-pos)) + ) + (logclear! (-> a0-18 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-18 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-18 target-post quad) (-> v1-17 quad)) + ) + 0 + (set! (-> self ground-mode) 1) + (none) + ) + :trans (behavior () + (if (< (vector-vector-xz-distance (-> self root-override2 trans) (-> self dest-pos)) 409.6) + (go-virtual exit-ambush-path) + ) + (none) + ) + :code (the-as (function none :behavior flamer) flamer-fly-code) + :post (behavior () + (flamer-method-187 self) + (flamer-flit-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate exit-ambush-path (flamer) + :virtual #t + :enter (behavior () + (let ((v1-0 self)) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logclear (-> v1-0 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-0 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-3 self)) + (set! (-> v1-3 enemy-flags) (the-as enemy-flag (logclear (-> v1-3 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :exit (behavior () + (logior! (-> self mask) (process-mask actor-pause)) + (logior! (-> self enemy-flags) (enemy-flag notice)) + (none) + ) + :trans (behavior () + (set! (-> self path-pos) (- (-> self path-pos) (* 0.33333334 (-> self clock seconds-per-frame)))) + (let ((f30-0 (-> self path-pos))) + (when (>= 0.0 f30-0) + (set! (-> self path-pos) 0.0) + (get-point-at-percent-along-path! (-> self path) (-> self root-override2 trans) f30-0 'interp) + (cond + ((logtest? (enemy-option dormant) (-> self fact-info-override enemy-options)) + (go-virtual dormant) + ) + ((logtest? (enemy-option dormant-aware) (-> self fact-info-override enemy-options)) + (go-virtual dormant-aware) + ) + (else + (go-virtual active) + ) + ) + ) + (get-point-at-percent-along-path! (-> self path) (-> self base-pos) f30-0 'interp) + (flamer-method-186 self f30-0) + ) + (none) + ) + :code (the-as (function none :behavior flamer) flamer-fly-code) + :post (behavior () + (flamer-method-187 self) + (when (>= (- (-> self clock frame-counter) (-> self flit-timer)) (rand-vu-int-range (seconds 1.2) (seconds 3))) + (set! (-> self flit-angle) (* 182.04445 (rand-vu-float-range 0.0 360.0))) + (set! (-> self flit-timer) (-> self clock frame-counter)) + ) + (vector-seek! (-> self root-override2 trans) (-> self base-pos) (* 16384.0 (-> self clock seconds-per-frame))) + (flamer-method-184 self) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate notice (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (go-virtual hostile) + (none) + ) + ) + +;; definition for function vector-square! +(defun vector-square! ((arg0 vector) (arg1 vector)) + (set! (-> arg0 x) (* (-> arg1 x) (-> arg1 x))) + (set! (-> arg0 y) (* (-> arg1 y) (-> arg1 y))) + (set! (-> arg0 z) (* (-> arg1 z) (-> arg1 z))) + arg0 + ) + +;; failed to figure out what this is: +(defstate hostile (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (flamer-method-189 self) + (set! (-> self ground-mode) 0) + (set! (-> self flit-timer) (+ (-> self clock frame-counter) (seconds -3))) + (none) + ) + :trans (behavior () + (let ((a0-1 (handle->process (-> self focus handle)))) + (when (or (not a0-1) + (and a0-1 + (< 491520.0 (vector-vector-distance (-> self idle-pos) (get-trans (the-as process-focusable a0-1) 0))) + (not (flamer-method-183 self)) + ) + ) + (if (logtest? (enemy-option ambush) (-> self fact-info-override enemy-options)) + (go-virtual exit-ambush) + (go-virtual active) + ) + ) + ) + (let ((gp-1 (get-enemy-target self))) + (if (and gp-1 + (>= (- (-> self clock frame-counter) (-> self last-fire-time)) + (the int (* 300.0 (rand-vu-float-range 3.0 6.0))) + ) + (< (vector-vector-distance (get-trans gp-1 3) (-> self root-override2 trans)) 245760.0) + ) + (go-virtual attack) + ) + ) + (none) + ) + :code (the-as (function none :behavior flamer) flamer-fly-code) + :post (behavior () + (flamer-method-187 self) + (flamer-flit-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (flamer) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (let ((s5-0 (handle->process (-> self focus handle)))) + (when s5-0 + (let ((gp-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data 9)))) + (let ((a2-1 (get-trans (the-as process-focusable s5-0) 3)) + (s5-1 (new 'stack-no-clear 'vector)) + ) + (setup-from-to-xz-vel! (-> self shot-trajectory) gp-0 a2-1 122880.0 -102400.0) + (set! (-> s5-1 quad) (-> self shot-trajectory initial-velocity quad)) + (vector-normalize! s5-1 1638.4) + (vector+! gp-0 gp-0 s5-1) + ) + (let ((a1-6 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> a1-6 ent) (-> self entity)) + (set! (-> a1-6 charge) 1.0) + (set! (-> a1-6 options) (projectile-options)) + (set! (-> a1-6 pos quad) (-> gp-0 quad)) + (set! (-> a1-6 vel quad) (-> self shot-trajectory initial-velocity quad)) + (set! (-> a1-6 notify-handle) (process->handle self)) + (set! (-> a1-6 owner-handle) (the-as handle #f)) + (set! (-> a1-6 ignore-handle) (process->handle self)) + (let* ((v1-21 *game-info*) + (a0-24 (+ (-> v1-21 attack-id) 1)) + ) + (set! (-> v1-21 attack-id) a0-24) + (set! (-> a1-6 attack-id) a0-24) + ) + (set! (-> a1-6 timeout) (seconds 4)) + (spawn-projectile metalhead-grenade-shot a1-6 self *default-dead-pool*) + ) + ) + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((zero? (rand-vu-int-range 0 2)) + (ja-no-eval :group! flamer-shoot1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim flamer-shoot1-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (ja-no-eval :group! flamer-shoot-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim flamer-shoot-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (go-virtual hostile) + (none) + ) + :post flamer-attack-post + ) + +;; definition for method 46 of type flamer +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-46 flamer ((obj flamer) (arg0 int)) + "@abstract" + (let ((v1-0 arg0)) + (cond + ((= v1-0 1) + (let ((v1-2 (-> obj root-override2 root-prim))) + (let ((a0-1 v1-2)) + (set! (-> a0-1 prim-core action) (collide-action solid deadly)) + (set! (-> a0-1 prim-core collide-with) (collide-spec backgnd jak bot obstacle hit-by-others-list player-list)) + ) + (let ((a0-2 (-> (the-as collide-shape-prim-group v1-2) child 0))) + (set! (-> a0-2 prim-core action) (collide-action solid deadly)) + (set! (-> a0-2 prim-core collide-with) (collide-spec backgnd jak bot obstacle hit-by-others-list player-list)) + ) + ) + ) + ((or (= v1-0 2) (zero? v1-0)) + (let ((v1-8 (-> obj root-override2 root-prim))) + (let ((a0-3 v1-8)) + (set! (-> a0-3 prim-core action) (collide-action semi-solid deadly)) + (set! (-> a0-3 prim-core collide-with) (collide-spec jak bot player-list)) + ) + (let ((a0-4 (-> (the-as collide-shape-prim-group v1-8) child 0))) + (set! (-> a0-4 prim-core action) (collide-action semi-solid deadly)) + (set! (-> a0-4 prim-core collide-with) (collide-spec jak bot player-list)) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 77 of type flamer +;; WARN: Return type mismatch object vs symbol. +;; WARN: Using new Jak 2 rtype-of +(defmethod enemy-method-77 flamer ((obj flamer) (arg0 (pointer float))) + (let ((v1-0 (-> obj incoming knocked-type))) + (the-as + symbol + (cond + ((= v1-0 (knocked-type knocked-type-6)) + (let* ((a0-2 '((flamer-blue-hit0-ja) (flamer-blue-hit1-ja) (flamer-blue-hit2-ja))) + (a1-3 ((method-of-type (rtype-of a0-2) length) a0-2)) + (s4-0 (new 'static 'array uint64 3 #x12 #x13 #x14)) + (s3-0 (new 'static 'array int32 4 0 0 0 0)) + (a2-0 (ash 1 (-> s3-0 0))) + (v1-6 (enemy-method-120 obj a1-3 a2-0)) + (s4-1 (-> obj draw art-group data (-> (the-as (pointer int32) (+ (* v1-6 8) (the-as int s4-0)))))) + ) + (set! (-> s3-0 0) v1-6) + (let ((v1-9 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-9 (= v1-9 (-> obj draw art-group data 16))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + (let ((a0-17 (-> obj skel root-channel 0))) + (set! (-> a0-17 frame-group) (the-as art-joint-anim s4-1)) + (set! (-> a0-17 param 0) (the float (+ (-> (the-as art-joint-anim s4-1) frames num-frames) -1))) + (set! (-> a0-17 param 1) (-> arg0 0)) + (set! (-> a0-17 frame-num) 0.0) + (joint-control-channel-group! a0-17 (the-as art-joint-anim s4-1) num-func-seek!) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-10 (-> obj draw art-group data (-> obj enemy-info-override knocked-anim))) + (a0-21 (-> obj skel root-channel 0)) + ) + (set! (-> a0-21 frame-group) (the-as art-joint-anim a1-10)) + (set! (-> a0-21 param 0) (the float (+ (-> (the-as art-joint-anim a1-10) frames num-frames) -1))) + (set! (-> a0-21 param 1) (-> arg0 0)) + (set! (-> a0-21 frame-num) 0.0) + (joint-control-channel-group! a0-21 (the-as art-joint-anim a1-10) num-func-seek!) + ) + #t + ) + ) + ) + ) + ) + +;; failed to figure out what this is: +(defstate knocked (flamer) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (set-gravity-length (-> self root-override2 dynam) 368640.0) + (set! (-> self hit-surface?) #f) + (none) + ) + :trans (behavior () + (let ((gp-0 (-> self root-override2))) + (when (logtest? (-> gp-0 status) (collide-status on-surface)) + (when (not (-> self hit-surface?)) + (set! (-> self hit-surface?) #t) + (set! (-> self surface-normal quad) (-> gp-0 poly-normal quad)) + ) + ) + (when (and (-> self hit-surface?) (zero? (-> self hit-points))) + (let ((s4-0 (new 'stack-no-clear 'quaternion))) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (vector-z-quaternion! s5-0 (-> gp-0 quat)) + (forward-up->quaternion s4-0 s5-0 (-> self surface-normal)) + ) + (quaternion-slerp! (-> gp-0 quat) (-> gp-0 quat) s4-0 0.25) + ) + ) + (when (and (nonzero? (-> self hit-points)) + (zero? (-> self fated-time)) + (or (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (and (< (-> self root-override2 trans y) (+ 18432.0 (-> self root-override2 gspot-pos y))) + (< (-> self root-override2 transv y) 0.0) + ) + ) + ) + (set-gravity-length (-> gp-0 dynam) 225280.0) + (vector-reset! (-> gp-0 transv)) + (go-hostile self) + ) + ) + (none) + ) + :post (behavior () + (seek! (-> self sound-volume) 0.0 (* 0.5 (-> self clock seconds-per-frame))) + (flamer-method-187 self) + (let ((t9-2 (-> (method-of-type nav-enemy knocked) post))) + (if t9-2 + ((the-as (function none) t9-2)) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate die-falling (flamer) + :virtual #t + :enter (behavior () + (let ((v1-1 (-> self root-override2 root-prim))) + (set! (-> v1-1 prim-core collide-as) (collide-spec)) + (set! (-> v1-1 prim-core collide-with) (collide-spec)) + ) + 0 + (set! (-> self hit-points) 0) + (if (logtest? (enemy-option knocked-into-water) (-> self fact-info-override enemy-options)) + (set! (-> self enemy-flags) (logior (enemy-flag trackable-backup) (-> self enemy-flags))) + ) + (let ((v1-8 self)) + (set! (-> v1-8 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-8 enemy-flags)))) + ) + 0 + (let ((v1-10 self)) + (set! (-> v1-10 enemy-flags) (the-as enemy-flag (logclear (-> v1-10 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-10 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (enemy-method-103 self) + (none) + ) + ) + +;; definition for method 132 of type flamer +(defmethod dispose! flamer ((obj flamer)) + "Cleans-up the enemy and any associated resources. Potentially spawns skull gems" + (let ((s5-1 (logtest? (enemy-flag recover-applied-velocity) (-> obj enemy-flags)))) + (let ((t9-0 (method-of-type nav-enemy dispose!))) + (t9-0 obj) + ) + (if (not s5-1) + (flamer-method-190 obj) + ) + ) + (none) + ) + +;; definition for method 186 of type flamer +(defmethod flamer-method-186 flamer ((obj flamer) (arg0 float)) + (let ((f0-1 (* (-> obj scale) arg0)) + (v0-0 (-> obj root-override2 scale)) + ) + (set! (-> v0-0 x) f0-1) + (set! (-> v0-0 y) f0-1) + (set! (-> v0-0 z) f0-1) + (set! (-> v0-0 w) 1.0) + v0-0 + ) + ) + +;; definition for method 60 of type flamer +(defmethod coin-flip? flamer ((obj flamer)) + "@returns The result of a 50/50 RNG roll" + #f + ) + +;; definition for method 114 of type flamer +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! flamer ((obj flamer)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (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 4) 0))) + (set! (-> s5-0 total-prims) (the-as uint 5)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) (collide-spec jak player-list)) + (set! (-> s4-0 prim-core action) (collide-action semi-solid deadly)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 26624.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 jak bot player-list)) + (set! (-> v1-14 prim-core action) (collide-action semi-solid deadly)) + (set! (-> v1-14 transform-index) 3) + (set-vector! (-> v1-14 local-sphere) 0.0 0.0 0.0 3481.6) + ) + (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 semi-solid deadly)) + (set! (-> v1-16 transform-index) 19) + (set-vector! (-> v1-16 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-18 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-18 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-18 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-18 prim-core action) (collide-action deadly)) + (set! (-> v1-18 transform-index) 6) + (set-vector! (-> v1-18 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-20 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-20 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-20 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-20 prim-core action) (collide-action deadly)) + (set! (-> v1-20 transform-index) 9) + (set-vector! (-> v1-20 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (set! (-> s5-0 nav-radius) 6144.0) + (let ((v1-22 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-22 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-22 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 7 of type flamer +;; WARN: Return type mismatch process-drawable vs flamer. +(defmethod relocate flamer ((obj flamer) (arg0 int)) + (if (nonzero? (-> obj flit-joint)) + (&+! (-> obj flit-joint) arg0) + ) + (the-as + flamer + ((the-as (function process-drawable int process-drawable) (find-parent-method flamer 7)) obj arg0) + ) + ) + +;; definition for method 115 of type flamer +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! flamer ((obj flamer)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-flamer" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *flamer-nav-enemy-info*) + (set! (-> obj neck up) (the-as uint 1)) + (set! (-> obj neck nose) (the-as uint 2)) + (set! (-> obj neck ear) (the-as uint 0)) + (set! (-> obj scale) 1.6) + (flamer-method-186 obj 1.0) + (logclear! (-> obj nav flags) (nav-control-flag limit-rotation-rate)) + (set! (-> obj sync-off) (the-as uint (get-rand-int obj 600))) + (set! (-> obj flit-angle) 0.0) + (set! (-> obj flit-timer) 0) + (set! (-> obj root-override2 dynam gravity y) 225280.0) + (set! (-> obj root-override2 dynam gravity-length) 225280.0) + (set! (-> obj root-override2 dynam gravity-max) 225280.0) + (let ((v1-25 (-> obj root-override2 trans))) + (set! (-> obj base-pos quad) (-> v1-25 quad)) + (set! (-> v1-25 y) (+ 22528.0 (-> v1-25 y))) + (set! (-> obj idle-pos quad) (-> v1-25 quad)) + ) + (set! (-> obj flit-joint) (the-as joint-mod (new 'process 'joint-mod-set-local obj 3 #t #f #f))) + (set! (-> obj flit-joint twist-min-y) (the-as float #t)) + (let ((f0-7 (res-lump-float (-> obj entity) 'rotoffset))) + (if (!= f0-7 0.0) + (quaternion-rotate-y! (-> obj root-override2 quat) (-> obj root-override2 quat) f0-7) + ) + ) + (let ((f0-8 (quaternion-y-angle (-> obj root-override2 quat)))) + (matrix-rotate-y! (-> obj zone-to-world) f0-8) + ) + (set! (-> obj zone-to-world trans quad) (-> obj root-override2 trans quad)) + (matrix-inverse-of-rot-trans! (-> obj world-to-zone) (-> obj zone-to-world)) + (set! (-> obj formation-entity) (entity-actor-lookup (-> obj entity) 'alt-actor 0)) + (set-vector! (-> obj offset) 0.0 0.0 94208.0 1.0) + (set! (-> obj path) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (set! (-> obj path-pos) 0.0) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! (-> obj sound) + (new 'process 'ambient-sound (static-sound-spec "flamer-loop" :fo-max 80) (-> obj root-override2 trans)) + ) + (set! (-> obj enemy-flags) (logior (enemy-flag multi-focus) (-> obj enemy-flags))) + (let ((v1-45 (-> obj nav))) + (set! (-> v1-45 sphere-mask) (the-as uint 0)) + ) + 0 + (let ((v1-47 (-> obj nav))) + (set! (-> v1-47 nearest-y-threshold) 63488.0) + ) + 0 + (quaternion-copy! (-> obj init-quat) (-> obj root-override2 quat)) + (add-connection + *part-engine* + obj + 19 + obj + 318 + (new 'static 'vector :x 819.2 :y -1187.84 :z 2088.96 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 19 + obj + 318 + (new 'static 'vector :x -819.2 :y -1187.84 :z 2088.96 :w 163840.0) + ) + (add-connection *part-engine* obj 9 obj 768 (new 'static 'vector :w 163840.0)) + 0 + (none) + ) + +;; definition for method 116 of type flamer +;; WARN: Return type mismatch int vs none. +(defmethod go-idle flamer ((obj flamer)) + (if (-> obj formation-entity) + (go (method-of-object obj wait-for-formation)) + (go (method-of-object obj idle)) + ) + 0 + (none) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy-battle_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy-battle_REF.gc new file mode 100644 index 0000000000..992b1161a1 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy-battle_REF.gc @@ -0,0 +1,371 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type hover-enemy-battle-command +(deftype hover-enemy-battle-command (structure) + ((command symbol :offset-assert 0) + (wave uint16 :offset-assert 4) + (time time-frame :offset-assert 8) + (alive-count int32 :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x14 + :flag-assert #x900000014 + ) + +;; definition for method 3 of type hover-enemy-battle-command +(defmethod inspect hover-enemy-battle-command ((obj hover-enemy-battle-command)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'hover-enemy-battle-command) + (format #t "~1Tcommand: ~A~%" (-> obj command)) + (format #t "~1Twave: ~D~%" (-> obj wave)) + (format #t "~1Ttime: ~D~%" (-> obj time)) + (format #t "~1Talive-count: ~D~%" (-> obj alive-count)) + (label cfg-4) + obj + ) + +;; definition of type hover-enemy-manager +(deftype hover-enemy-manager (process) + ((command-table (array hover-enemy-battle-command) :offset-assert 128) + (path path-control :offset-assert 132) + (formation hover-formation-control :offset-assert 136) + (actor-group (pointer actor-group) :offset-assert 140) + (actor-group-count int32 :offset-assert 144) + (total-to-spawn int32 :offset-assert 148) + (num-spawned int32 :offset-assert 152) + (alive-count int32 :offset-assert 156) + (formation-timer time-frame :offset-assert 160) + ) + :heap-base #x30 + :method-count-assert 19 + :size-assert #xa8 + :flag-assert #x13003000a8 + (:methods + (idle () _type_ :state 14) + (spawning (object object process pointer) _type_ :state 15) + (die () _type_ :state 16) + (hover-enemy-manager-init! (_type_ (array hover-enemy-battle-command)) none 17) + (spawn-enemy (_type_ uint) none 18) + ) + ) + +;; definition for method 3 of type hover-enemy-manager +(defmethod inspect hover-enemy-manager ((obj hover-enemy-manager)) + (when (not obj) + (set! obj obj) + (goto cfg-7) + ) + (let ((t9-0 (method-of-type process inspect))) + (t9-0 obj) + ) + (format #t "~2Tcommand-table: ~A~%" (-> obj command-table)) + (format #t "~2Tpath: ~A~%" (-> obj path)) + (format #t "~2Tformation: ~A~%" (-> obj formation)) + (format #t "~2Tactor-group: #x~X~%" (-> obj actor-group)) + (dotimes (s5-0 (-> obj actor-group-count)) + (format #t "~T [~D]~2Tactor-group: ~`actor-group`P~%" s5-0 (-> obj actor-group s5-0)) + ) + (format #t "~2Tactor-group-count: ~D~%" (-> obj actor-group-count)) + (format #t "~2Ttotal-to-spawn: ~D~%" (-> obj total-to-spawn)) + (format #t "~2Tnum-spawned: ~D~%" (-> obj num-spawned)) + (format #t "~2Talive-count: ~D~%" (-> obj alive-count)) + (format #t "~2Tformation-timer: ~D~%" (-> obj formation-timer)) + (label cfg-7) + obj + ) + +;; definition for function hover-enemy-manager-handler +(defbehavior hover-enemy-manager-handler hover-enemy-manager ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (local-vars (v0-0 object)) + (case arg2 + (('join 'leave 'set-type 'get-formation 'set-los) + (when (-> self formation) + (let ((v1-2 (-> self formation)) + (a1-8 arg0) + ) + (case arg2 + (('join) + (hover-formation-control-method-17 v1-2 a1-8) + ) + (('leave) + (hover-formation-control-method-18 v1-2 a1-8) + ) + (('set-type) + (let ((a1-11 1)) + (case (-> arg3 param 0) + (('line) + (set! a1-11 0) + ) + (('circle) + (set! a1-11 2) + ) + (('semicircle) + (set! a1-11 3) + ) + ) + (try-update-formation-type v1-2 (the-as formation-type a1-11)) + ) + ) + (('get-formation) + v1-2 + ) + (('set-los) + (cond + ((-> arg3 param 0) + (set! v0-0 (logior (-> v1-2 flags) 2)) + (set! (-> v1-2 flags) (the-as uint v0-0)) + ) + (else + (set! v0-0 (logand -3 (-> v1-2 flags))) + (set! (-> v1-2 flags) (the-as uint v0-0)) + ) + ) + v0-0 + ) + ) + ) + ) + ) + (('num-alive?) + (-> self alive-count) + ) + (('num-spawned?) + (-> self num-spawned) + ) + (('total-to-spawn?) + (-> self total-to-spawn) + ) + (('hover-die) + (set! v0-0 (max 0 (+ (-> self alive-count) -1))) + (set! (-> self alive-count) (the-as int v0-0)) + v0-0 + ) + (('path) + (if (not (logtest? (-> self path flags) (path-control-flag not-found))) + (-> self path) + ) + ) + ) + ) + +;; definition for function hover-enemy-manager-post +(defbehavior hover-enemy-manager-post hover-enemy-manager () + (when (-> self formation) + (let ((gp-0 (-> self formation))) + (let ((a0-0 gp-0)) + ((the-as (function hover-formation-control none) (method-of-object a0-0 hover-formation-control-method-14)) + a0-0 + ) + ) + (when (and (logtest? (-> gp-0 flags) 2) + (>= (- (-> self clock frame-counter) (-> self formation-timer)) (seconds 0.2)) + ) + (hover-formation-control-method-11 gp-0) + (set! (-> self formation-timer) (-> self clock frame-counter)) + ) + ) + ) + (if (not (logtest? (-> self path flags) (path-control-flag not-found))) + (debug-draw (-> self path)) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate idle (hover-enemy-manager) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('trigger) + (go-virtual spawning proc arg1 (the-as process event-type) (the-as pointer event)) + ) + (else + (hover-enemy-manager-handler proc arg1 event-type event) + ) + ) + ) + :code (the-as (function none :behavior hover-enemy-manager) sleep-code) + :post hover-enemy-manager-post + ) + +;; failed to figure out what this is: +(defstate spawning (hover-enemy-manager) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('spawning?) + #t + ) + (else + (hover-enemy-manager-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior ((arg0 object) (arg1 object) (arg2 process) (arg3 pointer)) + (let ((a0-1 (-> self formation))) + (if a0-1 + (set-anchor-proc a0-1 (process->handle *target*)) + ) + ) + (none) + ) + :code (behavior ((arg0 object) (arg1 object) (arg2 process) (arg3 pointer)) + (let ((gp-0 (-> self command-table))) + (dotimes (s5-0 (-> gp-0 length)) + (case (-> gp-0 s5-0 command) + (('spawn) + (spawn-enemy self (-> gp-0 s5-0 wave)) + ) + (('wait) + ) + ) + (let ((s4-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s4-0) (-> gp-0 s5-0 time)) + (suspend) + ) + ) + (while (< (-> gp-0 s5-0 alive-count) (-> self alive-count)) + (suspend) + ) + ) + ) + (let ((gp-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-1) (seconds 2)) + (suspend) + ) + ) + (go-virtual die) + (none) + ) + :post hover-enemy-manager-post + ) + +;; failed to figure out what this is: +(defstate die (hover-enemy-manager) + :virtual #t + :event hover-enemy-manager-handler + :code (behavior () + (while (-> self child) + (suspend) + ) + (process-entity-status! self (entity-perm-status dead) #t) + (none) + ) + ) + +;; definition for method 18 of type hover-enemy-manager +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod spawn-enemy hover-enemy-manager ((obj hover-enemy-manager) (arg0 uint)) + (when (< arg0 (the-as uint (-> obj actor-group-count))) + (dotimes (s4-0 (-> obj actor-group arg0 length)) + (let* ((s1-0 (-> obj actor-group arg0 data s4-0 actor)) + (s2-0 (-> (the-as entity-actor s1-0) etype)) + (s3-0 (new 'stack-no-clear 'transformq)) + ) + (set! (-> s3-0 trans quad) (-> s1-0 extra trans quad)) + (quaternion-copy! (-> s3-0 quat) (-> (the-as entity-actor s1-0) quat)) + (set! (-> s3-0 scale x) (the-as float s1-0)) + (set! (-> s3-0 scale y) (the-as float #f)) + (set! (-> s3-0 scale z) (the-as float #t)) + (let ((s1-1 (get-process *default-dead-pool* s2-0 #x4000))) + (when (when s1-1 + (let ((t9-2 (method-of-type process activate))) + (t9-2 s1-1 obj (symbol->string (-> s2-0 symbol)) (the-as pointer #x70004000)) + ) + (run-now-in-process s1-1 enemy-init-by-other obj s3-0) + (-> s1-1 ppointer) + ) + (+! (-> obj alive-count) 1) + (+! (-> obj num-spawned) 1) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 7 of type hover-enemy-manager +;; WARN: Return type mismatch process vs hover-enemy-manager. +(defmethod relocate hover-enemy-manager ((obj hover-enemy-manager) (arg0 int)) + (when (-> obj formation) + (if (nonzero? (-> obj formation)) + (&+! (-> obj formation) arg0) + ) + ) + (if (nonzero? (-> obj path)) + (&+! (-> obj path) arg0) + ) + (the-as + hover-enemy-manager + ((the-as (function process int process) (find-parent-method hover-enemy-manager 7)) obj arg0) + ) + ) + +;; definition for method 17 of type hover-enemy-manager +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-manager-init! hover-enemy-manager ((obj hover-enemy-manager) (arg0 (array hover-enemy-battle-command))) + "Initialize this [[hover-enemy-manager]]." + (local-vars (sv-16 res-tag)) + (with-pp + (set! (-> obj command-table) arg0) + (set! (-> obj path) (new 'process 'path-control obj 'path 0.0 (-> obj entity) #f)) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-5 (res-lump-data (-> obj entity) 'actor-groups pointer :tag-ptr (& sv-16)))) + (cond + ((and v1-5 (nonzero? (-> sv-16 elt-count))) + (set! (-> obj actor-group) (the-as (pointer actor-group) v1-5)) + (set! (-> obj actor-group-count) (the-as int (-> sv-16 elt-count))) + ) + (else + (set! (-> obj actor-group) (the-as (pointer actor-group) #f)) + (set! (-> obj actor-group-count) 0) + 0 + ) + ) + ) + (set! (-> obj total-to-spawn) 0) + (set! (-> obj num-spawned) 0) + (when (-> obj command-table) + (let ((v1-13 (-> obj command-table))) + (dotimes (a0-6 (-> v1-13 length)) + (if (= (-> v1-13 a0-6 command) 'spawn) + (+! (-> obj total-to-spawn) (-> obj actor-group (-> v1-13 a0-6 wave) length)) + ) + ) + ) + ) + (set! (-> obj formation) #f) + (set! (-> obj formation-timer) (-> pp clock frame-counter)) + (set! (-> obj alive-count) 0) + 0 + (none) + ) + ) + +;; definition for function hover-enemy-manager-init-by-other +;; WARN: Return type mismatch object vs none. +(defbehavior hover-enemy-manager-init-by-other hover-enemy-manager ((arg0 entity-actor) (arg1 (array hover-enemy-battle-command))) + (set! (-> self entity) arg0) + (hover-enemy-manager-init! self arg1) + (go-virtual idle) + (none) + ) + +;; definition for function hover-manager-spawn +;; WARN: Return type mismatch process-tree vs process. +(defun hover-manager-spawn ((arg0 turret) (arg1 entity-actor) (arg2 (array hover-enemy-battle-command))) + (the-as process (ppointer->process (process-spawn hover-enemy-manager arg1 arg2 :to arg0))) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy-h_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy-h_REF.gc index a3dddec6fd..1b8476b462 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy-h_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy-h_REF.gc @@ -44,57 +44,57 @@ ;; definition of type hover-enemy (deftype hover-enemy (enemy) - ((hover basic :offset-assert 532) - (hover-info hover-enemy-info :offset-assert 536) - (formation-entity basic :offset-assert 540) - (fly-anim-speed float :offset-assert 544) - (restart-fly-anims basic :offset-assert 548) - (main-joint-acc vector :inline :offset-assert 560) - (main-joint-vel vector :inline :offset-assert 576) - (main-joint-pos vector :inline :offset-assert 592) - (thrust int64 2 :offset-assert 608) - (rotation-vec vector :inline :offset-assert 624) - (dest-pos vector :inline :offset-assert 640) - (offset vector :inline :offset-assert 656) - (surface-normal vector :inline :offset-assert 672) - (local-dir vector :inline :offset-assert 688) - (scale float :offset-assert 704) - (scale-timer uint64 :offset-assert 712) - (hit-surface? basic :offset-assert 720) - (knocked-start-level float :offset-assert 724) - (knocked-fall-dist float :offset-assert 728) - (flying-death-anim int32 :offset-assert 732) - (flying-death-transv vector :inline :offset-assert 736) - (flying-death-engine int32 :offset-assert 752) - (flying-death-thrust-rotate float :offset-assert 756) - (flying-death-spin float :offset-assert 760) - (flying-death-spin-dest float :offset-assert 764) - (flying-death-spin-axis vector :inline :offset-assert 768) + ((hover hover-nav-control :offset-assert 532) + (hover-info hover-enemy-info :offset-assert 536) + (formation-entity entity :offset-assert 540) + (fly-anim-speed float :offset-assert 544) + (restart-fly-anims symbol :offset-assert 548) + (main-joint-acc vector :inline :offset-assert 560) + (main-joint-vel vector :inline :offset-assert 576) + (main-joint-pos vector :inline :offset-assert 592) + (thrust float 2 :offset-assert 608) + (rotation-vec vector :inline :offset-assert 624) + (dest-pos vector :inline :offset-assert 640) + (offset vector :inline :offset-assert 656) + (surface-normal vector :inline :offset-assert 672) + (local-dir vector :inline :offset-assert 688) + (scale float :offset-assert 704) + (scale-timer uint64 :offset-assert 712) + (hit-surface? symbol :offset-assert 720) + (knocked-start-level float :offset-assert 724) + (knocked-fall-dist float :offset-assert 728) + (flying-death-anim int32 :offset-assert 732) + (flying-death-transv vector :inline :offset-assert 736) + (flying-death-engine int32 :offset-assert 752) + (flying-death-thrust-rotate float :offset-assert 756) + (flying-death-spin float :offset-assert 760) + (flying-death-spin-dest float :offset-assert 764) + (flying-death-spin-axis vector :inline :offset-assert 768) ) :heap-base #x290 :method-count-assert 156 :size-assert #x310 :flag-assert #x9c02900310 (:methods - (hover-enemy-method-137 () none 137) - (hover-enemy-method-138 () none 138) - (hover-enemy-method-139 () none 139) - (hover-enemy-method-140 () none 140) - (hover-enemy-method-141 () none 141) - (hover-enemy-method-142 () none 142) - (hover-enemy-method-143 () none 143) - (hover-enemy-method-144 () none 144) - (hover-enemy-method-145 () none 145) - (hover-enemy-method-146 () none 146) - (hover-enemy-method-147 () none 147) - (hover-enemy-method-148 () none 148) - (hover-enemy-method-149 () none 149) - (hover-enemy-method-150 () none 150) - (hover-enemy-method-151 () none 151) - (hover-enemy-method-152 () none 152) - (hover-enemy-method-153 () none 153) - (hover-enemy-method-154 () none 154) - (hover-enemy-method-155 () none 155) + (knocked-recover () _type_ :state 137) + (flying-death () _type_ :state 138) + (flying-death-explode () _type_ :state 139) + (hover-enemy-method-140 (_type_ symbol) none 140) + (hover-enemy-method-141 (_type_ float) none 141) + (hover-enemy-method-142 (_type_) none 142) + (hover-enemy-method-143 (_type_ int float) none 143) + (hover-enemy-method-144 (_type_) none 144) + (hover-enemy-method-145 (_type_ int float int int) none 145) + (hover-enemy-method-146 (_type_) none 146) + (hover-enemy-method-147 (_type_) none 147) + (hover-enemy-method-148 (_type_) none 148) + (hover-enemy-method-149 (_type_) none 149) + (hover-enemy-method-150 (_type_) enemy-info 150) + (hover-enemy-method-151 (_type_) hover-enemy-info 151) + (hover-enemy-method-152 (_type_) hover-nav-params 152) + (hover-enemy-method-153 (_type_) none 153) + (hover-enemy-method-154 (_type_) none 154) + (hover-enemy-method-155 (_type_) none 155) ) ) @@ -139,7 +139,3 @@ ;; failed to figure out what this is: 0 - - - - diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy_REF.gc new file mode 100644 index 0000000000..8e201a26e6 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy_REF.gc @@ -0,0 +1,1115 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for method 74 of type hover-enemy +;; INFO: Used lq/sq +(defmethod general-event-handler hover-enemy ((obj hover-enemy) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (local-vars (v1-41 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (case arg2 + (('hit 'hit-knocked 'hit-flinch) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (cond + ((zero? (-> obj hit-points)) + (if (rng-hit? obj 0.4) + (go (method-of-object obj flying-death)) + (go (method-of-object obj flying-death-explode)) + ) + ) + (else + (go (method-of-object obj knocked)) + ) + ) + #t + ) + (('update-formation) + (let ((s5-1 (the-as object (-> arg3 param 0)))) + (let* ((f0-0 409.6) + (f0-2 (* f0-0 f0-0)) + ) + (.lvf vf1 (&-> (vector-! (new 'stack-no-clear 'vector) (the-as vector s5-1) (-> obj offset)) quad)) + (.add.w.vf vf2 vf0 vf0 :mask #b1) + (.mul.vf vf1 vf1 vf1) + (.mul.x.vf acc vf2 vf1 :mask #b1) + (.add.mul.y.vf acc vf2 vf1 acc :mask #b1) + (.add.mul.z.vf vf1 vf2 vf1 acc :mask #b1) + (.mov v1-41 vf1) + (if (< f0-2 v1-41) + (hover-nav-control-method-21 (-> obj hover)) + ) + ) + (let ((v0-7 (the-as object (-> obj offset)))) + (set! (-> (the-as vector v0-7) quad) (-> (the-as vector s5-1) quad)) + v0-7 + ) + ) + ) + (('get-hover-nav-sphere) + (if (not (and (-> obj next-state) (let ((v1-49 (-> obj next-state name))) + (or (= v1-49 'dormant) (= v1-49 'dormant-aware)) + ) + ) + ) + (-> (the-as collide-shape-prim-group (-> obj root-override2 root-prim)) + child + (-> obj hover params nav-collide-prim-index) + prim-core + ) + ) + ) + (else + ((method-of-type enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +;; definition for function hover-enemy-dest-post +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defbehavior hover-enemy-dest-post hover-enemy () + (local-vars (at-0 int) (at-1 int)) + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (let ((a1-1 (hover-nav-control-method-16 (-> self hover) (new 'stack-no-clear 'vector))) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (vector-flatten! gp-0 a1-1 *y-vector*) + (let ((f28-0 (lerp-scale -10922.667 10922.667 (-> gp-0 z) -1.0 1.0)) + (f30-0 (lerp-scale 10922.667 -10922.667 (-> gp-0 x) -1.0 1.0)) + ) + (set! (-> self rotation-vec x) + (deg-seek (-> self rotation-vec x) f28-0 (* 5461.3335 (-> self clock seconds-per-frame))) + ) + (set! (-> self rotation-vec z) + (deg-seek (-> self rotation-vec z) f30-0 (* 6371.5557 (-> self clock seconds-per-frame))) + ) + ) + ) + (let ((s4-1 (vector-! (new 'stack-no-clear 'vector) (-> self focus-pos) (-> self root-override2 trans)))) + (vector-normalize! s4-1 1.0) + (set! (-> self rotation-vec y) + (deg-seek (-> self rotation-vec y) (vector-y-angle s4-1) (* 14563.556 (-> self clock seconds-per-frame))) + ) + ) + (hover-enemy-method-146 self) + (hover-nav-control-method-12 (-> self hover)) + (enemy-simple-post) + (let ((a0-14 + (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data (-> self hover-info main-joint))) + ) + (v1-18 (new 'stack-no-clear 'vector)) + ) + (let ((a1-10 (new 'stack-no-clear 'vector))) + (vector-! v1-18 a0-14 (-> self main-joint-pos)) + (let ((a2-7 v1-18)) + (.lvf vf1 (&-> v1-18 quad)) + (let ((f0-14 (-> self clock frames-per-second))) + (.mov at-0 f0-14) + ) + (.mov vf2 at-0) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a2-7 quad) vf1) + ) + (vector-! a1-10 v1-18 (-> self main-joint-vel)) + (let ((a2-9 (-> self main-joint-acc))) + (.lvf vf1 (&-> a1-10 quad)) + (let ((f0-15 (-> self clock frames-per-second))) + (.mov at-1 f0-15) + ) + (.mov vf2 at-1) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a2-9 quad) vf1) + ) + ) + (set! (-> self main-joint-pos quad) (-> a0-14 quad)) + (set! (-> self main-joint-vel quad) (-> v1-18 quad)) + ) + 0 + (hover-enemy-method-142 self) + 0 + (none) + ) + ) + +;; definition for function hover-enemy-hostile-post +;; INFO: Used lq/sq +(defbehavior hover-enemy-hostile-post hover-enemy () + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) (process->ppointer self)) + (set! (-> a1-0 num-params) 0) + (set! (-> a1-0 message) 'get-formation) + (let* ((t9-0 send-event-function) + (v1-2 (-> self formation-entity)) + (a0-2 (the-as hover-formation (t9-0 + (if v1-2 + (-> v1-2 extra process) + ) + a1-0 + ) + ) + ) + (gp-0 (-> self dest-pos)) + ) + (cond + (a0-2 + (hover-formation-method-15 a0-2 gp-0 (-> self offset)) + ) + (else + (let* ((s5-0 (handle->process (-> self focus handle))) + (a0-7 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (cond + (a0-7 + (let* ((s5-1 (get-trans (the-as process-focusable a0-7) 3)) + (a0-9 (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) s5-1)) + ) + (vector+! gp-0 s5-1 (vector-rotate-y! (new 'stack-no-clear 'vector) (-> self offset) (vector-y-angle a0-9))) + ) + ) + (else + (set! (-> gp-0 quad) (-> self root-override2 trans quad)) + ) + ) + ) + ) + ) + (hover-nav-control-method-11 (-> self hover) gp-0) + ) + ) + (hover-enemy-dest-post) + (none) + ) + +;; definition for method 142 of type hover-enemy +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-142 hover-enemy ((obj hover-enemy)) + 0 + (none) + ) + +;; definition for method 153 of type hover-enemy +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-153 hover-enemy ((obj hover-enemy)) + (let* ((v1-0 (-> obj formation-entity)) + (a0-1 (if v1-0 + (-> v1-0 extra process) + ) + ) + ) + (if a0-1 + (send-event a0-1 'join) + ) + ) + 0 + (none) + ) + +;; definition for method 154 of type hover-enemy +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-154 hover-enemy ((obj hover-enemy)) + (let* ((v1-0 (-> obj formation-entity)) + (a0-1 (if v1-0 + (-> v1-0 extra process) + ) + ) + ) + (if a0-1 + (send-event a0-1 'leave) + ) + ) + 0 + (none) + ) + +;; definition for method 60 of type hover-enemy +(defmethod coin-flip? hover-enemy ((obj hover-enemy)) + "@returns The result of a 50/50 RNG roll" + #f + ) + +;; definition for method 144 of type hover-enemy +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-144 hover-enemy ((obj hover-enemy)) + (set! (-> obj main-joint-pos quad) (-> obj root-override2 trans quad)) + (set! (-> obj main-joint-vel quad) (the-as uint128 0)) + (set! (-> obj main-joint-acc quad) (the-as uint128 0)) + (set! (-> obj thrust 0) 0.0) + (set! (-> obj thrust 1) 0.0) + 0 + (none) + ) + +;; definition for method 145 of type hover-enemy +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-145 hover-enemy ((obj hover-enemy) (arg0 int) (arg1 float) (arg2 int) (arg3 int)) + (local-vars (v1-1 int)) + 0 + (if (< 0.0 arg1) + (set! v1-1 arg2) + (set! v1-1 arg3) + ) + (let ((a3-5 (-> obj skel root-channel arg0))) + (let ((f0-2 (fabs arg1))) + (set! (-> a3-5 frame-interp 1) f0-2) + (set! (-> a3-5 frame-interp 0) f0-2) + ) + (set! (-> a3-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data v1-1))) + (set! (-> a3-5 param 0) 0.0) + (set! (-> a3-5 frame-num) (-> obj skel root-channel 0 frame-num)) + (joint-control-channel-group! a3-5 (the-as art-joint-anim (-> obj draw art-group data v1-1)) num-func-chan) + ) + (none) + ) + +;; definition for method 129 of type hover-enemy +;; INFO: Used lq/sq +;; WARN: Return type mismatch vector vs none. +(defmethod enemy-method-129 hover-enemy ((obj hover-enemy)) + (local-vars (s5-0 vector)) + (let ((t9-0 (method-of-type enemy enemy-method-129))) + (t9-0 obj) + ) + (let ((a0-3 (handle->process (-> obj focus handle)))) + (set! s5-0 (when a0-3 + (set! s5-0 (-> obj focus-pos)) + (set! (-> s5-0 quad) (-> (get-trans (the-as process-focusable a0-3) 3) quad)) + s5-0 + ) + ) + ) + (none) + ) + +;; definition for method 55 of type hover-enemy +(defmethod track-target! hover-enemy ((obj hover-enemy)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (hover-enemy-method-148 obj) + (enemy-method-129 obj) + (let ((t9-2 (method-of-type enemy track-target!))) + (t9-2 obj) + ) + (hover-nav-control-method-13 (-> obj hover)) + (none) + ) + +;; definition for method 148 of type hover-enemy +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-148 hover-enemy ((obj hover-enemy)) + (cond + ((and (-> obj draw shadow) (logtest? (-> obj draw status) (draw-control-status on-screen))) + (new 'stack-no-clear 'vector) + (new 'stack-no-clear 'vector) + (let ((s4-0 (new 'stack-no-clear 'collide-query)) + (gp-0 (-> obj draw shadow-ctrl settings shadow-dir)) + (f30-0 122880.0) + ) + (set! (-> s4-0 start-pos quad) (-> obj root-override2 trans quad)) + (vector-normalize-copy! (-> s4-0 move-dist) gp-0 f30-0) + (let ((v1-10 s4-0)) + (set! (-> v1-10 radius) 2048.0) + (set! (-> v1-10 collide-with) (collide-spec backgnd)) + (set! (-> v1-10 ignore-process0) obj) + (set! (-> v1-10 ignore-process1) #f) + (set! (-> v1-10 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-10 action-mask) (collide-action solid)) + ) + (let ((f0-1 (fill-and-probe-using-line-sphere *collide-cache* s4-0))) + (cond + ((>= f0-1 0.0) + (let ((v1-14 (-> obj draw shadow-ctrl))) + (logclear! (-> v1-14 settings flags) (shadow-flags disable-draw)) + ) + 0 + (-> s4-0 best-other-tri intersect) + (let ((a1-3 (-> obj root-override2 trans))) + (-> a1-3 y) + (let ((f0-2 (* f0-1 f30-0))) + (shadow-control-method-14 + (-> obj draw shadow-ctrl) + a1-3 + gp-0 + (- (+ 81920.0 f30-0)) + (+ -12288.0 f0-2) + (+ 12288.0 f0-2) + ) + ) + ) + ) + (else + (let ((v1-25 (-> obj draw shadow-ctrl))) + (logior! (-> v1-25 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + ) + ) + ) + (else + (let ((v1-28 (-> obj draw shadow-ctrl))) + (logior! (-> v1-28 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + 0 + (none) + ) + +;; definition for function hover-enemy-fly-code +;; WARN: Return type mismatch symbol vs none. +;; WARN: new jak 2 until loop case, check carefully +(defbehavior hover-enemy-fly-code hover-enemy () + (let ((gp-0 (-> self draw art-group data (-> self enemy-info idle-anim)))) + (cond + ((-> self restart-fly-anims) + (ja-channel-push! 3 (seconds 0.2)) + (ja-no-eval :group! gp-0 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1)) (-> self fly-anim-speed)) + :frame-num 0.0 + ) + (let ((a0-4 (-> self skel root-channel 1))) + (let ((f0-4 0.0)) + (set! (-> a0-4 frame-interp 1) f0-4) + (set! (-> a0-4 frame-interp 0) f0-4) + ) + (set! (-> a0-4 frame-group) (the-as art-joint-anim gp-0)) + (set! (-> a0-4 param 0) (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> self fly-anim-speed)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim gp-0) num-func-seek!) + ) + (let ((a0-5 (-> self skel root-channel 2))) + (let ((f0-9 0.0)) + (set! (-> a0-5 frame-interp 1) f0-9) + (set! (-> a0-5 frame-interp 0) f0-9) + ) + (set! (-> a0-5 frame-group) (the-as art-joint-anim gp-0)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> self fly-anim-speed)) + (set! (-> a0-5 frame-num) 0.0) + (joint-control-channel-group! a0-5 (the-as art-joint-anim gp-0) num-func-seek!) + ) + (set! (-> self restart-fly-anims) #f) + ) + (else + (ja-no-eval :group! gp-0 :num! (loop! (-> self fly-anim-speed))) + (let ((a0-7 (-> self skel root-channel 1))) + (let ((f0-15 0.0)) + (set! (-> a0-7 frame-interp 1) f0-15) + (set! (-> a0-7 frame-interp 0) f0-15) + ) + (set! (-> a0-7 frame-group) (the-as art-joint-anim gp-0)) + (set! (-> a0-7 param 0) (-> self fly-anim-speed)) + (joint-control-channel-group! a0-7 (the-as art-joint-anim gp-0) num-func-loop!) + ) + (let ((a0-8 (-> self skel root-channel 2))) + (let ((f0-17 0.0)) + (set! (-> a0-8 frame-interp 1) f0-17) + (set! (-> a0-8 frame-interp 0) f0-17) + ) + (set! (-> a0-8 frame-group) (the-as art-joint-anim gp-0)) + (set! (-> a0-8 param 0) (-> self fly-anim-speed)) + (joint-control-channel-group! a0-8 (the-as art-joint-anim gp-0) num-func-loop!) + ) + (ja :num! (loop!)) + ) + ) + ) + (until #f + (let ((s5-0 (hover-nav-control-method-16 (-> self hover) (new 'stack-no-clear 'vector))) + (gp-1 (-> self hover-info)) + ) + (seek! (-> self local-dir x) (-> s5-0 x) (* 1.3 (-> self clock seconds-per-frame))) + (seek! (-> self local-dir z) (-> s5-0 z) (* 1.3 (-> self clock seconds-per-frame))) + (hover-enemy-method-145 self 1 (-> self local-dir x) (-> gp-1 fly-left-anim) (-> gp-1 fly-right-anim)) + (hover-enemy-method-145 self 2 (-> self local-dir z) (-> gp-1 fly-forward-anim) (-> gp-1 fly-backward-anim)) + ) + (suspend) + (ja :num! (loop! (-> self fly-anim-speed))) + ) + #f + (none) + ) + +;; failed to figure out what this is: +(defstate ambush (hover-enemy) + :virtual #t + :enter (behavior () + (logior! (-> self enemy-flags) (enemy-flag use-notice-distance)) + (hover-enemy-method-140 self #f) + (if (logtest? (-> self path flags) (path-control-flag not-found)) + (go process-drawable-art-error "no path") + ) + (set! (-> self scale-timer) (the-as uint (-> self clock frame-counter))) + (cond + ((not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (logclear! (-> self enemy-flags) (enemy-flag enable-on-active)) + (hover-enemy-method-141 self 0.0) + ) + (else + (hover-enemy-method-141 self 1.0) + ) + ) + (let* ((gp-0 *target*) + (s1-0 (if (type? gp-0 process-focusable) + gp-0 + ) + ) + (gp-1 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s4-0 (-> self root-override2)) + (s5-0 (get-point-at-percent-along-path! (-> self path) (new 'stack-no-clear 'vector) 0.0 'interp)) + ) + (let ((s0-0 (get-point-at-percent-along-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp)) + (s3-1 + (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) + child + (-> (hover-enemy-method-152 self) nav-collide-prim-index) + local-sphere + ) + ) + ) + (if s1-0 + (set! (-> self focus-pos quad) (-> (get-trans s1-0 3) quad)) + (set! (-> self focus-pos quad) (-> s0-0 quad)) + ) + (vector-! s2-0 (-> self focus-pos) (-> s4-0 trans)) + (vector-normalize! s2-0 1.0) + (set-vector! (-> self rotation-vec) (- (vector-x-angle s2-0)) (vector-y-angle s2-0) 0.0 0.0) + (hover-enemy-method-146 self) + (set! (-> s4-0 trans quad) (-> s5-0 quad)) + (if (logtest? (-> self fact-info-override enemy-options) (enemy-option user0)) + (vector-! + (-> s4-0 trans) + (-> s4-0 trans) + (vector-orient-by-quat! (new 'stack-no-clear 'vector) s3-1 (-> s4-0 quat)) + ) + ) + ) + (displacement-between-points-at-percent-normalized! (-> self path) gp-1 0.0) + (hover-nav-control-method-10 + (-> self hover) + s5-0 + gp-1 + (vector-normalize-copy! (new 'stack-no-clear 'vector) gp-1 (* 0.8 (-> self hover params max-speed))) + ) + ) + (hover-enemy-method-144 self) + (hover-nav-control-method-18 (-> self hover) (-> self path) -1 -1) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :exit (behavior () + (local-vars (v1-5 enemy-flag)) + (hover-nav-control-method-20 (-> self hover)) + (hover-enemy-method-140 self #t) + (let ((v1-4 (-> self enemy-flags))) + (if (logtest? v1-4 (enemy-flag checking-water)) + (set! v1-5 (logior v1-4 (enemy-flag enable-on-active))) + (set! v1-5 (logclear v1-4 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-5) + (hover-enemy-method-153 self) + (none) + ) + :trans (behavior () + (when (hover-nav-control-method-23 (-> self hover)) + (hover-enemy-method-153 self) + (if (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (hover-enemy-method-141 self 1.0) + ) + (go-virtual hostile) + ) + (none) + ) + :code hover-enemy-fly-code + :post (behavior () + (local-vars (v1-19 enemy-flag)) + (when (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (let ((f0-1 (the float (- (-> self clock frame-counter) (the-as int (-> self scale-timer))))) + (f1-0 1200.0) + ) + (when (< f0-1 f1-0) + (let ((f30-0 (fmin 1.0 (/ (+ 30.0 f0-1) f1-0)))) + (hover-enemy-method-141 self f30-0) + (when (and (not (logtest? (-> self enemy-flags) (enemy-flag enable-on-active))) (>= f30-0 1.0)) + (let ((v1-18 (-> self enemy-flags))) + (if (logtest? v1-18 (enemy-flag checking-water)) + (set! v1-19 (logior v1-18 (enemy-flag enable-on-active))) + (set! v1-19 (logclear v1-18 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-19) + ) + ) + ) + ) + ) + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate notice (hover-enemy) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((gp-0 (new 'stack-no-clear 'vector)) + (a0-0 *target*) + (s5-0 (-> self root-override2 trans)) + ) + (if a0-0 + (vector-normalize! (vector-! gp-0 (get-trans a0-0 3) s5-0) 1.0) + (vector-z-quaternion! gp-0 (-> self root-override2 quat)) + ) + (hover-nav-control-method-10 (-> self hover) s5-0 gp-0 (the-as vector #t)) + ) + (hover-enemy-method-144 self) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type enemy notice) exit))) + (if t9-0 + (t9-0) + ) + ) + (hover-enemy-method-153 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (hover-enemy) + :virtual #t + :code hover-enemy-fly-code + :post hover-enemy-hostile-post + ) + +;; failed to figure out what this is: +(defstate knocked (hover-enemy) + :virtual #t + :enter (behavior () + (let* ((t9-0 find-parent-method) + (a0-0 hover-enemy) + (t9-1 (-> (the-as state (t9-0 a0-0 30)) enter)) + ) + (if t9-1 + ((the-as (function enemy none) t9-1) (the-as enemy a0-0)) + ) + ) + (set! (-> self hit-surface?) #f) + (set! (-> self knocked-start-level) (-> self root-override2 trans y)) + (none) + ) + :exit (behavior () + (let ((t9-1 (-> (the-as state (find-parent-method hover-enemy 30)) exit))) + (if t9-1 + (t9-1) + ) + ) + (set! (-> self hit-surface?) #f) + (none) + ) + :trans (behavior () + (let ((gp-0 (-> self root-override2))) + (when (logtest? (-> gp-0 status) (collide-status on-surface)) + (when (not (-> self hit-surface?)) + (set! (-> self hit-surface?) #t) + (set! (-> self surface-normal quad) (-> gp-0 poly-normal quad)) + ) + ) + (when (and (-> self hit-surface?) (zero? (-> self hit-points))) + (let ((s4-0 (new 'stack-no-clear 'quaternion))) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (vector-z-quaternion! s5-0 (-> gp-0 quat)) + (forward-up->quaternion s4-0 s5-0 (-> self surface-normal)) + ) + (quaternion-slerp! (-> gp-0 quat) (-> gp-0 quat) s4-0 0.25) + ) + ) + ) + (if (and (nonzero? (-> self hit-points)) + (zero? (-> self fated-time)) + (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (< (-> self root-override2 trans y) (- (-> self knocked-start-level) (-> self knocked-fall-dist))) + ) + (go-virtual knocked-recover) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate knocked-recover (hover-enemy) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior hover-enemy) enemy-event-handler) + :code (behavior () + (local-vars (v1-38 enemy-flag) (v1-46 enemy-flag)) + (ja-channel-push! 1 (seconds 0.5)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info knocked-land-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info knocked-land-anim))) + frames + num-frames + ) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self restart-fly-anims) #t) + (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-37 (-> self enemy-flags))) + (if (logtest? v1-37 (enemy-flag checking-water)) + (set! v1-38 (logior v1-37 (enemy-flag enable-on-active))) + (set! v1-38 (logclear v1-37 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-38) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-move-dest)) + (set! (-> self mask) (logior (process-mask collectable) (-> self mask))) + (logclear! (-> self mask) (process-mask collectable)) + ) + (let ((v1-45 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-45) + (set! v1-46 (logior (enemy-flag check-water-backup) v1-45)) + (set! v1-46 (logclear v1-45 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-46) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (hover-nav-control-method-21 (-> self hover)) + (go-hostile self) + (none) + ) + :post hover-enemy-hostile-post + ) + +;; failed to figure out what this is: +(defstate flying-death (hover-enemy) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('touch 'touched 'attack) + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (go-virtual flying-death-explode) + ) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (dispose! self) + (stop-looking-at-target! self) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logclear! (-> self mask) (process-mask actor-pause)) + (logclear! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self enemy-flags) (enemy-flag check-water-backup)) + (set! (-> self root-override2 penetrate-using) (penetrate lunge vehicle knocked)) + (let ((gp-0 (-> self flying-death-transv))) + (let ((a1-0 (handle->process (-> self incoming attacker-handle)))) + (if a1-0 + (vector-! gp-0 (-> (the-as process-focusable a1-0) root-override trans) (-> self root-override2 trans)) + (vector-! gp-0 (-> self incoming attacker-pos) (-> self root-override2 trans)) + ) + ) + (set! (-> gp-0 y) 0.0) + (vector-normalize! gp-0 1.0) + (vector-rotate90-around-y! gp-0 gp-0) + (if (rng-hit? self 0.5) + (vector-negate! gp-0 gp-0) + ) + (let ((f30-0 (get-rand-float-range self 0.0 1.0))) + (vector-float*! gp-0 gp-0 (lerp 98304.0 172032.0 f30-0)) + (set! (-> gp-0 y) (lerp 8192.0 98304.0 f30-0)) + ) + (let ((v1-29 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat)))) + (cond + ((< 0.0 (vector-dot gp-0 v1-29)) + (set! (-> self flying-death-anim) (-> self hover-info fly-left-anim)) + (set! (-> self flying-death-engine) (-> self hover-info engine-left)) + (set! (-> self flying-death-thrust-rotate) (-> self hover-info thrust-rotate-left)) + (set! (-> self flying-death-spin-dest) -524288.0) + ) + (else + (set! (-> self flying-death-anim) (-> self hover-info fly-right-anim)) + (set! (-> self flying-death-engine) (-> self hover-info engine-right)) + (set! (-> self flying-death-thrust-rotate) (-> self hover-info thrust-rotate-right)) + (set! (-> self flying-death-spin-dest) 524288.0) + ) + ) + ) + ) + (set! (-> self flying-death-spin-axis quad) (-> *y-vector* quad)) + (vector-rotate-x! + (-> self flying-death-spin-axis) + (-> self flying-death-spin-axis) + (* 182.04445 (rand-vu-float-range -120.0 120.0)) + ) + (set-gravity-length (-> self root-override2 dynam) 163840.0) + (set! (-> self hover speed) 0.2) + (set! (-> self flying-death-spin) 0.0) + (enemy-method-103 self) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :trans (behavior () + (if (or (logtest? (-> self root-override2 status) + (collide-status touch-surface touch-wall touch-ceiling touch-actor impact-surface touch-background) + ) + (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 4)) + ) + (go-virtual flying-death-explode) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self flying-death-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self flying-death-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (seek! + (-> self flying-death-spin) + (-> self flying-death-spin-dest) + (* 196608.0 (-> self clock seconds-per-frame)) + ) + (let ((gp-0 (-> self root-override2))) + (let ((a2-2 + (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + (-> self flying-death-spin-axis) + (* (-> self flying-death-spin) (-> self clock seconds-per-frame)) + ) + ) + ) + (quaternion*! (-> gp-0 quat) (-> gp-0 quat) a2-2) + ) + (vector-v++! + (-> self flying-death-transv) + (compute-acc-due-to-gravity gp-0 (new 'stack-no-clear 'vector) 0.8) + ) + (let ((v1-6 (hover-enemy-method-152 self))) + (seek! + (-> self hover speed) + (* 2.0 (-> v1-6 max-speed)) + (* 0.8 (-> self clock seconds-per-frame) (-> v1-6 max-acceleration)) + ) + ) + (vector-normalize-copy! (-> gp-0 transv) (-> self flying-death-transv) (-> self hover speed)) + (let ((a2-8 (new 'stack-no-clear 'collide-query))) + (set! (-> a2-8 collide-with) (-> gp-0 root-prim prim-core collide-with)) + (set! (-> a2-8 ignore-process0) (-> gp-0 process)) + (set! (-> a2-8 ignore-process1) #f) + (set! (-> a2-8 ignore-pat) (-> gp-0 pat-ignore-mask)) + (set! (-> a2-8 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide gp-0 (-> gp-0 transv) a2-8 (meters 0)) + ) + ) + (enemy-simple-post) + (hover-enemy-method-143 self (-> self flying-death-engine) (-> self flying-death-thrust-rotate)) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate flying-death-explode (hover-enemy) + :virtual #t + :enter (behavior () + (dispose! self) + (let ((v1-3 (-> self root-override2 root-prim))) + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + (set! (-> v1-3 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (none) + ) + :code (behavior () + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + ) + +;; definition for method 67 of type hover-enemy +(defmethod go-stare hover-enemy ((obj hover-enemy)) + (go-hostile obj) + (none) + ) + +;; definition for method 68 of type hover-enemy +(defmethod go-stare2 hover-enemy ((obj hover-enemy)) + (go-hostile obj) + (none) + ) + +;; definition for method 146 of type hover-enemy +;; WARN: Return type mismatch quaternion vs none. +(defmethod hover-enemy-method-146 hover-enemy ((obj hover-enemy)) + (let ((gp-0 (new 'stack-no-clear 'matrix))) + (matrix-rotate-zxy! gp-0 (-> obj rotation-vec)) + (matrix->quaternion (-> obj root-override2 quat) gp-0) + ) + (none) + ) + +;; definition for method 147 of type hover-enemy +;; WARN: Return type mismatch float vs none. +(defmethod hover-enemy-method-147 hover-enemy ((obj hover-enemy)) + (let ((s5-0 (-> obj root-override2 quat)) + (gp-0 (-> obj rotation-vec)) + ) + (set! (-> gp-0 z) (quaternion-z-angle s5-0)) + (set! (-> gp-0 y) (quaternion-y-angle s5-0)) + (set! (-> gp-0 x) (quaternion-x-angle s5-0)) + ) + (none) + ) + +;; definition for method 140 of type hover-enemy +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-140 hover-enemy ((obj hover-enemy) (arg0 symbol)) + (let ((v1-0 0) + (a0-2 (-> obj root-override2 root-prim)) + ) + (if arg0 + (set! v1-0 1) + ) + (set! (-> (the-as collide-shape-prim-group a0-2) child 0 prim-core collide-with) (the-as collide-spec v1-0)) + (set! (-> (the-as collide-shape-prim-group a0-2) child 1 prim-core collide-with) (the-as collide-spec v1-0)) + (set! (-> (the-as collide-shape-prim-group a0-2) child 2 prim-core collide-with) (the-as collide-spec v1-0)) + ) + 0 + (none) + ) + +;; definition for method 141 of type hover-enemy +;; WARN: Return type mismatch vector vs none. +(defmethod hover-enemy-method-141 hover-enemy ((obj hover-enemy) (arg0 float)) + (let ((f0-1 (* (-> obj scale) arg0))) + (set-vector! (-> obj root-override2 scale) (* 1.2 f0-1) (* 0.9 f0-1) f0-1 1.0) + ) + (none) + ) + +;; definition for method 132 of type hover-enemy +(defmethod dispose! hover-enemy ((obj hover-enemy)) + "Cleans-up the enemy and any associated resources. Potentially spawns skull gems" + (when (not (logtest? (enemy-flag recover-applied-velocity) (-> obj enemy-flags))) + (process-entity-status! obj (entity-perm-status subtask-complete) #t) + (send-event (ppointer->process (-> obj parent)) 'hover-die) + (hover-enemy-method-154 obj) + ((method-of-type enemy dispose!) obj) + ) + (none) + ) + +;; definition for method 10 of type hover-enemy +(defmethod deactivate hover-enemy ((obj hover-enemy)) + (hover-nav-control-method-9 (-> obj hover)) + ((method-of-type enemy deactivate) obj) + (none) + ) + +;; definition for method 7 of type hover-enemy +;; WARN: Return type mismatch enemy vs hover-enemy. +(defmethod relocate hover-enemy ((obj hover-enemy) (arg0 int)) + (if (nonzero? (-> obj hover)) + (&+! (-> obj hover) arg0) + ) + (the-as hover-enemy ((method-of-type enemy relocate) obj arg0)) + ) + +;; definition for method 155 of type hover-enemy +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-155 hover-enemy ((obj hover-enemy)) + (set! (-> obj hover-info) (hover-enemy-method-151 obj)) + (set! (-> obj fly-anim-speed) (get-rand-float-range obj 0.8 1.2)) + (vector-reset! (-> obj rotation-vec)) + (vector-reset! (-> obj dest-pos)) + (vector-reset! (-> obj local-dir)) + (set! (-> obj scale) 1.0) + (hover-enemy-method-141 obj 1.0) + (set! (-> obj formation-entity) (entity-actor-lookup (-> obj entity) 'alt-actor 0)) + (logior! (-> obj skel status) (joint-control-status sync-math)) + (let ((t0-0 (hover-enemy-method-152 obj))) + (set! (-> obj hover) (new 'process 'hover-nav-control obj (-> obj root-override2) t0-0)) + ) + (let ((s5-0 (-> obj offset)) + (t9-6 (method-of-type res-lump get-property-struct)) + (a0-8 (-> obj entity)) + (a1-4 'trans-offset) + (a2-3 'interp) + (a3-1 -1000000000.0) + (t0-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> t0-1 x) 0.0) + (set! (-> t0-1 y) 20480.0) + (set! (-> t0-1 z) 61440.0) + (set! (-> t0-1 w) 1.0) + (set! (-> s5-0 quad) + (-> (the-as vector (t9-6 a0-8 a1-4 a2-3 a3-1 t0-1 (the-as (pointer res-tag) #f) *res-static-buf*)) quad) + ) + ) + (set! (-> obj restart-fly-anims) #t) + (set! (-> obj knocked-fall-dist) 8192.0) + 0 + (none) + ) + +;; definition of type wasp +(deftype wasp (hover-enemy) + ((gun-jmod joint-mod :offset-assert 784) + (entity-group actor-group :offset-assert 788) + (smoke-part sparticle-launch-control :offset-assert 792) + (engine-part sparticle-launch-control :offset-assert 796) + (old-gravity float :offset 804) + (knocked-anim int32 :offset-assert 808) + (knocked-recover-anim int32 :offset-assert 812) + (last-fire-time time-frame :offset-assert 816) + (bridge-index int32 :offset-assert 824) + (gun-x-angle float :offset-assert 828) + (gun-x-angle-final float :offset-assert 832) + (path-u float :offset-assert 836) + (path-du float :offset-assert 840) + (path-du-final float :offset-assert 844) + (path-dest float :offset-assert 848) + (plat-pos vector :inline :offset-assert 864) + (sound-id sound-id :offset-assert 880) + (attack-wait-min float :offset-assert 884) + (attack-wait-max float :offset-assert 888) + (attack-miss-dist-min float :offset-assert 892) + (attack-miss-dist-max float :offset-assert 896) + (attack-miss-dist-curr float :offset-assert 900) + ) + :heap-base #x310 + :method-count-assert 166 + :size-assert #x388 + :flag-assert #xa603100388 + (:methods + (shoot-bridge-wait () _type_ :state 156) + (shoot-bridge-intro () _type_ :state 157) + (shoot-bridge-hold () _type_ :state 158) + (shoot-bridge-hostile () _type_ :state 159) + (shoot-bridge-attack () _type_ :state 160) + (shoot-bridge-outro () _type_ :state 161) + (attack () _type_ :state 162) + (die-now () _type_ :state 163) + (die-explode () _type_ :state 164) + (spawn-wasp-shot (_type_ projectile-init-by-other-params int float float) none 165) + ) + ) + +;; definition for method 3 of type wasp +(defmethod inspect wasp ((obj wasp)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type hover-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tgun-jmod: ~A~%" (-> obj gun-jmod)) + (format #t "~2Tentity-group: ~A~%" (-> obj entity-group)) + (format #t "~2Tsmoke-part: ~A~%" (-> obj smoke-part)) + (format #t "~2Tengine-part: ~A~%" (-> obj engine-part)) + (format #t "~2Tknocked-start-level: ~f~%" (-> obj knocked-start-level)) + (format #t "~2Told-gravity: ~f~%" (-> obj old-gravity)) + (format #t "~2Tknocked-anim: ~D~%" (-> obj knocked-anim)) + (format #t "~2Tknocked-recover-anim: ~D~%" (-> obj knocked-recover-anim)) + (format #t "~2Tlast-fire-time: ~D~%" (-> obj last-fire-time)) + (format #t "~2Tbridge-index: ~D~%" (-> obj bridge-index)) + (format #t "~2Tgun-x-angle: ~f~%" (-> obj gun-x-angle)) + (format #t "~2Tgun-x-angle-final: ~f~%" (-> obj gun-x-angle-final)) + (format #t "~2Tpath-u: ~f~%" (-> obj path-u)) + (format #t "~2Tpath-du: ~f~%" (-> obj path-du)) + (format #t "~2Tpath-du-final: ~f~%" (-> obj path-du-final)) + (format #t "~2Tpath-dest: ~f~%" (-> obj path-dest)) + (format #t "~2Tplat-pos: #~%" (-> obj plat-pos)) + (format #t "~2Tsound-id: ~D~%" (-> obj sound-id)) + (format #t "~2Tattack-wait-min: ~f~%" (-> obj attack-wait-min)) + (format #t "~2Tattack-wait-max: ~f~%" (-> obj attack-wait-max)) + (format #t "~2Tattack-miss-dist-min: ~f~%" (-> obj attack-miss-dist-min)) + (format #t "~2Tattack-miss-dist-max: ~f~%" (-> obj attack-miss-dist-max)) + (format #t "~2Tattack-miss-dist-curr: ~f~%" (-> obj attack-miss-dist-curr)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +0 + + + + diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-formation-h_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-formation-h_REF.gc index 5c9bbd6399..70949d5eea 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-formation-h_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-formation-h_REF.gc @@ -40,7 +40,7 @@ ;; definition of type hover-actor (deftype hover-actor (structure) - ((handle uint64 :offset-assert 0) + ((handle handle :offset-assert 0) (offset vector :inline :offset-assert 16) ) :method-count-assert 9 @@ -133,7 +133,7 @@ :flag-assert #x1000100090 (:methods (idle () _type_ :state 14) - (hover-formation-method-15 (_type_) int 15) + (hover-formation-method-15 (_type_ vector vector) int 15) ) ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-formation_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-formation_REF.gc index 2dac0015b3..d64008c87b 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-formation_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-formation_REF.gc @@ -705,7 +705,7 @@ ) ;; definition for method 15 of type hover-formation -(defmethod hover-formation-method-15 hover-formation ((obj hover-formation)) +(defmethod hover-formation-method-15 hover-formation ((obj hover-formation) (arg0 vector) (arg1 vector)) 0 ) @@ -756,8 +756,14 @@ This commonly includes things such as: ) (set! (-> obj formation-timer) (the-as uint (-> pp clock frame-counter))) (logclear! (-> obj mask) (process-mask actor-pause)) - (process-entity-status! obj (entity-perm-status no-kill) #t) - (hover-formation-method-15 obj) + (let ((t9-6 process-entity-status!) + (a0-9 obj) + (a1-7 8) + (a2-6 #t) + ) + (t9-6 a0-9 (the-as entity-perm-status a1-7) a2-6) + (hover-formation-method-15 obj (the-as vector a1-7) (the-as vector a2-6)) + ) (go (method-of-object obj idle)) (none) ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-nav-control-h_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-nav-control-h_REF.gc index ed4bcf0b3d..7ae170791c 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-nav-control-h_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-nav-control-h_REF.gc @@ -170,9 +170,9 @@ ;; definition of type hover-nav-sphere (deftype hover-nav-sphere (list-node) - ((sphere sphere :inline :offset-assert 16) - (handle uint64 :offset-assert 32) - (timer uint64 :offset-assert 40) + ((sphere sphere :inline :offset-assert 16) + (handle handle :offset-assert 32) + (timer time-frame :offset-assert 40) ) :method-count-assert 9 :size-assert #x30 @@ -198,7 +198,7 @@ ;; definition of type hover-nav-path-segment (deftype hover-nav-path-segment (list-node) ((curve-matrix matrix :inline :offset-assert 16) - (pos-index int32 2 :offset-assert 80) + (pos-index float 2 :offset-assert 80) (dist float :offset-assert 88) (du float :offset-assert 92) ) @@ -246,7 +246,7 @@ :size-assert #x10 :flag-assert #xa00000010 (:methods - (hover-nav-path-info-method-9 () none 9) + (hover-nav-path-info-method-9 (_type_) none 9) ) ) @@ -293,46 +293,47 @@ ;; definition of type nav-network (deftype nav-network (basic) - ((network basic :offset-assert 4) - (dummy nav-network-info :inline :offset-assert 16) - (control-handle handle :offset-assert 88) - (list-table list-node 5 :offset-assert 96) - (open-list nav-network-path-node :offset 96) - (closed-list nav-network-path-node :offset 100) - (sphere-list hover-nav-sphere :offset 108) - (free-segment-list hover-nav-path-segment :offset 104) - (free-sphere-list hover-nav-sphere :offset 112) - (segment-pool uint32 :offset-assert 116) - (sphere-pool uint32 :offset-assert 120) + ((network (array nav-network-info) :offset-assert 4) + (dummy nav-network-info :inline :offset-assert 16) + (control-handle handle :offset-assert 88) + (list-table list-node 5 :offset-assert 96) + (open-list nav-network-path-node :offset 96) + (closed-list nav-network-path-node :offset 100) + (sphere-list hover-nav-sphere :offset 108) + (free-segment-list hover-nav-path-segment :offset 104) + (free-sphere-list hover-nav-sphere :offset 112) + (segment-pool (pointer hover-nav-path-segment) :offset-assert 116) + (sphere-pool (pointer hover-nav-sphere) :offset-assert 120) ) :method-count-assert 33 :size-assert #x7c :flag-assert #x210000007c (:methods + (new (symbol type) _type_ 0) (nav-network-method-9 (_type_) none 9) (nav-network-method-10 (_type_ level (array nav-network-info)) none 10) (nav-network-method-11 (_type_) none 11) (nav-network-method-12 (_type_) none 12) - (nav-network-method-13 (_type_) none 13) - (nav-network-method-14 (_type_ int) none 14) - (nav-network-method-15 (_type_) none 15) - (nav-network-method-16 (_type_) none 16) + (nav-network-method-13 (_type_ int nav-network-path-node) none 13) + (nav-network-method-14 (_type_ int nav-network-path-node) object 14) + (nav-network-method-15 (_type_ nav-network-path-node) object 15) + (nav-network-method-16 (_type_ nav-network-path-node) none 16) (nav-network-method-17 (_type_) nav-network-path-node 17) - (nav-network-method-18 (_type_) none 18) - (nav-network-method-19 (_type_) none 19) - (nav-network-method-20 (_type_) none 20) - (nav-network-method-21 (_type_) none 21) - (nav-network-method-22 (_type_) none 22) - (nav-network-method-23 (_type_) none 23) - (nav-network-method-24 (_type_) none 24) - (nav-network-method-25 (_type_) none 25) - (nav-network-method-26 (_type_) none 26) + (nav-network-method-18 (_type_ nav-network-path-node) none 18) + (nav-network-method-19 (_type_ nav-network-path-node) none 19) + (nav-network-method-20 (_type_ nav-network-path-node vector) none 20) + (nav-network-method-21 (_type_ object int int) none 21) + (nav-network-method-22 (_type_ hover-nav-path-info vector vector int int) hover-nav-path-segment 22) + (nav-network-method-23 (_type_ hover-nav-path-info) none 23) + (nav-network-method-24 (_type_ hover-nav-path-info int int int) symbol 24) + (nav-network-method-25 (_type_ process collide-prim-core) none 25) + (nav-network-method-26 (_type_ vector process vector vector float) vector 26) (nav-network-method-27 (_type_) none 27) (nav-network-method-28 (_type_) none 28) (nav-network-method-29 (_type_) symbol 29) - (get-network (_type_) basic 30) - (nav-network-method-31 () none 31) - (nav-network-method-32 () none 32) + (get-network (_type_) (array nav-network-info) 30) + (nav-network-method-31 (_type_ bounding-box) none 31) + (nav-network-method-32 (_type_ string) none 32) ) ) @@ -392,58 +393,59 @@ ;; definition of type hover-nav-control (deftype hover-nav-control (basic) - ((root basic :offset-assert 4) - (nav basic :offset-assert 8) - (flags uint16 :offset-assert 12) - (params hover-nav-params :offset-assert 16) - (path-timer uint64 :offset-assert 24) - (transvv vector :inline :offset-assert 32) - (dest-pos vector :inline :offset-assert 48) - (dest-vel vector :inline :offset-assert 64) - (dest-move-dir vector :inline :offset-assert 80) - (dest-offset vector :inline :offset-assert 96) - (move-dir vector :inline :offset-assert 112) - (nav-collide-impulse vector :inline :offset-assert 128) - (nav-collide-impulse-len float :offset-assert 144) - (dest-speed float :offset-assert 148) - (local-dist float :offset-assert 152) - (speed float :offset-assert 156) - (max-los-speed float :offset-assert 160) - (target-speed float :offset-assert 164) - (target-acceleration float :offset-assert 168) - (speed-dest float :offset-assert 172) - (path-info hover-nav-path-info :inline :offset-assert 176) - (curr-dest-pt int32 :offset-assert 192) - (los-obstruction-distance float :offset-assert 196) - (los-last-clear-time time-frame :offset-assert 200) - (max-speed-multiplier float :offset-assert 208) - (max-acceleration-multiplier float :offset-assert 212) + ((root collide-shape-moving :offset-assert 4) + (nav nav-network :offset-assert 8) + (flags uint16 :offset-assert 12) + (params hover-nav-params :offset-assert 16) + (path-timer time-frame :offset-assert 24) + (transvv vector :inline :offset-assert 32) + (dest-pos vector :inline :offset-assert 48) + (dest-vel vector :inline :offset-assert 64) + (dest-move-dir vector :inline :offset-assert 80) + (dest-offset vector :inline :offset-assert 96) + (move-dir vector :inline :offset-assert 112) + (nav-collide-impulse vector :inline :offset-assert 128) + (nav-collide-impulse-len float :offset-assert 144) + (dest-speed float :offset-assert 148) + (local-dist float :offset-assert 152) + (speed float :offset-assert 156) + (max-los-speed float :offset-assert 160) + (target-speed float :offset-assert 164) + (target-acceleration float :offset-assert 168) + (speed-dest float :offset-assert 172) + (path-info hover-nav-path-info :inline :offset-assert 176) + (curr-dest-pt int32 :offset-assert 192) + (los-obstruction-distance float :offset-assert 196) + (los-last-clear-time time-frame :offset-assert 200) + (max-speed-multiplier float :offset-assert 208) + (max-acceleration-multiplier float :offset-assert 212) ) :method-count-assert 32 :size-assert #xd8 :flag-assert #x20000000d8 (:methods + (new (symbol type process collide-shape-moving hover-nav-params) _type_ 0) (hover-nav-control-method-9 (_type_) none 9) - (hover-nav-control-method-10 (_type_) none 10) - (hover-nav-control-method-11 (_type_) none 11) + (hover-nav-control-method-10 (_type_ vector vector vector) none 10) + (hover-nav-control-method-11 (_type_ vector) none 11) (hover-nav-control-method-12 (_type_) none 12) (hover-nav-control-method-13 (_type_) none 13) (hover-nav-control-method-14 (_type_ float float) none 14) - (hover-nav-control-method-15 (_type_) none 15) - (hover-nav-control-method-16 (_type_) none 16) - (hover-nav-control-method-17 (_type_) none 17) - (hover-nav-control-method-18 (_type_) none 18) - (hover-nav-control-method-19 (_type_) none 19) + (hover-nav-control-method-15 (_type_ vector) none 15) + (hover-nav-control-method-16 (_type_ vector) vector 16) + (hover-nav-control-method-17 (_type_) collide-prim-core 17) + (hover-nav-control-method-18 (_type_ path-control int int) none 18) + (hover-nav-control-method-19 (_type_ (inline-array vector) int) none 19) (hover-nav-control-method-20 (_type_) none 20) (hover-nav-control-method-21 (_type_) none 21) (hover-nav-control-method-22 (_type_) hover-nav-path-segment 22) (hover-nav-control-method-23 (_type_) object 23) (hover-nav-control-method-24 (_type_) none 24) (hover-nav-control-method-25 (_type_) none 25) - (hover-nav-control-method-26 (_type_) none 26) - (hover-nav-control-method-27 (_type_) none 27) - (hover-nav-control-method-28 (_type_) none 28) - (hover-nav-control-method-29 (_type_) none 29) + (hover-nav-control-method-26 (_type_ vector vector float) symbol 26) + (hover-nav-control-method-27 (_type_ vector vector) int 27) + (hover-nav-control-method-28 (_type_ vector vector) none 28) + (hover-nav-control-method-29 (_type_ vector) none 29) (hover-nav-control-method-30 (_type_) float 30) (hover-nav-control-method-31 (_type_) float 31) ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-nav-control_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-nav-control_REF.gc new file mode 100644 index 0000000000..ccac14e1a8 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/hover-nav-control_REF.gc @@ -0,0 +1,1854 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol *debug-hover*, type symbol +(define *debug-hover* #f) + +;; definition of type nav-network-control +(deftype nav-network-control (process) + ((nav-network nav-network :offset-assert 128) + ) + :heap-base #x10 + :method-count-assert 15 + :size-assert #x84 + :flag-assert #xf00100084 + (:methods + (idle () _type_ :state 14) + ) + ) + +;; definition for method 3 of type nav-network-control +(defmethod inspect nav-network-control ((obj nav-network-control)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type process inspect))) + (t9-0 obj) + ) + (format #t "~2Tnav-network: ~A~%" (-> obj nav-network)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defstate idle (nav-network-control) + :virtual #t + :code (the-as (function none :behavior nav-network-control) sleep-code) + :post (behavior () + (nav-network-method-29 (-> self nav-network)) + (nav-network-method-27 (-> self nav-network)) + (none) + ) + ) + +;; definition for function nav-network-control-init-by-other +;; WARN: Return type mismatch object vs none. +(defbehavior nav-network-control-init-by-other nav-network-control ((arg0 nav-network) (arg1 level)) + (set! (-> self nav-network) arg0) + (set! (-> self level) arg1) + (logior! (-> self mask) (process-mask no-kill)) + (go-virtual idle) + (none) + ) + +;; definition for function detect-loop +;; ERROR: function has no type analysis. Cannot decompile. + +;; definition for function list-contains +;; ERROR: function has no type analysis. Cannot decompile. + +;; definition for method 0 of type nav-network +(defmethod new nav-network ((allocation symbol) (type-to-make type)) + (let ((gp-0 (object-new allocation type-to-make (the-as int (-> type-to-make size))))) + (set! (-> gp-0 dummy index) 0) + (set! (-> gp-0 dummy count) 0) + (vector-reset! (-> gp-0 dummy pos)) + (set! (-> gp-0 network) (the-as (array nav-network-info) (-> gp-0 dummy))) + (dotimes (v1-4 5) + (set! (-> gp-0 list-table v1-4) #f) + ) + (nav-network-method-12 gp-0) + (set! (-> gp-0 control-handle) (the-as handle #f)) + gp-0 + ) + ) + +;; definition for method 9 of type nav-network +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-9 nav-network ((obj nav-network)) + (set! (-> obj segment-pool) (the-as (pointer hover-nav-path-segment) (malloc 'loading-level #x6000))) + (set! (-> obj free-segment-list) #f) + (dotimes (v1-0 256) + (let ((a0-3 (&+ (-> obj segment-pool) (* 96 v1-0)))) + (set! (-> a0-3 0) #f) + (set! (-> a0-3 1) #f) + (let ((a2-0 (-> obj free-segment-list)) + (a1-3 (&-> obj free-segment-list)) + ) + (when (zero? a0-3) + (break!) + 0 + ) + (when (or (= a0-3 a2-0) (= a0-3 a1-3)) + (break!) + 0 + ) + (when (not (or (not a2-0) (!= (-> a2-0 prev) a0-3))) + (break!) + 0 + ) + (when a2-0 + (set! (-> a0-3 0) a2-0) + (set! (-> a0-3 1) (the-as hover-nav-path-segment (-> a2-0 prev))) + (if (-> a0-3 1) + (set! (-> a0-3 1 next) (the-as list-node a0-3)) + ) + (if (-> a0-3 0) + (set! (-> a0-3 0 prev) (the-as list-node a0-3)) + ) + ) + (if (or (not a2-0) (= a2-0 (-> a1-3 0))) + (set! (-> a1-3 0) (the-as hover-nav-path-segment a0-3)) + ) + ) + ) + ) + (set! (-> obj sphere-pool) (the-as (pointer hover-nav-sphere) (malloc 'loading-level 768))) + (set! (-> obj free-sphere-list) #f) + (dotimes (v1-3 16) + (let ((a0-6 (&+ (-> obj sphere-pool) (* 48 v1-3)))) + (set! (-> a0-6 0) #f) + (set! (-> a0-6 1) #f) + (let ((a2-4 (-> obj free-sphere-list)) + (a1-7 (&-> obj free-sphere-list)) + ) + (when (zero? a0-6) + (break!) + 0 + ) + (when (or (= a0-6 a2-4) (= a0-6 a1-7)) + (break!) + 0 + ) + (when (not (or (not a2-4) (!= (-> a2-4 prev) a0-6))) + (break!) + 0 + ) + (when a2-4 + (set! (-> a0-6 0) a2-4) + (set! (-> a0-6 1) (the-as hover-nav-sphere (-> a2-4 prev))) + (if (-> a0-6 1) + (set! (-> a0-6 1 next) (the-as list-node a0-6)) + ) + (if (-> a0-6 0) + (set! (-> a0-6 0 prev) (the-as list-node a0-6)) + ) + ) + (if (or (not a2-4) (= a2-4 (-> a1-7 0))) + (set! (-> a1-7 0) (the-as hover-nav-sphere a0-6)) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 10 of type nav-network +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-10 nav-network ((obj nav-network) (arg0 level) (arg1 (array nav-network-info))) + (set! (-> obj network) arg1) + (while (-> obj sphere-list) + (let ((v1-0 (-> obj sphere-list))) + (let ((a0-1 v1-0)) + (let ((a1-1 (&-> obj sphere-list))) + (if (= (-> a1-1 0) a0-1) + (set! (-> a1-1 0) (the-as hover-nav-sphere (-> a0-1 next))) + ) + ) + (if (-> a0-1 prev) + (set! (-> a0-1 prev next) (-> a0-1 next)) + ) + (if (-> a0-1 next) + (set! (-> a0-1 next prev) (-> a0-1 prev)) + ) + (set! (-> a0-1 prev) #f) + (set! (-> a0-1 next) #f) + ) + (let ((a1-8 (-> obj free-sphere-list)) + (a0-3 (&-> obj free-sphere-list)) + ) + (when (zero? v1-0) + (break!) + 0 + ) + (when (or (= v1-0 a1-8) (= v1-0 a0-3)) + (break!) + 0 + ) + (when (not (or (not a1-8) (!= (-> a1-8 prev) v1-0))) + (break!) + 0 + ) + (when a1-8 + (set! (-> v1-0 next) a1-8) + (set! (-> v1-0 prev) (-> a1-8 prev)) + (if (-> v1-0 prev) + (set! (-> v1-0 prev next) v1-0) + ) + (if (-> v1-0 next) + (set! (-> v1-0 next prev) v1-0) + ) + ) + (if (or (not a1-8) (= a1-8 (-> a0-3 0))) + (set! (-> a0-3 0) v1-0) + ) + ) + ) + ) + (if (not (handle->process (-> obj control-handle))) + (set! (-> obj control-handle) + (process->handle (the-as process (ppointer->process (process-spawn nav-network-control obj arg0)))) + ) + ) + 0 + (none) + ) + +;; definition for method 12 of type nav-network +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-12 nav-network ((obj nav-network)) + (set! (-> obj open-list) #f) + (set! (-> obj closed-list) #f) + (let ((v1-0 (-> obj network))) + (when v1-0 + (dotimes (a0-2 (-> v1-0 length)) + (let ((a1-3 (-> v1-0 a0-2 path-node))) + (set! (-> a1-3 status) (net-path-node-status)) + (set! (-> a1-3 parent) #f) + (set! (-> a1-3 next) #f) + (set! (-> a1-3 prev) #f) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 28 of type nav-network +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-28 nav-network ((obj nav-network)) + (dotimes (s5-0 2) + (format #t "list ~d: ~%" s5-0) + (let ((a0-2 (-> obj list-table s5-0))) + (while a0-2 + (let ((s4-0 (-> a0-2 next))) + (inspect a0-2) + (set! a0-2 s4-0) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 29 of type nav-network +;; INFO: Used lq/sq +(defmethod nav-network-method-29 nav-network ((obj nav-network)) + (when *display-nav-network* + (let ((gp-0 (-> obj network))) + (when gp-0 + (dotimes (s5-0 (-> gp-0 length)) + (let ((s4-0 (-> gp-0 s5-0))) + (add-debug-x #t (bucket-id debug2) (-> s4-0 pos) *color-white*) + (format (clear *temp-string*) "~d" s5-0) + (let ((a2-2 *temp-string*)) + (add-debug-text-3d #t (bucket-id debug2) a2-2 (-> s4-0 pos) (font-color #dadada) (the-as vector2h #f)) + ) + (dotimes (s3-1 (-> s4-0 count)) + (let ((a2-3 (new 'stack-no-clear 'vector))) + (set! (-> a2-3 quad) (-> s4-0 pos quad)) + (let ((a3-2 (new 'stack-no-clear 'vector))) + (set! (-> a3-2 quad) (-> gp-0 (-> s4-0 adjacency s3-1 index) pos quad)) + (add-debug-line + #t + (bucket-id debug2) + a2-3 + a3-2 + (new 'static 'rgba :r #x7f :g #xff :b #x7f :a #x10) + #f + (the-as rgba -1) + ) + ) + ) + ) + ) + ) + #f + ) + ) + ) + ) + +;; definition for method 15 of type nav-network +(defmethod nav-network-method-15 nav-network ((obj nav-network) (arg0 nav-network-path-node)) + (local-vars (a2-4 list-node)) + (when (nonzero? (-> arg0 status)) + (break!) + 0 + ) + (let ((f0-1 (+ (-> arg0 cost-to-start) (-> arg0 cost-to-end)))) + (when (not (and (not (-> arg0 next)) (not (-> arg0 prev)))) + (break!) + 0 + ) + (let ((v1-8 (the-as list-node (-> obj open-list)))) + (while v1-8 + (let ((a2-1 (-> v1-8 next))) + (if (= v1-8 arg0) + (return #t) + ) + (set! v1-8 a2-1) + ) + ) + ) + (when #f + (break!) + 0 + ) + (logior! (-> arg0 status) (net-path-node-status open)) + (let ((v1-17 (the-as list-node (-> obj open-list)))) + (while v1-17 + (let ((a2-3 (-> v1-17 next))) + (when (< f0-1 (+ (-> (the-as nav-network-path-node v1-17) cost-to-start) + (-> (the-as nav-network-path-node v1-17) cost-to-end) + ) + ) + (set! a2-4 v1-17) + (goto cfg-23) + ) + (set! v1-17 a2-3) + ) + ) + ) + ) + (set! a2-4 (the-as list-node #f)) + (label cfg-23) + (cond + (a2-4 + (let ((v1-20 arg0) + (a0-1 (-> obj list-table)) + ) + (when (zero? v1-20) + (break!) + 0 + ) + (when (or (= v1-20 a2-4) (= v1-20 a0-1)) + (break!) + 0 + ) + (when (not (or (not a2-4) (!= (-> (the-as nav-network-path-node a2-4) prev) v1-20))) + (break!) + 0 + ) + (when a2-4 + (set! (-> v1-20 next) a2-4) + (set! (-> v1-20 prev) (-> (the-as nav-network-path-node a2-4) prev)) + (if (-> v1-20 prev) + (set! (-> v1-20 prev next) v1-20) + ) + (if (-> v1-20 next) + (set! (-> v1-20 next prev) v1-20) + ) + ) + (if (or (not a2-4) (= a2-4 (-> a0-1 0))) + (set! (-> a0-1 0) v1-20) + ) + ) + ) + (else + (let ((a2-8 (the-as list-node #f))) + (let ((v1-21 (the-as list-node (-> obj open-list)))) + (while v1-21 + (let ((a3-22 (-> v1-21 next))) + (set! a2-8 v1-21) + (set! v1-21 a3-22) + ) + ) + ) + (let ((v1-23 arg0) + (a0-2 (-> obj list-table)) + ) + (when (or (= v1-23 a2-8) (= v1-23 a0-2)) + (break!) + 0 + ) + (when (not (or (not a2-8) (!= (-> (the-as nav-network-path-node a2-8) next) v1-23))) + (break!) + 0 + ) + (cond + (a2-8 + (set! (-> v1-23 next) (-> (the-as nav-network-path-node a2-8) next)) + (set! (-> v1-23 prev) a2-8) + (if (-> v1-23 prev) + (set! (-> v1-23 prev next) v1-23) + ) + (if (-> v1-23 next) + (set! (-> v1-23 next prev) v1-23) + ) + ) + (else + (set! (-> v1-23 next) (-> a0-2 0)) + (set! (-> v1-23 prev) #f) + (if (-> v1-23 next) + (set! (-> v1-23 next prev) v1-23) + ) + (set! (-> a0-2 0) v1-23) + ) + ) + ) + ) + ) + ) + arg0 + ) + +;; definition for method 13 of type nav-network +;; WARN: Return type mismatch nav-network-path-node vs none. +(defmethod nav-network-method-13 nav-network ((obj nav-network) (arg0 int) (arg1 nav-network-path-node)) + (when (nonzero? (-> arg1 status)) + (break!) + 0 + ) + (let ((v1-3 arg1) + (a3-2 (-> obj list-table arg0)) + (a0-2 (the-as object (&+ (-> obj list-table) (* arg0 4)))) + ) + (when (zero? v1-3) + (break!) + 0 + ) + (when (or (= v1-3 a3-2) (= v1-3 (the-as (pointer list-node) a0-2))) + (break!) + 0 + ) + (when (not (or (not a3-2) (!= (-> a3-2 prev) v1-3))) + (break!) + 0 + ) + (when a3-2 + (set! (-> v1-3 next) a3-2) + (set! (-> v1-3 prev) (-> a3-2 prev)) + (if (-> v1-3 prev) + (set! (-> v1-3 prev next) v1-3) + ) + (if (-> v1-3 next) + (set! (-> v1-3 next prev) v1-3) + ) + ) + (if (or (not a3-2) (= a3-2 (-> (the-as list-node a0-2) next))) + (set! (-> (the-as list-node a0-2) next) v1-3) + ) + ) + (none) + ) + +;; definition for method 14 of type nav-network +(defmethod nav-network-method-14 nav-network ((obj nav-network) (arg0 int) (arg1 nav-network-path-node)) + (let ((v1-0 arg1)) + (let ((a3-1 (the-as list-node (&+ (-> obj list-table) (* arg0 4))))) + (if (= (-> a3-1 next) v1-0) + (set! (-> a3-1 next) (-> v1-0 next)) + ) + ) + (if (-> v1-0 prev) + (set! (-> v1-0 prev next) (-> v1-0 next)) + ) + (if (-> v1-0 next) + (set! (-> v1-0 next prev) (-> v1-0 prev)) + ) + (set! (-> v1-0 prev) #f) + (set! (-> v1-0 next) #f) + ) + (let ((v1-4 (-> obj list-table arg0))) + (while v1-4 + (let ((a0-2 (-> v1-4 next))) + (if (= v1-4 arg1) + (return #t) + ) + (set! v1-4 a0-2) + ) + ) + ) + (when #f + (break!) + 0 + ) + (when (not (and (not (-> arg1 next)) (not (-> arg1 prev)))) + (break!) + 0 + ) + (set! (-> arg1 status) (net-path-node-status)) + 0 + ) + +;; definition for method 16 of type nav-network +;; WARN: Return type mismatch object vs none. +(defmethod nav-network-method-16 nav-network ((obj nav-network) (arg0 nav-network-path-node)) + (nav-network-method-14 obj 0 arg0) + (none) + ) + +;; definition for method 17 of type nav-network +(defmethod nav-network-method-17 nav-network ((obj nav-network)) + (let ((gp-0 (-> obj open-list))) + (if gp-0 + (nav-network-method-16 obj gp-0) + (set! gp-0 (the-as nav-network-path-node #f)) + ) + gp-0 + ) + ) + +;; definition for method 18 of type nav-network +;; WARN: Return type mismatch net-path-node-status vs none. +(defmethod nav-network-method-18 nav-network ((obj nav-network) (arg0 nav-network-path-node)) + (nav-network-method-13 obj 1 arg0) + (logior! (-> arg0 status) (net-path-node-status closed)) + (none) + ) + +;; definition for method 19 of type nav-network +;; WARN: Return type mismatch object vs none. +(defmethod nav-network-method-19 nav-network ((obj nav-network) (arg0 nav-network-path-node)) + (nav-network-method-14 obj 1 arg0) + (none) + ) + +;; definition for method 20 of type nav-network +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-20 nav-network ((obj nav-network) (arg0 nav-network-path-node) (arg1 vector)) + (let* ((s3-0 (-> obj network)) + (s2-0 (-> s3-0 (-> arg0 row-index))) + ) + (dotimes (s1-0 (-> s2-0 count)) + (let* ((v1-8 (-> s3-0 (-> s2-0 adjacency s1-0 index))) + (s0-0 (-> v1-8 path-node)) + (f0-1 (+ (-> arg0 cost-to-start) (-> s2-0 adjacency s1-0 dist))) + ) + (when (or (not (or (logtest? (-> s0-0 status) (net-path-node-status open)) + (logtest? (-> s0-0 status) (net-path-node-status closed)) + ) + ) + (< f0-1 (-> s0-0 cost-to-start)) + ) + (set! (-> s0-0 parent) arg0) + (set! (-> s0-0 cost-to-start) f0-1) + (set! (-> s0-0 cost-to-end) (vector-vector-distance (-> v1-8 pos) arg1)) + (cond + ((logtest? (-> s0-0 status) (net-path-node-status open)) + (nav-network-method-16 obj s0-0) + (nav-network-method-15 obj s0-0) + ) + ((logtest? (-> s0-0 status) (net-path-node-status closed)) + (nav-network-method-19 obj s0-0) + (nav-network-method-15 obj s0-0) + ) + (else + (nav-network-method-15 obj s0-0) + ) + ) + ) + ) + ) + ) + (nav-network-method-18 obj arg0) + 0 + (none) + ) + +;; definition for method 22 of type nav-network +;; INFO: Used lq/sq +(defmethod nav-network-method-22 nav-network ((obj nav-network) (arg0 hover-nav-path-info) (arg1 vector) (arg2 vector) (arg3 int) (arg4 int)) + (-> obj network) + (let ((gp-0 (-> obj free-segment-list))) + (cond + ((and gp-0 (nonzero? gp-0)) + (let ((v1-2 gp-0)) + (let ((a0-1 (&-> obj free-segment-list))) + (if (= (-> a0-1 0) v1-2) + (set! (-> a0-1 0) (the-as hover-nav-path-segment (-> v1-2 next))) + ) + ) + (if (-> v1-2 prev) + (set! (-> v1-2 prev next) (-> v1-2 next)) + ) + (if (-> v1-2 next) + (set! (-> v1-2 next prev) (-> v1-2 prev)) + ) + (set! (-> v1-2 prev) #f) + (set! (-> v1-2 next) #f) + ) + (set! (-> gp-0 curve-matrix quad 0) (-> arg1 quad)) + (set! (-> gp-0 curve-matrix vector 1 quad) (-> arg2 quad)) + (set! (-> gp-0 pos-index 0) (the-as float arg3)) + (set! (-> gp-0 pos-index 1) (the-as float arg4)) + (set! (-> gp-0 dist) + (vector-vector-distance (the-as vector (-> gp-0 curve-matrix)) (-> gp-0 curve-matrix vector 1)) + ) + (if (not (-> arg0 segment-list)) + (set! (-> arg0 tail-segment) gp-0) + ) + (let ((v1-9 gp-0) + (a1-7 (-> arg0 segment-list)) + (a0-13 (&-> arg0 segment-list)) + ) + (when (zero? v1-9) + (break!) + 0 + ) + (when (or (= v1-9 a1-7) (= v1-9 a0-13)) + (break!) + 0 + ) + (when (not (or (not a1-7) (!= (-> a1-7 prev) v1-9))) + (break!) + 0 + ) + (when a1-7 + (set! (-> v1-9 next) a1-7) + (set! (-> v1-9 prev) (-> a1-7 prev)) + (if (-> v1-9 prev) + (set! (-> v1-9 prev next) v1-9) + ) + (if (-> v1-9 next) + (set! (-> v1-9 next prev) v1-9) + ) + ) + (if (or (not a1-7) (= a1-7 (-> a0-13 0))) + (set! (-> a0-13 0) v1-9) + ) + ) + gp-0 + ) + (else + (format #t "nav-network out of path segments~%") + (the-as hover-nav-path-segment #f) + ) + ) + ) + ) + +;; definition for method 21 of type nav-network +;; WARN: Return type mismatch hover-nav-path-segment vs none. +(defmethod nav-network-method-21 nav-network ((obj nav-network) (arg0 object) (arg1 int) (arg2 int)) + (let ((t0-0 (-> obj network))) + (nav-network-method-22 obj (the-as hover-nav-path-info arg0) (-> t0-0 arg1 pos) (-> t0-0 arg2 pos) arg1 arg2) + ) + (none) + ) + +;; definition for method 23 of type nav-network +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-23 nav-network ((obj nav-network) (arg0 hover-nav-path-info)) + (while (-> arg0 segment-list) + (let ((v1-0 (-> arg0 segment-list))) + (let ((a2-0 v1-0)) + (let ((a3-0 (&-> arg0 segment-list))) + (if (= (-> a3-0 0) a2-0) + (set! (-> a3-0 0) (the-as hover-nav-path-segment (-> a2-0 next))) + ) + ) + (if (-> a2-0 prev) + (set! (-> a2-0 prev next) (-> a2-0 next)) + ) + (if (-> a2-0 next) + (set! (-> a2-0 next prev) (-> a2-0 prev)) + ) + (set! (-> a2-0 prev) #f) + (set! (-> a2-0 next) #f) + ) + (let ((a3-7 (-> obj free-segment-list)) + (a2-2 (&-> obj free-segment-list)) + ) + (when (zero? v1-0) + (break!) + 0 + ) + (when (or (= v1-0 a3-7) (= v1-0 a2-2)) + (break!) + 0 + ) + (when (not (or (not a3-7) (!= (-> a3-7 prev) v1-0))) + (break!) + 0 + ) + (when a3-7 + (set! (-> v1-0 next) a3-7) + (set! (-> v1-0 prev) (-> a3-7 prev)) + (if (-> v1-0 prev) + (set! (-> v1-0 prev next) v1-0) + ) + (if (-> v1-0 next) + (set! (-> v1-0 next prev) v1-0) + ) + ) + (if (or (not a3-7) (= a3-7 (-> a2-2 0))) + (set! (-> a2-2 0) v1-0) + ) + ) + ) + ) + (set! (-> arg0 tail-segment) #f) + (set! (-> arg0 curr-segment) #f) + 0 + (none) + ) + +;; definition for method 24 of type nav-network +;; WARN: new jak 2 until loop case, check carefully +(defmethod nav-network-method-24 nav-network ((obj nav-network) (arg0 hover-nav-path-info) (arg1 int) (arg2 int) (arg3 int)) + (local-vars (s3-1 nav-network-path-node)) + (nav-network-method-12 obj) + (let ((s4-0 (-> obj network))) + (let ((s2-0 (-> s4-0 arg1 path-node))) + (set! (-> s2-0 row-index) arg1) + (set! (-> s2-0 status) (net-path-node-status)) + (set! (-> s2-0 parent) #f) + (set! (-> s2-0 cost-to-start) 0.0) + (set! (-> s2-0 cost-to-end) (vector-vector-distance (-> s4-0 arg1 pos) (-> s4-0 arg2 pos))) + (nav-network-method-15 obj s2-0) + ) + (until #f + (let ((a1-3 (nav-network-method-17 obj))) + (when (not a1-3) + (set! s3-1 (the-as nav-network-path-node #f)) + (goto cfg-9) + ) + (when (= (-> a1-3 row-index) arg2) + (set! s3-1 a1-3) + (goto cfg-9) + ) + (nav-network-method-20 obj a1-3 (-> s4-0 arg2 pos)) + ) + ) + #f + (set! s3-1 (nav-network-method-17 obj)) + (label cfg-9) + (while (and s3-1 (-> s3-1 parent)) + (if *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) (-> s4-0 (-> s3-1 row-index) pos) (meters 0.5) *color-blue*) + ) + (nav-network-method-21 obj arg0 (-> s3-1 parent row-index) (-> s3-1 row-index)) + (set! s3-1 (-> s3-1 parent)) + ) + ) + #t + ) + +;; definition for method 25 of type nav-network +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-25 nav-network ((obj nav-network) (arg0 process) (arg1 collide-prim-core)) + (local-vars (a3-2 hover-nav-sphere)) + (let ((a1-4 (process->handle arg0))) + (let ((v1-2 (-> obj sphere-list))) + (while v1-2 + (let ((a3-1 (-> v1-2 next))) + (when (= (-> v1-2 handle) a1-4) + (set! a3-2 v1-2) + (goto cfg-12) + ) + (set! v1-2 (the-as hover-nav-sphere a3-1)) + ) + ) + ) + (set! a3-2 (the-as hover-nav-sphere #f)) + (label cfg-12) + (when (not a3-2) + (let ((v1-6 (-> obj free-sphere-list))) + (when v1-6 + (let ((a3-3 v1-6)) + (let ((t0-3 (&-> obj free-sphere-list))) + (if (= (-> t0-3 0) a3-3) + (set! (-> t0-3 0) (the-as hover-nav-sphere (-> a3-3 next))) + ) + ) + (if (-> a3-3 prev) + (set! (-> a3-3 prev next) (-> a3-3 next)) + ) + (if (-> a3-3 next) + (set! (-> a3-3 next prev) (-> a3-3 prev)) + ) + (set! (-> a3-3 prev) #f) + (set! (-> a3-3 next) #f) + ) + (set! (-> v1-6 handle) (the-as handle a1-4)) + (let ((a1-5 v1-6) + (a3-5 (-> obj sphere-list)) + (a0-1 (&-> obj sphere-list)) + ) + (when (zero? a1-5) + (break!) + 0 + ) + (when (or (= a1-5 a3-5) (= a1-5 a0-1)) + (break!) + 0 + ) + (when (not (or (not a3-5) (!= (-> a3-5 prev) a1-5))) + (break!) + 0 + ) + (when a3-5 + (set! (-> a1-5 next) a3-5) + (set! (-> a1-5 prev) (-> a3-5 prev)) + (if (-> a1-5 prev) + (set! (-> a1-5 prev next) a1-5) + ) + (if (-> a1-5 next) + (set! (-> a1-5 next prev) a1-5) + ) + ) + (if (or (not a3-5) (= a3-5 (-> a0-1 0))) + (set! (-> a0-1 0) a1-5) + ) + ) + (set! a3-2 v1-6) + ) + ) + ) + ) + (when a3-2 + (set! (-> a3-2 timer) (seconds 0.5)) + (when arg1 + (set! (-> a3-2 sphere quad) (-> arg1 world-sphere quad)) + (set! (-> a3-2 sphere r) (fmax 4096.0 (-> a3-2 sphere r))) + ) + ) + 0 + (none) + ) + +;; definition for method 26 of type nav-network +;; INFO: Used lq/sq +(defmethod nav-network-method-26 nav-network ((obj nav-network) (arg0 vector) (arg1 process) (arg2 vector) (arg3 vector) (arg4 float)) + (local-vars (sv-48 vector) (sv-64 sphere)) + (vector-reset! arg0) + (let ((s1-0 (process->handle arg1)) + (s2-0 0) + ) + (let ((v1-3 (the-as list-node (-> obj sphere-list)))) + (while v1-3 + (let ((s0-0 (-> v1-3 next))) + (when (!= (-> (the-as hover-nav-sphere v1-3) handle) s1-0) + (set! sv-64 (-> (the-as hover-nav-sphere v1-3) sphere)) + (set! sv-48 (new 'stack-no-clear 'vector)) + (vector-segment-distance-point! sv-64 arg2 arg3 sv-48) + (when (>= (+ arg4 (-> sv-64 r)) (vector-vector-distance sv-64 sv-48)) + (let* ((v1-8 (new 'stack-no-clear 'vector)) + (a0-6 arg2) + (v1-9 (vector-! v1-8 (the-as vector sv-64) a0-6)) + ) + (vector+! arg0 arg0 v1-9) + ) + (+! s2-0 1) + ) + ) + (set! v1-3 s0-0) + ) + ) + ) + (vector-float*! arg0 arg0 (/ 1.0 (the float s2-0))) + ) + ) + +;; definition for method 27 of type nav-network +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-27 nav-network ((obj nav-network)) + (with-pp + (let ((v1-0 (the-as list-node (-> obj sphere-list)))) + (while v1-0 + (let ((a0-2 (-> v1-0 next))) + (set! (-> (the-as hover-nav-sphere v1-0) timer) + (- (-> (the-as hover-nav-sphere v1-0) timer) (- (-> pp clock frame-counter) (-> pp clock old-frame-counter))) + ) + (when (<= (-> (the-as hover-nav-sphere v1-0) timer) 0) + (let ((a1-4 v1-0)) + (let ((a2-3 (&-> obj sphere-list))) + (if (= (-> a2-3 0) a1-4) + (set! (-> a2-3 0) (the-as hover-nav-sphere (-> a1-4 next))) + ) + ) + (if (-> a1-4 prev) + (set! (-> a1-4 prev next) (-> a1-4 next)) + ) + (if (-> a1-4 next) + (set! (-> a1-4 next prev) (-> a1-4 prev)) + ) + (set! (-> a1-4 prev) #f) + (set! (-> a1-4 next) #f) + ) + (let ((a2-10 (-> obj free-sphere-list)) + (a1-6 (&-> obj free-sphere-list)) + ) + (when (zero? v1-0) + (break!) + 0 + ) + (when (or (= v1-0 a2-10) (= v1-0 a1-6)) + (break!) + 0 + ) + (when (not (or (not a2-10) (!= (-> a2-10 prev) v1-0))) + (break!) + 0 + ) + (when a2-10 + (set! (-> v1-0 next) a2-10) + (set! (-> v1-0 prev) (-> a2-10 prev)) + (if (-> v1-0 prev) + (set! (-> v1-0 prev next) v1-0) + ) + (if (-> v1-0 next) + (set! (-> v1-0 next prev) v1-0) + ) + ) + (if (or (not a2-10) (= a2-10 (-> a1-6 0))) + (set! (-> a1-6 0) (the-as hover-nav-sphere v1-0)) + ) + ) + ) + (set! v1-0 a0-2) + ) + ) + ) + (let ((v1-2 (the-as list-node (-> obj sphere-list)))) + (while v1-2 + (let ((s5-0 (-> v1-2 next))) + (let* ((s3-0 (handle->process (-> (the-as hover-nav-sphere v1-2) handle))) + (s4-0 (if (type? s3-0 hover-enemy) + s3-0 + ) + ) + ) + (when s4-0 + (let ((a1-9 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-9 from) (process->ppointer pp)) + (set! (-> a1-9 num-params) 0) + (set! (-> a1-9 message) 'get-hover-nav-sphere) + (let ((a2-14 (send-event-function s4-0 a1-9))) + (if a2-14 + (nav-network-method-25 obj s4-0 (the-as collide-prim-core a2-14)) + ) + ) + ) + ) + ) + (set! v1-2 s5-0) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 31 of type nav-network +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-31 nav-network ((obj nav-network) (arg0 bounding-box)) + (set-to-point! arg0 (-> obj network 0 pos)) + (let* ((s4-0 (-> obj network length)) + (s3-0 0) + (v1-7 (-> obj network s3-0)) + ) + (while (< s3-0 s4-0) + (add-point! arg0 (-> v1-7 pos)) + (+! s3-0 1) + (set! v1-7 (-> obj network s3-0)) + ) + ) + 0 + (none) + ) + +;; definition for method 32 of type nav-network +;; WARN: Return type mismatch int vs none. +(defmethod nav-network-method-32 nav-network ((obj nav-network) (arg0 string)) + (let ((gp-0 (new 'stack-no-clear 'bounding-box)) + (s5-0 (entity-by-name arg0)) + ) + (when s5-0 + (nav-network-method-31 obj gp-0) + (vector-! (-> gp-0 min) (-> gp-0 min) (-> s5-0 extra trans)) + (vector-! (-> gp-0 max) (-> gp-0 max) (-> s5-0 extra trans)) + (format #t "~S ~m " (res-lump-struct s5-0 'name structure) (-> s5-0 extra vis-dist)) + (format + #t + " ~m ~m ~m ~m ~m ~m~%" + (-> gp-0 min x) + (-> gp-0 min y) + (-> gp-0 min z) + (-> gp-0 max x) + (-> gp-0 max y) + (-> gp-0 max z) + ) + ) + ) + 0 + (none) + ) + +;; definition for symbol *nav-network*, type nav-network +(define *nav-network* (the-as nav-network 0)) + +;; definition for method 26 of type hover-nav-control +;; INFO: Used lq/sq +(defmethod hover-nav-control-method-26 hover-nav-control ((obj hover-nav-control) (arg0 vector) (arg1 vector) (arg2 float)) + (let ((gp-0 (new 'stack-no-clear 'collide-query))) + (let ((v1-1 (vector-! (new 'stack-no-clear 'vector) arg1 arg0))) + (set! (-> gp-0 start-pos quad) (-> arg0 quad)) + (set! (-> gp-0 move-dist quad) (-> v1-1 quad)) + (vector-normalize! (-> gp-0 move-dist) (fmin (vector-length v1-1) (fmax 16384.0 (* 2.0 arg2)))) + ) + (let ((v1-5 gp-0)) + (set! (-> v1-5 radius) 4096.0) + (set! (-> v1-5 collide-with) (collide-spec backgnd)) + (set! (-> v1-5 ignore-process0) #f) + (set! (-> v1-5 ignore-process1) #f) + (set! (-> v1-5 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-5 action-mask) (collide-action solid)) + ) + (fill-using-line-sphere *collide-cache* gp-0) + (< (probe-using-line-sphere *collide-cache* gp-0) 0.0) + ) + ) + +;; definition for method 27 of type hover-nav-control +(defmethod hover-nav-control-method-27 hover-nav-control ((obj hover-nav-control) (arg0 vector) (arg1 vector)) + (let ((s2-0 (-> obj nav network)) + (gp-0 (the-as int #f)) + ) + (let ((f30-0 0.0)) + (dotimes (s1-0 (-> s2-0 length)) + (let* ((a0-1 (-> s2-0 s1-0 pos)) + (v1-5 (vector-! (new 'stack-no-clear 'vector) a0-1 arg0)) + (f28-0 (vector-length v1-5)) + ) + (if (< (vector-dot (vector-float*! (new 'stack-no-clear 'vector) v1-5 (/ 1.0 f28-0)) arg1) 0.0) + (set! f28-0 (* 1.25 f28-0)) + ) + (when (and (< f28-0 204800.0) (hover-nav-control-method-26 obj arg0 (-> s2-0 s1-0 pos) 0.0)) + (when (or (not gp-0) (< f28-0 f30-0)) + (set! gp-0 s1-0) + (set! f30-0 f28-0) + ) + ) + ) + ) + ) + gp-0 + ) + ) + +;; definition for method 22 of type hover-nav-control +(defmethod hover-nav-control-method-22 hover-nav-control ((obj hover-nav-control)) + (-> obj path-info curr-segment) + ) + +;; definition for method 23 of type hover-nav-control +(defmethod hover-nav-control-method-23 hover-nav-control ((obj hover-nav-control)) + (and (-> obj path-info curr-segment) (>= (-> obj path-info curr-u) 1.0)) + ) + +;; definition for method 21 of type hover-nav-control +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-21 hover-nav-control ((obj hover-nav-control)) + (nav-network-method-23 (-> obj nav) (-> obj path-info)) + (set! (-> obj curr-dest-pt) -1) + 0 + (none) + ) + +;; definition for method 28 of type hover-nav-control +;; INFO: Used lq/sq +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Stack slot offset 32 signed mismatch +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-28 hover-nav-control ((obj hover-nav-control) (arg0 vector) (arg1 vector)) + (local-vars (v0-15 symbol) (sv-32 int) (sv-48 (function hover-nav-control vector vector int))) + (let ((s4-0 (-> obj nav network)) + (s5-0 (-> obj path-info)) + (s1-0 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) arg0 arg1) 1.0)) + ) + (set! sv-32 (hover-nav-control-method-27 obj arg1 s1-0)) + (set! v0-15 + (cond + (sv-32 + (when (or (!= sv-32 (-> obj curr-dest-pt)) (not (-> obj path-info segment-list))) + (let ((s0-0 obj)) + (set! sv-48 (method-of-object s0-0 hover-nav-control-method-27)) + (let* ((a2-2 (vector-negate! s1-0 s1-0)) + (s2-1 (sv-48 s0-0 arg0 a2-2)) + ) + (when s2-1 + (cond + ((= s2-1 sv-32) + (if *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) (-> s4-0 sv-32 pos) (meters 1) *color-dark-blue*) + ) + (nav-network-method-22 (-> obj nav) s5-0 (-> s4-0 sv-32 pos) arg1 -1 -1) + (nav-network-method-22 + (-> obj nav) + s5-0 + (the-as vector (hover-nav-control-method-17 obj)) + (-> s4-0 s2-1 pos) + -1 + -1 + ) + ) + (else + (when *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) (-> s4-0 s2-1 pos) (meters 1) *color-green*) + (add-debug-sphere #t (bucket-id debug-no-zbuf1) (-> s4-0 sv-32 pos) (meters 1) *color-cyan*) + ) + (let* ((a0-14 (-> obj nav)) + (t9-10 (method-of-object a0-14 nav-network-method-22)) + (a1-11 s5-0) + (a2-8 (-> s4-0 sv-32 pos)) + (a3-5 arg1) + (t0-5 -1) + ) + (t9-10 a0-14 a1-11 a2-8 a3-5 t0-5 -1) + (nav-network-method-24 (-> obj nav) s5-0 s2-1 sv-32 t0-5) + ) + (nav-network-method-22 + (-> obj nav) + s5-0 + (the-as vector (hover-nav-control-method-17 obj)) + (-> s4-0 s2-1 pos) + -1 + -1 + ) + ) + ) + (hover-nav-control-method-29 obj (-> obj root transv)) + (set! (-> s5-0 curr-segment) (-> s5-0 segment-list)) + (set! (-> s5-0 curr-u) (/ 16384.0 (-> s5-0 curr-segment dist))) + (set! (-> obj curr-dest-pt) sv-32) + ) + ) + ) + ) + v0-15 + ) + (else + (if *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) arg1 (meters 1) *color-red*) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 29 of type hover-nav-control +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-29 hover-nav-control ((obj hover-nav-control) (arg0 vector)) + (let ((a0-1 (the-as list-node #f)) + (s4-0 (the-as list-node (-> obj path-info segment-list))) + ) + (while s4-0 + (cond + (a0-1 + (set! (-> (the-as hover-nav-path-segment s4-0) curve-matrix vector 2 quad) + (-> (the-as vector (-> (the-as hover-nav-path-segment a0-1) curve-matrix trans)) quad) + ) + ) + (arg0 + (set! (-> (the-as hover-nav-path-segment s4-0) curve-matrix vector 2 quad) (-> arg0 quad)) + ) + (else + (vector-normalize! + (vector-! + (-> (the-as hover-nav-path-segment s4-0) curve-matrix vector 2) + (-> (the-as hover-nav-path-segment s4-0) curve-matrix vector 1) + (the-as vector (-> (the-as hover-nav-path-segment s4-0) curve-matrix)) + ) + (hover-nav-control-method-30 obj) + ) + ) + ) + (let ((a0-9 (-> s4-0 next))) + (cond + (a0-9 + (vector-! + (-> (the-as hover-nav-path-segment s4-0) curve-matrix trans) + (-> (the-as hover-nav-path-segment a0-9) curve-matrix vector 1) + (the-as vector (+ (the-as uint s4-0) 16)) + ) + (vector-float*! + (-> (the-as hover-nav-path-segment s4-0) curve-matrix trans) + (-> (the-as hover-nav-path-segment s4-0) curve-matrix trans) + 0.5 + ) + ) + (else + (set-vector! (-> (the-as hover-nav-path-segment s4-0) curve-matrix trans) 0.0 0.0 0.0 0.0) + ) + ) + ) + (set! a0-1 s4-0) + (set! s4-0 (-> s4-0 next)) + ) + ) + 0 + (none) + ) + +;; definition for method 30 of type hover-nav-control +(defmethod hover-nav-control-method-30 hover-nav-control ((obj hover-nav-control)) + (* (-> obj max-speed-multiplier) (-> obj params max-speed)) + ) + +;; definition for method 31 of type hover-nav-control +(defmethod hover-nav-control-method-31 hover-nav-control ((obj hover-nav-control)) + (* (-> obj max-acceleration-multiplier) (-> obj params max-acceleration)) + ) + +;; definition for method 14 of type hover-nav-control +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-14 hover-nav-control ((obj hover-nav-control) (arg0 float) (arg1 float)) + (set! (-> obj max-speed-multiplier) arg0) + (set! (-> obj max-acceleration-multiplier) arg1) + 0 + (none) + ) + +;; definition for method 18 of type hover-nav-control +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-18 hover-nav-control ((obj hover-nav-control) (arg0 path-control) (arg1 int) (arg2 int)) + (hover-nav-control-method-21 obj) + (set! arg2 (cond + ((= arg2 -1) + (+ (-> arg0 curve num-cverts) -2) + ) + (else + (empty) + arg2 + ) + ) + ) + (while (>= arg2 (if (= arg1 -1) + 0 + arg1 + ) + ) + (let ((s2-0 (get-point-in-path! arg0 (new 'stack-no-clear 'vector) (the float arg2) 'interp)) + (a3-3 (get-point-in-path! arg0 (new 'stack-no-clear 'vector) (the float (+ arg2 1)) 'interp)) + ) + (hover-nav-path-segment-method-9 + (nav-network-method-22 (-> obj nav) (-> obj path-info) s2-0 a3-3 -1 -1) + (hover-nav-control-method-30 obj) + ) + ) + (+! arg2 -1) + ) + (hover-nav-control-method-29 obj (the-as vector #f)) + (set! (-> obj path-info curr-segment) (-> obj path-info segment-list)) + (logior! (-> obj flags) 1) + 0 + (none) + ) + +;; definition for method 19 of type hover-nav-control +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-19 hover-nav-control ((obj hover-nav-control) (arg0 (inline-array vector)) (arg1 int)) + (hover-nav-control-method-21 obj) + (let ((s4-1 (+ arg1 -2))) + (while (>= s4-1 0) + (hover-nav-path-segment-method-9 + (nav-network-method-22 (-> obj nav) (-> obj path-info) (-> arg0 s4-1) (-> arg0 (+ s4-1 1)) -1 -1) + (hover-nav-control-method-30 obj) + ) + (+! s4-1 -1) + ) + ) + (hover-nav-control-method-29 obj (the-as vector #f)) + (set! (-> obj path-info curr-segment) (-> obj path-info segment-list)) + (logior! (-> obj flags) 1) + 0 + (none) + ) + +;; definition for method 20 of type hover-nav-control +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-20 hover-nav-control ((obj hover-nav-control)) + (hover-nav-control-method-21 obj) + (set! (-> obj flags) (logand -2 (-> obj flags))) + 0 + (none) + ) + +;; definition for method 17 of type hover-nav-control +(defmethod hover-nav-control-method-17 hover-nav-control ((obj hover-nav-control)) + (-> (the-as collide-shape-prim-group (-> obj root root-prim)) + child + (-> obj params nav-collide-prim-index) + prim-core + ) + ) + +;; definition for method 15 of type hover-nav-control +;; WARN: Return type mismatch vector vs none. +(defmethod hover-nav-control-method-15 hover-nav-control ((obj hover-nav-control) (arg0 vector)) + (local-vars (sv-32 vector) (sv-36 collide-shape-moving)) + (set! sv-32 (new 'stack-no-clear 'vector)) + (set! sv-36 (-> obj root)) + (vector-inv-orient-by-quat! sv-32 (-> sv-36 transv) (-> sv-36 quat)) + (vector-float*! arg0 sv-32 (/ 1.0 (hover-nav-control-method-30 obj))) + (none) + ) + +;; definition for method 16 of type hover-nav-control +(defmethod hover-nav-control-method-16 hover-nav-control ((obj hover-nav-control) (arg0 vector)) + (local-vars (sv-32 vector)) + (set! sv-32 (new 'stack-no-clear 'vector)) + (vector-inv-orient-by-quat! sv-32 (-> obj transvv) (-> obj root quat)) + (vector-float*! arg0 sv-32 (/ 1.0 (hover-nav-control-method-31 obj))) + ) + +;; definition for method 10 of type hover-nav-control +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-10 hover-nav-control ((obj hover-nav-control) (arg0 vector) (arg1 vector) (arg2 vector)) + (set! (-> obj dest-pos quad) (-> arg0 quad)) + (cond + (arg2 + (set! (-> obj dest-vel quad) (-> arg2 quad)) + (set! (-> obj root transv quad) (-> arg2 quad)) + ) + (else + (set! (-> obj dest-vel quad) (the-as uint128 0)) + (set! (-> obj root transv quad) (the-as uint128 0)) + ) + ) + (vector-normalize-copy! (-> obj dest-move-dir) arg1 1.0) + 0 + (none) + ) + +;; definition for method 24 of type hover-nav-control +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-24 hover-nav-control ((obj hover-nav-control)) + (with-pp + (when (not (logtest? (-> obj flags) 1)) + (let ((s5-0 (new 'stack-no-clear 'collide-query))) + (-> obj params) + (let ((v1-5 (hover-nav-control-method-17 obj)) + (s4-0 (-> obj root transv)) + ) + (when (< 0.0 (vector-length s4-0)) + (set! (-> s5-0 start-pos quad) (-> v1-5 world-sphere quad)) + (set! (-> s5-0 move-dist quad) (-> s4-0 quad)) + (let ((f0-1 (vector-length (-> s5-0 move-dist)))) + (if (< 40960.0 f0-1) + (vector-float*! (-> s5-0 move-dist) (-> s5-0 move-dist) (/ 40960.0 f0-1)) + ) + ) + (let ((a0-14 s5-0)) + (set! (-> a0-14 radius) (-> v1-5 world-sphere w)) + (set! (-> a0-14 collide-with) (-> obj root root-prim prim-core collide-with)) + (set! (-> a0-14 ignore-process0) (-> obj root process)) + (set! (-> a0-14 ignore-process1) #f) + (set! (-> a0-14 ignore-pat) (-> obj root pat-ignore-mask)) + (set! (-> a0-14 action-mask) (collide-action solid)) + ) + (let ((f0-4 (fill-and-probe-using-line-sphere *collide-cache* s5-0))) + (cond + ((>= f0-4 0.0) + (set! (-> obj los-obstruction-distance) (* f0-4 (vector-length s4-0))) + (logior! (-> obj flags) 2) + ) + (else + (set! (-> obj los-last-clear-time) (-> pp clock frame-counter)) + (set! (-> obj flags) (logand -3 (-> obj flags))) + ) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 11 of type hover-nav-control +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-11 hover-nav-control ((obj hover-nav-control) (arg0 vector)) + (local-vars (sv-288 vector) (sv-304 vector) (sv-320 vector) (sv-336 vector) (sv-352 int)) + (with-pp + (when *debug-hover* + (if arg0 + (add-debug-sphere #t (bucket-id debug2) arg0 (meters 0.9) *color-yellow*) + ) + (if (!= (-> obj curr-dest-pt) -1) + (add-debug-sphere + #t + (bucket-id debug-no-zbuf1) + (-> obj nav network (-> obj curr-dest-pt) pos) + (meters 0.4) + *color-blue* + ) + ) + ) + (when (not (logtest? (-> obj flags) 1)) + (cond + ((and arg0 (and (< (vector-vector-distance arg0 (-> obj root trans)) 40960.0) + (>= (-> obj los-last-clear-time) (+ (-> pp clock frame-counter) (seconds -0.2))) + ) + ) + (if (not (and (-> obj path-info curr-segment) (< (-> obj path-info curr-u) 1.0))) + (hover-nav-control-method-21 obj) + ) + ) + ((or (>= (- (-> pp clock frame-counter) (-> obj los-last-clear-time)) (seconds 1)) + (not (-> obj path-info curr-segment)) + ) + (hover-nav-control-method-21 obj) + (when arg0 + (let ((s4-0 (new 'stack-no-clear 'vector))) + (set! (-> s4-0 quad) (-> obj root transv quad)) + (if (>= (- (-> pp clock frame-counter) (-> obj los-last-clear-time)) (seconds 1)) + (vector-normalize! s4-0 (fmin (vector-length s4-0) (-> obj los-obstruction-distance))) + ) + (hover-nav-control-method-28 + obj + (vector+! (new 'stack-no-clear 'vector) (the-as vector (hover-nav-control-method-17 obj)) s4-0) + arg0 + ) + ) + ) + ) + ) + ) + (let ((s4-1 (new 'stack-no-clear 'vector))) + (let* ((s3-1 (-> obj path-info)) + (s2-1 (-> s3-1 curr-segment)) + ) + (cond + (s2-1 + (when *debug-hover* + (let ((s1-2 (the-as list-node (-> s3-1 segment-list)))) + (while s1-2 + (add-debug-x + #t + (bucket-id debug-no-zbuf1) + (the-as vector (+ (the-as uint s1-2) 16)) + (new 'static 'rgba :r #xff :g #xff :b #xff :a #x40) + ) + (let ((s0-0 (matrix*! (new 'stack-no-clear 'matrix) *hermite-matrix* (the-as matrix (+ (the-as uint s1-2) 16))))) + (set! sv-288 (new 'stack-no-clear 'vector)) + (set! sv-304 (new 'stack-no-clear 'vector)) + (set! sv-320 (new 'stack-no-clear 'vector)) + (set! sv-336 (new 'stack-no-clear 'vector)) + (let ((f30-0 0.0) + (f28-0 0.1) + ) + (set! sv-352 0) + (while (< sv-352 10) + (set-vector! sv-288 (* f30-0 f30-0 f30-0) (* f30-0 f30-0) f30-0 1.0) + (set-vector! sv-304 (* f28-0 f28-0 f28-0) (* f28-0 f28-0) f28-0 1.0) + (vector-matrix*! sv-320 sv-288 s0-0) + (vector-matrix*! sv-336 sv-304 s0-0) + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + sv-320 + sv-336 + (new 'static 'rgba :r #xff :g #xff :b #xff :a #x40) + #f + (the-as rgba -1) + ) + (set! f30-0 (+ 0.1 f30-0)) + (set! f28-0 (+ 0.1 f28-0)) + (set! sv-352 (+ sv-352 1)) + ) + ) + ) + (set! s1-2 (-> s1-2 next)) + ) + ) + ) + (if arg0 + (set! (-> s3-1 tail-segment curve-matrix vector 1 quad) (-> arg0 quad)) + ) + (let ((f30-1 (-> s3-1 curr-u)) + (a2-11 (matrix*! (new 'stack-no-clear 'matrix) *hermite-matrix* (-> s2-1 curve-matrix))) + (a1-12 (new 'stack-no-clear 'vector)) + ) + (set-vector! a1-12 (* f30-1 f30-1 f30-1) (* f30-1 f30-1) f30-1 1.0) + (vector-matrix*! s4-1 a1-12 a2-11) + ) + (if *debug-hover* + (add-debug-sphere #t (bucket-id debug-no-zbuf1) s4-1 (meters 0.8) *color-magenta*) + ) + (let ((f0-19 (+ 2048.0 (vector-length (-> obj root transv))))) + (if (logtest? (-> obj flags) 2) + (set! f0-19 (fmin f0-19 (fmax 8192.0 (-> obj los-obstruction-distance)))) + ) + (hover-nav-path-segment-method-9 s2-1 f0-19) + ) + (seek! (-> s3-1 curr-u) 1.0 (* (-> s2-1 du) (-> pp clock seconds-per-frame))) + (when (and (>= (-> s3-1 curr-u) 1.0) (-> s2-1 next)) + (set! (-> s3-1 curr-segment) (the-as hover-nav-path-segment (-> s2-1 next))) + (set! (-> s3-1 curr-u) 0.0) + (hover-nav-path-segment-method-9 (-> s3-1 curr-segment) (hover-nav-control-method-30 obj)) + ) + ) + (arg0 + (set! (-> s4-1 quad) (-> arg0 quad)) + ) + (else + (set! (-> s4-1 quad) (-> (hover-nav-control-method-17 obj) world-sphere quad)) + ) + ) + ) + (let ((v1-94 (vector-! (new 'stack-no-clear 'vector) s4-1 (-> obj dest-pos)))) + (set! (-> obj dest-pos quad) (-> s4-1 quad)) + (vector-float*! (-> obj dest-vel) v1-94 (-> pp clock frames-per-second)) + ) + ) + (if (< 0.0 (vector-length (-> obj dest-vel))) + (vector-normalize-copy! (-> obj dest-move-dir) (-> obj dest-vel) 1.0) + ) + 0 + (none) + ) + ) + +;; definition for method 25 of type hover-nav-control +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-25 hover-nav-control ((obj hover-nav-control)) + (with-pp + (let ((s5-0 (new 'stack-no-clear 'hover-nav-path-segment)) + (f28-0 (hover-nav-control-method-31 obj)) + (f30-0 (hover-nav-control-method-30 obj)) + (s3-0 (-> obj root transv)) + ) + (-> obj transvv) + (let ((s4-0 (-> obj dest-offset))) + (vector-normalize-copy! (-> s5-0 curve-matrix vector 2) s3-0 1.0) + (vector-normalize-copy! (-> s5-0 curve-matrix trans) s4-0 1.0) + (set! (-> s5-0 pos-index 0) (vector-dot s3-0 (-> s5-0 curve-matrix trans))) + (set! (-> s5-0 pos-index 1) (/ (* 0.5 (-> s5-0 pos-index 0) (-> s5-0 pos-index 0)) (* 0.2 f28-0))) + (set! (-> s5-0 dist) (vector-dot (-> obj dest-vel) (-> s5-0 curve-matrix trans))) + (vector-normalize-copy! (-> s5-0 curve-matrix vector 1) s4-0 (-> obj target-speed)) + (vector-! (the-as vector (-> s5-0 curve-matrix)) (-> s5-0 curve-matrix vector 1) s3-0) + (let ((f0-9 (vector-length (the-as vector (-> s5-0 curve-matrix))))) + (if (< f28-0 f0-9) + (vector-float*! (the-as vector (-> s5-0 curve-matrix)) (the-as vector (-> s5-0 curve-matrix)) (/ f28-0 f0-9)) + ) + ) + (vector+float*! + (the-as vector (&-> s5-0 next)) + (-> obj root transv) + (the-as vector (-> s5-0 curve-matrix)) + (-> pp clock seconds-per-frame) + ) + (let ((f0-12 (vector-length (the-as vector (&-> s5-0 next)))) + (f1-6 (if (logtest? (-> obj flags) 2) + (fmax 8192.0 (* 0.8 (-> obj los-obstruction-distance))) + f30-0 + ) + ) + ) + (if (< f1-6 f0-12) + (vector-float*! (the-as vector (&-> s5-0 next)) (the-as vector (&-> s5-0 next)) (/ f1-6 f0-12)) + ) + ) + (set! (-> obj root transv quad) (-> (the-as vector (&-> s5-0 next)) quad)) + (set! (-> obj transvv quad) (-> s5-0 curve-matrix quad 0)) + (when *debug-hover* + (format *stdcon* " speed act: ~m target: ~m~%" (-> s5-0 pos-index 0) (-> obj target-speed)) + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> obj root trans) + (-> obj root transv) + (meters 0.00024414062) + *color-yellow* + ) + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> obj root trans) + (-> s5-0 curve-matrix vector 1) + (meters 0.00024414062) + *color-cyan* + ) + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> obj root trans) + (-> obj transvv) + (meters 0.00024414062) + *color-blue* + ) + (add-debug-x + #t + (bucket-id debug-no-zbuf1) + (vector+! (new 'stack-no-clear 'vector) (-> obj root trans) s4-0) + *color-green* + ) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 12 of type hover-nav-control +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-12 hover-nav-control ((obj hover-nav-control)) + (local-vars (at-0 int)) + (with-pp + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (hover-nav-control-method-25 obj) + (hover-nav-control-method-24 obj) + (let ((v1-5 (-> obj root transv)) + (a0-4 (-> obj root transv)) + (a1-0 (new 'stack-no-clear 'vector)) + ) + (.lvf vf1 (&-> (-> obj nav-collide-impulse) quad)) + (let ((f0-0 (-> pp clock seconds-per-frame))) + (.mov at-0 f0-0) + ) + (.mov vf2 at-0) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> a1-0 quad) vf1) + (vector+! v1-5 a0-4 a1-0) + ) + (let ((v1-7 (-> obj root)) + (a2-2 (new 'stack-no-clear 'collide-query)) + ) + (set! (-> a2-2 collide-with) (-> v1-7 root-prim prim-core collide-with)) + (set! (-> a2-2 ignore-process0) (-> v1-7 process)) + (set! (-> a2-2 ignore-process1) #f) + (set! (-> a2-2 ignore-pat) (-> v1-7 pat-ignore-mask)) + (set! (-> a2-2 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide v1-7 (-> v1-7 transv) a2-2 (meters 0)) + ) + (vector-float*! + (-> obj root transv) + (-> obj root transv) + (- 1.0 (* (-> obj params friction) (-> pp clock seconds-per-frame))) + ) + 0 + (none) + ) + ) + ) + +;; definition for method 13 of type hover-nav-control +;; INFO: Used lq/sq +;; ERROR: Stack slot load at 128 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 144 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 160 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 128 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 144 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 160 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 128 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 144 mismatch: defined as size 4, got size 16 +;; ERROR: Stack slot load at 160 mismatch: defined as size 4, got size 16 +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-13 hover-nav-control ((obj hover-nav-control)) + (local-vars (sv-112 float) (sv-128 float) (sv-144 float) (sv-160 float)) + (with-pp + (let* ((s5-0 (-> obj root)) + (s3-0 (hover-nav-control-method-17 obj)) + (v1-2 (vector-! (new 'stack-no-clear 'vector) (the-as vector s3-0) (-> s5-0 trans))) + (s4-1 (vector-! (new 'stack-no-clear 'vector) (-> obj dest-pos) v1-2)) + ) + (when (not (logtest? (-> obj flags) 1)) + (let* ((s2-0 (-> obj root transv)) + (f30-0 (vector-length s2-0)) + (s1-0 lerp-scale) + (s0-0 0.0) + ) + (set! sv-112 (hover-nav-control-method-30 obj)) + (set! sv-128 (* 2.0 f30-0)) + (set! sv-144 (the-as float 0.0)) + (let* ((t0-0 (hover-nav-control-method-30 obj)) + (f0-4 (s1-0 s0-0 sv-112 sv-128 sv-144 t0-0)) + (t0-2 (vector+float*! (new 'stack-no-clear 'vector) (the-as vector s3-0) s2-0 (/ f0-4 f30-0))) + (s2-1 (nav-network-method-26 + (-> obj nav) + (new 'stack-no-clear 'vector) + (-> obj root process) + (the-as vector s3-0) + t0-2 + (-> s3-0 world-sphere w) + ) + ) + ) + (let ((f0-7 (vector-length s2-1)) + (s1-1 seek) + (s0-1 (-> obj nav-collide-impulse-len)) + ) + (set! sv-160 f0-7) + (let ((a2-2 (* (hover-nav-control-method-31 obj) (-> pp clock seconds-per-frame)))) + (set! (-> obj nav-collide-impulse-len) (s1-1 s0-1 sv-160 a2-2)) + ) + ) + (vector-normalize-copy! (-> obj nav-collide-impulse) s2-1 (- (-> obj nav-collide-impulse-len))) + ) + ) + (if *debug-hover* + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (the-as vector s3-0) + (-> obj nav-collide-impulse) + (meters 0.00024414062) + *color-red* + ) + ) + ) + (let ((f30-1 (hover-nav-control-method-31 obj)) + (f28-0 (hover-nav-control-method-30 obj)) + ) + (vector-z-quaternion! (-> obj move-dir) (-> s5-0 quat)) + (set! (-> obj speed) (vector-length (-> s5-0 transv))) + (vector-! (-> obj dest-offset) s4-1 (-> s5-0 trans)) + (let ((s4-2 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> obj dest-offset) 1.0)) + (v0-13 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 transv) 1.0)) + ) + (set! (-> obj speed-dest) (vector-dot (-> s5-0 transv) s4-2)) + (set! (-> obj local-dist) (vector-dot v0-13 (-> obj dest-offset))) + ) + (let* ((f0-20 (fmax 0.0 (+ -2048.0 (vector-length (-> obj dest-offset))))) + (f1-5 (sqrtf (* 1.6 f0-20 f30-1))) + (f0-23 0.0) + ) + (seek! (-> obj target-speed) (fmax (fmin f1-5 f28-0) f0-23) (* 0.9 (-> pp clock seconds-per-frame) f30-1)) + ) + ) + ) + (when *debug-hover* + (add-debug-x #t (bucket-id debug-no-zbuf1) (-> obj dest-pos) *color-white*) + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> obj dest-pos) + (-> obj dest-vel) + (meters 0.00024414062) + *color-white* + ) + ) + 0 + (none) + ) + ) + +;; definition for function hover-bounce-reaction +(defun hover-bounce-reaction ((arg0 control-info) (arg1 collide-query) (arg2 vector) (arg3 vector)) + (cshape-reaction-update-state arg0 arg1 arg3) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (vector-reflect! s4-0 arg3 (-> arg0 surface-normal)) + (vector-float*! arg2 s4-0 0.4) + ) + (-> arg0 status) + ) + +;; definition for method 9 of type hover-nav-control +;; WARN: Return type mismatch int vs none. +(defmethod hover-nav-control-method-9 hover-nav-control ((obj hover-nav-control)) + (hover-nav-control-method-21 obj) + 0 + (none) + ) + +;; definition for method 7 of type hover-nav-control +(defmethod relocate hover-nav-control ((obj hover-nav-control) (arg0 int)) + (if (nonzero? (-> obj root)) + (&+! (-> obj root) arg0) + ) + obj + ) + +;; definition for method 0 of type hover-nav-control +;; INFO: Used lq/sq +(defmethod new hover-nav-control ((allocation symbol) (type-to-make type) (arg0 process) (arg1 collide-shape-moving) (arg2 hover-nav-params)) + (with-pp + (let ((s5-0 (object-new allocation type-to-make (the-as int (-> type-to-make size))))) + (set! (-> s5-0 root) arg1) + (set! (-> s5-0 root reaction) hover-bounce-reaction) + (set! (-> s5-0 nav) *nav-network*) + (set! (-> s5-0 path-info segment-list) #f) + (set! (-> s5-0 path-info tail-segment) #f) + (set! (-> s5-0 path-info curr-segment) #f) + (set! (-> s5-0 path-info curr-u) 0.0) + (set! (-> s5-0 flags) (the-as uint 0)) + (set! (-> s5-0 params) arg2) + (set! *hover-nav-time-offset* (+ *hover-nav-time-offset* 1)) + (vector-reset! (-> s5-0 dest-pos)) + (set! (-> s5-0 dest-vel quad) (the-as uint128 0)) + (set! (-> s5-0 dest-move-dir quad) (the-as uint128 0)) + (set! (-> s5-0 dest-offset quad) (the-as uint128 0)) + (set! (-> s5-0 nav-collide-impulse quad) (the-as uint128 0)) + (vector-z-quaternion! (-> s5-0 move-dir) (-> s5-0 root quat)) + (set! (-> s5-0 nav-collide-impulse-len) 0.0) + (set! (-> s5-0 speed) 0.0) + (set! (-> s5-0 target-speed) 0.0) + (set! (-> s5-0 target-acceleration) 0.0) + (set! (-> s5-0 speed-dest) 0.0) + (set! (-> s5-0 curr-dest-pt) -1) + (set! (-> s5-0 los-obstruction-distance) 0.0) + (set! (-> s5-0 los-last-clear-time) (-> pp clock frame-counter)) + (hover-nav-control-method-14 s5-0 1.0 1.0) + (nav-network-method-25 (-> s5-0 nav) arg0 (the-as collide-prim-core #f)) + s5-0 + ) + ) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/wasp_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/wasp_REF.gc new file mode 100644 index 0000000000..e47482a7bd --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/wasp_REF.gc @@ -0,0 +1,1705 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defpartgroup group-wasp-explosion + :id 157 + :duration (seconds 2) + :linger-duration (seconds 1) + :flags (use-local-clock unk-5 unk-6 unk-7) + :bounds (static-bspherem 0 0 0 15) + :rotate ((degrees 0) (degrees 4) (degrees 0)) + :scale (0.0 16384.0 0.0) + :parts ((sp-item 726 :flags (bit6) :period 900 :length 5) + (sp-item 727 :flags (bit6) :period 900 :length 5) + (sp-item 728 :period 900 :length 15) + (sp-item 729 :fade-after (meters 60) :period 900 :length 10 :offset 10) + (sp-item 730 :fade-after (meters 60) :falloff-to (meters 60) :period 900 :length 50 :offset 20) + (sp-item 731 :fade-after (meters 200) :falloff-to (meters 200) :period 900 :length 25 :offset 20) + (sp-item 732 :fade-after (meters 150) :falloff-to (meters 150) :period 900 :length 20 :offset 30) + ) + ) + +;; failed to figure out what this is: +(defpart 727 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 2)) + (sp-flt spt-rot-x 2048.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 24.0) + (sp-flt spt-scalevel-x (meters 0.10666667)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -4.266667) + (sp-flt spt-fade-b -4.266667) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 150) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 glow) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 733) + ) + ) + +;; failed to figure out what this is: +(defpart 733 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.85333335) + (sp-flt spt-fade-g -1.7066667) + (sp-flt spt-fade-b -1.7066667) + (sp-flt spt-fade-a -0.64) + ) + ) + +;; failed to figure out what this is: +(defpart 732 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x34 :page #xc)) + (sp-rnd-flt spt-num 2.0 0.2 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-rot-z) + :flags (sp-flag spflag7) + :random-rangef 655360.0 + :random-multf 1.0 + ) + (sp-rnd-flt spt-scale-y (meters 0.8) (meters 0.2) 1.0) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 734) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-conerot-x) + :flags (sp-flag from-pointer) + :func '*sp-temp* + ) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 731 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x33 :page #xc)) + (sp-func spt-birth-func 'birth-func-texture-group) + (sp-flt spt-num 3.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0) + (sp-flt spt-rot-z (degrees 0.0)) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 32.0 32.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.02) (meters 0.01) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.01) (meters 0.13333334) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.36) + (sp-flt spt-fade-b -4.24) + (sp-flt spt-fade-a -0.22068965) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (new 'static 'sp-field-init-spec + :field (sp-field-id spt-userdata) + :flags (sp-flag plain-v2) + :object (new 'static 'boxed-array :type int32 40 1 0 #xc00000 #xc03300) + ) + (sp-int spt-next-time 25) + (sp-launcher-by-id spt-next-launcher 734) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 734 + :init-specs ((sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.0) + (sp-flt spt-fade-b 0.0) + (sp-int-plain-rnd spt-next-time 5 19 1) + (sp-launcher-by-id spt-next-launcher 735) + ) + ) + +;; failed to figure out what this is: +(defpart 735 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.016666668) (meters 0.016666668) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.44) + (sp-flt spt-fade-g -2.36) + (sp-flt spt-fade-b -2.64) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 736) + ) + ) + +;; failed to figure out what this is: +(defpart 736 + :init-specs ((sp-rnd-flt spt-scalevel-x (meters 0.008333334) (meters 0.008333334) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -1.2944444) + (sp-flt spt-fade-g -0.7111111) + (sp-flt spt-fade-b -0.094444446) + (sp-rnd-flt spt-fade-a -0.06545454 -0.06545454 1.0) + (sp-int-plain-rnd spt-next-time 150 29 1) + (sp-launcher-by-id spt-next-launcher 737) + ) + ) + +;; failed to figure out what this is: +(defpart 737 + :init-specs ((sp-flt spt-fade-r 0.0) (sp-flt spt-fade-g 0.0) (sp-flt spt-fade-b 0.0) (sp-flt spt-fade-a -0.1125)) + ) + +;; failed to figure out what this is: +(defpart 726 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-scale-x (meters 5)) + (sp-flt spt-rot-x 2048.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 96.0) + (sp-flt spt-scalevel-x (meters 0.5)) + (sp-flt spt-rotvel-z (degrees 0.3)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -1.28) + (sp-flt spt-fade-b -5.1) + (sp-flt spt-fade-a 0.0) + (sp-int spt-timer 65) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-int spt-next-time 30) + (sp-launcher-by-id spt-next-launcher 738) + ) + ) + +;; failed to figure out what this is: +(defpart 738 + :init-specs ((sp-flt spt-scalevel-x (meters -0.2857143)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -3.6571429) + (sp-flt spt-fade-b 0.0) + (sp-flt spt-fade-a -2.7428572) + ) + ) + +;; failed to figure out what this is: +(defpart 730 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x32 :page #xc)) + (sp-rnd-flt spt-num 8.0 2.0 1.0) + (sp-flt spt-x (meters 0.25)) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.25) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 16.0 48.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.083333336) (meters 0.083333336) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.006666667) (meters 0.0016666667) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g -0.18) + (sp-flt spt-fade-b -2.12) + (sp-rnd-flt spt-accel-y -0.68266666 -1.3653333 1.0) + (sp-flt spt-friction 0.87) + (sp-int spt-timer 1000) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 739) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 739 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0016666667)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 0.0) + (sp-flt spt-fade-g 0.02) + (sp-flt spt-fade-b 0.23555556) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 740) + ) + ) + +;; failed to figure out what this is: +(defpart 740 + :init-specs ((sp-flt spt-fade-r -0.5543478) (sp-flt spt-fade-g -0.5543478) (sp-flt spt-fade-a -0.13913043)) + ) + +;; failed to figure out what this is: +(defpart 728 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 8.0 1.0 1.0) + (sp-rnd-flt spt-x (meters 0) (meters 0.6) 1.0) + (sp-rnd-flt spt-scale-x (meters 2.5) (meters 2) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 70.0 20.0 1.0) + (sp-rnd-flt spt-g 70.0 20.0 1.0) + (sp-rnd-flt spt-b 70.0 20.0 1.0) + (sp-rnd-flt spt-a 0.0 40.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0) (meters 0.1) 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.033333335) (meters 0.02) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -0.12) (degrees 0.24) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r 3.3) + (sp-flt spt-fade-g 3.12) + (sp-flt spt-fade-b 1.18) + (sp-flt spt-fade-a 1.76) + (sp-flt spt-friction 0.88) + (sp-int spt-timer 710) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3) + (sp-int-plain-rnd spt-next-time 35 14 1) + (sp-launcher-by-id spt-next-launcher 741) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 3600.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defpart 741 + :init-specs ((sp-flt spt-scalevel-x (meters 0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.53333336) + (sp-flt spt-fade-g -1.9666667) + (sp-flt spt-fade-b -2.2) + (sp-flt spt-fade-a -0.41666666) + (sp-int-plain-rnd spt-next-time 45 14 1) + (sp-launcher-by-id spt-next-launcher 742) + ) + ) + +;; failed to figure out what this is: +(defpart 742 + :init-specs ((sp-flt spt-scalevel-x (meters 0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.38833332) + (sp-flt spt-fade-g -0.21333334) + (sp-flt spt-fade-b -0.028333334) + (sp-flt spt-fade-a -0.38833332) + ) + ) + +;; failed to figure out what this is: +(defpart 729 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x31 :page #xc)) + (sp-rnd-flt spt-num 4.0 2.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.2) (meters 0.5) 1.0) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.2) (meters 0.1) 1.0) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-flt spt-g 96.0) + (sp-flt spt-b 64.0) + (sp-rnd-flt spt-a 64.0 64.0 1.0) + (sp-rnd-flt spt-scalevel-x (meters 0.13333334) (meters 0.02) 1.0) + (sp-flt spt-fade-g 1.6) + (sp-flt spt-fade-b 3.2) + (sp-flt spt-fade-a -1.6) + (sp-int spt-timer 90) + (sp-cpuinfo-flags sp-cpuinfo-flag-2) + ) + ) + +;; definition of type wasp-shot +(deftype wasp-shot (metalhead-shot) + () + :heap-base #x170 + :method-count-assert 40 + :size-assert #x1f0 + :flag-assert #x28017001f0 + ) + +;; definition for method 3 of type wasp-shot +(defmethod inspect wasp-shot ((obj wasp-shot)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type metalhead-shot inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition for method 28 of type wasp-shot +;; WARN: Return type mismatch int vs none. +(defmethod play-impact-sound wasp-shot ((obj wasp-shot) (arg0 projectile-options)) + (let ((v1-0 arg0)) + (cond + ((zero? v1-0) + (sound-play "wasp-shot-fire") + ) + ((= v1-0 (projectile-options lose-altitude)) + (sound-play "wasp-shot-hit") + ) + ) + ) + 0 + (none) + ) + +;; definition for method 31 of type wasp-shot +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod init-proj-settings! wasp-shot ((obj wasp-shot)) + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" + (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) + (set! (-> obj attack-mode) 'wasp-shot) + (set! (-> obj max-speed) 491520.0) + (set! (-> obj move) metalhead-shot-move) + (set! (-> obj timeout) (seconds 1.375)) + 0 + (none) + ) + +;; failed to figure out what this is: +(defskelgroup skel-wasp wasp wasp-lod0-jg -1 + ((wasp-lod0-mg (meters 20)) (wasp-lod1-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :shadow wasp-shadow-mg + :origin-joint-index 3 + ) + +;; failed to figure out what this is: +(defskelgroup skel-wasp-explode wasp wasp-explode-lod0-jg wasp-explode-idle-ja + ((wasp-explode-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 7.5) + :origin-joint-index 3 + ) + +;; definition for symbol *wasp-exploder-params*, type joint-exploder-static-params +(define *wasp-exploder-params* + (new 'static 'joint-exploder-static-params + :joints (new 'static 'boxed-array :type joint-exploder-static-joint-params + (new 'static 'joint-exploder-static-joint-params :joint-index 3 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 4 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 5 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 6 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 7 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 8 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 9 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 10 :parent-joint-index -1) + (new 'static 'joint-exploder-static-joint-params :joint-index 11 :parent-joint-index -1) + ) + :collide-spec #x1 + ) + ) + +;; definition for symbol *wasp-enemy-info*, type enemy-info +(define *wasp-enemy-info* (new 'static 'enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #f + :hover-if-no-ground #f + :idle-anim-script #f + :idle-anim 4 + :notice-anim 4 + :hostile-anim 4 + :hit-anim 12 + :knocked-anim 10 + :knocked-land-anim 11 + :die-anim 14 + :die-falling-anim 15 + :victory-anim 4 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 7 + :look-at-joint 7 + :bullseye-joint 4 + :sound-hit (static-sound-name "wasp-hit") + :sound-die (static-sound-name "wasp-die") + :notice-distance (meters 70) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 55) + :default-hit-points 6 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 2730.6667 + :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 53248.0 + :knocked-hard-vxz-hi 101580.8 + :knocked-hard-vy-lo 60620.8 + :knocked-hard-vy-hi 95027.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 10) + :shadow-min-y (meters -20) + :shadow-locus-dist (meters 150) + :gem-joint 7 + :gem-offset (new 'static 'sphere :r 163840.0) + ) + ) + +;; failed to figure out what this is: +(set! (-> *wasp-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 74 of type wasp +(defmethod general-event-handler wasp ((obj wasp) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('hit 'hit-knocked) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (if (zero? (-> obj hit-points)) + (go (method-of-object obj die-explode)) + (go (method-of-object obj knocked)) + ) + ) + (else + ((method-of-type hover-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +;; definition for method 52 of type wasp +(defmethod enemy-method-52 wasp ((obj wasp) (arg0 vector)) + (let ((s4-0 (-> obj root-override2))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-2)) + (let ((gp-1 (-> obj root-override2 transv))) + (let ((a1-1 (handle->process (-> obj incoming attacker-handle)))) + (if a1-1 + (vector-! gp-1 (-> (the-as process-focusable a1-1) root-override trans) (-> obj root-override2 trans)) + (vector-! gp-1 (-> obj incoming attacker-pos) (-> obj root-override2 trans)) + ) + ) + (set! (-> gp-1 y) 0.0) + (vector-normalize! gp-1 1.0) + (vector-rotate90-around-y! gp-1 gp-1) + (if (< 0.0 (vector-dot + (vector-! (new 'stack-no-clear 'vector) (-> obj incoming attacker-pos) (-> s4-0 trans)) + (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> s4-0 quat)) + ) + ) + (vector-negate! gp-1 gp-1) + ) + (let ((f30-1 (get-rand-float-range obj 0.0 1.0)) + (s5-1 (-> obj enemy-info)) + ) + (vector-float*! gp-1 gp-1 (lerp (-> s5-1 knocked-hard-vxz-lo) (-> s5-1 knocked-hard-vxz-hi) f30-1)) + (set! (-> gp-1 y) (lerp (-> s5-1 knocked-hard-vy-lo) (-> s5-1 knocked-hard-vy-hi) f30-1)) + ) + ) + ) + (else + ((the-as (function enemy vector none) (find-parent-method wasp 52)) obj arg0) + ) + ) + ) + (none) + ) + +;; definition for method 116 of type wasp +;; WARN: Return type mismatch object vs none. +(defmethod go-idle wasp ((obj wasp)) + (cond + ((logtest? (-> obj fact-info-override enemy-options) (enemy-option user0)) + (go (method-of-object obj shoot-bridge-wait)) + ) + ((logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (go (method-of-object obj ambush)) + ) + (else + (go (method-of-object obj notice)) + ) + ) + (none) + ) + +;; definition for method 70 of type wasp +;; WARN: Return type mismatch object vs none. +(defmethod go-hostile wasp ((obj wasp)) + (go (method-of-object obj hostile)) + (none) + ) + +;; definition for method 72 of type wasp +(defmethod react-to-focus wasp ((obj wasp)) + "@TODO - flesh out docs" + (go-hostile obj) + (none) + ) + +;; definition for method 129 of type wasp +;; INFO: Used lq/sq +(defmethod enemy-method-129 wasp ((obj wasp)) + (if (logtest? (-> obj fact-info-override enemy-options) (enemy-option user0)) + (set! (-> obj focus-pos quad) (-> obj plat-pos quad)) + ((method-of-type hover-enemy enemy-method-129) obj) + ) + (none) + ) + +;; definition for method 55 of type wasp +(defmethod track-target! wasp ((obj wasp)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (seek! (-> obj gun-x-angle) (-> obj gun-x-angle-final) (* 21845.334 (-> pp clock seconds-per-frame))) + ((method-of-type hover-enemy track-target!) obj) + (none) + ) + ) + +;; definition for function shoot-bridge-post +(defbehavior shoot-bridge-post wasp () + (get-point-at-percent-along-path! (-> self path) (-> self focus-pos) 0.5 'interp) + (hover-nav-control-method-11 (-> self hover) (-> self focus-pos)) + (hover-enemy-dest-post) + (none) + ) + +;; failed to figure out what this is: +(defstate dormant (wasp) + :virtual #t + :enter (behavior () + (if (logtest? (-> self fact-info-override enemy-options) (enemy-option user0)) + (go-virtual shoot-bridge-wait) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate ambush (wasp) + :virtual #t + :post (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy ambush) post))) + (if t9-0 + ((the-as (function none) t9-0)) + ) + ) + (set! (-> self last-fire-time) (+ (-> self clock frame-counter) (seconds -1.5))) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate notice (wasp) + :virtual #t + :post (behavior () + (let ((t9-0 (-> (method-of-type hover-enemy notice) post))) + (if t9-0 + ((the-as (function none) t9-0)) + ) + ) + (set! (-> self last-fire-time) (+ (-> self clock frame-counter) (seconds -1.5))) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate shoot-bridge-wait (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('trigger) + (go-virtual shoot-bridge-intro) + ) + ) + ) + :enter (behavior () + (logior! (-> self enemy-flags) (enemy-flag use-notice-distance)) + (hover-enemy-method-140 self #f) + (if (logtest? (-> self path flags) (path-control-flag not-found)) + (go process-drawable-art-error "no path") + ) + (hover-enemy-method-141 self 1.0) + (hover-enemy-method-144 self) + (let ((s5-0 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 0.0 'interp)) + (s4-0 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp)) + (gp-0 (displacement-between-points-at-percent-normalized! (-> self path) (new 'stack-no-clear 'vector) 0.0)) + ) + (set! (-> self focus-pos quad) (-> s4-0 quad)) + (hover-nav-control-method-10 (-> self hover) s5-0 gp-0 (the-as vector #t)) + (set-vector! (-> self rotation-vec) 0.0 (vector-y-angle gp-0) 0.0 0.0) + ) + (hover-enemy-method-146 self) + (hover-nav-control-method-18 (-> self hover) (-> self path) -1 6) + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self bridge-index) 0) + (logclear! (-> self enemy-flags) (enemy-flag enable-on-active checking-water)) + (logclear! (-> self mask) (process-mask collectable)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-move-dest)) + (none) + ) + :exit (behavior () + (let ((gp-0 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 0.0 'interp)) + (v1-2 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp)) + ) + (hover-nav-control-method-10 + (-> self hover) + gp-0 + (vector-normalize! (vector-! (new 'stack-no-clear 'vector) v1-2 gp-0) 1.0) + (the-as vector #t) + ) + ) + (none) + ) + :code (the-as (function none :behavior wasp) sleep-code) + ) + +;; failed to figure out what this is: +(defstate shoot-bridge-intro (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('shoot) + (go-virtual shoot-bridge-hostile) + ) + ) + ) + :enter (behavior () + (set! (-> self plat-pos quad) (-> self entity-group data 0 actor extra trans quad)) + (none) + ) + :trans (behavior () + (if (< (vector-vector-distance + (-> self root-override2 trans) + (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 6.0 'interp) + ) + 40960.0 + ) + (go-virtual shoot-bridge-hold) + ) + (none) + ) + :code (the-as (function none :behavior wasp) hover-enemy-fly-code) + :post (behavior () + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate shoot-bridge-hold (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('shoot) + (go-virtual shoot-bridge-hostile) + ) + ) + ) + :code (the-as (function none :behavior wasp) hover-enemy-fly-code) + :post (behavior () + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate shoot-bridge-hostile (wasp) + :virtual #t + :exit (-> (method-of-type wasp ambush) exit) + :trans (behavior () + (let ((v1-0 (-> self entity-group)) + (a0-0 (-> self bridge-index)) + ) + (cond + ((< a0-0 (-> v1-0 length)) + (let ((a1-1 (-> v1-0 data a0-0 actor extra trans))) + (set! (-> self plat-pos quad) (-> a1-1 quad)) + (set! (-> self plat-pos y) (+ -8192.0 (-> self plat-pos y))) + (set! (-> self focus-pos quad) (-> self plat-pos quad)) + (when (< (vector-vector-distance (-> self root-override2 trans) a1-1) + (- 327680.0 (* 81920.0 (the float (-> self bridge-index)))) + ) + (+! (-> self bridge-index) 1) + (go-virtual shoot-bridge-attack) + ) + ) + ) + (else + (go-virtual shoot-bridge-outro) + ) + ) + ) + (none) + ) + :code (the-as (function none :behavior wasp) hover-enemy-fly-code) + :post (behavior () + (let ((a1-0 (new 'stack-no-clear 'vector))) + (set! (-> a1-0 quad) (-> self focus-pos quad)) + (set! (-> a1-0 z) (+ 81920.0 (-> a1-0 z))) + (set! (-> a1-0 y) (+ 40960.0 (-> a1-0 y))) + (hover-nav-control-method-11 (-> self hover) a1-0) + ) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate shoot-bridge-attack (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (let ((gp-0 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> gp-0 ent) (-> self entity)) + (set! (-> gp-0 charge) 1.0) + (set! (-> gp-0 options) (projectile-options)) + (set! (-> gp-0 notify-handle) (the-as handle #f)) + (set! (-> gp-0 owner-handle) (the-as handle #f)) + (set! (-> gp-0 ignore-handle) (process->handle self)) + (let* ((v1-6 *game-info*) + (a0-6 (+ (-> v1-6 attack-id) 1)) + ) + (set! (-> v1-6 attack-id) a0-6) + (set! (-> gp-0 attack-id) a0-6) + ) + (set! (-> gp-0 timeout) (seconds 4)) + (spawn-wasp-shot self gp-0 19 0.000000000000000000000000000000000000000000024 -1.0) + (spawn-wasp-shot self gp-0 23 0.00000000000000000000000000000000000000000003 1.0) + ) + (sound-play "wasp-fire" :position (-> self root-override2 trans)) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self attack-miss-dist-curr) (-> self attack-miss-dist-min)) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (sound-play "wasp-warn" :position (-> self root-override2 trans)) + (ja-no-eval :group! (-> self draw art-group data (-> self hover-info shoot-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self hover-info shoot-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self restart-fly-anims) #t) + (go-virtual shoot-bridge-hostile) + (none) + ) + :post (behavior () + (let* ((a1-0 (-> self node-list data (-> self hover-info gun-base))) + (a0-2 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-4 (new 'stack-no-clear 'vector))) + (set! (-> v1-4 quad) (-> self focus-pos quad)) + (+! (-> v1-4 y) (-> self attack-miss-dist-curr)) + (vector-! gp-0 v1-4 a0-2) + ) + (vector-normalize! gp-0 1.0) + (set! (-> self gun-x-angle-final) (- (vector-x-angle gp-0))) + ) + (quaternion-vector-angle! (the-as quaternion (-> self gun-jmod target)) *x-vector* (-> self gun-x-angle)) + (seek! + (-> self attack-miss-dist-curr) + (-> self attack-miss-dist-max) + (* 0.5 (-> self clock seconds-per-frame) (- (-> self attack-miss-dist-max) (-> self attack-miss-dist-min))) + ) + (let ((a1-8 (new 'stack-no-clear 'vector))) + (set! (-> a1-8 quad) (-> self focus-pos quad)) + (set! (-> a1-8 z) (+ 81920.0 (-> a1-8 z))) + (set! (-> a1-8 y) (+ 40960.0 (-> a1-8 y))) + (hover-nav-control-method-11 (-> self hover) a1-8) + ) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate shoot-bridge-outro (wasp) + :virtual #t + :enter (behavior () + (let ((v1-1 (-> self root-override2 root-prim))) + (set! (-> v1-1 prim-core collide-as) (collide-spec)) + (set! (-> v1-1 prim-core collide-with) (collide-spec)) + ) + 0 + (hover-nav-control-method-18 (-> self hover) (-> self path) 7 -1) + (let ((gp-0 (get-point-at-percent-along-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp)) + (v1-7 (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) 8.0 'interp)) + ) + (set! (-> self focus-pos quad) (-> gp-0 quad)) + (hover-nav-control-method-10 + (-> self hover) + v1-7 + (vector-normalize! (vector-! (new 'stack-no-clear 'vector) v1-7 (-> self root-override2 trans)) 1.0) + (the-as vector #t) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :trans (behavior () + (when (< (vector-vector-distance + (-> self root-override2 trans) + (get-point-in-path! (-> self path) (new 'stack-no-clear 'vector) (get-num-segments (-> self path)) 'interp) + ) + 8192.0 + ) + (cleanup-for-death self) + (go empty-state) + ) + (none) + ) + :code (the-as (function none :behavior wasp) hover-enemy-fly-code) + :post (behavior () + (if (not (hover-nav-control-method-23 (-> self hover))) + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-nav-control-method-11 + (-> self hover) + (get-point-at-percent-along-path! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp) + ) + ) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (wasp) + :virtual #t + :trans (behavior () + (let ((gp-0 (ja-group)) + (f0-0 (ja-aframe-num 0)) + ) + (when (and (= gp-0 wasp-idle-ja) + (or (and (>= f0-0 0.0) (>= 1.0 f0-0)) + (and (>= f0-0 16.0) + (>= (the float (+ (-> (the-as art-joint-anim wasp-idle-ja) frames num-frames) -1)) (ja-frame-num 0)) + ) + ) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self last-fire-time)) + (the int (* 300.0 (rand-vu-float-range (-> self attack-wait-min) (-> self attack-wait-max)))) + ) + (get-enemy-target self) + ) + (go-virtual attack) + ) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (wasp) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (let ((gp-0 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> gp-0 ent) (-> self entity)) + (set! (-> gp-0 charge) 1.0) + (set! (-> gp-0 options) (projectile-options)) + (set! (-> gp-0 notify-handle) (the-as handle #f)) + (set! (-> gp-0 owner-handle) (the-as handle #f)) + (set! (-> gp-0 ignore-handle) (process->handle self)) + (let* ((v1-6 *game-info*) + (a0-6 (+ (-> v1-6 attack-id) 1)) + ) + (set! (-> v1-6 attack-id) a0-6) + (set! (-> gp-0 attack-id) a0-6) + ) + (set! (-> gp-0 timeout) (seconds 4)) + (spawn-wasp-shot self gp-0 19 0.000000000000000000000000000000000000000000024 -1.0) + (spawn-wasp-shot self gp-0 23 0.00000000000000000000000000000000000000000003 1.0) + ) + (sound-play "wasp-fire" :position (-> self root-override2 trans)) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self attack-miss-dist-curr) (-> self attack-miss-dist-min)) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (sound-play "wasp-warn" :position (-> self root-override2 trans)) + (ja-no-eval :group! (-> self draw art-group data (-> self hover-info shoot-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self hover-info shoot-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self last-fire-time) (-> self clock frame-counter)) + (set! (-> self restart-fly-anims) #t) + (go-hostile self) + (none) + ) + :post (behavior () + (let* ((a1-0 (-> self node-list data (-> self hover-info gun-base))) + (a0-2 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-4 (new 'stack-no-clear 'vector))) + (set! (-> v1-4 quad) (-> self focus-pos quad)) + (+! (-> v1-4 y) (-> self attack-miss-dist-curr)) + (vector-! gp-0 v1-4 a0-2) + ) + (vector-normalize! gp-0 1.0) + (set! (-> self gun-x-angle-final) (- (vector-x-angle gp-0))) + ) + (quaternion-vector-angle! (the-as quaternion (-> self gun-jmod target)) *x-vector* (-> self gun-x-angle)) + (seek! + (-> self attack-miss-dist-curr) + (-> self attack-miss-dist-max) + (* 0.5 (-> self clock seconds-per-frame) (- (-> self attack-miss-dist-max) (-> self attack-miss-dist-min))) + ) + (hover-enemy-hostile-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate knocked-recover (wasp) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior wasp) enemy-event-handler) + :code (behavior () + (local-vars (v1-35 enemy-flag) (v1-43 enemy-flag)) + (ja-channel-push! 1 (seconds 0.5)) + (ja-no-eval :group! (-> self draw art-group data (-> self knocked-recover-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self knocked-recover-anim))) frames num-frames) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self restart-fly-anims) #t) + (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-34 (-> self enemy-flags))) + (if (logtest? v1-34 (enemy-flag checking-water)) + (set! v1-35 (logior v1-34 (enemy-flag enable-on-active))) + (set! v1-35 (logclear v1-34 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-35) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-move-dest)) + (set! (-> self mask) (logior (process-mask collectable) (-> self mask))) + (logclear! (-> self mask) (process-mask collectable)) + ) + (let ((v1-42 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-42) + (set! v1-43 (logior (enemy-flag check-water-backup) v1-42)) + (set! v1-43 (logclear v1-42 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-43) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (hover-nav-control-method-21 (-> self hover)) + (go-hostile self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate die-explode (wasp) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior wasp) enemy-event-handler) + :code (behavior () + (dispose! self) + (set! (-> self hit-points) 0) + (let ((v1-3 (-> self root-override2 root-prim))) + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + (set! (-> v1-3 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (sound-stop (-> self sound-id)) + (sound-play "wasp-explode") + (let ((gp-1 (new 'stack 'joint-exploder-tuning (the-as uint 0)))) + (process-spawn + joint-exploder + (art-group-get-by-name *level* "skel-wasp-explode" (the-as (pointer uint32) #f)) + 22 + gp-1 + *wasp-exploder-params* + :to self + ) + ) + (let ((gp-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-2 + (let ((t9-10 (method-of-type part-tracker activate))) + (t9-10 (the-as part-tracker gp-2) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-11 run-function-in-process) + (a0-12 gp-2) + (a1-8 part-tracker-init) + (a2-12 (-> *part-group-id-table* 157)) + (a3-4 0) + (t0-2 #f) + (t1-2 #f) + (t2-1 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-11) + a0-12 + a1-8 + a2-12 + a3-4 + t0-2 + t1-2 + t2-1 + t3-0 + ) + ) + (-> gp-2 ppointer) + ) + ) + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate die-now (wasp) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior wasp) enemy-event-handler) + :code (behavior () + (dispose! self) + (let ((v1-3 (-> self root-override2 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) + (do-effect (-> self skel effect) 'death-default 0.0 -1) + (let ((gp-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-0) (seconds 1)) + (suspend) + ) + ) + (send-event self 'death-end) + (cleanup-for-death self) + (none) + ) + :post (the-as (function none :behavior wasp) transform-post) + ) + +;; definition for method 107 of type wasp +;; WARN: Return type mismatch process vs process-focusable. +(defmethod get-enemy-target wasp ((obj wasp)) + "@returns the [[process-focusable]] that the enemy is currently focusing on, or [[#f]] otherwise" + (let ((s5-0 (handle->process (-> obj focus handle)))) + (the-as + process-focusable + (when s5-0 + (let* ((a0-4 (-> obj root-override2)) + (s4-1 (vector+! (new 'stack-no-clear 'vector) (-> a0-4 trans) (-> a0-4 transv))) + (s3-1 (vector-! (new 'stack-no-clear 'vector) s4-1 (-> obj focus-pos))) + (s2-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (get-quat (the-as process-focusable s5-0) 0))) + (s3-2 (vector-normalize-copy! (new 'stack-no-clear 'vector) s3-1 1.0)) + ) + (if (and (and s5-0 + (zero? (logand (-> (the-as process-focusable s5-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + (< 0.0 (vector-dot s2-1 s3-2)) + (< (vector-vector-distance s4-1 (-> obj focus-pos)) 225280.0) + (and (< (fabs (vector-x-angle s3-2)) 3640.889) (enemy-method-95 obj (-> obj focus-pos) 5461.3335)) + ) + s5-0 + ) + ) + ) + ) + ) + ) + +;; definition for method 77 of type wasp +(defmethod enemy-method-77 wasp ((obj wasp) (arg0 (pointer float))) + (cond + ((rng-hit? obj 0.5) + (set! (-> obj knocked-anim) 10) + (set! (-> obj knocked-recover-anim) 11) + ) + (else + (set! (-> obj knocked-anim) 12) + (set! (-> obj knocked-recover-anim) 13) + ) + ) + (ja-channel-push! 1 0) + (let ((a1-3 (-> obj draw art-group data (-> obj knocked-anim))) + (a0-5 (-> obj skel root-channel 0)) + ) + (set! (-> a0-5 frame-group) (the-as art-joint-anim a1-3)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim a1-3) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> arg0 0)) + (set! (-> a0-5 frame-num) 0.0) + (joint-control-channel-group! a0-5 (the-as art-joint-anim a1-3) num-func-seek!) + ) + #t + ) + +;; definition for method 78 of type wasp +(defmethod enemy-method-78 wasp ((obj wasp) (arg0 (pointer float))) + (let ((v1-4 (-> obj draw art-group data (-> obj enemy-info knocked-land-anim))) + (a0-3 (-> obj skel root-channel 0)) + ) + (set! (-> a0-3 frame-group) (the-as art-joint-anim v1-4)) + (set! (-> a0-3 param 0) (the float (+ (-> (the-as art-joint-anim v1-4) 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-4) num-func-seek!) + ) + #t + ) + +;; definition for method 80 of type wasp +(defmethod enemy-method-80 wasp ((obj wasp) (arg0 enemy-knocked-info)) + (-> obj root-override2) + (>= (-> arg0 on-surface-count) 1) + ) + +;; definition for method 81 of type wasp +(defmethod enemy-method-81 wasp ((obj wasp)) + #f + ) + +;; definition for method 73 of type wasp +(defmethod kill-prefer-falling wasp ((obj wasp)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + (cond + ((and (-> obj next-state) (= (-> obj next-state name) 'knocked)) + (go (method-of-object obj die-now)) + ) + ((-> obj enemy-info use-die-falling) + (go (method-of-object obj die-falling)) + ) + (else + (go (method-of-object obj die)) + ) + ) + ) + +;; definition for method 165 of type wasp +;; WARN: Return type mismatch int vs none. +(defmethod spawn-wasp-shot wasp ((obj wasp) (arg0 projectile-init-by-other-params) (arg1 int) (arg2 float) (arg3 float)) + (vector<-cspace! (-> arg0 pos) (-> obj node-list data arg1)) + (let ((s3-1 (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> obj node-list data arg1 bone transform vector 1) + 1.0 + ) + (* 273.06668 arg3) + ) + ) + (a1-8 (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> obj node-list data arg1 bone transform vector 2) + 1.0 + ) + ) + ) + (vector-orient-by-quat! (-> arg0 vel) a1-8 s3-1) + ) + (vector-normalize! (-> arg0 vel) 491520.0) + (spawn-projectile wasp-shot arg0 obj *default-dead-pool*) + 0 + (none) + ) + +;; definition for method 142 of type wasp +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-142 wasp ((obj wasp)) + (let ((s5-0 (-> obj main-joint-acc)) + (s4-0 (-> obj main-joint-vel)) + (gp-0 + (lambda ((arg0 wasp) (arg1 cspace) (arg2 float) (arg3 float) (arg4 vector) (arg5 vector) (arg6 int)) + (local-vars (sv-192 float) (sv-208 quaternion) (sv-224 vector)) + (with-pp + (set! sv-192 arg2) + (let ((s0-0 arg3)) + (set! sv-224 arg4) + (let ((s1-0 arg5) + (s3-0 arg6) + (s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) arg1)) + (s5-0 (new 'stack-no-clear 'matrix)) + (a1-3 (matrix-with-scale->quaternion (new 'stack-no-clear 'quaternion) (-> arg1 bone transform))) + ) + (set! sv-208 (new 'stack-no-clear 'quaternion)) + (let ((s2-1 (new 'stack-no-clear 'vector))) + (-> arg0 scale) + (quaternion-rotate-local-z! sv-208 a1-3 sv-192) + (quaternion->matrix s5-0 sv-208) + (set! (-> s2-1 quad) (-> arg0 root-override2 scale quad)) + (scale-matrix! s5-0 s2-1 s5-0) + (let* ((s1-1 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) s1-0 (-> arg0 root-override2 quat))) + (t9-6 vector-inv-orient-by-quat!) + (a0-10 (new 'stack-no-clear 'vector)) + (a2-4 (-> arg0 root-override2 quat)) + (v0-6 (t9-6 a0-10 sv-224 a2-4)) + (f30-0 (* 2457600.0 (-> pp clock seconds-per-frame))) + (f28-0 + (seek + (-> arg0 thrust s3-0) + (+ (* 0.4 (fmax 0.0 (* (-> v0-6 x) s0-0))) + (fmax 0.0 (-> v0-6 y)) + (fabs (* 0.2 (-> v0-6 z))) + (fmax 0.0 (-> s1-1 y)) + ) + (* 0.2 f30-0) + ) + ) + ) + (let ((f20-0 (lerp-scale 819.2 4096.0 f28-0 1638.4 f30-0)) + (f26-0 (lerp-scale 4915.2 11468.8 f28-0 1638.4 f30-0)) + ) + (lerp-scale 0.0 -4915.2 f28-0 1638.4 f30-0) + (let ((f22-0 (lerp-scale 0.5 1.5 f28-0 1638.4 f30-0)) + (f24-0 (lerp-scale 0.1 1.0 f28-0 1638.4 f30-0)) + ) + (lerp-scale 0.1 1.0 f28-0 1638.4 f30-0) + (let ((f1-10 (lerp-scale 0.02 0.6 f28-0 1638.4 f30-0)) + (f2-6 (fmin 1.0 (-> s2-1 x))) + (f0-15 (fmin 1.0 (-> s2-1 y))) + ) + (set! (-> *part-id-table* 718 init-specs 4 initial-valuef) (* f20-0 f2-6)) + (set! (-> *part-id-table* 718 init-specs 5 initial-valuef) (* f26-0 f0-15)) + (set! (-> *part-id-table* 722 init-specs 3 initial-valuef) (* f22-0 f2-6)) + (set! (-> *part-id-table* 719 init-specs 1 initial-valuef) (* f24-0 f0-15)) + (set! (-> *part-id-table* 720 init-specs 1 initial-valuef) (* f1-10 f0-15)) + (set! (-> *part-id-table* 721 init-specs 0 initial-valuef) (* f24-0 f0-15)) + (set! (-> arg0 thrust s3-0) f28-0) + (let ((f0-16 (* f26-0 f0-15))) + (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 vector 1) (* -0.5 f0-16)) + ) + ) + ) + ) + (set! (-> s5-0 trans quad) (-> s4-0 quad)) + (spawn-with-matrix (-> arg0 engine-part) s5-0) + (let ((f0-18 (lerp-scale 0.75 1.0 f28-0 1638.4 f30-0))) + (sound-play-by-name + (static-sound-name "wasp-jets") + (-> arg0 sound-id) + (the int (* 1024.0 f0-18)) + 0 + 0 + (sound-group sfx) + (-> arg0 root-override2 trans) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + ) + ) + (gp-0 + obj + (-> obj node-list data (-> obj hover-info engine-left)) + (-> obj hover-info thrust-rotate-left) + -1.0 + s5-0 + s4-0 + 0 + ) + (gp-0 + obj + (-> obj node-list data (-> obj hover-info engine-right)) + (-> obj hover-info thrust-rotate-right) + 1.0 + s5-0 + s4-0 + 1 + ) + ) + 0 + (none) + ) + +;; definition for method 114 of type wasp +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! wasp ((obj wasp)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (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 10) 0))) + (set! (-> s5-0 total-prims) (the-as uint 11)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd)) + (set! (-> s4-0 prim-core action) (collide-action solid)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 15564.8) + (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)) + (set! (-> v1-14 prim-core action) (collide-action solid)) + (set! (-> v1-14 transform-index) 0) + (set-vector! (-> v1-14 local-sphere) 0.0 5324.8 -2048.0 6144.0) + ) + (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 backgnd)) + (set! (-> v1-16 prim-core action) (collide-action solid)) + (set! (-> v1-16 transform-index) 0) + (set-vector! (-> v1-16 local-sphere) 0.0 3276.8 -2048.0 4915.2) + ) + (let ((v1-18 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-18 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-18 prim-core collide-with) (collide-spec backgnd)) + (set! (-> v1-18 prim-core action) (collide-action solid)) + (set! (-> v1-18 transform-index) 0) + (set-vector! (-> v1-18 local-sphere) 0.0 7372.8 -2048.0 4915.2) + ) + (let ((v1-20 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-20 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-20 prim-core action) (collide-action semi-solid)) + (set! (-> v1-20 transform-index) 3) + (set-vector! (-> v1-20 local-sphere) 0.0 0.0 1228.8 3481.6) + ) + (let ((v1-22 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-22 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-22 prim-core action) (collide-action semi-solid)) + (set! (-> v1-22 transform-index) 7) + (set-vector! (-> v1-22 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-24 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-24 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-24 prim-core action) (collide-action semi-solid)) + (set! (-> v1-24 transform-index) 9) + (set-vector! (-> v1-24 local-sphere) 0.0 1638.4 0.0 2048.0) + ) + (let ((v1-26 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-26 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-26 prim-core action) (collide-action semi-solid)) + (set! (-> v1-26 transform-index) 10) + (set-vector! (-> v1-26 local-sphere) -819.2 0.0 0.0 1638.4) + ) + (let ((v1-28 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-28 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-28 prim-core action) (collide-action semi-solid)) + (set! (-> v1-28 transform-index) 12) + (set-vector! (-> v1-28 local-sphere) 0.0 -1638.4 0.0 2048.0) + ) + (let ((v1-30 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-30 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-30 prim-core action) (collide-action semi-solid)) + (set! (-> v1-30 transform-index) 13) + (set-vector! (-> v1-30 local-sphere) 819.2 0.0 0.0 1638.4) + ) + (let ((v1-32 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-32 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-32 prim-core action) (collide-action semi-solid)) + (set! (-> v1-32 transform-index) 15) + (set-vector! (-> v1-32 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (let ((v1-35 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-35 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-35 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 10 of type wasp +(defmethod deactivate wasp ((obj wasp)) + (if (nonzero? (-> obj smoke-part)) + (kill-and-free-particles (-> obj smoke-part)) + ) + (if (nonzero? (-> obj engine-part)) + (kill-and-free-particles (-> obj engine-part)) + ) + (sound-stop (-> obj sound-id)) + ((method-of-type hover-enemy deactivate) obj) + (none) + ) + +;; definition for method 7 of type wasp +;; WARN: Return type mismatch hover-enemy vs wasp. +(defmethod relocate wasp ((obj wasp) (arg0 int)) + (if (nonzero? (-> obj gun-jmod)) + (&+! (-> obj gun-jmod) arg0) + ) + (if (nonzero? (-> obj smoke-part)) + (&+! (-> obj smoke-part) arg0) + ) + (if (nonzero? (-> obj engine-part)) + (&+! (-> obj engine-part) arg0) + ) + (the-as wasp ((method-of-type hover-enemy relocate) obj arg0)) + ) + +;; definition for method 149 of type wasp +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-149 wasp ((obj wasp)) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-wasp" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + 0 + (none) + ) + +;; definition for method 150 of type wasp +(defmethod hover-enemy-method-150 wasp ((obj wasp)) + *wasp-enemy-info* + ) + +;; definition for method 151 of type wasp +(defmethod hover-enemy-method-151 wasp ((obj wasp)) + (new 'static 'hover-enemy-info + :fly-forward-anim 7 + :fly-backward-anim 8 + :fly-left-anim 6 + :fly-right-anim 5 + :shoot-anim 9 + :main-joint 3 + :gun-base 15 + :engine-left 10 + :engine-right 13 + :thrust-rotate-left 16384.0 + :thrust-rotate-right -16384.0 + ) + ) + +;; definition for method 152 of type wasp +(defmethod hover-enemy-method-152 wasp ((obj wasp)) + (new 'static 'hover-nav-params :max-speed 73728.0 :max-acceleration 122880.0 :friction 0.05) + ) + +;; definition for method 115 of type wasp +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! wasp ((obj wasp)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (local-vars (sv-16 res-tag) (sv-32 res-tag) (sv-48 res-tag) (sv-64 res-tag)) + (hover-enemy-method-149 obj) + (init-enemy-behaviour-and-stats! obj (hover-enemy-method-150 obj)) + (hover-enemy-method-155 obj) + (set! (-> obj neck up) (the-as uint 1)) + (set! (-> obj neck nose) (the-as uint 2)) + (set! (-> obj neck ear) (the-as uint 0)) + (set! (-> obj scale) (get-rand-float-range obj 0.9 1.3)) + (set! (-> obj sound-id) (new-sound-id)) + (set! (-> obj root-override2 dynam gravity y) 327680.0) + (set! (-> obj root-override2 dynam gravity-length) 327680.0) + (set! (-> obj root-override2 dynam gravity-max) 327680.0) + (set! (-> obj gun-jmod) + (the-as joint-mod (new 'process 'joint-mod-rotate-local obj (-> obj hover-info gun-base) #t)) + ) + (set! (-> obj gun-x-angle) 0.0) + (set! (-> obj gun-x-angle-final) 0.0) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-28 (res-lump-data (-> obj entity) 'actor-groups (pointer actor-group) :tag-ptr (& sv-16)))) + (if (and v1-28 (= (-> sv-16 elt-count) 1)) + (set! (-> obj entity-group) (-> v1-28 0)) + (set! (-> obj entity-group) #f) + ) + ) + (set! sv-32 (new 'static 'res-tag)) + (let ((v1-32 (res-lump-data (-> obj entity) 'timeout (pointer float) :tag-ptr (& sv-32)))) + (cond + ((and v1-32 (= (-> sv-32 elt-count) 2)) + (set! (-> obj attack-wait-min) (-> v1-32 0)) + (set! (-> obj attack-wait-max) (-> v1-32 1)) + ) + (else + (set! (-> obj attack-wait-min) 1.0) + (set! (-> obj attack-wait-max) 3.0) + ) + ) + ) + (let ((f30-0 4096.0)) + (set! sv-48 (new 'static 'res-tag)) + (let ((v1-39 (res-lump-data (-> obj entity) 'min-max (pointer float) :tag-ptr (& sv-48)))) + (set! (-> obj attack-miss-dist-min) (* f30-0 (if (and v1-39 (> (the-as int (-> sv-48 elt-count)) 0)) + (-> v1-39 0) + -1.0 + ) + ) + ) + ) + ) + (let ((f30-1 4096.0)) + (set! sv-64 (new 'static 'res-tag)) + (let ((v1-43 (res-lump-data (-> obj entity) 'min-max (pointer float) :tag-ptr (& sv-64)))) + (set! (-> obj attack-miss-dist-max) (* f30-1 (if (and v1-43 (< 1 (the-as int (-> sv-64 elt-count)))) + (-> v1-43 1) + 1.0 + ) + ) + ) + ) + ) + (set! (-> obj path) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (set! (-> obj path-u) 0.0) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! (-> obj smoke-part) (create-launch-control (-> *part-group-id-table* 154) obj)) + (set! (-> obj engine-part) (create-launch-control (-> *part-group-id-table* 156) obj)) + (add-connection + *part-engine* + obj + 7 + obj + 318 + (new 'static 'vector :x 1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 7 + obj + 318 + (new 'static 'vector :x -1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection *part-engine* obj 7 obj 743 (new 'static 'vector :y 1433.6 :z 1228.8 :w 163840.0)) + 0 + (none) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/common/enemy/metalhead_bearer/centurion_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/metalhead_bearer/centurion_REF.gc index cbd6fd2a37..569cf6c3c6 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/metalhead_bearer/centurion_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/metalhead_bearer/centurion_REF.gc @@ -858,7 +858,7 @@ (set! (-> v1-32 attack-id) a0-26) (set! (-> s5-0 attack-id) a0-26) ) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) (spawn-projectile centurion-shot s5-0 obj *default-dead-pool*) ) (set! (-> obj can-shoot?) #f) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/metalhead_slinger/grenadier_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/metalhead_slinger/grenadier_REF.gc index e6cf4bc8f4..5ab2ec28c0 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/metalhead_slinger/grenadier_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/metalhead_slinger/grenadier_REF.gc @@ -891,7 +891,7 @@ (set! (-> v1-27 attack-id) a0-27) (set! (-> a1-9 attack-id) a0-27) ) - (set! (-> a1-9 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> a1-9 timeout) (seconds 4)) (spawn-projectile metalhead-grenade-shot a1-9 self *default-dead-pool*) ) ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/spyder_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/spyder_REF.gc index e6d5700ced..95bd1884ad 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/spyder_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/spyder_REF.gc @@ -1087,7 +1087,7 @@ (set! (-> a0-10 attack-id) a3-11) (set! (-> gp-0 attack-id) a3-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (vector-normalize! (vector-! (-> gp-0 vel) a1-1 (the-as vector v1-0)) arg1) ) (spawn-projectile spyder-shot gp-0 obj *default-dead-pool*) diff --git a/test/decompiler/reference/jak2/levels/common/entities/sew-gunturret_REF.gc b/test/decompiler/reference/jak2/levels/common/entities/sew-gunturret_REF.gc index 84dbe2eb3a..c71e86cf57 100644 --- a/test/decompiler/reference/jak2/levels/common/entities/sew-gunturret_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/entities/sew-gunturret_REF.gc @@ -776,7 +776,7 @@ (set! (-> v1-12 attack-id) a0-18) (set! (-> proj-params attack-id) a0-18) ) - (set! (-> proj-params timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> proj-params timeout) (seconds 4)) (vector-normalize-copy! (-> proj-params vel) s2-1 491520.0) (let ((f30-1 (fmin 16384.0 f30-0))) (set-vector! temp-vec (-> s2-1 z) (-> s2-1 y) (- (-> s2-1 x)) 1.0) diff --git a/test/decompiler/reference/jak2/levels/common/metalhead-projectile_REF.gc b/test/decompiler/reference/jak2/levels/common/metalhead-projectile_REF.gc index c1ac948dfd..0320cf8164 100644 --- a/test/decompiler/reference/jak2/levels/common/metalhead-projectile_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/metalhead-projectile_REF.gc @@ -628,7 +628,7 @@ (set! (-> a0-10 attack-id) a2-11) (set! (-> gp-0 attack-id) a2-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (set! (-> gp-0 pos quad) (-> arg1 quad)) (vector-normalize-copy! (-> gp-0 vel) v1-1 arg3) ) @@ -1028,7 +1028,7 @@ (set! (-> a0-10 attack-id) a2-11) (set! (-> gp-0 attack-id) a2-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (set! (-> gp-0 pos quad) (-> arg1 quad)) (vector-normalize-copy! (-> gp-0 vel) v1-1 arg3) ) diff --git a/test/decompiler/reference/jak2/levels/dig/dig3-obs_REF.gc b/test/decompiler/reference/jak2/levels/dig/dig3-obs_REF.gc index cb9b6d48c0..e39093c599 100644 --- a/test/decompiler/reference/jak2/levels/dig/dig3-obs_REF.gc +++ b/test/decompiler/reference/jak2/levels/dig/dig3-obs_REF.gc @@ -793,7 +793,7 @@ This commonly includes things such as: (set! (-> a0-8 attack-id) a1-6) (set! (-> v1-7 attack-id) a1-6) ) - (set! (-> v1-7 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> v1-7 timeout) (seconds 4)) (vector+! (-> v1-7 pos) (-> self root trans) s5-1) (vector-float*! (-> v1-7 vel) gp-2 163840.0) (spawn-projectile diff --git a/test/decompiler/reference/jak2/levels/drill_platform/drill-obs_REF.gc b/test/decompiler/reference/jak2/levels/drill_platform/drill-obs_REF.gc index dfa21cb9c5..e0223959ca 100644 --- a/test/decompiler/reference/jak2/levels/drill_platform/drill-obs_REF.gc +++ b/test/decompiler/reference/jak2/levels/drill_platform/drill-obs_REF.gc @@ -1745,7 +1745,7 @@ This commonly includes things such as: (set! (-> v1-48 attack-id) a0-24) (set! (-> s4-4 attack-id) a0-24) ) - (set! (-> s4-4 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-4 timeout) (seconds 4)) (set! (-> s4-4 pos quad) (-> s5-1 start-pos quad)) (vector-normalize-copy! (-> s4-4 vel) (-> s5-1 move-dist) 4096000.0) (spawn-projectile guard-lazer-shot s4-4 self *default-dead-pool*) diff --git a/test/decompiler/reference/jak2/levels/forest/predator_REF.gc b/test/decompiler/reference/jak2/levels/forest/predator_REF.gc index 5cf29cf03e..a64ac3d716 100644 --- a/test/decompiler/reference/jak2/levels/forest/predator_REF.gc +++ b/test/decompiler/reference/jak2/levels/forest/predator_REF.gc @@ -759,7 +759,7 @@ (set! (-> v1-10 attack-id) a0-11) (set! (-> s5-0 attack-id) a0-11) ) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) (vector<-cspace! (-> s5-0 pos) a1-1) (let ((s2-0 (handle->process (-> obj focus handle))) (s3-0 (new 'stack-no-clear 'vector)) diff --git a/test/decompiler/reference/jak2/levels/fortress/ammo_dump/fort-robotank-turret_REF.gc b/test/decompiler/reference/jak2/levels/fortress/ammo_dump/fort-robotank-turret_REF.gc index 1e25fe26e0..86569334f1 100644 --- a/test/decompiler/reference/jak2/levels/fortress/ammo_dump/fort-robotank-turret_REF.gc +++ b/test/decompiler/reference/jak2/levels/fortress/ammo_dump/fort-robotank-turret_REF.gc @@ -1016,7 +1016,7 @@ (set! (-> a1-10 attack-id) a2-11) (set! (-> gp-0 attack-id) a2-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (vector-! (-> gp-0 vel) a0-1 v1-0) ) (vector-normalize! (-> gp-0 vel) 512000.0) diff --git a/test/decompiler/reference/jak2/levels/fortress/fort-turret_REF.gc b/test/decompiler/reference/jak2/levels/fortress/fort-turret_REF.gc index cbfcd8a3ca..532273f9c6 100644 --- a/test/decompiler/reference/jak2/levels/fortress/fort-turret_REF.gc +++ b/test/decompiler/reference/jak2/levels/fortress/fort-turret_REF.gc @@ -779,7 +779,7 @@ (set! (-> v1-10 attack-id) a0-18) (set! (-> s4-0 attack-id) a0-18) ) - (set! (-> s4-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-0 timeout) (seconds 4)) (vector-normalize-copy! (-> s4-0 vel) s2-1 491520.0) (let ((f30-1 (fmin 16384.0 f30-0))) (set-vector! s3-0 (-> s2-1 z) (-> s2-1 y) (- (-> s2-1 x)) 1.0) diff --git a/test/decompiler/reference/jak2/levels/mars_tomb/widow2_REF.gc b/test/decompiler/reference/jak2/levels/mars_tomb/widow2_REF.gc index 10da52a3bb..96bc4b968e 100644 --- a/test/decompiler/reference/jak2/levels/mars_tomb/widow2_REF.gc +++ b/test/decompiler/reference/jak2/levels/mars_tomb/widow2_REF.gc @@ -57,7 +57,7 @@ (set! (-> v1-13 attack-id) a0-12) (set! (-> s5-0 attack-id) a0-12) ) - (set! (-> s5-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s5-0 timeout) (seconds 4)) (vector-normalize-copy! (-> s5-0 vel) arg2 491520.0) (let ((f30-1 (fmin 16384.0 f30-0))) (set-vector! s3-0 (-> arg2 z) (-> arg2 y) (- (-> arg2 x)) 1.0) diff --git a/test/decompiler/reference/jak2/levels/nest/flying-spider_REF.gc b/test/decompiler/reference/jak2/levels/nest/flying-spider_REF.gc index facf4c2f8f..7be3dbf936 100644 --- a/test/decompiler/reference/jak2/levels/nest/flying-spider_REF.gc +++ b/test/decompiler/reference/jak2/levels/nest/flying-spider_REF.gc @@ -53,7 +53,7 @@ (set! (-> a0-10 attack-id) a2-11) (set! (-> gp-0 attack-id) a2-11) ) - (set! (-> gp-0 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> gp-0 timeout) (seconds 4)) (set! (-> gp-0 pos quad) (-> arg1 quad)) (vector-normalize-copy! (-> gp-0 vel) v1-1 arg3) ) diff --git a/test/decompiler/reference/jak2/levels/palace/boss/squid-setup_REF.gc b/test/decompiler/reference/jak2/levels/palace/boss/squid-setup_REF.gc index 5dc7eb073f..8d983cf6c0 100644 --- a/test/decompiler/reference/jak2/levels/palace/boss/squid-setup_REF.gc +++ b/test/decompiler/reference/jak2/levels/palace/boss/squid-setup_REF.gc @@ -3066,7 +3066,7 @@ This commonly includes things such as: (set! (-> a1-11 attack-id) a2-12) (set! (-> s4-1 attack-id) a2-12) ) - (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 timeout) (seconds 4)) (vector-! (-> s4-1 vel) v1-6 a0-3) ) (set! (-> arg1 grenade) (ppointer->handle (spawn-projectile squid-grenade s4-1 obj *default-dead-pool*))) @@ -3296,7 +3296,3 @@ This commonly includes things such as: ;; definition for method 53 of type squid ;; INFO: function output is handled by mips2c (defmethod-mips2c "(method 53 squid)" 53 squid) - - - - diff --git a/test/decompiler/reference/jak2/levels/palace/pal-obs_REF.gc b/test/decompiler/reference/jak2/levels/palace/pal-obs_REF.gc index 4336e63fe6..382c43000b 100644 --- a/test/decompiler/reference/jak2/levels/palace/pal-obs_REF.gc +++ b/test/decompiler/reference/jak2/levels/palace/pal-obs_REF.gc @@ -988,7 +988,7 @@ This commonly includes things such as: (set! (-> v1-26 attack-id) a0-17) (set! (-> a1-2 attack-id) a0-17) ) - (set! (-> a1-2 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> a1-2 timeout) (seconds 4)) (set! (-> a1-2 pos quad) (-> s5-0 quad)) (set! (-> a1-2 vel quad) (-> gp-0 quad)) (spawn-projectile palent-turret-shot a1-2 self *default-dead-pool*) @@ -1281,7 +1281,3 @@ This commonly includes things such as: (go (method-of-object obj idle)) (none) ) - - - - diff --git a/test/decompiler/reference/jak2/levels/underport/jellyfish_REF.gc b/test/decompiler/reference/jak2/levels/underport/jellyfish_REF.gc new file mode 100644 index 0000000000..f67d238b78 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/underport/jellyfish_REF.gc @@ -0,0 +1,1571 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type jellyfish-formation +(deftype jellyfish-formation (hover-formation) + () + :heap-base #x10 + :method-count-assert 16 + :size-assert #x90 + :flag-assert #x1000100090 + ) + +;; definition for method 3 of type jellyfish-formation +(defmethod inspect jellyfish-formation ((obj jellyfish-formation)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type hover-formation inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition for method 15 of type jellyfish-formation +(defmethod hover-formation-method-15 jellyfish-formation ((obj jellyfish-formation) (arg0 vector) (arg1 vector)) + (logior! (-> obj formation flags) 2) + 0 + ) + +;; definition of type jellyfish-chain-physics +(deftype jellyfish-chain-physics (chain-physics) + () + :method-count-assert 18 + :size-assert #x570 + :flag-assert #x1200000570 + ) + +;; definition for method 3 of type jellyfish-chain-physics +(defmethod inspect jellyfish-chain-physics ((obj jellyfish-chain-physics)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tchain-joints[20] @ #x~X~%" (-> obj chain-joints)) + (format #t "~1Tnum-joints: ~D~%" (-> obj num-joints)) + (format #t "~1Troot-joint-index: ~D~%" (-> obj root-joint-index)) + (format #t "~1Tjoint-length: ~f~%" (-> obj joint-length)) + (format #t "~1Tgravity: #~%" (-> obj gravity)) + (format #t "~1Tgravity-target: #~%" (-> obj gravity-target)) + (format #t "~1Tstretch-vel: ~f~%" (-> obj stretch-vel)) + (format #t "~1Tstretch-vel-parallel: ~f~%" (-> obj stretch-vel-parallel)) + (format #t "~1Tcompress-vel: ~f~%" (-> obj compress-vel)) + (format #t "~1Tcompress-vel-parallel: ~f~%" (-> obj compress-vel-parallel)) + (format #t "~1Tnegate-y: ~A~%" (-> obj negate-y)) + (format #t "~1Taxial-slop: ~f~%" (-> obj axial-slop)) + (format #t "~1Tmaximum-stretch: ~f~%" (-> obj maximum-stretch)) + (format #t "~1Tturn-off-start: ~D~%" (-> obj turn-off-start)) + (format #t "~1Tturn-off-duration: ~D~%" (-> obj turn-off-duration)) + (label cfg-4) + obj + ) + +;; definition for method 13 of type jellyfish-chain-physics +;; WARN: Return type mismatch int vs none. +(defmethod apply-gravity jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 vector) (arg1 int) (arg2 process-drawable)) + (vector-float*! + arg0 + (-> obj gravity) + (* 4096.0 (-> self clock time-adjust-ratio) (lerp-scale 0.01 0.1 (the float arg1) 0.0 5.0)) + ) + (vector+float*! arg0 arg0 (the-as vector (+ (the-as uint (-> obj chain-joints 0 velocity)) (* arg1 64))) 0.2) + 0 + (none) + ) + +;; definition for method 14 of type jellyfish-chain-physics +;; WARN: Return type mismatch int vs none. +(defmethod chain-physics-method-14 jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 vector) (arg1 int)) + (vector-float*! + arg0 + (the-as vector (+ (the-as uint (-> obj chain-joints 0 velocity)) (* (+ arg1 1) 64))) + (lerp-scale 0.1 0.9 (the float arg1) 0.0 5.0) + ) + 0 + (none) + ) + +;; definition for method 16 of type jellyfish-chain-physics +(defmethod chain-physics-method-16 jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 int)) + (if (zero? arg0) + 0.0 + 5461.3335 + ) + ) + +;; definition for method 12 of type jellyfish-chain-physics +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod gravity-update jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 process-drawable)) + ((method-of-type chain-physics gravity-update) obj arg0) + (let ((gp-0 (new 'stack-no-clear 'collide-query))) + (let ((s5-0 (new 'stack-no-clear 'bounding-box))) + (let ((s4-0 (new 'stack-no-clear 'sphere))) + (set! (-> s4-0 quad) (-> (the-as collide-shape-moving (-> arg0 root)) root-prim prim-core world-sphere quad)) + (vector+float*! + (the-as vector s4-0) + (the-as vector s4-0) + (vector-y-quaternion! (new 'stack-no-clear 'vector) (-> arg0 root quat)) + -14336.0 + ) + (set! (-> s4-0 r) 12288.0) + (set-from-sphere! s5-0 s4-0) + ) + (set! (-> gp-0 collide-with) (collide-spec backgnd)) + (set! (-> gp-0 ignore-process0) #f) + (set! (-> gp-0 ignore-process1) #f) + (set! (-> gp-0 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> gp-0 action-mask) (collide-action solid)) + (mem-copy! (the-as pointer (-> gp-0 bbox)) (the-as pointer s5-0) 32) + ) + (fill-using-bounding-box *collide-cache* gp-0) + ) + 0 + (none) + ) + +;; definition for method 17 of type jellyfish-chain-physics +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod chain-physics-method-17 jellyfish-chain-physics ((obj jellyfish-chain-physics) (arg0 vector) (arg1 int)) + (local-vars (v1-26 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (let* ((s5-0 (new 'stack-no-clear 'collide-query)) + (v1-2 (-> obj chain-joints arg1)) + (s4-1 (vector-! (new 'stack-no-clear 'vector) arg0 (-> v1-2 position))) + (s3-0 0) + ) + (set! (-> arg0 quad) (-> v1-2 position quad)) + (until (or (< 6 s3-0) (begin + (.lvf vf1 (&-> s4-1 quad)) + (.add.w.vf vf2 vf0 vf0 :mask #b1) + (.mul.vf vf1 vf1 vf1) + (.mul.x.vf acc vf2 vf1 :mask #b1) + (.add.mul.y.vf acc vf2 vf1 acc :mask #b1) + (.add.mul.z.vf vf1 vf2 vf1 acc :mask #b1) + (.mov v1-26 vf1) + (let ((f0-7 v1-26) + (f1-5 409.6) + ) + (< f0-7 (* f1-5 f1-5)) + ) + ) + ) + (+! s3-0 1) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (set! (-> s5-0 move-dist quad) (-> s4-1 quad)) + (let ((v1-7 s5-0)) + (set! (-> v1-7 radius) 1228.8) + (set! (-> v1-7 collide-with) (collide-spec backgnd)) + (set! (-> v1-7 ignore-process0) #f) + (set! (-> v1-7 ignore-process1) #f) + (set! (-> v1-7 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-7 action-mask) (collide-action solid)) + ) + (set! (-> s5-0 num-spheres) (the-as uint #f)) + (let ((f0-1 (probe-using-line-sphere *collide-cache* s5-0))) + (cond + ((>= f0-1 0.0) + (let ((f0-2 (fmin 1.0 f0-1))) + (vector+float*! arg0 arg0 s4-1 f0-2) + (vector-float*! s4-1 s4-1 (- 1.0 f0-2)) + ) + (let ((f0-5 (vector-dot s4-1 (-> s5-0 best-other-tri normal)))) + (vector--float*! s4-1 s4-1 (-> s5-0 best-other-tri normal) (* 1.2 f0-5)) + ) + ) + (else + (vector+! arg0 arg0 s4-1) + (goto cfg-11) + ) + ) + ) + ) + ) + (label cfg-11) + 0 + (none) + ) + ) + +;; definition of type jellyfish +(deftype jellyfish (hover-enemy) + ((los los-control :inline :offset-assert 784) + (sync sync-eased :inline :offset-assert 936) + (sound-id uint32 :offset-assert 980) + (path-player-u float :offset-assert 984) + (path-my-u float :offset-assert 988) + (path-y-offset float :offset-assert 992) + (path-stare-u float :offset-assert 996) + (tentacle-clock float :offset-assert 1000) + (tentacle-blend float :offset-assert 1004) + (last-attack-time time-frame :offset-assert 1008) + (last-fire-time time-frame :offset-assert 1016) + (charge-path-timer time-frame :offset-assert 1024) + (tentacles jellyfish-chain-physics 5 :offset-assert 1032) + (tentacles-initialized symbol :offset-assert 1052) + (stare-pos vector :inline :offset-assert 1056) + (charge-pos vector :inline :offset-assert 1072) + (grab-front symbol :offset-assert 1088) + (grab-offset vector :inline :offset-assert 1104) + (grab-start-pos vector :inline :offset-assert 1120) + (grab-start-quat quaternion :inline :offset-assert 1136) + (focus-rot quaternion :inline :offset-assert 1152) + (attach-lerp float :offset-assert 1168) + ) + :heap-base #x420 + :method-count-assert 165 + :size-assert #x494 + :flag-assert #xa504200494 + (:methods + (jellyfish-method-156 () none 156) + (threaten () _type_ :state 157) + (charge-attack () _type_ :state 158) + (grab-mech () _type_ :state 159) + (die-now () _type_ :state 160) + (jellyfish-method-161 (_type_ vector float) vector 161) + (jellyfish-method-162 (_type_) symbol 162) + (jellyfish-method-163 (_type_ process-focusable) symbol 163) + (jellyfish-method-164 (_type_ process-focusable) symbol 164) + ) + ) + +;; definition for method 3 of type jellyfish +(defmethod inspect jellyfish ((obj jellyfish)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type hover-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tlos: #~%" (-> obj los)) + (format #t "~2Tsync: #~%" (-> obj sync)) + (format #t "~2Tsound-id: ~D~%" (-> obj sound-id)) + (format #t "~2Tpath-player-u: ~f~%" (-> obj path-player-u)) + (format #t "~2Tpath-my-u: ~f~%" (-> obj path-my-u)) + (format #t "~2Tpath-y-offset: ~f~%" (-> obj path-y-offset)) + (format #t "~2Tpath-stare-u: ~f~%" (-> obj path-stare-u)) + (format #t "~2Ttentacle-clock: ~f~%" (-> obj tentacle-clock)) + (format #t "~2Ttentacle-blend: ~f~%" (-> obj tentacle-blend)) + (format #t "~2Tlast-attack-time: ~D~%" (-> obj last-attack-time)) + (format #t "~2Tlast-fire-time: ~D~%" (-> obj last-fire-time)) + (format #t "~2Tcharge-path-timer: ~D~%" (-> obj charge-path-timer)) + (format #t "~2Ttentacles[5] @ #x~X~%" (-> obj tentacles)) + (format #t "~2Ttentacles-initialized: ~A~%" (-> obj tentacles-initialized)) + (format #t "~2Tstare-pos: #~%" (-> obj stare-pos)) + (format #t "~2Tcharge-pos: #~%" (-> obj charge-pos)) + (format #t "~2Tgrab-front: ~A~%" (-> obj grab-front)) + (format #t "~2Tgrab-offset: #~%" (-> obj grab-offset)) + (format #t "~2Tgrab-start-pos: #~%" (-> obj grab-start-pos)) + (format #t "~2Tgrab-start-quat: #~%" (-> obj grab-start-quat)) + (format #t "~2Tfocus-rot: #~%" (-> obj focus-rot)) + (format #t "~2Tattach-lerp: ~f~%" (-> obj attach-lerp)) + (label cfg-4) + obj + ) + +;; definition for symbol *jellyfish-mech-reserved*, type symbol +(define *jellyfish-mech-reserved* #f) + +;; definition of type jellyfish-joint-mod-tentacle-info +(deftype jellyfish-joint-mod-tentacle-info (structure) + ((axis vector :inline :offset-assert 0) + (angle float :offset-assert 16) + (period float :offset-assert 20) + (offset float :offset-assert 24) + ) + :method-count-assert 9 + :size-assert #x1c + :flag-assert #x90000001c + ) + +;; definition for method 3 of type jellyfish-joint-mod-tentacle-info +(defmethod inspect jellyfish-joint-mod-tentacle-info ((obj jellyfish-joint-mod-tentacle-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'jellyfish-joint-mod-tentacle-info) + (format #t "~1Taxis: #~%" (-> obj axis)) + (format #t "~1Tangle: ~f~%" (-> obj angle)) + (format #t "~1Tperiod: ~f~%" (-> obj period)) + (format #t "~1Toffset: ~f~%" (-> obj offset)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-jellyfish jellyfish jellyfish-lod0-jg jellyfish-idle-ja + ((jellyfish-lod0-mg (meters 999999))) + :bounds (static-spherem 0 -1.8 0 5) + ) + +;; definition for symbol *jellyfish-mainvein-chain-setup*, type (array chain-physics-setup) +(define *jellyfish-mainvein-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 11) + (new 'static 'chain-physics-setup :joint-index 12) + (new 'static 'chain-physics-setup :joint-index 13) + (new 'static 'chain-physics-setup :joint-index 14) + (new 'static 'chain-physics-setup :joint-index 15) + ) + ) + +;; definition for symbol *jellyfish-lfront-chain-setup*, type (array chain-physics-setup) +(define *jellyfish-lfront-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 17) + (new 'static 'chain-physics-setup :joint-index 18) + (new 'static 'chain-physics-setup :joint-index 19) + (new 'static 'chain-physics-setup :joint-index 20) + ) + ) + +;; definition for symbol *jellyfish-rfront-chain-setup*, type (array chain-physics-setup) +(define *jellyfish-rfront-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 22) + (new 'static 'chain-physics-setup :joint-index 23) + (new 'static 'chain-physics-setup :joint-index 24) + (new 'static 'chain-physics-setup :joint-index 25) + ) + ) + +;; definition for symbol *jellyfish-lrear-chain-setup*, type (array chain-physics-setup) +(define *jellyfish-lrear-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 27) + (new 'static 'chain-physics-setup :joint-index 28) + (new 'static 'chain-physics-setup :joint-index 29) + (new 'static 'chain-physics-setup :joint-index 30) + ) + ) + +;; definition for symbol *jellyfish-rrear-chain-setup*, type (array chain-physics-setup) +(define *jellyfish-rrear-chain-setup* (new 'static 'boxed-array :type chain-physics-setup + (new 'static 'chain-physics-setup :joint-index 32) + (new 'static 'chain-physics-setup :joint-index 33) + (new 'static 'chain-physics-setup :joint-index 34) + (new 'static 'chain-physics-setup :joint-index 35) + ) + ) + +;; definition for symbol *jellyfish-enemy-info*, type enemy-info +(define *jellyfish-enemy-info* (new 'static 'enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #f + :hover-if-no-ground #f + :idle-anim-script #f + :idle-anim 2 + :notice-anim 2 + :hostile-anim 2 + :hit-anim 2 + :knocked-anim 2 + :knocked-land-anim 2 + :die-anim 3 + :die-falling-anim 3 + :victory-anim 2 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 36 + :look-at-joint 3 + :bullseye-joint 3 + :sound-hit (static-sound-name "jellyfish-hit") + :sound-die (static-sound-name "jellyfish-die") + :notice-distance (meters 45) + :notice-distance-delta (meters 4) + :proximity-notice-distance (meters 20) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 2730.6667 + :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 28672.0 + :knocked-medium-vxz-hi 65536.0 + :knocked-medium-vy-lo 12288.0 + :knocked-medium-vy-hi 36864.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 10) + :shadow-min-y (meters -20) + :shadow-locus-dist (meters 150) + :gem-joint 36 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y -409.6 :z 4751.36 :r 163840.0) + ) + ) + +;; failed to figure out what this is: +(set! (-> *jellyfish-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 151 of type jellyfish +(defmethod hover-enemy-method-151 jellyfish ((obj jellyfish)) + (new 'static 'hover-enemy-info + :fly-forward-anim 2 + :fly-backward-anim 2 + :fly-left-anim 2 + :fly-right-anim 2 + :shoot-anim 2 + :main-joint 3 + :gun-base 40 + :engine-left -1 + :engine-right -1 + ) + ) + +;; definition for method 152 of type jellyfish +(defmethod hover-enemy-method-152 jellyfish ((obj jellyfish)) + (new 'static 'hover-nav-params :max-speed 32768.0 :max-acceleration 24576.0 :friction 0.8) + ) + +;; failed to figure out what this is: +(defstate active (jellyfish) + :virtual #t + :enter (behavior () + (let ((gp-1 (jellyfish-method-161 self (new 'stack-no-clear 'vector) (get-norm! (-> self sync) 0))) + (v1-6 (jellyfish-method-161 + self + (new 'stack-no-clear 'vector) + (get-norm! (-> self sync) (the-as int (+ (-> self clock frame-counter) (seconds 1)))) + ) + ) + (s5-2 (new 'stack-no-clear 'vector)) + ) + (vector-! s5-2 v1-6 gp-1) + (vector-normalize! s5-2 1.0) + (hover-nav-control-method-10 (-> self hover) gp-1 s5-2 (the-as vector #t)) + ) + (set! (-> self restart-fly-anims) #t) + (none) + ) + :trans (behavior () + (local-vars (a0-8 vector) (gp-2 vector)) + (seek! (-> self tentacle-blend) 1.0 (-> self clock seconds-per-frame)) + (hover-nav-control-method-11 + (-> self hover) + (jellyfish-method-161 self (new 'stack-no-clear 'vector) (get-norm! (-> self sync) 0)) + ) + (when (and (jellyfish-method-164 self (the-as process-focusable #f)) + (begin + (set! gp-2 (jellyfish-method-161 self (new 'stack-no-clear 'vector) (get-norm! (-> self sync) 0))) + (set! a0-8 (jellyfish-method-161 self (new 'stack-no-clear 'vector) (-> self path-player-u))) + (-> self focus-pos) + (< (fabs (- (-> self root-override2 trans y) (-> gp-2 y))) 8192.0) + ) + (< (vector-vector-xz-distance a0-8 gp-2) 16384.0) + ) + (set! (-> self path-stare-u) (get-norm! (-> self sync) 0)) + (go-virtual stare) + ) + (none) + ) + :code (the-as (function none :behavior jellyfish) hover-enemy-fly-code) + :post (behavior () + (debug-draw (-> self path)) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate stare (jellyfish) + :virtual #t + :enter (behavior () + (let ((t9-1 (-> (the-as (state enemy) (find-parent-method jellyfish 35)) enter))) + (if t9-1 + (t9-1) + ) + ) + (jellyfish-method-161 self (-> self stare-pos) (-> self path-stare-u)) + (set! (-> self stare-pos y) (+ -32768.0 (-> self stare-pos y))) + (let ((gp-0 (new 'stack-no-clear 'collide-query))) + (set! (-> gp-0 start-pos quad) (-> self stare-pos quad)) + (set! (-> gp-0 start-pos y) (+ 8192.0 (-> gp-0 start-pos y))) + (set-vector! (-> gp-0 move-dist) 0.0 -81920.0 0.0 0.0) + (let ((v1-8 gp-0)) + (set! (-> v1-8 radius) 819.2) + (set! (-> v1-8 collide-with) (collide-spec backgnd)) + (set! (-> v1-8 ignore-process0) self) + (set! (-> v1-8 ignore-process1) #f) + (set! (-> v1-8 ignore-pat) (-> self root-override2 pat-ignore-mask)) + (set! (-> v1-8 action-mask) (collide-action solid)) + ) + (if (>= (fill-and-probe-using-line-sphere *collide-cache* gp-0) 0.0) + (set! (-> self stare-pos y) (fmax (-> self stare-pos y) (+ 24576.0 (-> gp-0 best-other-tri intersect y)))) + ) + ) + (set! (-> self charge-path-timer) 0) + (look-at-target! self (enemy-flag lock-focus)) + (none) + ) + :trans (behavior () + (local-vars (gp-0 vector)) + (seek! (-> self tentacle-blend) 1.0 (-> self clock seconds-per-frame)) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.1)) + (let ((v1-4 (-> self focus aware))) + (cond + ((>= 1 (the-as int v1-4)) + (go-virtual active) + ) + ((= v1-4 (enemy-aware unaware)) + (go-flee self) + ) + ) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 2)) + (not (jellyfish-method-164 self (the-as process-focusable #f))) + ) + (go-virtual active) + ) + (if (and (not *jellyfish-mech-reserved*) + (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1)) + (jellyfish-method-163 self (the-as process-focusable #f)) + (begin + (set! gp-0 (jellyfish-method-161 self (new 'stack-no-clear 'vector) (-> self path-stare-u))) + (< (vector-vector-xz-distance (-> self root-override2 trans) gp-0) 12288.0) + ) + (< (fabs (- (-> self root-override2 trans y) (-> gp-0 y))) 40960.0) + ) + (go-virtual threaten) + ) + ) + (none) + ) + :post (behavior () + (hover-nav-control-method-11 (-> self hover) (-> self stare-pos)) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate threaten (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :enter (behavior () + (set! *jellyfish-mech-reserved* #t) + (none) + ) + :exit (behavior () + (set! *jellyfish-mech-reserved* #f) + (none) + ) + :trans (behavior () + (seek! (-> self tentacle-blend) 0.0 (-> self clock seconds-per-frame)) + (none) + ) + :code (behavior () + (set! (-> self restart-fly-anims) #t) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! jellyfish-notice-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-notice-ja) frames num-frames) -1)) 1.4) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 1.4)) + ) + (let ((gp-0 (handle->process (-> self focus handle))) + (s5-0 (-> self root-override2 trans)) + ) + (cond + ((not (jellyfish-method-163 self (the-as process-focusable gp-0))) + (go-virtual stare) + ) + ((< (vector-vector-distance s5-0 (get-trans (the-as process-focusable gp-0) 3)) 20480.0) + (go-virtual grab-mech) + ) + ((jellyfish-method-162 self) + (go-virtual charge-attack) + ) + (else + (go-virtual stare) + ) + ) + ) + (none) + ) + :post (behavior () + (hover-nav-control-method-11 (-> self hover) (the-as vector #f)) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate charge-attack (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :enter (behavior () + (set! *jellyfish-mech-reserved* #t) + (look-at-target! self (enemy-flag death-start)) + (hover-nav-control-method-14 (-> self hover) 8.0 10.0) + (hover-nav-control-method-10 + (-> self hover) + (-> self charge-pos) + (vector-normalize! + (vector-! (new 'stack-no-clear 'vector) (-> self charge-pos) (-> self root-override2 trans)) + 1.0 + ) + (the-as vector #t) + ) + (logior! (-> self focus-status) (focus-status dangerous)) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :exit (behavior () + (hover-nav-control-method-14 (-> self hover) 1.0 1.0) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (hover-nav-control-method-20 (-> self hover)) + (set! *jellyfish-mech-reserved* #f) + (none) + ) + :trans (behavior () + (let ((gp-0 (-> self root-override2 trans))) + (if (< (vector-vector-distance gp-0 (-> self charge-pos)) 16384.0) + (go-virtual threaten) + ) + (let ((s5-0 (handle->process (-> self focus handle)))) + (cond + ((not (jellyfish-method-163 self (the-as process-focusable s5-0))) + (go-virtual stare) + ) + ((< (vector-vector-distance gp-0 (get-trans (the-as process-focusable s5-0) 3)) 20480.0) + (go-virtual grab-mech) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-no-eval :group! jellyfish-notice-charge-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-notice-charge-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (until #f + (ja-no-eval :group! jellyfish-notice-charge-loop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-notice-charge-loop-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (let* ((gp-0 (-> self root-override2 trans)) + (s5-1 (vector-! (new 'stack-no-clear 'vector) (-> self charge-pos) gp-0)) + ) + (let* ((s4-1 (vector-! (new 'stack-no-clear 'vector) (-> self focus-pos) gp-0)) + (f30-0 (vector-length s5-1)) + (f28-0 (vector-length s4-1)) + ) + (let ((s3-0 (new 'stack-no-clear 'quaternion))) + (vector-normalize! s5-1 1.0) + (vector-normalize! s4-1 1.0) + (quaternion-from-two-vectors-partial! s3-0 s5-1 s4-1 (* 8.0 (-> self clock seconds-per-frame))) + (vector-orient-by-quat! s5-1 s5-1 s3-0) + ) + (vector-normalize! s5-1 (fmin f30-0 (+ 16384.0 f28-0))) + ) + (vector+! (-> self charge-pos) gp-0 s5-1) + ) + (hover-nav-control-method-11 (-> self hover) (-> self charge-pos)) + (hover-enemy-dest-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate grab-mech (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :enter (behavior () + (set! *jellyfish-mech-reserved* #t) + (set! (-> self attach-lerp) 0.0) + (let ((gp-0 *target*)) + (if (and gp-0 + (logtest? (focus-status mech) (-> gp-0 focus-status)) + (zero? (logand (-> gp-0 focus-status) (focus-status dead ignore))) + ) + (set! (-> self grab-front) + (< (vector-dot + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat)) + (-> gp-0 manipy 0 node-list data 3 bone transform vector 2) + ) + 0.0 + ) + ) + ) + ) + (none) + ) + :exit (behavior () + (sound-stop (the-as sound-id (-> self sound-id))) + (hover-enemy-method-147 self) + (let ((v1-3 (-> self root-override2 root-prim))) + (set! (-> v1-3 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-3 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (dotimes (gp-0 3) + (initialize-chain-joints (-> self tentacles gp-0)) + ) + (set! *jellyfish-mech-reserved* #f) + (none) + ) + :trans (behavior () + (let ((gp-0 *target*)) + (cond + ((not (jellyfish-method-163 self gp-0)) + (set! (-> self last-attack-time) (-> self clock frame-counter)) + (go-virtual active) + ) + (else + (let ((gp-1 (-> gp-0 manipy 0 node-list data 3))) + (vector<-cspace! (-> self focus-pos) gp-1) + (matrix-with-scale->quaternion (-> self focus-rot) (-> gp-1 bone transform)) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (dotimes (gp-0 3) + (turn-off (-> self tentacles gp-0) (seconds 0.93)) + ) + (ja-channel-push! 1 (seconds 0.1)) + (set-vector! (-> self grab-offset) 0.0 14336.0 0.0 0.0) + (set! (-> self grab-start-pos quad) (-> self root-override2 trans quad)) + (quaternion-copy! (-> self grab-start-quat) (-> self root-override2 quat)) + (ja-no-eval :group! jellyfish-grab-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-grab-start-ja) frames num-frames) -1)) 1.2) + :frame-num 0.0 + ) + (until (ja-done? 0) + (set! (-> self attach-lerp) (lerp-scale 0.0 1.0 (ja-aframe-num 0) 0.0 14.0)) + (suspend) + (ja :num! (seek! max 1.2)) + ) + (let ((v1-34 (-> self root-override2 root-prim))) + (set! (-> v1-34 prim-core collide-as) (collide-spec)) + (set! (-> v1-34 prim-core collide-with) (collide-spec)) + ) + 0 + (if (-> self grab-front) + (set-vector! (-> self grab-offset) 0.0 9179.136 -3682.304 0.0) + (set-vector! (-> self grab-offset) 0.0 9179.136 4354.048 0.0) + ) + (set! (-> self grab-start-pos quad) (-> self root-override2 trans quad)) + (quaternion-copy! (-> self grab-start-quat) (-> self root-override2 quat)) + (ja-no-eval :group! jellyfish-grab-attach-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-grab-attach-ja) frames num-frames) -1)) 1.2) + :frame-num 0.0 + ) + (until (ja-done? 0) + (set! (-> self attach-lerp) (lerp-scale 0.0 1.0 (ja-aframe-num 0) 14.0 23.0)) + (suspend) + (ja :num! (seek! max 1.2)) + ) + (set! (-> self grab-start-pos quad) (-> self root-override2 trans quad)) + (quaternion-copy! (-> self grab-start-quat) (-> self root-override2 quat)) + (let ((a1-11 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-11 from) (process->ppointer self)) + (set! (-> a1-11 num-params) 2) + (set! (-> a1-11 message) 'shove) + (set! (-> a1-11 param 0) (the-as uint #f)) + (let ((v1-70 (new 'static 'attack-info :mask (attack-info-mask mode shove-back shove-up id)))) + (let* ((a0-29 *game-info*) + (a2-7 (+ (-> a0-29 attack-id) 1)) + ) + (set! (-> a0-29 attack-id) a2-7) + (set! (-> v1-70 id) a2-7) + ) + (set! (-> v1-70 shove-up) 12288.0) + (set! (-> v1-70 shove-back) 0.0) + (set! (-> v1-70 mode) 'shock) + (set! (-> a1-11 param 1) (the-as uint v1-70)) + ) + (send-event-function *target* a1-11) + ) + (let ((gp-3 *target*)) + (dotimes (s5-2 2) + (ja-no-eval :group! jellyfish-grab-attach-loop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-grab-attach-loop-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and gp-3 + (logtest? (focus-status mech) (-> gp-3 focus-status)) + (zero? (logand (-> gp-3 focus-status) (focus-status dead ignore))) + ) + (let ((a1-13 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-13 from) (process->ppointer self)) + (set! (-> a1-13 num-params) 2) + (set! (-> a1-13 message) 'attack) + (set! (-> a1-13 param 0) (the-as uint #f)) + (let ((v1-95 (new 'static 'attack-info :mask (attack-info-mask intersection mode id)))) + (let* ((a0-37 *game-info*) + (a2-10 (+ (-> a0-37 attack-id) 1)) + ) + (set! (-> a0-37 attack-id) a2-10) + (set! (-> v1-95 id) a2-10) + ) + (set! (-> v1-95 mode) 'shock) + (set! (-> v1-95 intersection quad) (-> self root-override2 trans quad)) + (set! (-> a1-13 param 1) (the-as uint v1-95)) + ) + (send-event-function gp-3 a1-13) + ) + ) + (sound-play "squid-attack" :id (the-as sound-id (-> self sound-id))) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (sound-stop (the-as sound-id (-> self sound-id))) + (set-vector! (-> self grab-offset) 0.0 20480.0 0.0 0.0) + (set! (-> self grab-start-pos quad) (-> self root-override2 trans quad)) + (quaternion-copy! (-> self grab-start-quat) (-> self root-override2 quat)) + (dotimes (gp-4 3) + (initialize-chain-joints (-> self tentacles gp-4)) + ) + (ja-no-eval :group! jellyfish-grab-detach-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-grab-detach-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (set! (-> self attach-lerp) (lerp-scale 0.0 1.0 (ja-aframe-num 0) 48.0 65.0)) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> self last-attack-time) (-> self clock frame-counter)) + (go-virtual active) + (none) + ) + :post (behavior () + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> self grab-offset quad)) + (let ((s5-0 (quaternion-copy! (new 'stack-no-clear 'quaternion) (-> self focus-rot)))) + (vector-orient-by-quat! gp-0 gp-0 s5-0) + (vector+! gp-0 (-> self focus-pos) gp-0) + (if (-> self grab-front) + (quaternion-rotate-y! s5-0 s5-0 32768.0) + ) + (vector-lerp! (-> self root-override2 trans) (-> self grab-start-pos) gp-0 (-> self attach-lerp)) + (quaternion-slerp! (-> self root-override2 quat) (-> self grab-start-quat) s5-0 (-> self attach-lerp)) + ) + ) + (enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate die (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :code (behavior () + (dispose! self) + (logclear! (-> self focus-status) (focus-status dangerous)) + (enemy-method-52 self (-> self root-override2 transv)) + (let ((gp-0 (-> self clock frame-counter))) + (ja-no-eval :group! jellyfish-die-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-die-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((s5-0 (ja-group)) + (f0-4 (ja-aframe-num 0)) + ) + (when (and (= s5-0 jellyfish-die-ja) (>= f0-4 0.0) (>= 0.5 f0-4)) + (when (>= (- (-> self clock frame-counter) gp-0) (seconds 0.05)) + (process-drawable-shock-skel-effect + self + (-> *lightning-spec-id-table* 5) + lightning-probe-callback + (-> *part-id-table* 166) + 2048.0 + -1 + -1 + ) + (set! gp-0 (-> self clock frame-counter)) + ) + ) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (let ((v1-52 (-> self root-override2 root-prim))) + (set! (-> v1-52 prim-core collide-as) (collide-spec)) + (set! (-> v1-52 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (send-event self 'death-end) + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + :post (the-as (function none :behavior jellyfish) enemy-falling-post) + ) + +;; failed to figure out what this is: +(defstate die-now (jellyfish) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior jellyfish) enemy-event-handler) + :code (behavior () + (dispose! self) + (let ((v1-3 (-> self root-override2 root-prim))) + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + (set! (-> v1-3 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (ja-no-eval :group! jellyfish-die-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim jellyfish-die-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (send-event self 'death-end) + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + ) + +;; definition for method 74 of type jellyfish +(defmethod general-event-handler jellyfish ((obj jellyfish) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('hit 'hit-knocked) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (go (method-of-object obj die)) + #t + ) + (else + ((method-of-type hover-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +;; definition for method 161 of type jellyfish +(defmethod jellyfish-method-161 jellyfish ((obj jellyfish) (arg0 vector) (arg1 float)) + (get-point-in-path! (-> obj path) arg0 arg1 'interp) + (+! (-> arg0 y) (-> obj path-y-offset)) + arg0 + ) + +;; definition for method 164 of type jellyfish +;; WARN: Return type mismatch object vs symbol. +(defmethod jellyfish-method-164 jellyfish ((obj jellyfish) (arg0 process-focusable)) + (local-vars (v1-10 object)) + (jellyfish-method-161 obj (new 'stack-no-clear 'vector) (get-norm! (-> obj sync) 0)) + (let ((s5-1 (jellyfish-method-161 obj (new 'stack-no-clear 'vector) (-> obj path-player-u))) + (gp-1 (-> obj focus-pos)) + ) + (-> obj root-override2 trans) + (the-as + symbol + (and (and (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + (logtest? (focus-status mech) (-> (the-as process-focusable (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + ) + focus-status + ) + ) + (begin + (let ((v1-13 #t)) + (set! arg0 (cond + (arg0 + (empty) + arg0 + ) + (else + (the-as process-focusable (handle->process (-> obj focus handle))) + ) + ) + ) + (let ((a0-18 (the-as focus-status (logand (-> arg0 focus-status) (focus-status dead ignore))))) + (cmove-#f-nonzero v1-10 a0-18 v1-13) + ) + ) + v1-10 + ) + ) + (< (vector-vector-xz-distance s5-1 gp-1) 122880.0) + (< (fabs (- (-> s5-1 y) (-> gp-1 y))) 65536.0) + ) + ) + ) + ) + +;; definition for method 163 of type jellyfish +;; WARN: Return type mismatch object vs symbol. +(defmethod jellyfish-method-163 jellyfish ((obj jellyfish) (arg0 process-focusable)) + (local-vars (v1-8 object)) + (jellyfish-method-161 obj (new 'stack-no-clear 'vector) (-> obj path-stare-u)) + (let ((s5-0 (-> obj focus-pos))) + (-> obj root-override2 trans) + (the-as + symbol + (and (and (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + (logtest? (focus-status mech) (-> (the-as process-focusable (if arg0 + arg0 + (handle->process (-> obj focus handle)) + ) + ) + focus-status + ) + ) + (begin + (let ((v1-11 #t)) + (set! arg0 (cond + (arg0 + (empty) + arg0 + ) + (else + (the-as process-focusable (handle->process (-> obj focus handle))) + ) + ) + ) + (let ((a0-16 (the-as focus-status (logand (-> arg0 focus-status) (focus-status dead ignore))))) + (cmove-#f-nonzero v1-8 a0-16 v1-11) + ) + ) + v1-8 + ) + ) + (< (vector-vector-xz-distance s5-0 (-> obj stare-pos)) 81920.0) + (< (fabs (- (-> s5-0 y) (-> obj stare-pos y))) 32768.0) + ) + ) + ) + ) + +;; definition for method 162 of type jellyfish +;; INFO: Used lq/sq +(defmethod jellyfish-method-162 jellyfish ((obj jellyfish)) + (local-vars (sv-624 int)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + (vf3 :class vf) + (vf4 :class vf) + ) + (init-vf0-vector) + (let* ((s5-0 (-> obj root-override2 trans)) + (s3-1 (vector-! (new 'stack-no-clear 'vector) (-> obj focus-pos) s5-0)) + (s4-0 (vector-normalize-copy! (new 'stack-no-clear 'vector) s3-1 1.0)) + (f0-0 (vector-length s3-1)) + (f28-0 (+ 16384.0 f0-0)) + ) + (vector-normalize! s3-1 f28-0) + (vector+! (-> obj charge-pos) s5-0 s3-1) + (let ((f30-0 f28-0) + (f28-1 (* 0.000024414063 f28-0)) + (s3-2 0) + (s2-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack-no-clear 'collide-query)) + (f26-0 40960.0) + ) + (set! sv-624 0) + (while (< sv-624 (the int f28-1)) + (let ((a2-1 s2-0)) + (let ((v1-9 s5-0) + (a0-6 s4-0) + (a1-2 s3-2) + ) + (.lvf vf2 (&-> a0-6 quad)) + (.lvf vf1 (&-> v1-9 quad)) + (.mov vf3 a1-2) + ) + (.add.x.vf vf4 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf2 vf3) + (.add.mul.w.vf vf4 vf1 vf0 acc :mask #b111) + (.svf (&-> a2-1 quad) vf4) + ) + (when (> sv-624 0) + (set! (-> s0-0 start-pos quad) (-> s1-0 quad)) + (vector-! (-> s0-0 move-dist) s2-0 s1-0) + (let ((v1-14 s0-0)) + (set! (-> v1-14 radius) + (-> (the-as collide-shape-prim-group (-> obj root-override2 root-prim)) child 0 local-sphere w) + ) + (set! (-> v1-14 collide-with) (collide-spec backgnd enemy obstacle hit-by-others-list)) + (set! (-> v1-14 ignore-process0) obj) + (set! (-> v1-14 ignore-process1) #f) + (set! (-> v1-14 ignore-pat) (-> obj root-override2 pat-ignore-mask)) + (set! (-> v1-14 action-mask) (collide-action solid)) + ) + (if (>= (fill-and-probe-using-line-sphere *collide-cache* s0-0) 0.0) + (return #f) + ) + ) + (set! (-> s1-0 quad) (-> s2-0 quad)) + (set! f30-0 (fmax 0.0 (+ -40960.0 f30-0))) + (+! s3-2 (the int (fmin 40960.0 f30-0))) + (set! f26-0 (+ -4915.2 f26-0)) + (set! sv-624 (+ sv-624 1)) + ) + ) + ) + #t + ) + ) + +;; definition for function jellyfish-joint-mod-tentacle +(defun jellyfish-joint-mod-tentacle ((arg0 cspace) (arg1 transformq)) + (let* ((s4-0 (-> arg0 param1)) + (s3-0 (the-as structure (-> arg0 param2))) + (f0-0 4.0) + (t9-0 sin) + (f1-0 65536.0) + (f2-1 + (+ (-> (the-as jellyfish s4-0) tentacle-clock) (-> (the-as jellyfish-joint-mod-tentacle-info s3-0) offset)) + ) + (f0-4 (* (t9-0 (* f1-0 (/ (- f2-1 (* (the float (the int (/ f2-1 f0-0))) f0-0)) f0-0))) + (-> (the-as jellyfish-joint-mod-tentacle-info s3-0) angle) + ) + ) + (s2-0 (new 'stack-no-clear 'quaternion)) + ) + (let ((a2-1 (quaternion-vector-angle! + (new 'stack-no-clear 'quaternion) + (-> (the-as jellyfish-joint-mod-tentacle-info s3-0) axis) + f0-4 + ) + ) + ) + (quaternion-normalize! (quaternion*! s2-0 (-> arg1 quat) a2-1)) + ) + (quaternion-slerp! (-> arg1 quat) (-> arg1 quat) s2-0 (-> (the-as jellyfish s4-0) tentacle-blend)) + ) + (cspace<-parented-transformq-joint! arg0 arg1) + (none) + ) + +;; definition for method 55 of type jellyfish +;; INFO: Used lq/sq +(defmethod track-target! jellyfish ((obj jellyfish)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (let ((v1-1 + (vector-inv-orient-by-quat! + (new 'stack-no-clear 'vector) + (-> obj main-joint-acc) + (-> obj root-override2 quat) + ) + ) + ) + (+! (-> obj tentacle-clock) + (* (lerp-scale 1.0 10.0 (fmax (fmax (fmax 0.0 (fabs (-> v1-1 x))) (-> v1-1 y)) (fabs (-> v1-1 z))) 0.0 24576.0) + (-> pp clock seconds-per-frame) + ) + ) + ) + (when (not (-> obj tentacles-initialized)) + (set! (-> obj tentacles-initialized) #t) + (dotimes (s5-0 5) + (initialize-chain-joints (-> obj tentacles s5-0)) + ) + ) + (dotimes (s5-1 5) + (update (-> obj tentacles s5-1) obj) + ) + (let ((a1-3 (handle->process (-> obj focus handle)))) + (if a1-3 + (los-control-method-9 (-> obj los) (the-as process-focusable a1-3) (the-as vector #f) 4096.0) + ) + ) + (let ((a0-10 (handle->process (-> obj focus handle)))) + (when (and a0-10 + (logtest? (focus-status mech) (-> (the-as process-focusable a0-10) focus-status)) + (zero? (logand (-> (the-as process-focusable a0-10) focus-status) (focus-status dead ignore))) + ) + (set! (-> obj focus-pos quad) (-> (get-trans (the-as process-focusable a0-10) 0) quad)) + (set! (-> obj path-player-u) (get-furthest-point-on-path (-> obj path) (-> obj focus-pos))) + ) + ) + (set! (-> obj path-my-u) (get-furthest-point-on-path (-> obj path) (-> obj root-override2 trans))) + ((method-of-type hover-enemy track-target!) obj) + (none) + ) + ) + +;; definition for method 116 of type jellyfish +;; WARN: Return type mismatch object vs none. +(defmethod go-idle jellyfish ((obj jellyfish)) + (go (method-of-object obj active)) + (none) + ) + +;; definition for method 149 of type jellyfish +;; WARN: Return type mismatch int vs none. +(defmethod hover-enemy-method-149 jellyfish ((obj jellyfish)) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-jellyfish" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + 0 + (none) + ) + +;; definition for method 150 of type jellyfish +(defmethod hover-enemy-method-150 jellyfish ((obj jellyfish)) + *jellyfish-enemy-info* + ) + +;; definition for method 114 of type jellyfish +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! jellyfish ((obj jellyfish)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (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 4) 0))) + (set! (-> s5-0 total-prims) (the-as uint 5)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd jak bot enemy obstacle player-list)) + (set! (-> s4-0 prim-core action) (collide-action solid deadly)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 -7372.8 0.0 20480.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 enemy obstacle player-list)) + (set! (-> v1-14 prim-core action) (collide-action solid deadly)) + (set-vector! (-> v1-14 local-sphere) 0.0 1228.8 -2048.0 6144.0) + ) + (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 backgnd jak bot enemy obstacle player-list)) + (set! (-> v1-16 prim-core action) (collide-action solid deadly)) + (set-vector! (-> v1-16 local-sphere) 0.0 -819.2 -2048.0 4915.2) + ) + (let ((v1-18 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-18 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-18 prim-core collide-with) (collide-spec backgnd jak bot enemy obstacle player-list)) + (set! (-> v1-18 prim-core action) (collide-action solid deadly)) + (set-vector! (-> v1-18 local-sphere) 0.0 3276.8 -2048.0 4915.2) + ) + (let ((v1-20 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-20 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-20 prim-core action) (collide-action semi-solid)) + (set! (-> v1-20 transform-index) 3) + (set-vector! (-> v1-20 local-sphere) 0.0 0.0 1228.8 8192.0) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (let ((v1-23 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-23 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-23 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 7 of type jellyfish +;; WARN: Return type mismatch hover-enemy vs jellyfish. +(defmethod relocate jellyfish ((obj jellyfish) (arg0 int)) + (dotimes (v1-0 5) + (if (nonzero? (-> obj tentacles v1-0)) + (&+! (-> obj tentacles v1-0) arg0) + ) + ) + (the-as jellyfish ((method-of-type hover-enemy relocate) obj arg0)) + ) + +;; definition for method 10 of type jellyfish +(defmethod deactivate jellyfish ((obj jellyfish)) + (sound-stop (the-as sound-id (-> obj sound-id))) + ((the-as (function process-drawable none) (find-parent-method jellyfish 10)) obj) + (none) + ) + +;; definition for method 115 of type jellyfish +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! jellyfish ((obj jellyfish)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (with-pp + (hover-enemy-method-149 obj) + (init-enemy-behaviour-and-stats! obj (hover-enemy-method-150 obj)) + (hover-enemy-method-155 obj) + (set-vector! (-> obj offset) 0.0 6144.0 61440.0 1.0) + (set! (-> obj knocked-fall-dist) 0.0) + (let ((v1-8 (-> obj neck))) + (set! (-> v1-8 up) (the-as uint 1)) + (set! (-> v1-8 nose) (the-as uint 2)) + (set! (-> v1-8 ear) (the-as uint 0)) + (set! (-> v1-8 twist-speed-x) 0.05) + (set! (-> v1-8 twist-speed-y) 0.06) + (set! (-> v1-8 max-dist) 122880.0) + ) + (set! (-> obj root-override2 dynam gravity y) 40960.0) + (set! (-> obj root-override2 dynam gravity-length) 40960.0) + (set! (-> obj root-override2 dynam gravity-max) 40960.0) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + (new-source! (-> obj los) obj (seconds 1) (collide-spec backgnd enemy obstacle hit-by-others-list)) + (set! (-> obj last-fire-time) (-> pp clock frame-counter)) + (set! (-> obj last-attack-time) 0) + (set! (-> obj sound-id) (the-as uint (new-sound-id))) + (set! (-> obj path) (new 'process 'path-control obj 'path 0.0 (-> obj entity) #f)) + (set! (-> obj path-player-u) 0.0) + (set! (-> obj path-my-u) 0.0) + (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text)) + (set! (-> obj path-y-offset) (res-lump-float (-> obj entity) 'y-offset)) + (let ((a1-4 (new 'stack-no-clear 'sync-info-params))) + (let ((v1-32 0)) + (if #t + (set! v1-32 (logior v1-32 1)) + ) + (set! (-> a1-4 sync-type) 'sync-eased) + (set! (-> a1-4 sync-flags) (the-as sync-flags v1-32)) + ) + (set! (-> a1-4 period) (the-as uint 6000)) + (set! (-> a1-4 entity) (-> obj entity)) + (set! (-> a1-4 percent) 0.0) + (set! (-> a1-4 ease-in) 0.15) + (set! (-> a1-4 ease-out) 0.15) + (set! (-> a1-4 pause-in) 0.0) + (set! (-> a1-4 pause-out) 0.0) + (initialize! (-> obj sync) a1-4) + ) + (add-connection + *part-engine* + obj + 36 + obj + 318 + (new 'static 'vector :x 1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 36 + obj + 318 + (new 'static 'vector :x -1187.84 :y -3112.96 :z 1392.64 :w 163840.0) + ) + (add-connection *part-engine* obj 36 obj 743 (new 'static 'vector :y 1433.6 :z 1228.8 :w 163840.0)) + (dotimes (s5-1 5) + (set! (-> obj tentacles s5-1) (new 'process 'jellyfish-chain-physics)) + ) + (chain-physics-initialize obj (-> obj tentacles 0) 10 4096.0 *jellyfish-mainvein-chain-setup*) + (chain-physics-initialize obj (-> obj tentacles 1) 16 4096.0 *jellyfish-lfront-chain-setup*) + (chain-physics-initialize obj (-> obj tentacles 2) 21 4096.0 *jellyfish-rfront-chain-setup*) + (chain-physics-initialize obj (-> obj tentacles 3) 26 4096.0 *jellyfish-lrear-chain-setup*) + (chain-physics-initialize obj (-> obj tentacles 4) 31 4096.0 *jellyfish-rrear-chain-setup*) + (set! (-> obj tentacles 2 negate-y) #t) + (set! (-> obj tentacles 4 negate-y) #t) + (let ((a0-35 (-> obj skel root-channel 0))) + (set! (-> a0-35 frame-group) (the-as art-joint-anim (-> obj draw art-group data 2))) + (set! (-> a0-35 frame-num) 0.0) + (joint-control-channel-group! a0-35 (the-as art-joint-anim (-> obj draw art-group data 2)) num-func-identity) + ) + (ja-post) + (dotimes (s5-2 5) + (initialize-chain-joints (-> obj tentacles s5-2)) + ) + (let ((a1-15 (-> obj node-list data 16)) + (v1-68 + (new 'static 'jellyfish-joint-mod-tentacle-info + :axis (new 'static 'vector :z 1.0 :w 1.0) + :angle 3094.7556 + :offset 30.0 + ) + ) + ) + (set! (-> a1-15 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-15 param1) obj) + (set! (-> a1-15 param2) (the-as basic v1-68)) + ) + (let ((a1-16 (-> obj node-list data 21)) + (v1-70 + (new 'static 'jellyfish-joint-mod-tentacle-info + :axis (new 'static 'vector :z 1.0 :w 1.0) + :angle 3094.7556 + :offset 30.0 + ) + ) + ) + (set! (-> a1-16 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-16 param1) obj) + (set! (-> a1-16 param2) (the-as basic v1-70)) + ) + (let ((a1-17 (-> obj node-list data 26)) + (v1-72 + (new 'static 'jellyfish-joint-mod-tentacle-info + :axis (new 'static 'vector :z 1.0 :w 1.0) + :angle 4369.067 + :offset 45.0 + ) + ) + ) + (set! (-> a1-17 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-17 param1) obj) + (set! (-> a1-17 param2) (the-as basic v1-72)) + ) + (let ((a1-18 (-> obj node-list data 31)) + (v1-74 + (new 'static 'jellyfish-joint-mod-tentacle-info + :axis (new 'static 'vector :z 1.0 :w 1.0) + :angle 4369.067 + :offset 45.0 + ) + ) + ) + (set! (-> a1-18 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-18 param1) obj) + (set! (-> a1-18 param2) (the-as basic v1-74)) + ) + (let ((a1-19 (-> obj node-list data 10)) + (v1-76 + (new 'static 'jellyfish-joint-mod-tentacle-info :axis (new 'static 'vector :x 1.0 :w 1.0) :angle 2730.6667) + ) + ) + (set! (-> a1-19 param0) jellyfish-joint-mod-tentacle) + (set! (-> a1-19 param1) obj) + (set! (-> a1-19 param2) (the-as basic v1-76)) + ) + (set! (-> obj tentacles-initialized) #f) + (set! (-> obj tentacle-clock) 0.0) + (set! (-> obj tentacle-blend) 1.0) + (add-connection + *part-engine* + obj + 36 + obj + 318 + (new 'static 'vector :x 1966.08 :y -1843.2 :z 2129.92 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 36 + obj + 318 + (new 'static 'vector :x -1966.08 :y -1843.2 :z 2129.92 :w 163840.0) + ) + 0 + (none) + ) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/underport/under-obs_REF.gc b/test/decompiler/reference/jak2/levels/underport/under-obs_REF.gc index 5e2d706f5f..2f4a7f3002 100644 --- a/test/decompiler/reference/jak2/levels/underport/under-obs_REF.gc +++ b/test/decompiler/reference/jak2/levels/underport/under-obs_REF.gc @@ -1581,15 +1581,9 @@ This commonly includes things such as: :code (the-as (function none :behavior under-mine) sleep-code) :post (behavior () (transform-post) - (when *nav-network* - (let* ((a0-0 *nav-network*) - (t9-1 (method-of-object a0-0 nav-network-method-25)) - ) - self - (-> self root-override root-prim prim-core) - (t9-1 a0-0) + (if *nav-network* + (nav-network-method-25 *nav-network* self (-> self root-override root-prim prim-core)) ) - ) (when (not (-> self chain-initialized)) (set! (-> self chain-initialized) #t) (initialize-chain-joints (-> self chain)) @@ -1650,7 +1644,7 @@ This commonly includes things such as: (set! (-> obj chain-initialized) #f) (set! (-> obj chain) (new 'process 'under-mine-chain-physics)) (chain-physics-initialize obj (-> obj chain) 15 1843.2 *under-mine-chain-setup*) - (set! (-> obj chain negate-y) (the-as basic #t)) + (set! (-> obj chain negate-y) #t) (set! (-> obj chain axial-slop) 1820.4445) (set! (-> obj chain maximum-stretch) 100.0) (set! (-> obj chain stretch-vel) 0.7)