From 67d4eda16926ebfc91cb6a6c6b8885f411fea457 Mon Sep 17 00:00:00 2001 From: Hat Kid <6624576+Hat-Kid@users.noreply.github.com> Date: Fri, 10 Feb 2023 00:22:56 +0100 Subject: [PATCH] decomp: `hover-*` files, `wasp`, `crimson-guard-hover`, `flamer`, `target-turret`, `drill-turret`, `jellyfish` (#2198) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Manual patches: - `drill-turret`: The static data for `*turret-13-path*`, `*turret-14-path*` and `*turret-15-path*` was decompiled by hand and the integers in the `set-speed-mult` events have been replaced with boxed integer arrays that contain only that integer in order to make the compiler happy. To that effect, the event handler in `target-turret` was changed to access that array instead of just accessing the int. - `hover-nav-control`: In `hover-nav-control::10`, `arg2` is usually a `vector`, but there are some places where it is called with `#t` as `arg2` and, subsequently, crashes the game because it tries to access the `quad` of `arg2` if `arg2` is truthy. To mitigate this, the condition `arg2` has been replaced with `(and (!= arg2 #t) arg2)` (in this case, it would jump to the `else` that just resets the `dest-vel` and `transv` `quad`s) - `drill-baron`: The static data for `*drill-ship-turret-speed-event*` has been decompiled by hand. TODOs: - Jellyfish crash the game - Destroying the metalhead eggs that are on the breakable wall crashes the game (already happened with the Peacemaker before) - Figure out why static data of type `turret-path-event` doesn't decompile The docs for all the hover-nav and nav-network code could use some love in the future, I'm not smart enough to figure out what any of that code actually means, but it seems to work... Also threw in the fix for the ▲ that was accidentally left commented out. --- decompiler/config/jak2/all-types.gc | 736 ++--- .../jak2/anonymous_function_types.jsonc | 13 + decompiler/config/jak2/hacks.jsonc | 3 - decompiler/config/jak2/label_types.jsonc | 46 +- decompiler/config/jak2/stack_structures.jsonc | 69 + decompiler/config/jak2/type_casts.jsonc | 355 +++ decompiler/util/data_decompile.cpp | 12 +- goal_src/jak2/characters/ashelin/ash.gc | 73 +- goal_src/jak2/characters/sig/sig.gc | 69 +- goal_src/jak2/engine/camera/camera-h.gc | 1 + .../jak2/engine/common_objs/projectile-h.gc | 2 +- .../jak2/engine/common_objs/projectile.gc | 17 +- goal_src/jak2/engine/draw/drawable.gc | 6 +- goal_src/jak2/engine/entity/entity-table.gc | 2 +- .../jak2/engine/physics/chain-physics-h.gc | 6 +- goal_src/jak2/engine/physics/chain-physics.gc | 8 +- .../jak2/engine/target/board/board-states.gc | 2 +- .../jak2/engine/target/gun/gun-blue-shot.gc | 8 +- .../jak2/engine/target/gun/gun-dark-shot.gc | 5 +- goal_src/jak2/engine/target/gun/gun-util.gc | 19 +- .../jak2/engine/target/gun/gun-yellow-shot.gc | 10 +- goal_src/jak2/engine/target/target-h.gc | 5 +- goal_src/jak2/engine/target/target-turret.gc | 2591 +++++++++++++++ goal_src/jak2/levels/atoll/juicer.gc | 3 +- goal_src/jak2/levels/city/common/guard.gc | 4 +- .../levels/city/common/metalhead-predator.gc | 2 +- .../jak2/levels/city/common/vehicle-guard.gc | 6 +- .../levels/common/enemy/bombots/bombbot.gc | 5 +- .../enemy/guards/crimson-guard-level.gc | 339 +- .../common/enemy/hover/crimson-guard-hover.gc | 1922 +++++++++++ .../jak2/levels/common/enemy/hover/flamer.gc | 1534 +++++++++ .../common/enemy/hover/hover-enemy-battle.gc | 313 ++ .../common/enemy/hover/hover-enemy-h.gc | 90 +- .../levels/common/enemy/hover/hover-enemy.gc | 1022 ++++++ .../common/enemy/hover/hover-formation-h.gc | 4 +- .../common/enemy/hover/hover-formation.gc | 12 +- .../common/enemy/hover/hover-nav-control-h.gc | 140 +- .../common/enemy/hover/hover-nav-control.gc | 1722 ++++++++++ .../jak2/levels/common/enemy/hover/wasp.gc | 1612 ++++++++++ .../enemy/metalhead_bearer/centurion.gc | 72 +- .../enemy/metalhead_slinger/grenadier.gc | 69 +- goal_src/jak2/levels/common/enemy/spyder.gc | 2 +- .../levels/common/entities/sew-gunturret.gc | 2 +- .../levels/common/metalhead-projectile.gc | 13 +- goal_src/jak2/levels/dig/dig3-obs.gc | 2 +- .../jak2/levels/drill_platform/drill-baron.gc | 2075 ++++++++++++ .../jak2/levels/drill_platform/drill-obs.gc | 10 +- .../levels/drill_platform/drill-turret.gc | 574 ++++ goal_src/jak2/levels/forest/predator.gc | 72 +- .../ammo_dump/fort-robotank-turret.gc | 5 +- goal_src/jak2/levels/fortress/fort-turret.gc | 2 +- goal_src/jak2/levels/mars_tomb/widow2.gc | 2 +- goal_src/jak2/levels/nest/flying-spider.gc | 2 +- .../jak2/levels/palace/boss/squid-setup.gc | 3 +- goal_src/jak2/levels/palace/pal-obs.gc | 2 +- goal_src/jak2/levels/underport/jellyfish.gc | 1426 +++++++++ goal_src/jak2/levels/underport/under-obs.gc | 15 +- .../jak2/characters/ashelin/ash_REF.gc | 2 +- .../reference/jak2/characters/sig/sig_REF.gc | 2 +- .../jak2/engine/camera/camera-h_REF.gc | 1 + .../engine/common_objs/projectile-h_REF.gc | 2 +- .../jak2/engine/common_objs/projectile_REF.gc | 2 +- .../jak2/engine/entity/entity-table_REF.gc | 2 +- .../engine/physics/chain-physics-h_REF.gc | 6 +- .../jak2/engine/physics/chain-physics_REF.gc | 8 +- .../engine/target/board/board-states_REF.gc | 2 +- .../engine/target/gun/gun-blue-shot_REF.gc | 2 +- .../engine/target/gun/gun-dark-shot_REF.gc | 2 +- .../jak2/engine/target/gun/gun-util_REF.gc | 4 +- .../engine/target/gun/gun-yellow-shot_REF.gc | 4 +- .../jak2/engine/target/target-h_REF.gc | 4 +- .../jak2/engine/target/target-turret_REF.gc | 2829 +++++++++++++++++ .../reference/jak2/levels/atoll/juicer_REF.gc | 3 +- .../jak2/levels/city/common/guard_REF.gc | 8 +- .../levels/city/common/vehicle-guard_REF.gc | 6 +- .../common/enemy/bombots/bombbot_REF.gc | 2 +- .../enemy/guards/crimson-guard-level_REF.gc | 4 +- .../enemy/hover/crimson-guard-hover_REF.gc | 2050 ++++++++++++ .../levels/common/enemy/hover/flamer_REF.gc | 1653 ++++++++++ .../enemy/hover/hover-enemy-battle_REF.gc | 371 +++ .../common/enemy/hover/hover-enemy-h_REF.gc | 94 +- .../common/enemy/hover/hover-enemy_REF.gc | 1115 +++++++ .../enemy/hover/hover-formation-h_REF.gc | 4 +- .../common/enemy/hover/hover-formation_REF.gc | 12 +- .../enemy/hover/hover-nav-control-h_REF.gc | 140 +- .../enemy/hover/hover-nav-control_REF.gc | 1854 +++++++++++ .../levels/common/enemy/hover/wasp_REF.gc | 1705 ++++++++++ .../enemy/metalhead_bearer/centurion_REF.gc | 2 +- .../enemy/metalhead_slinger/grenadier_REF.gc | 2 +- .../jak2/levels/common/enemy/spyder_REF.gc | 2 +- .../common/entities/sew-gunturret_REF.gc | 2 +- .../levels/common/metalhead-projectile_REF.gc | 4 +- .../reference/jak2/levels/dig/dig3-obs_REF.gc | 2 +- .../levels/drill_platform/drill-obs_REF.gc | 2 +- .../jak2/levels/forest/predator_REF.gc | 2 +- .../ammo_dump/fort-robotank-turret_REF.gc | 2 +- .../jak2/levels/fortress/fort-turret_REF.gc | 2 +- .../jak2/levels/mars_tomb/widow2_REF.gc | 2 +- .../jak2/levels/nest/flying-spider_REF.gc | 2 +- .../levels/palace/boss/squid-setup_REF.gc | 6 +- .../jak2/levels/palace/pal-obs_REF.gc | 6 +- .../jak2/levels/underport/jellyfish_REF.gc | 1571 +++++++++ .../jak2/levels/underport/under-obs_REF.gc | 12 +- 103 files changed, 29856 insertions(+), 794 deletions(-) create mode 100644 test/decompiler/reference/jak2/engine/target/target-turret_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/hover/crimson-guard-hover_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/hover/flamer_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy-battle_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/hover/hover-enemy_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/hover/hover-nav-control_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/hover/wasp_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/underport/jellyfish_REF.gc 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)