From bdee98323dca7486e67a275c19ae998230fbf342 Mon Sep 17 00:00:00 2001 From: Hat Kid <6624576+Hat-Kid@users.noreply.github.com> Date: Sat, 7 Jan 2023 23:14:12 +0100 Subject: [PATCH] decomp: add a bunch of enemy files (#2101) Adds the following files: - `amphibian` - `centurion` - `ginsu` - `grenadier` - `hopper` - `metalmonk` - `monster-frog` - `predator-graph` - `predator-h` - `predator` - `rapid-gunner` - `rhino` - `rhino-wall` - `tomb-baby-spider` Also adds the DGOs for the following levels: - Mar's Tomb - Mountain Temple - Drill Platform - Sacred Site (Sage Hut) Manual patches: - The decompiler emits `(b! #t cfg-17)` in `(trans hostile hopper)` without putting a `(label cfg-17)` anywhere - Added cast to `art-joint-anim` in `(code broken rhino-wall)` and `(code hit rhino-wall)` Other notes: - `amphibian` seems to occasionally crash when using its tongue attack. Haven't investigated this yet - `ginsu` crashes after being killed somewhere in the `deactivate` method, possibly because of its `part-spawner` - Predators aren't spawning in the forest hunt mission, not sure if `forest-obs` might be needed for that or if it's something else - The `rhino-wall` STR animation seems to load (albeit a bit broken due to missing VAG stream playback), but causes the viewport to shrink as soon as it's played - I added `pegasus::74` to the `event_handler_hack` bool in `variable_naming.cpp` because I got a `none` cast after changing the return value of `enemy::74` --- decompiler/analysis/variable_naming.cpp | 3 +- decompiler/config/jak2/all-types.gc | 518 ++-- decompiler/config/jak2/hacks.jsonc | 10 +- decompiler/config/jak2/inputs.jsonc | 33 +- decompiler/config/jak2/label_types.jsonc | 42 + decompiler/config/jak2/stack_structures.jsonc | 51 +- decompiler/config/jak2/type_casts.jsonc | 581 ++++- decompiler/config/jak2_ntsc_v1.jsonc | 2 +- decompiler/util/data_decompile.cpp | 5 +- .../opengl_renderer/OpenGLRenderer.cpp | 3 + game/graphics/opengl_renderer/buckets.h | 1 + goal_src/jak2/engine/ai/enemy-h.gc | 6 +- goal_src/jak2/engine/ai/enemy.gc | 641 ++--- goal_src/jak2/engine/data/art-elts.gc | 1 - goal_src/jak2/engine/nav/nav-control-h.gc | 6 +- goal_src/jak2/engine/nav/nav-control.gc | 15 +- goal_src/jak2/engine/nav/nav-enemy.gc | 48 +- .../engine/spatial-hash/spatial-hash-h.gc | 14 +- goal_src/jak2/game.gp | 228 +- goal_src/jak2/kernel/gcommon.gc | 2 + goal_src/jak2/levels/common/airlock.gc | 1 + .../common/enemy/amphibian/amphibian.gc | 1829 ++++++++++++++ .../enemy/baby_spider/tomb-baby-spider.gc | 748 ++++++ goal_src/jak2/levels/common/enemy/hopper.gc | 991 ++++++++ .../enemy/metalhead_bearer/centurion.gc | 1529 ++++++++++++ .../common/enemy/metalhead_brown/metalmonk.gc | 1181 +++++++++ .../enemy/metalhead_slinger/grenadier.gc | 1314 ++++++++++ goal_src/jak2/levels/common/grunt.gc | 1 - goal_src/jak2/levels/drill_platform/ginsu.gc | 1074 ++++++++ goal_src/jak2/levels/forest/pegasus.gc | 70 +- goal_src/jak2/levels/forest/predator-graph.gc | 2151 ++++++++++++++++ goal_src/jak2/levels/forest/predator-h.gc | 9 +- goal_src/jak2/levels/forest/predator.gc | 1713 +++++++++++++ .../jak2/levels/mars_tomb/monster-frog.gc | 1022 ++++++++ goal_src/jak2/levels/ruins/rapid-gunner.gc | 1496 ++++++++++++ goal_src/jak2/levels/temple/rhino-wall.gc | 298 +++ goal_src/jak2/levels/temple/rhino.gc | 1762 ++++++++++++++ .../reference/jak2/engine/ai/enemy-h_REF.gc | 6 +- .../reference/jak2/engine/ai/enemy_REF.gc | 641 ++--- .../jak2/engine/nav/nav-control-h_REF.gc | 2 +- .../jak2/engine/nav/nav-control_REF.gc | 11 +- .../jak2/engine/nav/nav-enemy_REF.gc | 48 +- .../engine/spatial-hash/spatial-hash-h_REF.gc | 2 +- .../common/enemy/amphibian/amphibian_REF.gc | 1975 +++++++++++++++ .../enemy/baby_spider/tomb-baby-spider_REF.gc | 796 ++++++ .../jak2/levels/common/enemy/hopper_REF.gc | 946 ++++++++ .../enemy/metalhead_bearer/centurion_REF.gc | 1650 +++++++++++++ .../enemy/metalhead_brown/metalmonk_REF.gc | 1275 ++++++++++ .../enemy/metalhead_slinger/grenadier_REF.gc | 1385 +++++++++++ .../reference/jak2/levels/common/grunt_REF.gc | 1 - .../jak2/levels/drill_platform/ginsu_REF.gc | 1174 +++++++++ .../jak2/levels/forest/pegasus_REF.gc | 65 +- .../jak2/levels/forest/predator-graph_REF.gc | 2155 +++++++++++++++++ .../jak2/levels/forest/predator-h_REF.gc | 13 +- .../jak2/levels/forest/predator_REF.gc | 1844 ++++++++++++++ .../jak2/levels/mars_tomb/monster-frog_REF.gc | 1060 ++++++++ .../jak2/levels/ruins/rapid-gunner_REF.gc | 1585 ++++++++++++ .../jak2/levels/temple/rhino-wall_REF.gc | 288 +++ .../reference/jak2/levels/temple/rhino_REF.gc | 2056 ++++++++++++++++ test/offline/config/jak2/config.jsonc | 9 +- 60 files changed, 37190 insertions(+), 1196 deletions(-) create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/amphibian/amphibian_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/baby_spider/tomb-baby-spider_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/hopper_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/metalhead_bearer/centurion_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/metalhead_brown/metalmonk_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/common/enemy/metalhead_slinger/grenadier_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/drill_platform/ginsu_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/forest/predator-graph_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/forest/predator_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/mars_tomb/monster-frog_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/ruins/rapid-gunner_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/temple/rhino-wall_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/temple/rhino_REF.gc diff --git a/decompiler/analysis/variable_naming.cpp b/decompiler/analysis/variable_naming.cpp index c8887064ad..aaf410d610 100644 --- a/decompiler/analysis/variable_naming.cpp +++ b/decompiler/analysis/variable_naming.cpp @@ -735,7 +735,8 @@ void SSA::make_vars(const Function& function, const DecompilerTypeSystem& dts) { if (function.ir2.env.version == GameVersion::Jak2) { event_handler_hack = function.guessed_name.is_event_handler() || function.guessed_name.to_string() == "target-generic-event-handler" || - function.guessed_name.to_string() == "target-standard-event-handler"; + function.guessed_name.to_string() == "target-standard-event-handler" || + function.guessed_name.to_string() == "(method 74 pegasus)"; } for (int block_id = 0; block_id < int(blocks.size()); block_id++) { diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index 56fe8ba6e4..7734c52e07 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -22756,7 +22756,7 @@ (clamp-vector-to-mesh-no-gaps (_type_ vector nav-poly vector clamp-travel-vector-to-mesh-return-info) none 21) (find-first-sphere-and-update-avoid-params (_type_ vector nav-avoid-spheres-params) float 22) (set-spheres-from-nav-ids "Set up spheres from sphere ids previously found by find-sphere-ids-from-sphere-hash" (_type_) none 23) - (add-root-sphere-to-hash! "Add our root sphere to the hash (if enabled with output-sphere-hash flag) at the given location." (_type_ vector int) none 24) + (add-root-sphere-to-hash! "Add our root sphere to the hash (if enabled with output-sphere-hash flag) at the given location." (_type_ vector int) symbol 24) (get-max-rotation-rate (_type_) float 25) (get-sphere-mask (_type_) uint 26) (get-target-speed (_type_) meters 27) @@ -22879,7 +22879,7 @@ (update-from-spheres (_type_) none 28) (sphere-hash-method-29 (_type_ find-nav-sphere-ids-params int int int) none 29) (find-nav-sphere-ids (_type_ find-nav-sphere-ids-params) none 30) - (add-sphere-with-mask-and-id (_type_ vector int int) none 31) + (add-sphere-with-mask-and-id (_type_ vector int int) symbol 31) (sphere-hash-method-32 (_type_ vector vector float int) symbol 32) (remove-by-id (_type_ sphere int) none 33) ) @@ -32623,14 +32623,14 @@ (enemy-method-55 (_type_) none 55) (enemy-method-56 (_type_ process event-message-block) int 56) (enemy-method-57 (_type_ process-focusable enemy-best-focus) enemy-aware 57) - (enemy-method-58 (_type_) symbol 58) + (enemy-method-58 (_type_ process event-message-block) symbol 58) (enemy-method-59 (_type_) penetrate 59) (coin-flip? "@returns The result of a 50/50 RNG roll" (_type_) symbol 60) (enemy-method-61 (_type_ int) int :behavior enemy 61) (enemy-method-62 (_type_) none 62) - (enemy-method-63 (_type_ process-focusable symbol) none 63) + (enemy-method-63 (_type_ process-focusable symbol) symbol 63) (enemy-method-64 (_type_) none 64) (enemy-method-65 (_type_) none 65) (go-ambush (_type_) none 66) @@ -32641,7 +32641,7 @@ (go-flee (_type_) none 71) (enemy-method-72 (_type_) none 72) (enemy-method-73 (_type_) none 73) - (enemy-method-74 (_type_ process object symbol event-message-block) none 74) + (enemy-method-74 (_type_ process object symbol event-message-block) object 74) (enemy-method-75 (_type_ process touching-shapes-entry) none 75) (enemy-method-76 (_type_ process event-message-block) symbol 76) (enemy-method-77 (_type_ (pointer float)) symbol 77) @@ -36046,14 +36046,15 @@ (dest-node-id uint16 :offset-assert 0) (flags predator-edge-flag :offset-assert 2) ) + :pack-me :flag-assert #x900000004 ) (deftype predator-graph (structure) ((node-count uint16 :offset-assert 0) (edge-count uint16 :offset-assert 2) - (node uint32 :offset-assert 4) - (edge uint32 :offset-assert 8) + (node (inline-array predator-node) :offset-assert 4) + (edge (inline-array predator-edge) :offset-assert 8) ) :method-count-assert 9 :size-assert #xc @@ -36065,13 +36066,12 @@ ;; predator-graph ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; (define-extern *predator-graph* object) +(define-extern *predator-graph* predator-graph) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; predator ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype predator-shot (metalhead-shot) () :method-count-assert 40 @@ -36080,19 +36080,18 @@ (:methods ) ) -|# (deftype predator (nav-enemy) ((los los-control :inline :offset-assert 608) - (want-stop basic :offset-assert 756) + (want-stop symbol :offset-assert 756) (target-pos vector :inline :offset-assert 768) (curr-node int32 :offset-assert 784) (hide-pos vector :inline :offset-assert 800) (next-change uint64 :offset-assert 816) (shoot-angle float :offset-assert 824) (miss-amount float :offset-assert 828) - (ambient-sound-id uint32 :offset-assert 832) - (shock-effect-time time-frame :offset-assert 840) + (ambient-sound-id sound-id :offset-assert 832) + (shock-effect-time time-frame :offset-assert 840) (shock-effect-end uint64 :offset-assert 848) (fade float :offset-assert 856) (dest-fade float :offset-assert 860) @@ -36105,39 +36104,37 @@ (fire () _type_ :state 179) (hide () _type_ :state 180) (hidden () _type_ :state 181) - (predator-method-182 () none 182) - (predator-method-183 () none 183) - (predator-method-184 () none 184) - (predator-method-185 () none 185) - (predator-method-186 () none 186) - (predator-method-187 () none 187) - (predator-method-188 () none 188) + (set-dangerous! (_type_ symbol) symbol 182) + (predator-method-183 (_type_) none 183) + (predator-method-184 (_type_ int float) none 184) + (predator-method-185 (_type_) none 185) + (predator-method-186 (_type_) none 186) + (predator-method-187 (_type_) symbol 187) + (predator-method-188 (_type_ vector vector vector) none 188) ) ) -#| (deftype predator-manager (process) - () + ((predator-count uint32 :offset-assert 128) + (predator-h handle 32 :offset-assert 136) + (hud-counter handle :offset-assert 392) + (actor-group (pointer actor-group) :offset-assert 400) + (actor-group-count int32 :offset-assert 404) + ) :method-count-assert 17 :size-assert #x198 :flag-assert #x1101200198 ;; Failed to read fields. (:methods - (predator-manager-method-9 () none 9) - (predator-manager-method-10 () none 10) - (closed () _type_ :state 11) - (predator-manager-method-12 () none 12) - (predator-manager-method-13 () none 13) (idle () _type_ :state 14) (closed () _type_ :state 15) - (predator-manager-method-16 () none 16) + (predator-manager-method-16 (_type_) none 16) ) ) -|# -;; (define-extern point-in-line-region? function) -;; (define-extern *predator-nav-enemy-info* nav-enemy-info) -;; (define-extern *predator-manager* object) +(define-extern point-in-line-region? (function vector vector vector float symbol)) +(define-extern *predator-nav-enemy-info* nav-enemy-info) +(define-extern *predator-manager* predator-manager) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; forest-scenes ;; @@ -36681,7 +36678,6 @@ ;; tomb-baby-spider ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype tomb-baby-spider (nav-enemy) () :method-count-assert 180 @@ -36692,9 +36688,7 @@ (attack-stop () _type_ :state 179) ) ) -|# -#| (deftype dig-spider (tomb-baby-spider) () :method-count-assert 180 @@ -36703,9 +36697,8 @@ (:methods ) ) -|# -;; (define-extern *tomb-baby-spider-nav-enemy-info* nav-enemy-info) +(define-extern *tomb-baby-spider-nav-enemy-info* nav-enemy-info) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; grenadier ;; @@ -36723,15 +36716,15 @@ ) (deftype grenadier (nav-enemy) - ((shot-trajectory trajectory :inline :offset-assert 608) - (hostile-path path-control :offset-assert 648) - (bank bank-info :inline :offset-assert 656) - (joint joint-mod-blend-world :offset-assert 720) - (heading basic :offset-assert 724) - (move-pos vector :inline :offset-assert 736) - (move-angle float :offset-assert 752) - (status-flags uint64 :offset-assert 760) - (suppress-knockaside-timer uint64 :offset-assert 768) + ((shot-trajectory trajectory :inline :offset-assert 608) + (hostile-path path-control :offset-assert 648) + (bank bank-info :inline :offset-assert 656) + (joint joint-mod-blend-world :offset-assert 720) + (heading symbol :offset-assert 724) + (move-pos vector :inline :offset-assert 736) + (move-angle float :offset-assert 752) + (status-flags uint64 :offset-assert 760) + (suppress-knockaside-timer time-frame :offset-assert 768) ) :method-count-assert 184 :size-assert #x308 @@ -36740,20 +36733,19 @@ (attack () _type_ :state 178) (backup () _type_ :state 179) (spin-kick () _type_ :state 180) - (grenadier-method-181 () none 181) - (grenadier-method-182 () none 182) - (grenadier-method-183 () none 183) + (grenadier-method-181 (_type_) none 181) + (grenadier-method-182 (_type_ vector) none 182) + (grenadier-method-183 (_type_) none 183) ) ) -;; (define-extern *grenadier-nav-enemy-info* nav-enemy-info) -;; (define-extern pos-rotate-y<-vector+vector function) +(define-extern *grenadier-nav-enemy-info* nav-enemy-info) +(define-extern pos-rotate-y<-vector+vector (function vector vector float)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; metalmonk ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype metalmonk-anim-info (structure) ((anim-index int32 :offset-assert 0) ) @@ -36761,51 +36753,46 @@ :size-assert #x4 :flag-assert #x900000004 ) -|# -#| (deftype metalmonk-global-info (basic) - ((prev-yellow-hit int8 :offset-assert 4) - (prev-blue-hit int8 :offset-assert 5) - (idle-anim UNKNOWN 3 :offset-assert 8) - (patrol-anim UNKNOWN 2 :offset-assert 20) - (notice-anim UNKNOWN 2 :offset-assert 28) - (charge-anim UNKNOWN 2 :offset-assert 36) - (attack-anim UNKNOWN 2 :offset-assert 44) - (knocked-anim UNKNOWN 2 :offset-assert 52) - (celebrate-anim UNKNOWN 2 :offset-assert 60) - (yellow-hit-anim UNKNOWN 4 :offset-assert 68) - (blue-hit-anim UNKNOWN 3 :offset-assert 84) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (idle-anim int32 3 :offset-assert 8) + (patrol-anim int32 2 :offset-assert 20) + (notice-anim int32 2 :offset-assert 28) + (charge-anim int32 2 :offset-assert 36) + (attack-anim int32 2 :offset-assert 44) + (knocked-anim int32 2 :offset-assert 52) + (celebrate-anim int32 2 :offset-assert 60) + (yellow-hit-anim int32 4 :offset-assert 68) + (blue-hit-anim int32 3 :offset-assert 84) ) + :pack-me :method-count-assert 9 :size-assert #x60 :flag-assert #x900000060 ) -|# -#| (deftype metalmonk (nav-enemy) - ((focus-pos vector :inline :offset-assert 348) - (new-facing vector :inline :offset-assert 620) - (old-facing vector :inline :offset-assert 636) - (high-time time-frame :offset-assert 652) - (intro-path basic :offset-assert 660) + ((new-facing vector :inline :offset 624) + (old-facing vector :inline :offset 640) + (high-time time-frame :offset 656) + (intro-path path-control :offset-assert 664) ) :method-count-assert 183 :size-assert #x29c :flag-assert #xb70220029c (:methods (attack () _type_ :state 178) - (metalmonk-method-179 () none 179) - (metalmonk-method-180 () none 180) - (metalmonk-method-181 () none 181) - (metalmonk-method-182 () none 182) + (metalmonk-method-179 (_type_ vector) none 179) + (metalmonk-method-180 (_type_ symbol) none 180) + (metalmonk-method-181 (_type_ float float) none 181) + (metalmonk-method-182 (_type_ float float) none 182) ) ) -|# -;; (define-extern *metalmonk-global-info* metalmonk-global-info) -;; (define-extern *metalmonk-nav-enemy-info* nav-enemy-info) +(define-extern *metalmonk-global-info* metalmonk-global-info) +(define-extern *metalmonk-nav-enemy-info* nav-enemy-info) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; dig-texture ;; @@ -37660,7 +37647,6 @@ ;; centurion ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype centurion-shot (metalhead-shot) () :method-count-assert 40 @@ -37669,22 +37655,20 @@ (:methods ) ) -|# -#| (deftype centurion (nav-enemy) - ((los los-control :inline :offset-assert 604) - (target-pos vector :inline :offset-assert 764) - (can-shoot? basic :offset-assert 780) - (incoming-attack-id uint32 :offset-assert 784) - (can-take-damage? basic :offset-assert 788) - (first-shoot? basic :offset-assert 792) - (shoot-dir vector :inline :offset-assert 796) - (tar-pos vector :inline :offset-assert 812) - (joint basic :offset-assert 828) - (joint-enable basic :offset-assert 832) - (victory-sound uint32 :offset-assert 836) - (shield-shot uint32 :offset-assert 840) + ((los los-control :inline :offset-assert 608) + (target-pos vector :inline :offset-assert 768) + (can-shoot? basic :offset-assert 784) + (incoming-attack-id uint32 :offset-assert 788) + (can-take-damage? symbol :offset-assert 792) + (first-shoot? symbol :offset-assert 796) + (shoot-dir vector :inline :offset-assert 800) + (tar-pos vector :inline :offset-assert 816) + (joint joint-mod :offset-assert 832) + (joint-enable symbol :offset-assert 836) + (victory-sound sound-id :offset-assert 840) + (shield-shot uint32 :offset-assert 844) ) :method-count-assert 183 :size-assert #x350 @@ -37692,14 +37676,12 @@ (:methods (attack () _type_ :state 178) (fire () _type_ :state 179) - (centurion-method-180 () none 180) - (centurion-method-181 () none 181) - (centurion-method-182 () none 182) + (centurion-method-180 (_type_) none 180) + (centurion-method-181 (_type_ vector) int 181) + (centurion-method-182 (_type_ vector) symbol 182) ) ) -|# -#| (deftype centurion-anim-info (structure) ((anim-index int32 :offset-assert 0) ) @@ -37707,39 +37689,36 @@ :size-assert #x4 :flag-assert #x900000004 ) -|# -#| (deftype centurion-global-info (basic) - ((prev-yellow-hit int8 :offset-assert 4) - (prev-blue-hit int8 :offset-assert 5) - (yellow-hit-anim UNKNOWN 1 :offset-assert 8) - (blue-hit-anim UNKNOWN 3 :offset-assert 12) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (yellow-hit-anim int32 1 :offset-assert 8) + (blue-hit-anim int32 3 :offset-assert 12) ) + :pack-me :method-count-assert 9 :size-assert #x18 :flag-assert #x900000018 ) -|# -;; (define-extern *centurion-shield-glow-spt-scale-x* object) -;; (define-extern *centurion-shield-glow-spt-scale-y* object) -;; (define-extern *centurion-shield-center-spt-scale-x* object) -;; (define-extern *centurion-shield-center-spt-scale-y* object) -;; (define-extern *centurion-shield-spt-scale-x* object) -;; (define-extern *centurion-shield-spt-scale-y* object) -;; (define-extern *centurion-shield-2-spt-scale-x* object) -;; (define-extern *centurion-shield-2-spt-scale-y* object) -;; (define-extern centurion-shield-big function) -;; (define-extern centurion-shield-little function) -;; (define-extern *centurion-global-info* centurion-global-info) -;; (define-extern *centurion-nav-enemy-info* nav-enemy-info) +(define-extern *centurion-shield-glow-spt-scale-x* int) +(define-extern *centurion-shield-glow-spt-scale-y* int) +(define-extern *centurion-shield-center-spt-scale-x* int) +(define-extern *centurion-shield-center-spt-scale-y* int) +(define-extern *centurion-shield-spt-scale-x* int) +(define-extern *centurion-shield-spt-scale-y* int) +(define-extern *centurion-shield-2-spt-scale-x* int) +(define-extern *centurion-shield-2-spt-scale-y* int) +(define-extern centurion-shield-big (function none)) +(define-extern centurion-shield-little (function none)) +(define-extern *centurion-global-info* centurion-global-info) +(define-extern *centurion-nav-enemy-info* nav-enemy-info) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ginsu ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype ginsu-anim-info (structure) ((anim-index int32 :offset-assert 0) ) @@ -37747,35 +37726,31 @@ :size-assert #x4 :flag-assert #x900000004 ) -|# -#| (deftype ginsu-global-info (basic) - ((prev-blue-hit int8 :offset-assert 4) - (blue-hit-anim UNKNOWN 3 :offset-assert 8) + ((prev-blue-hit int8 :offset-assert 4) + (blue-hit-anim int32 3 :offset-assert 8) ) :method-count-assert 9 :size-assert #x14 :flag-assert #x900000014 ) -|# -#| (deftype ginsu (nav-enemy) - ((blade-jm basic :offset-assert 600) - (blade-speed cam-float-seeker :inline :offset-assert 604) - (blade-angle float :offset-assert 628) - (desired-distance float :offset-assert 632) - (spiral-time time-frame :offset-assert 636) - (blade-part basic :offset-assert 644) - (ambush-path basic :offset-assert 648) - (path-pos float :offset-assert 652) - (ambush-started basic :offset-assert 656) - (blade-sound uint32 :offset-assert 660) - (blade-sound-playing basic :offset-assert 664) - (grind-sound uint32 :offset-assert 668) - (grind-sound-playing basic :offset-assert 672) - (grind-timer uint64 :offset-assert 676) + ((blade-jm joint-mod :offset-assert 604) + (blade-speed cam-float-seeker :inline :offset-assert 608) + (blade-angle float :offset-assert 632) + (desired-distance float :offset-assert 636) + (spiral-time time-frame :offset-assert 640) + (blade-part part-spawner :offset-assert 648) + (ambush-path path-control :offset-assert 652) + (path-pos float :offset-assert 656) + (ambush-started symbol :offset-assert 660) + (blade-sound uint32 :offset-assert 664) + (blade-sound-playing symbol :offset-assert 668) + (grind-sound uint32 :offset-assert 672) + (grind-sound-playing symbol :offset-assert 676) + (grind-timer time-frame :offset-assert 680) ) :method-count-assert 184 :size-assert #x2b0 @@ -37783,17 +37758,16 @@ (:methods (anticipate-attack () _type_ :state 178) (attack () _type_ :state 179) - (ginsu-method-180 () none 180) - (ginsu-method-181 () none 181) - (ginsu-method-182 () none 182) - (ginsu-method-183 () none 183) + (ginsu-method-180 (_type_) none 180) + (ginsu-method-181 (_type_ vector) vector 181) + (ginsu-method-182 (_type_) none 182) + (ginsu-method-183 (_type_ symbol) none 183) ) ) -|# -;; (define-extern *ginsu-global-info* ginsu-global-info) -;; (define-extern *ginsu-nav-enemy-info* nav-enemy-info) -;; (define-extern ginsu-sounds-off function) +(define-extern *ginsu-global-info* ginsu-global-info) +(define-extern *ginsu-nav-enemy-info* nav-enemy-info) +(define-extern ginsu-sounds-off (function none :behavior ginsu)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; oracle-texture ;; @@ -37917,30 +37891,31 @@ ;; rhino ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| +(declare-type rhino-wall process-focusable) + (deftype rhino (nav-enemy) - ((wall basic :offset-assert 600) - (path-intro basic :offset-assert 604) - (charge-aware uint64 :offset-assert 612) - (anim-skid-left int32 :offset-assert 620) - (anim-skid-right int32 :offset-assert 624) - (anim-victory-hit int32 :offset-assert 628) - (circle-backward? basic :offset-assert 636) - (focus-pos vector :inline :offset-assert 348) - (skid-speed float :offset-assert 668) - (angle float :offset-assert 672) - (angle-speed float :offset-assert 676) - (dest vector :inline :offset-assert 684) - (charge-straight basic :offset-assert 700) - (in-stop-run basic :offset-assert 704) - (smush-target basic :offset-assert 708) - (num-hit-flinch int32 :offset-assert 712) - (frame-die-smush float :offset-assert 716) - (quat quaternion :inline :offset-assert 732) - (can-hit? basic :offset-assert 748) - (interest int32 :offset-assert 752) - (victory-count uint32 :offset-assert 756) - (stomach-touched-once? basic :offset-assert 760) + ((wall rhino-wall :offset-assert 604) + (path-intro path-control :offset-assert 608) + (charge-aware uint64 :offset-assert 616) + (anim-skid-left int32 :offset-assert 624) + (anim-skid-right int32 :offset-assert 628) + (anim-victory-hit int32 :offset-assert 632) + (circle-backward? symbol :offset-assert 636) + ;; (focus-pos vector :inline :offset-assert 348) + (skid-speed float :offset 672) + (angle float :offset-assert 676) + (angle-speed float :offset-assert 680) + (dest vector :inline :offset-assert 688) + (charge-straight symbol :offset-assert 704) + (in-stop-run symbol :offset-assert 708) + (smush-target smush-control :offset-assert 712) + (num-hit-flinch int32 :offset-assert 716) + (frame-die-smush float :offset-assert 720) + (quat quaternion :inline :offset-assert 736) + (can-hit? symbol :offset-assert 752) + (interest int32 :offset-assert 756) + (victory-count uint32 :offset-assert 760) + (stomach-touched-once? symbol :offset-assert 764) ) :method-count-assert 183 :size-assert #x300 @@ -37950,22 +37925,20 @@ (stop-run () _type_ :state 179) (run-away () _type_ :state 180) (charge () _type_ :state 181) - (rhino-method-182 () none 182) + (rhino-method-182 (_type_ process event-message-block) symbol 182) ) ) -|# -;; (define-extern *rhino-nav-enemy-info* nav-enemy-info) +(define-extern *rhino-nav-enemy-info* nav-enemy-info) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; rhino-wall ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype rhino-wall (process-focusable) - ((anim basic :offset-assert 200) - (art-name basic :offset-assert 204) - (id int8 :offset-assert 208) + ((anim spool-anim :offset-assert 204) + (art-name string :offset-assert 208) + (id int8 :offset-assert 212) ) :method-count-assert 31 :size-assert #xd5 @@ -37974,10 +37947,9 @@ (unbroken () _type_ :state 27) (hit () _type_ :state 28) (broken () _type_ :state 29) - (rhino-wall-method-30 () none 30) + (rhino-wall-method-30 (_type_) none 30) ) ) -|# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -38304,65 +38276,60 @@ ;; hopper ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype hopper (nav-enemy) - ((speed-y float :offset-assert 600) - (accel-y float :offset-assert 604) - (next-jump-time int32 :offset-assert 608) - (path-intro basic :offset-assert 612) - (can-go-knocked? basic :offset-assert 616) - (land-anim-index int32 :offset-assert 620) - (step-num int32 :offset-assert 624) - (best-point vector :inline :offset-assert 636) - (best-score float :offset-assert 652) - (origin vector :inline :offset-assert 668) - (direction vector :inline :offset-assert 684) - (jump-dist float :offset-assert 700) - (side float :offset-assert 704) - (jump-start-anim uint32 :offset-assert 708) - (jump-air-anim uint32 :offset-assert 712) - (jump-land-anim uint32 :offset-assert 716) - (jump-height-min float :offset-assert 720) - (jump-anim-start-frame float :offset-assert 724) - (minimap connection-minimap :offset-assert 728) + ((speed-y float :offset-assert 604) + (accel-y float :offset-assert 608) + (next-jump-time int32 :offset-assert 612) + (path-intro path-control :offset-assert 616) + (can-go-knocked? symbol :offset-assert 620) + (land-anim-index int32 :offset-assert 624) + (step-num int32 :offset-assert 628) + (best-point vector :inline :offset-assert 640) + (best-score float :offset-assert 656) + (origin vector :inline :offset-assert 672) + (direction vector :inline :offset-assert 688) + (jump-dist float :offset-assert 704) + (side float :offset-assert 708) + (jump-start-anim uint32 :offset-assert 712) + (jump-air-anim uint32 :offset-assert 716) + (jump-land-anim uint32 :offset-assert 720) + (jump-height-min float :offset-assert 724) + (jump-anim-start-frame float :offset-assert 728) + (minimap connection-minimap :offset-assert 732) ) :method-count-assert 180 :size-assert #x2e0 :flag-assert #xb4026002e0 (:methods - (hopper-method-178 () none 178) - (hopper-method-179 () none 179) + (hopper-method-178 (_type_) symbol 178) + (hopper-method-179 (_type_) none 179) ) ) -|# -#| (deftype hopper-anim-info (structure) ((hit-anim-index int32 :offset-assert 0) (land-anim-index int32 :offset-assert 4) ) + :pack-me :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 ) -|# -#| (deftype hopper-global-info (basic) ((prev-yellow-hit int8 :offset-assert 4) (prev-blue-hit int8 :offset-assert 5) - (yellow-hit-anim UNKNOWN 3 :offset-assert 8) - (blue-hit-anim UNKNOWN 3 :offset-assert 32) + (yellow-hit-anim hopper-anim-info 3 :inline :offset-assert 8) + (blue-hit-anim hopper-anim-info 3 :inline :offset-assert 32) ) :method-count-assert 9 :size-assert #x38 :flag-assert #x900000038 ) -|# -;; (define-extern *hopper-global-info* hopper-global-info) -;; (define-extern *hopper-nav-enemy-info* nav-enemy-info) ;; nav-enemy-info -;; (define-extern *hopper-next-jump-time* object) +(define-extern *hopper-global-info* hopper-global-info) +(define-extern *hopper-nav-enemy-info* nav-enemy-info) ;; nav-enemy-info +(define-extern *hopper-next-jump-time* time-frame) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; intro-ocean ;; @@ -39374,7 +39341,6 @@ ;; amphibian ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype amphibian-tongue-attack-info (structure) ((targ-dist float :offset-assert 0) (max-length float :offset-assert 4) @@ -39392,12 +39358,10 @@ :size-assert #xa0 :flag-assert #x9000000a0 ) -|# -#| (deftype amphibian-joint-mod (basic) ((joint-index int32 :offset-assert 4) - (proc basic :offset-assert 8) + (proc process-drawable :offset-assert 8) (max-length float :offset-assert 12) (target vector :inline :offset-assert 16) ) @@ -39405,12 +39369,11 @@ :size-assert #x20 :flag-assert #xa00000020 (:methods - (amphibian-joint-mod-method-9 () none 9) + (new (symbol type process-drawable int) _type_ 0) + (amphibian-joint-mod-method-9 (_type_) none 9) ) ) -|# -#| (deftype amphibian-anim-info (structure) ((anim-index int32 :offset-assert 0) ) @@ -39418,38 +39381,34 @@ :size-assert #x4 :flag-assert #x900000004 ) -|# -#| (deftype amphibian-global-info (basic) ((prev-blue-hit int8 :offset-assert 4) (prev-knocked int8 :offset-assert 5) - (notice-anim UNKNOWN 2 :offset-assert 8) - (run-anim UNKNOWN 2 :offset-assert 16) - (knocked-anim UNKNOWN 3 :offset-assert 24) - (knocked-land-anim UNKNOWN 3 :offset-assert 36) - (blue-hit-anim UNKNOWN 3 :offset-assert 48) - (jump-wind-up-anim UNKNOWN 2 :offset-assert 60) - (jump-in-air-anim UNKNOWN 2 :offset-assert 68) - (jump-land-anim UNKNOWN 2 :offset-assert 76) + (notice-anim int32 2 :offset-assert 8) + (run-anim int32 2 :offset-assert 16) + (knocked-anim int32 3 :offset-assert 24) + (knocked-land-anim int32 3 :offset-assert 36) + (blue-hit-anim int32 3 :offset-assert 48) + (jump-wind-up-anim int32 2 :offset-assert 60) + (jump-in-air-anim int32 2 :offset-assert 68) + (jump-land-anim int32 2 :offset-assert 76) ) :method-count-assert 9 :size-assert #x54 :flag-assert #x900000054 ) -|# -#| (deftype amphibian (nav-enemy) - ((tongue-scale float :offset-assert 600) - (flags uint8 :offset-assert 604) - (knocked-anim-index int8 :offset-assert 605) - (jump-anim-index int8 :offset-assert 606) - (tongue-mode uint64 :offset-assert 612) - (tongue-mod basic :offset-assert 620) - (attacker-handle uint64 :offset-assert 628) - (prev-ry float :offset-assert 636) - (prev-ry1 float :offset-assert 640) + ((tongue-scale float :offset-assert 604) + (flags uint8 :offset-assert 608) + (knocked-anim-index int8 :offset-assert 609) + (jump-anim-index int8 :offset-assert 610) + (tongue-mode uint64 :offset-assert 616) + (tongue-mod amphibian-joint-mod :offset-assert 624) + (attacker-handle handle :offset-assert 632) + (prev-ry float :offset-assert 640) + (prev-ry1 float :offset-assert 644) ) :method-count-assert 188 :size-assert #x288 @@ -39461,17 +39420,16 @@ (attack-spin () _type_ :state 181) (stare-idle () _type_ :state 182) (tongue-attack () _type_ :state 183) - (amphibian-method-184 () none 184) - (amphibian-method-185 () none 185) - (amphibian-method-186 () none 186) - (amphibian-method-187 () none 187) + (amphibian-method-184 (_type_ vector vector) vector 184) + (amphibian-method-185 (_type_ amphibian-tongue-attack-info) none 185) + (amphibian-method-186 (_type_ vector vector) symbol 186) + (amphibian-method-187 (_type_) none 187) ) ) -|# -;; (define-extern *amphibian-global-info* amphibian-global-info) -;; (define-extern *amphibian-nav-enemy-info* nav-enemy-info) -;; (define-extern amphibian-joint-mod-callback function) +(define-extern *amphibian-global-info* amphibian-global-info) +(define-extern *amphibian-nav-enemy-info* nav-enemy-info) +(define-extern amphibian-joint-mod-callback (function cspace transformq none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; juicer ;; @@ -46220,23 +46178,21 @@ ;; monster-frog ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype monster-frog (nav-enemy) () :method-count-assert 181 :size-assert #x25c :flag-assert #xb501e0025c (:methods - (attack () _type_ :state 178) + (attack (vector) _type_ :state 178) (attack-recover () _type_ :state 179) (turn () _type_ :state 180) ) ) -|# -;; (define-extern *monster-frog-nav-enemy-info* nav-enemy-info) -;; (define-extern monster-frog-hop-slow-code function) -;; (define-extern monster-frog-hop-fast-code function) +(define-extern *monster-frog-nav-enemy-info* nav-enemy-info) +(define-extern monster-frog-hop-slow-code (function symbol :behavior monster-frog)) +(define-extern monster-frog-hop-fast-code (function symbol :behavior monster-frog)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; tomb-scenes ;; @@ -51898,27 +51854,26 @@ ;; rapid-gunner ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype rapid-gunner (nav-enemy) - ((los los-control :inline :offset-assert 604) - (joint basic :offset-assert 752) - (joint-blend float :offset-assert 756) - (joint-enable basic :offset-assert 760) - (shot-timer uint64 :offset-assert 764) - (predict-timer uint64 :offset-assert 772) - (target-prev-pos vector :inline :offset-assert 780) - (target-next-pos vector :inline :offset-assert 796) - (focus-dir vector :inline :offset-assert 812) - (y-diff float :offset-assert 828) - (shots-fired uint32 :offset-assert 832) - (spin-up-angle float :offset-assert 836) - (spin-up-timer uint64 :offset-assert 844) - (shoot-anim-index int32 :offset-assert 852) - (status-flags uint64 :offset-assert 860) - (start-pos vector :inline :offset-assert 876) - (dest-pos vector :inline :offset-assert 892) - (hop-dir vector :inline :offset-assert 908) - (roam-radius float :offset-assert 924) + ((los los-control :inline :offset-assert 608) + (joint joint-mod :offset-assert 756) + (joint-blend float :offset-assert 760) + (joint-enable symbol :offset-assert 764) + (shot-timer uint64 :offset-assert 768) + (predict-timer uint64 :offset-assert 776) + (target-prev-pos vector :inline :offset-assert 784) + (target-next-pos vector :inline :offset-assert 800) + (focus-dir vector :inline :offset-assert 816) + (y-diff float :offset-assert 832) + (shots-fired uint32 :offset-assert 836) + (spin-up-angle float :offset-assert 840) + (spin-up-timer time-frame :offset-assert 848) + (shoot-anim-index int32 :offset-assert 856) + (status-flags uint64 :offset-assert 864) + (start-pos vector :inline :offset-assert 880) + (dest-pos vector :inline :offset-assert 896) + (hop-dir vector :inline :offset-assert 912) + (roam-radius float :offset-assert 928) ) :method-count-assert 187 :size-assert #x3a4 @@ -51930,14 +51885,12 @@ (hop-turn () _type_ :state 181) (cool-down () _type_ :state 182) (reload () _type_ :state 183) - (rapid-gunner-method-184 () none 184) - (rapid-gunner-method-185 () none 185) - (rapid-gunner-method-186 () none 186) + (rapid-gunner-method-184 (_type_ float) symbol 184) + (rapid-gunner-method-185 (_type_ vector float) none 185) + (rapid-gunner-method-186 (_type_ int float int int) none 186) ) ) -|# -#| (deftype shield-gunner (rapid-gunner) () :method-count-assert 187 @@ -51946,12 +51899,11 @@ (:methods ) ) -|# -;; (define-extern *rapid-gunner-nav-enemy-info* nav-enemy-info) -;; (define-extern vector-average-copy! function) -;; (define-extern *aim-pos* object) -;; (define-extern rapid-gunner-common-post function) +(define-extern *rapid-gunner-nav-enemy-info* nav-enemy-info) +(define-extern vector-average-copy! (function vector vector float vector)) +(define-extern *aim-pos* vector) +(define-extern rapid-gunner-common-post (function none :behavior rapid-gunner)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; collection-task ;; diff --git a/decompiler/config/jak2/hacks.jsonc b/decompiler/config/jak2/hacks.jsonc index d6668f4676..dfea1c27c1 100644 --- a/decompiler/config/jak2/hacks.jsonc +++ b/decompiler/config/jak2/hacks.jsonc @@ -40,7 +40,6 @@ "(method 77 flamer)", "(method 77 grenadier)", "(method 224 bot)", - "(method 77 rapid-gunner)", // until loop without nop: "target-history-print", "display-list-control", @@ -52,7 +51,6 @@ "(anon-function 10 pilot-recorder)", "(method 0 hover-nav-control)", "(method 24 nav-network)", - "(method 11 predator-manager)", "(method 9 bot-speech-list)", "(method 9 bot-speech-list-shuffle)", "(anon-function 10 sig-recorder)", @@ -113,7 +111,6 @@ "(method 9 editable-region)", // condition branch assert hit "(anon-function 10 meet-brutter)", "(method 154 vehicle-racer)", - "(method 188 predator)", "(anon-function 13 sig0-course)", "(method 228 hal-sewer)", "(method 154 vehicle-city-racer)", @@ -122,8 +119,6 @@ "vehicle-explode-post", "(method 158 vehicle-guard)", "(method 207 metalhead-predator)", - "(anon-function 28 grenadier)", - "(anon-function 24 grenadier)", "test-to-from-spr", "test-from-spr", "test-to-spr", @@ -479,7 +474,10 @@ "(method 40 nav-state)": [1, 2], "(method 45 nav-mesh)": [5, 6], "(method 43 nav-mesh)": [0, 1, 2, 12, 13, 14, 15, 16, 17, 18, 19, 20], - "(anon-function 45 gungame-obs)": [0, 1, 6, 9, 14, 18, 21, 22, 30] // TODO - probably not the best + "(anon-function 45 gungame-obs)": [0, 1, 6, 9, 14, 18, 21, 22, 30], // TODO - probably not the best + + "(method 142 grenadier)": [0, 1, 3], + "(anon-function 34 predator)": [24] }, // Sometimes the game might use format strings that are fetched dynamically, diff --git a/decompiler/config/jak2/inputs.jsonc b/decompiler/config/jak2/inputs.jsonc index 104b1efc31..005c9cc65e 100644 --- a/decompiler/config/jak2/inputs.jsonc +++ b/decompiler/config/jak2/inputs.jsonc @@ -30,7 +30,7 @@ "DGO/DMI.DGO", "DGO/ORACLE.DGO", // "DGO/LERLTESS.DGO", - // "DGO/DRI.DGO", + "DGO/DRI.DGO", // "DGO/LBRNERMK.DGO", // "DGO/LRACECF.DGO", "DGO/CTC.DGO", @@ -45,7 +45,7 @@ // "DGO/LTRNYSAM.DGO", // "DGO/LOUTCSTB.DGO", // "DGO/LASHTHRN.DGO", - // "DGO/TOC.DGO", + "DGO/TOC.DGO", "DGO/CFB.DGO", "DGO/CAB.DGO", // "DGO/STC.DGO", @@ -67,7 +67,7 @@ "DGO/LKIDDOGE.DGO", // "DGO/NESTT.DGO", "DGO/LWIDEC.DGO", - // "DGO/SAG.DGO", + "DGO/SAG.DGO", "DGO/NEB.DGO", "DGO/COB.DGO", "DGO/LBOMBBOT.DGO", @@ -79,7 +79,7 @@ "DGO/NES.DGO", "DGO/PAR.DGO", // "DGO/LERBRNGD.DGO", - // "DGO/MTX.DGO", + "DGO/MTX.DGO", "DGO/FDA.DGO", // "DGO/LKEIRIFT.DGO", "DGO/LWHACK.DGO", @@ -111,7 +111,7 @@ "DGO/SKA.DGO", // "DGO/LTRNKRKD.DGO", "DGO/CIA.DGO", - // "DGO/TOB.DGO", + "DGO/TOB.DGO", // "DGO/LRACEDB.DGO", "DGO/LDJAKBRN.DGO", "DGO/TOA.DGO", @@ -135,7 +135,7 @@ // "DGO/SWE.DGO", // "DGO/LRACECB.DGO", "DGO/GGA.DGO", - // "DGO/TOD.DGO", + "DGO/TOD.DGO", "DGO/MCN.DGO", // "DGO/SEW.DGO", "DGO/VIN.DGO", @@ -190,10 +190,6 @@ "CTB.DGO", "CWI.DGO", "DMI.DGO", - "FOB.DGO", - "FOR.DGO", - "FEA.DGO", - "FEB.DGO", "GGA.DGO", "HIDEOUT.DGO", "KIOSK.DGO", @@ -201,6 +197,23 @@ "LWIDEA.DGO", "LWIDEB.DGO", "LWIDEC.DGO", + "FEA.DGO", + "FEB.DGO", + "DRI.DGO", + "TOC.DGO", + "FOB.DGO", + "SAG.DGO", + "MTX.DGO", + "TOB.DGO", + "TOA.DGO", + "TOD.DGO", + "DRILLMTN.DGO", + "FOR.DGO", + + "LDJAKBRN.DGO", + "HIDEOUT.DGO", + "KIOSK.DGO", + "DMI.DGO", "LSACK.DGO", "MTN.DGO", "PRI.DGO", diff --git a/decompiler/config/jak2/label_types.jsonc b/decompiler/config/jak2/label_types.jsonc index 2fdf5c4d2c..ebf6fb4ff9 100644 --- a/decompiler/config/jak2/label_types.jsonc +++ b/decompiler/config/jak2/label_types.jsonc @@ -854,5 +854,47 @@ ["L58", "vector"], ["L57", "vector"], ["L56", "vector"] + ], + "amphibian": [["L275", "attack-info"]], + "hopper": [ + ["L99", "vector"], + ["L98", "vector"] + ], + "metalmonk": [ + ["L197", "attack-info"], + ["L186", "vector"], + ["L185", "vector"], + ["L184", "vector"] + ], + "ginsu": [["L156", "attack-info"]], + "centurion": [ + ["L187", "vector"], + ["L186", "vector"], + ["L194", "attack-info"] + ], + "rhino": [ + ["L253", "attack-info"], + ["L239", "vector"], + ["L238", "vector"] + ], + "grenadier": [ + ["L204", "vector"], + ["L203", "vector"], + ["L220", "(pointer int64)", 2], + ["L227", "(pointer int64)", 2] + ], + "rapid-gunner": [ + ["L211", "vector"], + ["L210", "vector"], + ["L209", "vector"], + ["L223", "(pointer int32)", 4], + ["L224", "(pointer int64)", 3], + ["L232", "(pointer int64)", 3], + ["L231", "(pointer int32)", 4] + ], + "tomb-baby-spider": [["L73", "attack-info"]], + "predator": [ + ["L252", "vector"], + ["L251", "vector"] ] } diff --git a/decompiler/config/jak2/stack_structures.jsonc b/decompiler/config/jak2/stack_structures.jsonc index b9d7098560..bc946c8d69 100644 --- a/decompiler/config/jak2/stack_structures.jsonc +++ b/decompiler/config/jak2/stack_structures.jsonc @@ -1305,5 +1305,54 @@ "(trans target-mech-carry-drag)": [[560, "sphere"]], "(method 22 krew-collection-item)": [[16, "collide-query-with-2vec"]], "(code idle krew-collection-item)": [[64, "vector"]], - "pegasus-fly-code": [[96, "vector"]] + "pegasus-fly-code": [[96, "vector"]], + "(method 90 amphibian)": [[80, "vector"]], + "(method 186 amphibian)": [ + [560, "vector"], + [16, "collide-query"], + [576, "event-message-block"] + ], + "(enter tongue-attack amphibian)": [[16, "amphibian-tongue-attack-info"]], + "amphibian-joint-mod-callback": [ + [16, ["inline-array", "matrix", 3]], + [112, "vector"] + ], + "(method 178 hopper)": [ + [144, "vector"], + // unused + [96, "vector"], + [176, "vector"] + ], + "(method 90 hopper)": [[80, "vector"]], + "(method 180 ginsu)": [[16, "matrix"]], + "(trans hostile centurion)": [[16, "vector"]], + "(method 181 centurion)": [ + [80, "vector"], + [160, "vector"], + [176, "vector"] + ], + "(method 74 centurion)": [[16, "event-message-block"]], + "(enter stop-run rhino)": [ + // unused + [32, "vector"] + ], + "(enter attack rhino)": [[32, "vector"]], + "(method 74 rhino)": [[48, "vector"]], + "(enter run-away rhino)": [[32, "vector"]], + "(trans hostile grenadier)": [ + // unused + [48, "vector"] + ], + "(method 115 rapid-gunner)": [[32, "vector"]], + "(code notice monster-frog)": [[16, "vector"]], + "(method 184 predator)": [ + [128, "vector"], + [144, "vector"], + [176, "vector"] + ], + "(method 11 predator-manager)": [ + [32, "transformq"], + [80, "vector"], + [112, "vector"] + ] } diff --git a/decompiler/config/jak2/type_casts.jsonc b/decompiler/config/jak2/type_casts.jsonc index 1896b26117..0f8d0c2f08 100644 --- a/decompiler/config/jak2/type_casts.jsonc +++ b/decompiler/config/jak2/type_casts.jsonc @@ -5417,7 +5417,11 @@ [110, "s2", "collide-shape-prim-sphere"] ], "(method 11 nav-state)": [[37, "v1", "float"]], - "(method 18 nav-control)": [[252, "a2", "float"]], + "(method 18 nav-control)": [ + [252, "a2", "float"], + [250, "a3", "uint"], + [250, "t0", "uint"] + ], "(method 23 nav-mesh)": [["_stack_", 16, "res-tag"]], "nav-control-validate": [ [29, "s5", "int"], @@ -5691,9 +5695,7 @@ [10, "gp", "target"], [14, "gp", "target"] ], - "(anon-function 9 target-mech)": [ - [2, "a0", "(pointer target)"] - ], + "(anon-function 9 target-mech)": [[2, "a0", "(pointer target)"]], "target-mech-handler": [ [91, "a0", "process"], [213, "a3", "vector"], @@ -5754,5 +5756,574 @@ ], "(code die pegasus)": [[45, "v1", "art-joint-anim"]], "pegasus-choose-path": [[114, "v1", "float"]], - "(method 115 pegasus)": [["_stack_", 16, "res-tag"]] + "(method 115 pegasus)": [["_stack_", 16, "res-tag"]], + "(code attack-forward amphibian)": [[14, "v1", "art-joint-anim"]], + "(enter attack-forward amphibian)": [ + [50, "gp", "process-focusable"], + [54, "a0", "process-focusable"], + [53, "gp", "process-focusable"] + ], + "(code tongue-attack amphibian)": [[14, "v1", "art-joint-anim"]], + "(method 76 amphibian)": [[1, "a1", "process-focusable"]], + "(method 90 amphibian)": [[165, "v1", "art-joint-anim"]], + "(method 88 amphibian)": [[29, "s4", "art-joint-anim"]], + "(method 87 amphibian)": [[20, "s4", "art-joint-anim"]], + "(method 89 amphibian)": [[37, "s4", "art-joint-anim"]], + "(method 78 amphibian)": [ + [21, "v1", "art-joint-anim"], + [67, "s4", "art-joint-anim"] + ], + "(method 77 amphibian)": [ + [37, "s5", "art-joint-anim"], + [97, "s4", "art-joint-anim"] + ], + "(method 51 amphibian)": [ + [34, "a0", "process-focusable"], + [37, "a0", "process-focusable"] + ], + "(method 186 amphibian)": [[41, "s3", "collide-shape-prim-sphere"]], + "(code notice amphibian)": [[37, "a1", "art-joint-anim"]], + "(enter stare amphibian)": [ + [35, "a0", "process-focusable"], + [38, "a0", "process-focusable"] + ], + "(code attack-spin amphibian)": [ + [53, "v1", "art-joint-anim"], + [203, "a0", "process-focusable"], + [102, "v1", "art-joint-anim"], + [136, "v1", "art-joint-anim"], + [206, "a0", "process-focusable"] + ], + "(enter attack-spin amphibian)": [ + [56, "gp", "process-focusable"], + [59, "gp", "process-focusable"] + ], + "(post attack-forward-lunge amphibian)": [ + [14, "a0", "process-focusable"], + [17, "a0", "process-focusable"] + ], + "(code stare-idle amphibian)": [[23, "v1", "art-joint-anim"]], + "(code stare amphibian)": [ + [53, "v1", "art-joint-anim"], + [102, "v1", "art-joint-anim"], + [136, "v1", "art-joint-anim"] + ], + "(enter notice amphibian)": [ + [20, "a0", "process-focusable"], + [23, "a0", "process-focusable"] + ], + "(code active amphibian)": [ + [69, "v1", "art-joint-anim"], + [135, "v1", "art-joint-anim"] + ], + "(method 185 amphibian)": [ + [33, "a0", "process-focusable"], + [36, "a0", "process-focusable"] + ], + "amphibian-joint-mod-callback": [ + [12, "s2", "amphibian-joint-mod"], + [18, "s2", "amphibian-joint-mod"], + [48, "s2", "amphibian-joint-mod"], + [49, "v1", "amphibian"] + ], + "(method 7 hopper)": [ + [14, "t9", "(function process-focusable int process-focusable)"] + ], + "(method 132 hopper)": [[16, "t9", "(function enemy none)"]], + "(code active hopper)": [[22, "v1", "art-joint-anim"]], + "(trans hostile hopper)": [ + [24, "gp", "process-focusable"], + [153, "gp", "process-focusable"], + [156, "gp", "process-focusable"] + ], + "(method 88 hopper)": [[16, "a1", "art-joint-anim"]], + "(method 87 hopper)": [[16, "a1", "art-joint-anim"]], + "(method 89 hopper)": [[16, "a1", "art-joint-anim"]], + "(method 78 hopper)": [ + [18, "s4", "art-joint-anim"], + [56, "v1", "art-joint-anim"] + ], + "(method 77 hopper)": [ + [33, "a1", "art-joint-anim"], + [86, "a1", "art-joint-anim"] + ], + "(method 7 metalmonk)": [ + [14, "t9", "(function process-focusable int process-focusable)"] + ], + "(method 87 metalmonk)": [[27, "s5", "art-joint-anim"]], + "(method 104 metalmonk)": [ + [14, "a0", "process-focusable"], + [17, "a0", "process-focusable"] + ], + "(code attack metalmonk)": [[37, "s5", "art-joint-anim"]], + "(code active metalmonk)": [ + [205, "a1", "art-joint-anim"], + [118, "gp", "art-joint-anim"] + ], + "(trans hostile metalmonk)": [ + [29, "gp", "process-focusable"], + [71, "gp", "process-focusable"], + [74, "gp", "process-focusable"] + ], + "(method 180 metalmonk)": [[4, "v1", "collide-shape-prim-group"]], + "(method 78 metalmonk)": [ + [18, "s4", "art-joint-anim"], + [83, "s4", "art-joint-anim"] + ], + "(method 77 metalmonk)": [ + [37, "a1", "art-joint-anim"], + [106, "s5", "art-joint-anim"], + [163, "s4", "art-joint-anim"] + ], + "(trans victory metalmonk)": [ + [28, "a0", "process-focusable"], + [31, "a0", "process-focusable"] + ], + "(method 46 ginsu)": [[8, "v1", "collide-shape-prim-group"]], + "(method 183 ginsu)": [[2, "v1", "collide-shape-prim-group"]], + "(method 70 ginsu)": [ + [33, "v1", "float"], + [30, "a0", "int"] + ], + "(method 181 ginsu)": [ + [18, "a0", "process-focusable"], + [21, "a0", "process-focusable"] + ], + "(trans attack ginsu)": [[32, "a0", "process-focusable"]], + "(trans anticipate-attack ginsu)": [[27, "a0", "process-focusable"]], + "(method 142 ginsu)": [ + [16, "a0", "process-focusable"], + [19, "a0", "process-focusable"] + ], + "(method 10 ginsu)": [[6, "t9", "(function none :behavior part-spawner)"]], + "(code victory centurion)": [[30, "v1", "art-joint-anim"]], + "(code fire centurion)": [ + [22, "a0", "process-focusable"], + [25, "a0", "process-focusable"], + [43, "v1", "art-joint-anim"], + [76, "gp", "process-focusable"], + [95, "gp", "process-focusable"], + [311, "v1", "art-joint-anim"], + [374, "v1", "art-joint-anim"], + [98, "gp", "process-focusable"], + [163, "a0", "process-focusable"], + [166, "a0", "process-focusable"] + ], + "(code active centurion)": [[22, "v1", "art-joint-anim"]], + "(code attack centurion)": [[14, "v1", "art-joint-anim"]], + "(enter attack centurion)": [ + [3, "a0", "collide-shape-prim-group"], + [9, "v1", "collide-shape-prim-group"] + ], + "(exit attack centurion)": [ + [3, "a0", "collide-shape-prim-group"], + [9, "v1", "collide-shape-prim-group"] + ], + "(method 55 centurion)": [ + [246, "a0", "process-focusable"], + [249, "a0", "process-focusable"], + [341, "a2", "float"] + ], + "(code hostile centurion)": [ + [87, "a0", "process-focusable"], + [90, "a0", "process-focusable"] + ], + "(method 7 centurion)": [ + [14, "t9", "(function process-focusable int process-focusable)"] + ], + "(method 78 centurion)": [ + [18, "v1", "art-joint-anim"], + [53, "s4", "art-joint-anim"], + [82, "v1", "art-joint-anim"] + ], + "(method 77 centurion)": [ + [18, "v1", "art-joint-anim"], + [72, "a1", "art-joint-anim"], + [117, "a1", "art-joint-anim"], + [151, "s4", "art-joint-anim"] + ], + "(trans hostile centurion)": [ + [25, "a0", "process-focusable"], + [31, "s5", "process-focusable"], + [21, "s5", "process-focusable"] + ], + "(method 180 centurion)": [ + [28, "s0", "process-focusable"], + [49, "s0", "process-focusable"] + ], + "(method 132 centurion)": [[13, "t9", "(function enemy none)"]], + "(method 31 centurion-shot)": [[7, "t9", "(function projectile none)"]], + "(method 28 centurion-shot)": [ + [49, "t9", "(function projectile projectile-options sound-id)"] + ], + "(method 74 centurion)": [ + [76, "v1", "attack-info"], + [78, "v1", "attack-info"], + [85, "v1", "attack-info"] + ], + "(method 30 rhino-wall)": [[5, "v1", "collide-shape-prim-group"]], + "(code circling rhino)": [ + [129, "gp", "art-joint-anim"], + [243, "v1", "art-joint-anim"] + ], + "(code charge rhino)": [ + [29, "v1", "art-joint-anim"], + [85, "v1", "art-joint-anim"], + [137, "v1", "art-joint-anim"] + ], + "(code stop-run rhino)": [ + [14, "v1", "art-joint-anim"], + [85, "a0", "process-focusable"], + [88, "a0", "process-focusable"], + [145, "a1", "art-joint-anim"] + ], + "(code attack rhino)": [[15, "v1", "art-joint-anim"]], + "(trans hostile rhino)": [ + [20, "a0", "process-focusable"], + [20, "a0", "process-focusable"], + [23, "a0", "process-focusable"], + [81, "a0", "process-focusable"], + [84, "a0", "process-focusable"], + [113, "s3", "process-focusable"], + [19, "s3", "process-focusable"], + [80, "s3", "process-focusable"], + [117, "a0", "process-focusable"], + [116, "s3", "process-focusable"] + ], + "(code die rhino)": [[33, "v1", "art-joint-anim"]], + "(code hit rhino)": [ + [30, "v1", "art-joint-anim"], + [83, "v1", "art-joint-anim"] + ], + "(method 104 rhino)": [ + [30, "a0", "process-focusable"], + [30, "a0", "process-focusable"], + [33, "a0", "process-focusable"] + ], + "(enter victory rhino)": [ + [8, "v1", "collide-shape-prim-group"], + [12, "v1", "collide-shape-prim-group"], + [17, "a0", "collide-shape-prim-group"] + ], + "(code victory rhino)": [ + [14, "v1", "art-joint-anim"], + [59, "a0", "collide-shape-prim-group"], + [64, "a0", "collide-shape-prim-group"], + [69, "a0", "collide-shape-prim-group"], + [81, "v1", "art-joint-anim"], + [140, "a0", "process-focusable"], + [143, "a0", "process-focusable"], + [157, "gp", "process-focusable"], + [180, "a0", "collide-shape-prim-group"], + [201, "v1", "art-joint-anim"], + [290, "a0", "process-focusable"], + [139, "gp", "process-focusable"], + [293, "a0", "process-focusable"] + ], + "(method 7 rhino)": [ + [14, "t9", "(function process-focusable int process-focusable)"] + ], + "(method 74 rhino)": [[68, "s2", "process-focusable"]], + "(method 182 rhino)": [[36, "s2", "process-drawable"]], + "(exit victory rhino)": [ + [10, "v1", "collide-shape-prim-group"], + [14, "v1", "collide-shape-prim-group"] + ], + "(code run-away rhino)": [[14, "v1", "art-joint-anim"]], + "(code hit rhino-wall)": [ + [42, "a2", "art-joint-anim"], + [32, "v0", "art-joint-anim"] + ], + "(trans hostile grenadier)": [ + [19, "a0", "process-focusable"], + [156, "a0", "process-focusable"], + [22, "a0", "process-focusable"] + ], + "(method 181 grenadier)": [ + [21, "a0", "process-focusable"], + [24, "a0", "process-focusable"], + [79, "a0", "process-focusable"], + [82, "a0", "process-focusable"], + [20, "s5", "process-focusable"], + [78, "s5", "process-focusable"] + ], + "(code hit grenadier)": [ + [87, "gp", "art-joint-anim"], + [210, "a0", "process-focusable"] + ], + "(code victory grenadier)": [ + [27, "v1", "art-joint-anim"], + [76, "v1", "art-joint-anim"] + ], + "(post attack grenadier)": [ + [24, "a0", "process-focusable"], + [27, "a0", "process-focusable"] + ], + "(code attack grenadier)": [ + [74, "v1", "art-joint-anim"], + [163, "v1", "art-joint-anim"], + [295, "a0", "process-focusable"], + [298, "a0", "process-focusable"], + [317, "v1", "art-joint-anim"], + [366, "v1", "art-joint-anim"] + ], + "(event attack grenadier)": [ + [23, "s4", "process-focusable"], + [27, "a0", "process-focusable"], + [26, "s4", "process-focusable"] + ], + "(method 78 grenadier)": [ + [18, "s4", "art-joint-anim"], + [63, "a1", "art-joint-anim"], + [93, "v1", "art-joint-anim"] + ], + "(exit spin-kick grenadier)": [[2, "v1", "collide-shape-prim-group"]], + "(post spin-kick grenadier)": [ + [24, "a0", "process-focusable"], + [27, "a0", "process-focusable"] + ], + "(code spin-kick grenadier)": [[14, "v1", "art-joint-anim"]], + "(enter spin-kick grenadier)": [[29, "v1", "collide-shape-prim-group"]], + "(code backup grenadier)": [[10, "v1", "art-joint-anim"]], + "(method 7 grenadier)": [ + [21, "t9", "(function process-focusable int process-focusable)"] + ], + "(method 70 grenadier)": [[41, "a0", "process-focusable"]], + "(code active grenadier)": [ + [140, "v1", "art-joint-anim"], + [202, "v1", "art-joint-anim"], + [51, "v1", "art-joint-anim"], + [27, "s5", "pair"], + [311, "v1", "art-joint-anim"] + ], + "(code hostile grenadier)": [[45, "gp", "art-joint-anim"]], + "rapid-gunner-common-post": [ + [14, "a0", "process-focusable"], + [17, "a0", "process-focusable"] + ], + "(post notice rapid-gunner)": [ + [24, "a0", "process-focusable"], + [27, "a0", "process-focusable"] + ], + "(code notice rapid-gunner)": [[30, "v1", "art-joint-anim"]], + "(enter notice rapid-gunner)": [ + [85, "a0", "process-focusable"], + [88, "a0", "process-focusable"] + ], + "(trans attack rapid-gunner)": [ + [30, "a0", "process-focusable"], + [33, "a0", "process-focusable"], + [37, "a0", "process-focusable"], + [40, "a0", "process-focusable"], + [67, "gp", "process-focusable"], + [170, "gp", "process-focusable"], + [173, "gp", "process-focusable"], + [36, "gp", "process-focusable"], + [29, "gp", "process-focusable"] + ], + "(post attack rapid-gunner)": [ + [32, "a0", "process-focusable"], + [35, "a0", "process-focusable"] + ], + "(code attack rapid-gunner)": [[103, "v1", "art-joint-anim"]], + "(code hop rapid-gunner)": [ + [89, "v1", "art-joint-anim"], + [120, "v1", "art-joint-anim"] + ], + "(post hop-turn rapid-gunner)": [ + [32, "a0", "process-focusable"], + [35, "a0", "process-focusable"] + ], + "(method 7 rapid-gunner)": [ + [14, "t9", "(function process-focusable int process-focusable)"] + ], + "(exit spin-attack rapid-gunner)": [[13, "v1", "collide-shape-prim-group"]], + "(post spin-attack rapid-gunner)": [ + [24, "a0", "process-focusable"], + [27, "a0", "process-focusable"] + ], + "(code spin-attack rapid-gunner)": [[14, "v1", "art-joint-anim"]], + "(enter spin-attack rapid-gunner)": [[29, "v1", "collide-shape-prim-group"]], + "(code hostile rapid-gunner)": [[118, "v1", "art-joint-anim"]], + "(trans hostile rapid-gunner)": [ + [27, "a0", "process-focusable"], + [30, "a0", "process-focusable"], + [58, "gp", "process-focusable"], + [26, "gp", "process-focusable"] + ], + "(code reload rapid-gunner)": [[14, "v1", "art-joint-anim"]], + "(code cool-down rapid-gunner)": [[14, "v1", "art-joint-anim"]], + "(code hop-turn rapid-gunner)": [[14, "v1", "art-joint-anim"]], + "(method 78 rapid-gunner)": [ + [21, "v1", "art-joint-anim"], + [67, "a1", "art-joint-anim"], + [94, "a1", "art-joint-anim"] + ], + "(method 79 tomb-baby-spider)": [ + [49, "v1", "art-joint-anim"], + [77, "v1", "art-joint-anim"], + [127, "v1", "collide-shape-prim-group"], + [131, "v1", "collide-shape-prim-group"], + [135, "v1", "collide-shape-prim-group"], + [137, "v1", "collide-shape-prim-group"], + [139, "v1", "collide-shape-prim-group"] + ], + "(method 78 tomb-baby-spider)": [ + [13, "a2", "art-joint-anim"], + [50, "a2", "art-joint-anim"] + ], + "(method 77 tomb-baby-spider)": [ + [2, "a2", "collide-shape-prim-group"], + [36, "a2", "art-joint-anim"], + [73, "a2", "art-joint-anim"], + [10, "a2", "collide-shape-prim-group"] + ], + "(code attack-stop tomb-baby-spider)": [[10, "v1", "art-joint-anim"]], + "(exit attack tomb-baby-spider)": [[2, "v1", "collide-shape-prim-group"]], + "(enter attack tomb-baby-spider)": [[14, "v1", "collide-shape-prim-group"]], + "(code attack tomb-baby-spider)": [[30, "v1", "art-joint-anim"]], + "(code notice tomb-baby-spider)": [ + [27, "a0", "process-focusable"], + [30, "a0", "process-focusable"], + [52, "v1", "art-joint-anim"], + [115, "v1", "art-joint-anim"] + ], + "(code active tomb-baby-spider)": [ + [30, "v1", "art-joint-anim"], + [126, "v1", "art-joint-anim"], + [188, "v1", "art-joint-anim"], + [297, "v1", "art-joint-anim"] + ], + "monster-frog-hop-fast-code": [ + [15, "v1", "art-joint-anim"], + [72, "v1", "art-joint-anim"] + ], + "monster-frog-hop-slow-code": [ + [231, "v1", "art-joint-anim"], + [288, "v1", "art-joint-anim"], + [46, "v1", "art-joint-anim"], + [117, "v1", "art-joint-anim"] + ], + "(method 78 monster-frog)": [ + [19, "v1", "art-joint-anim"], + [54, "v1", "art-joint-anim"], + [89, "v1", "art-joint-anim"], + [121, "v1", "art-joint-anim"] + ], + "(method 77 monster-frog)": [ + [19, "v1", "art-joint-anim"], + [54, "v1", "art-joint-anim"], + [89, "v1", "art-joint-anim"], + [121, "v1", "art-joint-anim"] + ], + "(code attack-recover monster-frog)": [ + [10, "v1", "art-joint-anim"], + [87, "v1", "art-joint-anim"], + [158, "v1", "art-joint-anim"] + ], + "(code attack monster-frog)": [[19, "v1", "art-joint-anim"]], + "(code turn monster-frog)": [ + [21, "v1", "art-joint-anim"], + [79, "v1", "art-joint-anim"] + ], + "(code active monster-frog)": [ + [27, "v1", "art-joint-anim"], + [80, "v1", "art-joint-anim"], + [172, "v1", "art-joint-anim"], + [234, "v1", "art-joint-anim"], + [343, "v1", "art-joint-anim"] + ], + "(code notice monster-frog)": [ + [23, "v1", "art-joint-anim"], + [71, "v1", "art-joint-anim"], + [103, "a0", "process-focusable"], + [106, "a0", "process-focusable"], + [149, "v1", "art-joint-anim"] + ], + "(code ambush monster-frog)": [ + [21, "a0", "process-focusable"], + [24, "a0", "process-focusable"], + [68, "v1", "art-joint-anim"] + ], + "(post turn monster-frog)": [ + [24, "a0", "process-focusable"], + [27, "a0", "process-focusable"] + ], + "(code hostile monster-frog)": [ + [18, "a0", "process-focusable"], + [21, "a0", "process-focusable"], + [117, "v1", "art-joint-anim"], + [202, "v1", "art-joint-anim"] + ], + "(method 77 predator)": [ + [21, "v1", "art-joint-anim"], + [53, "v1", "art-joint-anim"], + [96, "v1", "art-joint-anim"], + [126, "v1", "art-joint-anim"], + [160, "v1", "art-joint-anim"], + [192, "v1", "art-joint-anim"] + ], + "(method 78 predator)": [ + [21, "v1", "art-joint-anim"], + [53, "v1", "art-joint-anim"], + [89, "v1", "art-joint-anim"], + [123, "v1", "art-joint-anim"], + [155, "v1", "art-joint-anim"] + ], + "(method 7 predator)": [ + [9, "t9", "(function process-focusable int process-focusable)"] + ], + "(method 184 predator)": [ + [67, "s2", "process-focusable"], + [79, "a0", "process-focusable"], + [78, "s2", "process-focusable"], + [108, "s2", "process-focusable"] + ], + "(method 182 predator)": [[4, "v1", "collide-shape-prim-group"]], + "(code active predator)": [[22, "v1", "art-joint-anim"]], + "(post idle predator)": [[4, "t9", "(function none)"]], + "(code fire predator)": [ + [26, "v1", "art-joint-anim"], + [103, "a0", "process-focusable"], + [102, "s5", "process-focusable"], + [121, "s5", "process-focusable"], + [124, "s5", "process-focusable"] + ], + "(code close-attack predator)": [ + [14, "v1", "art-joint-anim"], + [71, "v1", "art-joint-anim"] + ], + "(trans hidden predator)": [ + [40, "gp", "process-focusable"], + [43, "gp", "process-focusable"] + ], + "(code hidden predator)": [ + [14, "v1", "art-joint-anim"], + [75, "v1", "art-joint-anim"] + ], + "(code hostile predator)": [ + [14, "v1", "art-joint-anim"], + [67, "v1", "art-joint-anim"] + ], + "(trans hostile predator)": [ + [52, "gp", "process-focusable"], + [55, "gp", "process-focusable"] + ], + "(code hide predator)": [[14, "v1", "art-joint-anim"]], + "(trans hide predator)": [ + [21, "gp", "process-focusable"], + [24, "gp", "process-focusable"] + ], + "(method 186 predator)": [[17, "v1", "int"]], + "(method 77 rapid-gunner)": [ + [29, "v1", "art-joint-anim"], + [149, "v1", "art-joint-anim"], + [266, "a1", "art-joint-anim"], + [116, "s4", "art-joint-anim"], + [233, "s5", "art-joint-anim"] + ], + "(method 11 predator-manager)": [ + ["_stack_", 16, "res-tag"], + [281, "s2", "process-drawable"] + ] } diff --git a/decompiler/config/jak2_ntsc_v1.jsonc b/decompiler/config/jak2_ntsc_v1.jsonc index 3018835e16..ecca476c0b 100644 --- a/decompiler/config/jak2_ntsc_v1.jsonc +++ b/decompiler/config/jak2_ntsc_v1.jsonc @@ -7,7 +7,7 @@ // if you want to filter to only some object names. // it will make the decompiler much faster. - "allowed_objects": ["pegasus"], + "allowed_objects": [], "banned_objects": ["texture-anim-tables", "traffic-engine"], //////////////////////////// diff --git a/decompiler/util/data_decompile.cpp b/decompiler/util/data_decompile.cpp index 7dde3448d8..9387ebd067 100644 --- a/decompiler/util/data_decompile.cpp +++ b/decompiler/util/data_decompile.cpp @@ -828,7 +828,10 @@ const std::unordered_map< {"lightning-probe-vars", {{"probe-dirs", ArrayFieldDecompMeta(TypeSpec("vector"), 16)}}}, {"nav-mesh", {{"poly-array", ArrayFieldDecompMeta(TypeSpec("nav-poly"), 64)}, - {"nav-control-array", ArrayFieldDecompMeta(TypeSpec("nav-control"), 288)}}}}}}; + {"nav-control-array", ArrayFieldDecompMeta(TypeSpec("nav-control"), 288)}}}, + {"predator-graph", + {{"node", ArrayFieldDecompMeta(TypeSpec("predator-node"), 48)}, + {"edge", ArrayFieldDecompMeta(TypeSpec("predator-edge"), 4)}}}}}}; goos::Object decompile_structure(const TypeSpec& type, const DecompilerLabel& label, diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index 1a48a7d7d8..c3e8d8c30e 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -157,6 +157,9 @@ void OpenGLRenderer::init_bucket_renderers_jak2() { // 130 init_bucket_renderer("tex-l1-alpha", BucketCategory::TEX, BucketId::TEX_L1_ALPHA); + init_bucket_renderer("tfrag-t-l1-alpha", BucketCategory::TFRAG, + BucketId::TFRAG_T_L1_ALPHA, + std::vector{tfrag3::TFragmentTreeKind::TRANS}, false, 1); // 140 // 150 // 160 diff --git a/game/graphics/opengl_renderer/buckets.h b/game/graphics/opengl_renderer/buckets.h index 15823fbad4..8a78eea4cf 100644 --- a/game/graphics/opengl_renderer/buckets.h +++ b/game/graphics/opengl_renderer/buckets.h @@ -116,6 +116,7 @@ enum class BucketId { TEX_L0_ALPHA = 127, TFRAG_T_L0_ALPHA = 128, TEX_L1_ALPHA = 137, + TFRAG_T_L1_ALPHA = 138, TEX_LCOM_TFRAG = 187, MERC_LCOM_TFRAG = 188, TEX_LCOM_SHRUB = 191, diff --git a/goal_src/jak2/engine/ai/enemy-h.gc b/goal_src/jak2/engine/ai/enemy-h.gc index 07abd2b519..d9696ddbdf 100644 --- a/goal_src/jak2/engine/ai/enemy-h.gc +++ b/goal_src/jak2/engine/ai/enemy-h.gc @@ -337,12 +337,12 @@ (enemy-method-55 (_type_) none 55) (enemy-method-56 (_type_ process event-message-block) int 56) (enemy-method-57 (_type_ process-focusable enemy-best-focus) enemy-aware 57) - (enemy-method-58 (_type_) symbol 58) + (enemy-method-58 (_type_ process event-message-block) symbol 58) (enemy-method-59 (_type_) penetrate 59) (coin-flip? (_type_) symbol 60) (enemy-method-61 (_type_ int) int :behavior enemy 61) (enemy-method-62 (_type_) none 62) - (enemy-method-63 (_type_ process-focusable symbol) none 63) + (enemy-method-63 (_type_ process-focusable symbol) symbol 63) (enemy-method-64 (_type_) none 64) (enemy-method-65 (_type_) none 65) (go-ambush (_type_) none 66) @@ -353,7 +353,7 @@ (go-flee (_type_) none 71) (enemy-method-72 (_type_) none 72) (enemy-method-73 (_type_) none 73) - (enemy-method-74 (_type_ process object symbol event-message-block) none 74) + (enemy-method-74 (_type_ process object symbol event-message-block) object 74) (enemy-method-75 (_type_ process touching-shapes-entry) none 75) (enemy-method-76 (_type_ process event-message-block) symbol 76) (enemy-method-77 (_type_ (pointer float)) symbol 77) diff --git a/goal_src/jak2/engine/ai/enemy.gc b/goal_src/jak2/engine/ai/enemy.gc index 06d11dd12a..5fc6a14ff5 100644 --- a/goal_src/jak2/engine/ai/enemy.gc +++ b/goal_src/jak2/engine/ai/enemy.gc @@ -406,13 +406,11 @@ ) ) -;; WARN: Return type mismatch symbol vs none. (defmethod enemy-method-63 enemy ((obj enemy) (arg0 process-focusable) (arg1 symbol)) (if arg1 (enemy-focus-method-13 (-> obj focus) arg0 (the-as enemy-aware arg1)) (try-update-focus (-> obj focus) arg0 obj) ) - (none) ) (defmethod enemy-method-62 enemy ((obj enemy)) @@ -1592,124 +1590,162 @@ ) ) +;; WARN: Return type mismatch none vs object. +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 17] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 28] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 89] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 202] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 274] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 346] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 413] ;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 490] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 493] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 530] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 560] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 610] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 641] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 774] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 807] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 814] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 850] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 933] (defmethod enemy-method-74 enemy ((obj enemy) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) (local-vars (s5-5 rgbaf) (sv-432 process) (sv-448 event-message-block)) (with-pp - (cond - ((= arg2 'track) - (and (nonzero? (-> obj hit-points)) - (logtest? (-> obj enemy-flags) (enemy-flag enable-on-active)) - (logtest? (enemy-flag check-water-backup) (-> obj enemy-flags)) - ) - ) - ((= arg2 'combo) - (and (not (logtest? (enemy-flag multi-focus) (-> obj enemy-flags))) (nonzero? (-> obj hit-points))) - ) - ((= arg2 'touch) - (enemy-method-75 obj arg0 (the-as touching-shapes-entry arg3)) - ) - ((= arg2 'touched) - (when (logtest? (-> obj enemy-flags) (enemy-flag attackable-backup)) - (let* ((s3-1 arg0) - (v1-20 (if (type? s3-1 process-drawable) - (the-as process-drawable s3-1) - ) - ) - ) - (when v1-20 - (let* ((s3-2 (-> v1-20 root)) - (a1-4 (if (type? s3-2 collide-shape) - s3-2 - ) - ) - (s3-3 (-> arg3 param 0)) - ) - (if (and a1-4 - s3-3 - ((method-of-type touching-shapes-entry prims-touching-action?) - (the-as touching-shapes-entry s3-3) - (the-as collide-shape a1-4) - (collide-action solid) - (collide-action) - ) - ((method-of-type touching-shapes-entry prims-touching-action?) - (the-as touching-shapes-entry s3-3) - (-> obj root-override2) - (collide-action solid) - (collide-action) - ) - ) - (set! (-> obj auto-reset-penetrate-time) (the-as uint (-> pp clock frame-counter))) - ) - ) - ) - ) - ) - (enemy-method-76 obj arg0 arg3) - ) - ((= arg2 'attack-invinc) - (case (-> (the-as attack-info (-> arg3 param 1)) mode) - (('endlessfall) - (let ((v1-31 (-> obj root-override2 root-prim))) - (set! (-> v1-31 prim-core collide-as) (collide-spec)) - (set! (-> v1-31 prim-core collide-with) (collide-spec)) - ) - 0 - (enemy-method-73 obj) - ) - ) - ) - ((= arg2 'attack) - (let ((s2-0 (the-as object (-> arg3 param 1)))) - (when (!= (-> (the-as attack-info s2-0) id) (-> obj incoming attack-id)) - (cond - ((and (logtest? (-> obj enemy-flags) (enemy-flag enable-on-active)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (let* ((s1-0 obj) - (s0-0 (method-of-object s1-0 enemy-method-106)) - ) - (set! sv-432 arg0) - (set! sv-448 arg3) - (let ((a3-3 (get-penetrate-using-from-attack-event (the-as process-drawable arg0) arg3))) - (s0-0 s1-0 sv-432 sv-448 (the-as int a3-3) (the-as attack-info s2-0)) - ) - ) - (send-event (ppointer->process (-> obj parent)) 'child-hit) - 0 - (if (not *debug-unkillable*) - (enemy-method-48 obj arg0 arg3) - ) - (let ((s2-1 (the-as attack-info (enemy-method-58 obj)))) - (when s2-1 - (logclear! (-> obj enemy-flags) (enemy-flag called-dying)) - (enemy-method-108 obj (the-as enemy arg0) arg3) - (let ((a1-13 (new 'stack-no-clear 'event-message-block))) - (set! (-> a1-13 from) (process->ppointer arg0)) - (set! (-> a1-13 num-params) (the-as int arg1)) - (set! (-> a1-13 message) (the-as symbol s2-1)) - (set! (-> a1-13 param 0) (-> arg3 param 0)) - (set! (-> a1-13 param 1) (-> arg3 param 1)) - (set! (-> a1-13 param 2) (-> arg3 param 2)) - (set! (-> a1-13 param 3) (-> arg3 param 3)) - (set! (-> a1-13 param 4) (-> arg3 param 4)) - (set! (-> a1-13 param 5) (-> arg3 param 5)) - (send-event-function obj a1-13) - ) - ) - ) + (the-as + object + (cond + ((= arg2 'track) + (and (nonzero? (-> obj hit-points)) + (logtest? (-> obj enemy-flags) (enemy-flag enable-on-active)) + (logtest? (enemy-flag check-water-backup) (-> obj enemy-flags)) ) - (else - (set! (-> obj incoming attack-id) (-> (the-as attack-info s2-0) id)) - (enemy-method-75 obj arg0 (the-as touching-shapes-entry arg3)) + ) + ((= arg2 'combo) + (and (not (logtest? (enemy-flag multi-focus) (-> obj enemy-flags))) (nonzero? (-> obj hit-points))) + ) + ((= arg2 'touch) + (enemy-method-75 obj arg0 (the-as touching-shapes-entry arg3)) + ) + ((= arg2 'touched) + (when (logtest? (-> obj enemy-flags) (enemy-flag attackable-backup)) + (let* ((s3-1 arg0) + (v1-20 (if (type? s3-1 process-drawable) + (the-as process-drawable s3-1) + ) + ) + ) + (when v1-20 + (let* ((s3-2 (-> v1-20 root)) + (a1-4 (if (type? s3-2 collide-shape) + s3-2 + ) + ) + (s3-3 (-> arg3 param 0)) + ) + (if (and a1-4 + s3-3 + ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s3-3) + (the-as collide-shape a1-4) + (collide-action solid) + (collide-action) + ) + ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s3-3) + (-> obj root-override2) + (collide-action solid) + (collide-action) + ) + ) + (set! (-> obj auto-reset-penetrate-time) (the-as uint (-> pp clock frame-counter))) + ) + ) + ) + ) + ) + (enemy-method-76 obj arg0 arg3) + ) + ((= arg2 'attack-invinc) + (case (-> (the-as attack-info (-> arg3 param 1)) mode) + (('endlessfall) + (let ((v1-31 (-> obj root-override2 root-prim))) + (set! (-> v1-31 prim-core collide-as) (collide-spec)) + (set! (-> v1-31 prim-core collide-with) (collide-spec)) + ) + 0 + (enemy-method-73 obj) + ) + ) + ) + ((= arg2 'attack) + (let ((s2-0 (the-as object (-> arg3 param 1)))) + (when (!= (-> (the-as attack-info s2-0) id) (-> obj incoming attack-id)) + (cond + ((and (logtest? (-> obj enemy-flags) (enemy-flag enable-on-active)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + (let* ((s1-0 obj) + (s0-0 (method-of-object s1-0 enemy-method-106)) + ) + (set! sv-432 arg0) + (set! sv-448 arg3) + (let ((a3-3 (get-penetrate-using-from-attack-event (the-as process-drawable arg0) arg3))) + (s0-0 s1-0 sv-432 sv-448 (the-as int a3-3) (the-as attack-info s2-0)) + ) + ) + (send-event (ppointer->process (-> obj parent)) 'child-hit) + 0 + (if (not *debug-unkillable*) + (enemy-method-48 obj arg0 arg3) + ) + (let ((s2-1 (the-as attack-info (enemy-method-58 obj arg0 arg3)))) + (when s2-1 + (logclear! (-> obj enemy-flags) (enemy-flag called-dying)) + (enemy-method-108 obj (the-as enemy arg0) arg3) + (let ((a1-13 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-13 from) (process->ppointer arg0)) + (set! (-> a1-13 num-params) (the-as int arg1)) + (set! (-> a1-13 message) (the-as symbol s2-1)) + (set! (-> a1-13 param 0) (-> arg3 param 0)) + (set! (-> a1-13 param 1) (-> arg3 param 1)) + (set! (-> a1-13 param 2) (-> arg3 param 2)) + (set! (-> a1-13 param 3) (-> arg3 param 3)) + (set! (-> a1-13 param 4) (-> arg3 param 4)) + (set! (-> a1-13 param 5) (-> arg3 param 5)) + (send-event-function obj a1-13) + ) + ) + ) + ) + (else + (set! (-> obj incoming attack-id) (-> (the-as attack-info s2-0) id)) + (enemy-method-75 obj arg0 (the-as touching-shapes-entry arg3)) + ) ) ) ) ) - ) - ((= arg2 'hit-flinch) - (when (zero? (-> obj hit-points)) + ((= arg2 'hit-flinch) + (when (zero? (-> obj hit-points)) + (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) + (enemy-method-73 obj) + ) + #t + ) + ((= arg2 '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)) @@ -1723,138 +1759,17 @@ (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) (process-contact-action arg0) (send-event arg0 'get-attack-count 1) - (enemy-method-73 obj) - ) - #t - ) - ((= arg2 '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) - (when (zero? (-> obj hit-points)) - (case (-> obj incoming knocked-type) - (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) - (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) - 0 - ) - ) - ) - (go (method-of-object obj knocked)) - ) - ((= arg2 'hit) - (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)) - (enemy-method-73 obj) - (go (method-of-object obj hit)) - ) - ) - ((= arg2 'cue-chase) - (when (and (> (-> obj hit-points) 0) - (zero? (-> obj fated-time)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (let ((v1-162 (logtest? (enemy-flag alert) (-> obj enemy-flags)))) - (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice alert victory called-dying)) - (set! (-> obj enemy-flags) (logior (enemy-flag dangerous-backup) (-> obj enemy-flags))) - (logclear! (-> obj mask) (process-mask actor-pause)) - (cond - (v1-162 - (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) - (go-ambush obj) - (go-hostile obj) - ) - ) - ((and (-> obj next-state) (let ((v1-173 (-> obj next-state name))) - (or (= v1-173 'dormant) (= v1-173 'dormant-aware)) - ) - ) - (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) - (go-ambush obj) - (go (method-of-object obj notice)) - ) + (when (zero? (-> obj hit-points)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + 0 ) ) ) - #t + (go (method-of-object obj knocked)) ) - ) - ((= arg2 'cue-wake) - (when (and (> (-> obj hit-points) 0) - (zero? (-> obj fated-time)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (logclear! (-> obj enemy-flags) (enemy-flag alert victory called-dying)) - (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) - (go-ambush obj) - (enemy-method-72 obj) - ) - #t - ) - ) - ((= arg2 'jump) - (when (and (> (-> obj hit-points) 0) - (zero? (-> obj fated-time)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (logclear! (-> obj mask) (process-mask actor-pause)) - (set! (-> obj jump-why) (-> arg3 param 0)) - (set! (-> obj event-param-point quad) (-> (the-as vector (-> arg3 param 1)) quad)) - (go (method-of-object obj jump)) - ) - ) - ((= arg2 'death-start) - (set! (-> obj enemy-flags) (the-as enemy-flag (logior (enemy-flag recover) (-> obj enemy-flags)))) - (send-event (ppointer->process (-> obj parent)) 'child-die) - (drop-pickup (-> obj fact-info-override) #t *entity-pool* (-> obj fact-info-override) 0) - (let ((s5-1 (-> obj on-death))) - (if s5-1 - (eval! - (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (-> obj root-override2 trans)) - (the-as pair s5-1) - ) - ) - ) - ) - ((= arg2 'death-end) - (if (-> obj skel effect) - (logior! (-> obj skel effect flags) (effect-control-flag ecf2)) - ) - (logior! (-> obj draw status) (draw-control-status no-draw)) - (logclear! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) - (logclear! (-> obj focus-status) (focus-status dangerous)) - (logclear! (-> obj enemy-flags) (enemy-flag check-water)) - ) - ((= arg2 'instant-death) - (when (and (> (-> obj hit-points) 0) (zero? (-> obj fated-time))) - (set! (-> obj hit-points) 0) - (set! (-> obj root-override2 penetrated-by) (enemy-method-59 obj)) - (let ((s5-2 (enemy-method-50 obj (new 'stack-no-clear 'vector)))) - (vector-z-quaternion! s5-2 (-> obj root-override2 quat)) - (vector-float*! s5-2 s5-2 -1.0) - (vector-normalize! s5-2 1.0) - ) + ((= arg2 'hit) (logclear! (-> obj mask) (process-mask actor-pause)) (logclear! (-> obj focus-status) (focus-status dangerous)) (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) @@ -1866,88 +1781,187 @@ (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))) - (enemy-method-73 obj) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (if (zero? (-> obj hit-points)) + (enemy-method-73 obj) + (go (method-of-object obj hit)) + ) ) - ) - ((= arg2 'die-fast) - (logior! (-> obj draw status) (draw-control-status no-draw)) - (enemy-method-132 obj) - (send-event (ppointer->process (-> obj parent)) 'child-die) - (let ((s5-3 (-> obj on-death))) - (if s5-3 - (eval! - (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (-> obj root-override2 trans)) - (the-as pair s5-3) + ((= arg2 'cue-chase) + (when (and (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + (let ((v1-162 (logtest? (enemy-flag alert) (-> obj enemy-flags)))) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice alert victory called-dying)) + (set! (-> obj enemy-flags) (logior (enemy-flag dangerous-backup) (-> obj enemy-flags))) + (logclear! (-> obj mask) (process-mask actor-pause)) + (cond + (v1-162 + (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (go-ambush obj) + (go-hostile obj) + ) + ) + ((and (-> obj next-state) (let ((v1-173 (-> obj next-state name))) + (or (= v1-173 'dormant) (= v1-173 'dormant-aware)) + ) + ) + (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (go-ambush obj) + (go (method-of-object obj notice)) + ) + ) ) ) - ) - (cleanup-for-death obj) - (go (method-of-object obj die-fast)) - ) - ((= arg2 'victory) - (if (and (-> obj enemy-info use-victory) - (not (and (-> obj next-state) (= (-> obj next-state name) 'victory))) - (> (-> obj hit-points) 0) - (zero? (-> obj fated-time)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (go (method-of-object obj victory)) - ) - ) - ((= arg2 'nav-control) - (if (nonzero? (-> obj nav)) - (-> obj nav) - ) - ) - ((= arg2 'push-trans) - (move-by-vector! (-> obj root-override2) (the-as vector (-> arg3 param 0))) - ) - ((= arg2 'move-trans) - (move-to-point! (-> obj root-override2) (the-as vector (-> arg3 param 0))) - ) - ((= arg2 'shadow) - (cond - ((-> arg3 param 0) - (let ((v1-320 (-> obj draw shadow-ctrl))) - (logclear! (-> v1-320 settings flags) (shadow-flags disable-draw)) - ) - 0 - ) - (else - (let ((v1-323 (-> obj draw shadow-ctrl))) - (logior! (-> v1-323 settings flags) (shadow-flags disable-draw)) - ) - 0 + #t ) ) - ) - ((= arg2 'color-effect) - (let ((v1-325 (-> arg3 param 0))) - (set! s5-5 - (cond - ((= v1-325 'dark) - (let ((f30-0 (rand-vu-float-range 0.2 1.0))) - (set-vector! (-> obj draw color-mult) (lerp 1.0 1.0 f30-0) (lerp 1.0 0.0 f30-0) (lerp 1.0 1.0 f30-0) 1.0) - (set! s5-5 (-> obj draw color-emissive)) - (set! (-> s5-5 x) (lerp 0.0 0.3 f30-0)) - (set! (-> s5-5 y) (lerp 0.0 0.0 f30-0)) - (set! (-> s5-5 z) (lerp 0.0 0.3 f30-0)) + ((= arg2 'cue-wake) + (when (and (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) ) - (set! (-> s5-5 w) 1.0) - s5-5 - ) - ((= v1-325 #f) - (set-vector! (-> obj draw color-mult) 1.0 1.0 1.0 1.0) - (set! s5-5 (-> obj draw color-emissive)) - (set! (-> s5-5 quad) (the-as uint128 0)) - s5-5 - ) + (logclear! (-> obj enemy-flags) (enemy-flag alert victory called-dying)) + (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (go-ambush obj) + (enemy-method-72 obj) + ) + #t + ) + ) + ((= arg2 'jump) + (when (and (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (set! (-> obj jump-why) (-> arg3 param 0)) + (set! (-> obj event-param-point quad) (-> (the-as vector (-> arg3 param 1)) quad)) + (go (method-of-object obj jump)) + ) + ) + ((= arg2 'death-start) + (set! (-> obj enemy-flags) (the-as enemy-flag (logior (enemy-flag recover) (-> obj enemy-flags)))) + (send-event (ppointer->process (-> obj parent)) 'child-die) + (drop-pickup (-> obj fact-info-override) #t *entity-pool* (-> obj fact-info-override) 0) + (let ((s5-1 (-> obj on-death))) + (if s5-1 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (-> obj root-override2 trans)) + (the-as pair s5-1) ) ) + ) ) - ) + ((= arg2 'death-end) + (if (-> obj skel effect) + (logior! (-> obj skel effect flags) (effect-control-flag ecf2)) + ) + (logior! (-> obj draw status) (draw-control-status no-draw)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (set! (-> obj enemy-flags) (logclear (-> obj enemy-flags) (enemy-flag check-water))) + ) + ((= arg2 'instant-death) + (when (and (> (-> obj hit-points) 0) (zero? (-> obj fated-time))) + (set! (-> obj hit-points) 0) + (set! (-> obj root-override2 penetrated-by) (enemy-method-59 obj)) + (let ((s5-2 (enemy-method-50 obj (new 'stack-no-clear 'vector)))) + (vector-z-quaternion! s5-2 (-> obj root-override2 quat)) + (vector-float*! s5-2 s5-2 -1.0) + (vector-normalize! s5-2 1.0) + ) + (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))) + (enemy-method-73 obj) + ) + ) + ((= arg2 'die-fast) + (logior! (-> obj draw status) (draw-control-status no-draw)) + (enemy-method-132 obj) + (send-event (ppointer->process (-> obj parent)) 'child-die) + (let ((s5-3 (-> obj on-death))) + (if s5-3 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (-> obj root-override2 trans)) + (the-as pair s5-3) + ) + ) + ) + (cleanup-for-death obj) + (go (method-of-object obj die-fast)) + ) + ((= arg2 'victory) + (if (and (-> obj enemy-info use-victory) + (not (and (-> obj next-state) (= (-> obj next-state name) 'victory))) + (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + (go (method-of-object obj victory)) + ) + ) + ((= arg2 'nav-control) + (if (nonzero? (-> obj nav)) + (-> obj nav) + ) + ) + ((= arg2 'push-trans) + (move-by-vector! (-> obj root-override2) (the-as vector (-> arg3 param 0))) + ) + ((= arg2 'move-trans) + (move-to-point! (-> obj root-override2) (the-as vector (-> arg3 param 0))) + ) + ((= arg2 'shadow) + (cond + ((-> arg3 param 0) + (let ((v1-320 (-> obj draw shadow-ctrl))) + (logclear! (-> v1-320 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + (else + (let ((v1-323 (-> obj draw shadow-ctrl))) + (logior! (-> v1-323 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + ) + ((= arg2 'color-effect) + (case (-> arg3 param 0) + (('dark) + (let ((f30-0 (rand-vu-float-range 0.2 1.0))) + (set-vector! (-> obj draw color-mult) (lerp 1.0 1.0 f30-0) (lerp 1.0 0.0 f30-0) (lerp 1.0 1.0 f30-0) 1.0) + (set! s5-5 (-> obj draw color-emissive)) + (set! (-> s5-5 x) (lerp 0.0 0.3 f30-0)) + (set! (-> s5-5 y) (lerp 0.0 0.0 f30-0)) + (set! (-> s5-5 z) (lerp 0.0 0.3 f30-0)) + ) + (set! (-> s5-5 w) 1.0) + s5-5 + ) + ((#f) + (set-vector! (-> obj draw color-mult) 1.0 1.0 1.0 1.0) + (set! s5-5 (-> obj draw color-emissive)) + (set! (-> s5-5 quad) (the-as uint128 0)) + s5-5 + ) + ) + ) + ) ) - (none) ) ) @@ -1960,7 +1974,7 @@ ) ) -(defmethod enemy-method-58 enemy ((obj enemy)) +(defmethod enemy-method-58 enemy ((obj enemy) (arg0 process) (arg1 event-message-block)) (let ((v1-0 (-> obj incoming penetrate-using))) (cond ((logtest? (the-as penetrate v1-0) (-> obj penetrated-flinch)) @@ -2095,9 +2109,8 @@ ) ) -;; WARN: Return type mismatch none vs object. (defbehavior enemy-event-handler enemy ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) - (the-as object (enemy-method-74 self arg0 arg1 arg2 arg3)) + (enemy-method-74 self arg0 arg1 arg2 arg3) ) (defbehavior enemy-simple-post enemy () diff --git a/goal_src/jak2/engine/data/art-elts.gc b/goal_src/jak2/engine/data/art-elts.gc index eba5c78cd9..6e6c249fec 100644 --- a/goal_src/jak2/engine/data/art-elts.gc +++ b/goal_src/jak2/engine/data/art-elts.gc @@ -4776,4 +4776,3 @@ (def-art-elt grunt-egg-a-ag grunt-egg-a-lod1-mg 2) (def-art-elt grunt-egg-a-ag grunt-egg-a-lod0-mg 1) (def-art-elt grunt-egg-a-ag grunt-egg-a-lod0-jg 0) - diff --git a/goal_src/jak2/engine/nav/nav-control-h.gc b/goal_src/jak2/engine/nav/nav-control-h.gc index f4f39d4969..cf3e401237 100644 --- a/goal_src/jak2/engine/nav/nav-control-h.gc +++ b/goal_src/jak2/engine/nav/nav-control-h.gc @@ -207,14 +207,14 @@ (clamp-vector-to-mesh-no-gaps (_type_ vector nav-poly vector clamp-travel-vector-to-mesh-return-info) none 21) (find-first-sphere-and-update-avoid-params (_type_ vector nav-avoid-spheres-params) float 22) (set-spheres-from-nav-ids (_type_) none 23) - (add-root-sphere-to-hash! (_type_ vector int) none 24) + (add-root-sphere-to-hash! (_type_ vector int) symbol 24) (get-max-rotation-rate (_type_) float 25) (get-sphere-mask (_type_) uint 26) (get-target-speed (_type_) meters 27) (enable-extra-sphere! (_type_) none 28) (disable-extra-sphere! (_type_) none 29) (copy-extra-nav-sphere! (_type_ sphere) none 30) - (set-extra-nav-sphere-xyz! (_type_ sphere) none 31) + (set-extra-nav-sphere-xyz! (_type_ sphere) none 31) (set-extra-nav-sphere-radius! (_type_ float) none 32) (set-nearest-y-thres! (_type_ float) none 33) (set-nav-cull-radius! (_type_ meters) none 34) @@ -225,7 +225,7 @@ (set-max-rotation-rate! (_type_ float) none 39) (set-sphere-mask! (_type_ uint) none 40) (remove! (_type_) none 41) - (init! (_type_ collide-shape) none 42) + (init! (_type_ collide-shape) none 42) (display-marks? (_type_) symbol 43) (nav-control-method-44 () none 44) (find-first-sphere-intersecting-ray (_type_ vector vector vector) sphere 45) diff --git a/goal_src/jak2/engine/nav/nav-control.gc b/goal_src/jak2/engine/nav/nav-control.gc index 94475f81a5..1381737293 100644 --- a/goal_src/jak2/engine/nav/nav-control.gc +++ b/goal_src/jak2/engine/nav/nav-control.gc @@ -855,12 +855,14 @@ (a1-31 (-> s5-0 temp-dir v1-30)) (a0-39 (-> s5-0 in-dir)) (a2-14 (-> s5-0 right-dir)) - (a3-7 (vector-dot a1-31 a2-14)) + (a3-7 (the-as number (vector-dot a1-31 a2-14))) (t0-1 #xffffffff80000000) (a2-16 #x3f800000) - (f0-30 - (* f0-29 (* (the-as float (logior (logand (the-as uint a3-7) (the-as uint t0-1)) a2-16)) (- 1.0 (vector-dot a1-31 a0-39)))) - ) + (f0-30 (* f0-29 (* (the-as float (logior (logand (the-as uint a3-7) (the-as uint t0-1)) a2-16)) + (- 1.0 (vector-dot a1-31 a0-39)) + ) + ) + ) ) (when (< (-> s5-0 best-dir-angle s3-0) f0-30) (set! (-> s5-0 best-dir s3-0 quad) (-> s5-0 temp-dir v1-30 quad)) @@ -1767,7 +1769,6 @@ (the-as int (-> obj root-sphere-id)) ) ) - (none) ) (defmethod reset! nav-state ((obj nav-state) (arg0 nav-control)) @@ -3526,7 +3527,3 @@ (none) ) ) - - - - diff --git a/goal_src/jak2/engine/nav/nav-enemy.gc b/goal_src/jak2/engine/nav/nav-enemy.gc index c0c6c57c46..4b43dbd8d1 100644 --- a/goal_src/jak2/engine/nav/nav-enemy.gc +++ b/goal_src/jak2/engine/nav/nav-enemy.gc @@ -25,27 +25,34 @@ ) ) +;; WARN: Return type mismatch none vs object. +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 7] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 15] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 23] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 33] (defmethod enemy-method-74 nav-enemy ((obj nav-enemy) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) - (case arg2 - (('nav-mesh-kill) - (deactivate obj) - #t - ) - (('nav-mesh-new) - (set! (-> obj water-max-height) (-> obj nav state mesh water-max-height)) - #t - ) - (('debug-control-on) - (go (method-of-object obj debug-control)) - ) - (('debug-control-off) - (enemy-method-72 obj) - ) - (else - ((method-of-type enemy enemy-method-74) obj arg0 arg1 arg2 arg3) - ) + (let ((v1-0 arg2)) + (the-as object (cond + ((= v1-0 'nav-mesh-kill) + (deactivate obj) + #t + ) + ((= v1-0 'nav-mesh-new) + (set! (-> obj water-max-height) (-> obj nav state mesh water-max-height)) + #t + ) + ((= v1-0 'debug-control-on) + (go (method-of-object obj debug-control)) + ) + ((= v1-0 'debug-control-off) + (enemy-method-72 obj) + ) + (else + ((method-of-type enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) ) - (none) ) (define *nav-enemy-dummy-shadow-control* @@ -2697,13 +2704,12 @@ :post nav-enemy-die-falling-post ) -;; WARN: Return type mismatch none vs symbol. (defmethod enemy-method-82 nav-enemy ((obj nav-enemy) (arg0 enemy-jump-info)) "@abstract" (let ((v1-0 (new 'stack-no-clear 'vector))) (set! (-> v1-0 quad) (-> arg0 dest-pos quad)) (set! (-> v1-0 w) (-> obj nav-radius-backup)) - (the-as symbol (add-root-sphere-to-hash! (-> obj nav) v1-0 #x80068)) + (add-root-sphere-to-hash! (-> obj nav) v1-0 #x80068) ) ) diff --git a/goal_src/jak2/engine/spatial-hash/spatial-hash-h.gc b/goal_src/jak2/engine/spatial-hash/spatial-hash-h.gc index e084fade14..7d6ad0abe0 100644 --- a/goal_src/jak2/engine/spatial-hash/spatial-hash-h.gc +++ b/goal_src/jak2/engine/spatial-hash/spatial-hash-h.gc @@ -72,12 +72,12 @@ (deftype find-nav-sphere-ids-params (structure) - ((bsphere sphere :inline :offset-assert 0) - (y-threshold float :offset-assert 16) - (len int16 :offset-assert 20) - (max-len int16 :offset-assert 22) - (mask uint8 :offset-assert 24) - (array (pointer uint8) :offset-assert 28) + ((bsphere sphere :inline :offset-assert 0) + (y-threshold float :offset-assert 16) + (len int16 :offset-assert 20) + (max-len int16 :offset-assert 22) + (mask uint8 :offset-assert 24) + (array (pointer uint8) :offset-assert 28) ) :method-count-assert 9 :size-assert #x20 @@ -103,7 +103,7 @@ (update-from-spheres (_type_) none 28) (sphere-hash-method-29 (_type_ find-nav-sphere-ids-params int int int) none 29) (find-nav-sphere-ids (_type_ find-nav-sphere-ids-params) none 30) - (add-sphere-with-mask-and-id (_type_ vector int int) none 31) + (add-sphere-with-mask-and-id (_type_ vector int int) symbol 31) (sphere-hash-method-32 (_type_ vector vector float int) symbol 32) (remove-by-id (_type_ sphere int) none 33) ) diff --git a/goal_src/jak2/game.gp b/goal_src/jak2/game.gp index 00196f2d0a..a726ec63f7 100644 --- a/goal_src/jak2/game.gp +++ b/goal_src/jak2/game.gp @@ -175,6 +175,9 @@ :out `(,out-name)) out-name)) +(defmacro copy-strs (&rest strs) + `(begin ,@(apply (lambda (x) `(set! *all-str* (cons (copy-iso-file ,x "STR/" ".STR") *all-str*))) strs))) + (defmacro copy-sbk-files (&rest files) `(begin ,@(apply (lambda (x) `(set! *all-sbk* (cons (copy-iso-file ,x "SBK/" ".SBK") *all-sbk*))) files))) @@ -1936,28 +1939,28 @@ ;; ;; DRI ;; ;;;;;;;;;;;;;;;;;;;;; -;; (cgo "DRI.DGO" "dri.gd") +(cgo "DRI.DGO" "dri.gd") -;; (copy-textures 1204 1205 1239 1203 1206) +(copy-textures 1204 1205 1239 1203 1206) -;; (copy-gos -;; "centurion-ag" -;; "drill-turret-ext-ag" -;; "mech-ag" -;; "port-turret-ag" -;; "ginsu-ag" -;; "drill-elevator-ag" -;; "drill-plat-falling-ag" -;; "drill-bridge-shot-ag" -;; "warp-gate-ag" -;; "drill-elevator-base-ag" -;; "drill-wall-ag" -;; "drill-metalhead-eggs-c-ag" -;; "drill-metalhead-eggs-b-ag" -;; "drill-metalhead-eggs-a-ag" -;; "drill-turret-int-ag" -;; "drill-vis" -;; ) +(copy-gos + "centurion-ag" + ;; "drill-turret-ext-ag" + ;; "mech-ag" + ;; "port-turret-ag" + "ginsu-ag" + "drill-elevator-ag" + "drill-plat-falling-ag" + "drill-bridge-shot-ag" + ;; "warp-gate-ag" + "drill-elevator-base-ag" + ;; "drill-wall-ag" + ;; "drill-metalhead-eggs-c-ag" + ;; "drill-metalhead-eggs-b-ag" + ;; "drill-metalhead-eggs-a-ag" + ;; "drill-turret-int-ag" + "drill-vis" + ) ;; ;;;;;;;;;;;;;;;;;;;;; ;; ;; DRILLMTN @@ -2117,7 +2120,12 @@ (copy-gos "youngsamos-forestb+0-ag" + ;; "daxter-highres-ag" "youngsamos-highres-ag" + ;; "jak-highres-ag" + ;; "crimson-guard-hover-ag" + ;; "transport-ag" + ;; "life-seed-ag" "forestb-vis" ) @@ -3459,36 +3467,38 @@ ;; ;; MTX ;; ;;;;;;;;;;;;;;;;;;;;; -;; (cgo "MTX.DGO" "mtx.gd") +(cgo "MTX.DGO" "mtx.gd") -;; (copy-textures 1719 1721 1720 1722 3506) +(copy-textures 1719 1721 1720 1722 3506) -;; (copy-gos -;; "daxter-highres-ag" -;; "jak-highres-ag" -;; "mtn-gear-device-ag" -;; "mtn-step-plat-rocks-ag" -;; "metalmonk-ag" -;; "centurion-ag" -;; "rhino-ag" -;; "mtn-plat-buried-rocks-ag" -;; "rhino-wall-ag" -;; "hopper-ag" -;; "water-anim-mountain-dark-eco-ag" -;; "mtn-aval-rocks-ag" -;; "mtn-dice-ag" -;; "plat-buried-ag" -;; "plat-return-ag" -;; "iris-door-ag" -;; "seal-of-mar-ag" -;; "mtn-dice-button-ag" -;; "mtn-plat-eject-ag" -;; "mtn-button-ag" -;; "gear-device-gear-ag" -;; "mtn-lens-ag" -;; "particleman-ag" -;; "mtnext-vis" -;; ) +(copy-gos + ;; "daxter-highres-ag" + ;; "jak-highres-ag" + "mtn-gear-device-ag" + "mtn-step-plat-rocks-ag" + ;; "metalmonk-ag" + ;; "centurion-ag" + "rhino-ag" + "mtn-plat-buried-rocks-ag" + "rhino-wall-ag" + "hopper-ag" + "water-anim-mountain-dark-eco-ag" + "mtn-aval-rocks-ag" + "mtn-dice-ag" + ;; "plat-buried-ag" + ;; "plat-return-ag" + ;; "iris-door-ag" + "seal-of-mar-ag" + "mtn-dice-button-ag" + "mtn-plat-eject-ag" + "mtn-button-ag" + ;; "gear-device-gear-ag" + ;; "mtn-lens-ag" + ;; "particleman-ag" + "mtnext-vis" + ) + +(copy-strs "RHW1" "RHW2") ;; ;;;;;;;;;;;;;;;;;;;;; ;; ;; NEB @@ -3906,24 +3916,24 @@ ;; ;; SAG ;; ;;;;;;;;;;;;;;;;;;;;; -;; (cgo "SAG.DGO" "sag.gd") +(cgo "SAG.DGO" "sag.gd") -;; (copy-textures 881 1131 882 880) +(copy-textures 881 1131 882 880) -;; (copy-gos -;; "daxter-highres-ag" -;; "jak-highres-ag" -;; "torn-highres-ag" -;; "ruins-tower-a-ag" -;; "ruins-tower-c-ag" -;; "ruins-tower-e-ag" -;; "ruins-tower-b-ag" -;; "ruins-tower-f-ag" -;; "ruins-tower-d-ag" -;; "life-seed-ag" -;; "ruins-tower-rp-ag" -;; "sagehut-vis" -;; ) +(copy-gos + ;; "daxter-highres-ag" + ;; "jak-highres-ag" + "torn-highres-ag" + "ruins-tower-a-ag" + "ruins-tower-c-ag" + "ruins-tower-e-ag" + "ruins-tower-b-ag" + "ruins-tower-f-ag" + "ruins-tower-d-ag" + ;; "life-seed-ag" + "ruins-tower-rp-ag" + "sagehut-vis" + ) ;; ;;;;;;;;;;;;;;;;;;;;; ;; ;; SEB @@ -4431,51 +4441,51 @@ ;; ;; TOB ;; ;;;;;;;;;;;;;;;;;;;;; -;; (cgo "TOB.DGO" "tob.gd") +(cgo "TOB.DGO" "tob.gd") -;; (copy-textures 1596 1597) +(copy-textures 1596 1597) -;; (copy-gos -;; "jak-pole+0-ag" -;; "tomb-stair-block-ag" -;; "tomb-baby-spider-ag" -;; "water-anim-tomb-dark-eco-ag" -;; "tomb-elevator-ag" -;; "tomb-plat-wall-ag" -;; "tomb-button-ag" -;; "tomb-stair-block-spikes-ag" -;; "tomb-boulder-door-ag" -;; "tomb-move-swing-pole-ag" -;; "tombb-vis" -;; ) +(copy-gos + ;; "jak-pole+0-ag" + "tomb-stair-block-ag" + "tomb-baby-spider-ag" + "water-anim-tomb-dark-eco-ag" + "tomb-elevator-ag" + "tomb-plat-wall-ag" + "tomb-button-ag" + "tomb-stair-block-spikes-ag" + "tomb-boulder-door-ag" + "tomb-move-swing-pole-ag" + "tombb-vis" + ) ;; ;;;;;;;;;;;;;;;;;;;;; ;; ;; TOC ;; ;;;;;;;;;;;;;;;;;;;;; -;; (cgo "TOC.DGO" "toc.gd") +(cgo "TOC.DGO" "toc.gd") -;; (copy-textures 1598 1599 1832) +(copy-textures 1598 1599 1832) -;; (copy-gos -;; "water-anim-tomb-ag" -;; "tomb-baby-spider-ag" -;; "tomb-beetle-ag" -;; "tomb-door-ag" -;; "tomb-vibe-ag" -;; "tomb-simon-button-ag" -;; "tomb-plat-simon-ag" -;; "tomb-wing-door-ag" -;; "tomb-button-ag" -;; "tomb-beetle-door-ag" -;; "tombc-vis" -;; ) +(copy-gos + ;; "water-anim-tomb-ag" + ;; "tomb-baby-spider-ag" + "tomb-beetle-ag" + "tomb-door-ag" + "tomb-vibe-ag" + ;; "tomb-simon-button-ag" + "tomb-plat-simon-ag" + ;; "tomb-wing-door-ag" + ;; "tomb-button-ag" + "tomb-beetle-door-ag" + "tombc-vis" + ) ;; ;;;;;;;;;;;;;;;;;;;;; ;; ;; TOD ;; ;;;;;;;;;;;;;;;;;;;;; -;; (cgo "TOD.DGO" "tod.gd") +(cgo "TOD.DGO" "tod.gd") ;; (goal-src-sequence ;; "" @@ -4483,21 +4493,21 @@ ;; "levels/common/entities/com-elevator.gc" ;; ) -;; (copy-textures 1626 1627 3275) +(copy-textures 1626 1627 3275) -;; (copy-gos -;; "youngsamos-tombd+0-ag" -;; "kid-tombd+0-ag" -;; "daxter-highres-ag" -;; "youngsamos-highres-ag" -;; "jak-highres-ag" -;; "crocadog-highres-ag" -;; "kor-highres-ag" -;; "kid-highres-ag" -;; "tomb-mar-door-ag" -;; "com-elevator-ag" -;; "tombd-vis" -;; ) +(copy-gos + "youngsamos-tombd+0-ag" + ;; "kid-tombd+0-ag" + ;; "daxter-highres-ag" + ;; "youngsamos-highres-ag" + ;; "jak-highres-ag" + ;; "crocadog-highres-ag" + ;; "kor-highres-ag" + ;; "kid-highres-ag" + ;; "tomb-mar-door-ag" + ;; "com-elevator-ag" + "tombd-vis" + ) ;; ;;;;;;;;;;;;;;;;;;;;; ;; ;; TOE diff --git a/goal_src/jak2/kernel/gcommon.gc b/goal_src/jak2/kernel/gcommon.gc index ea158eb41c..74bc655f35 100644 --- a/goal_src/jak2/kernel/gcommon.gc +++ b/goal_src/jak2/kernel/gcommon.gc @@ -1401,6 +1401,8 @@ (fake-asm .sync.p) ;; Copies the contents of a cop0 (system control) register to a gpr (fake-asm .mfc0 dest src) + (fake-asm .mfpc dest src) ;; Copies the contents of a gpr to a cop0 (system control) register (fake-asm .mtc0 dest src) + (fake-asm .mtpc dest src) ) diff --git a/goal_src/jak2/levels/common/airlock.gc b/goal_src/jak2/levels/common/airlock.gc index 65e4b3fbb3..b63212c5fe 100644 --- a/goal_src/jak2/levels/common/airlock.gc +++ b/goal_src/jak2/levels/common/airlock.gc @@ -1096,6 +1096,7 @@ ;; WARN: Return type mismatch object vs none. (defmethod init-from-entity! tomb-mar-door ((obj tomb-mar-door) (arg0 entity-actor)) + (stack-size-set! (-> obj main-thread) 1024) ;; added (let ((s5-0 (new 'process 'collide-shape obj (collide-list-enum usually-hit-by-player)))) (set! (-> s5-0 penetrated-by) (penetrate)) (let ((v1-2 (new 'process 'collide-shape-prim-mesh s5-0 (the-as uint 0) (the-as uint 0)))) diff --git a/goal_src/jak2/levels/common/enemy/amphibian/amphibian.gc b/goal_src/jak2/levels/common/enemy/amphibian/amphibian.gc index fda6da6795..c19b08302d 100644 --- a/goal_src/jak2/levels/common/enemy/amphibian/amphibian.gc +++ b/goal_src/jak2/levels/common/enemy/amphibian/amphibian.gc @@ -7,3 +7,1832 @@ ;; DECOMP BEGINS +(deftype amphibian-tongue-attack-info (structure) + ((targ-dist float :offset-assert 0) + (max-length float :offset-assert 4) + (start-pos vector :inline :offset-assert 16) + (base-dir vector :inline :offset-assert 32) + (base-rot vector :inline :offset-assert 48) + (targ-pos vector :inline :offset-assert 64) + (targ-dir vector :inline :offset-assert 80) + (targ-rot vector :inline :offset-assert 96) + (clamped-pos vector :inline :offset-assert 112) + (clamped-dir vector :inline :offset-assert 128) + (clamped-rot vector :inline :offset-assert 144) + ) + :method-count-assert 9 + :size-assert #xa0 + :flag-assert #x9000000a0 + ) + + +(deftype amphibian-joint-mod (basic) + ((joint-index int32 :offset-assert 4) + (proc process-drawable :offset-assert 8) + (max-length float :offset-assert 12) + (target vector :inline :offset-assert 16) + ) + :method-count-assert 10 + :size-assert #x20 + :flag-assert #xa00000020 + (:methods + (new (symbol type process-drawable int) _type_ 0) + (amphibian-joint-mod-method-9 (_type_) none 9) + ) + ) + + +(defskelgroup skel-amphibian amphibian amphibian-lod0-jg -1 + ((amphibian-lod0-mg (meters 20)) (amphibian-lod1-mg (meters 999999))) + :bounds (static-spherem 0 1 0 5.5) + :shadow amphibian-shadow-mg + ) + +(deftype amphibian-anim-info (structure) + ((anim-index int32 :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + + +(deftype amphibian-global-info (basic) + ((prev-blue-hit int8 :offset-assert 4) + (prev-knocked int8 :offset-assert 5) + (notice-anim int32 2 :offset-assert 8) + (run-anim int32 2 :offset-assert 16) + (knocked-anim int32 3 :offset-assert 24) + (knocked-land-anim int32 3 :offset-assert 36) + (blue-hit-anim int32 3 :offset-assert 48) + (jump-wind-up-anim int32 2 :offset-assert 60) + (jump-in-air-anim int32 2 :offset-assert 68) + (jump-land-anim int32 2 :offset-assert 76) + ) + :method-count-assert 9 + :size-assert #x54 + :flag-assert #x900000054 + ) + + +(deftype amphibian (nav-enemy) + ((tongue-scale float :offset-assert 604) + (flags uint8 :offset-assert 608) + (knocked-anim-index int8 :offset-assert 609) + (jump-anim-index int8 :offset-assert 610) + (tongue-mode uint64 :offset-assert 616) + (tongue-mod amphibian-joint-mod :offset-assert 624) + (attacker-handle handle :offset-assert 632) + (prev-ry float :offset-assert 640) + (prev-ry1 float :offset-assert 644) + ) + :heap-base #x210 + :method-count-assert 188 + :size-assert #x288 + :flag-assert #xbc02100288 + (:methods + (attack-forward () _type_ :state 178) + (attack-forward-lunge () _type_ :state 179) + (attack-forward-end () _type_ :state 180) + (attack-spin () _type_ :state 181) + (stare-idle () _type_ :state 182) + (tongue-attack () _type_ :state 183) + (amphibian-method-184 (_type_ vector vector) vector 184) + (amphibian-method-185 (_type_ amphibian-tongue-attack-info) none 185) + (amphibian-method-186 (_type_ vector vector) symbol 186) + (amphibian-method-187 (_type_) none 187) + ) + ) + + +(define *amphibian-global-info* (new 'static 'amphibian-global-info + :notice-anim (new 'static 'array int32 2 28 29) + :run-anim (new 'static 'array int32 2 26 27) + :knocked-anim (new 'static 'array int32 3 6 8 10) + :knocked-land-anim (new 'static 'array int32 3 7 9 11) + :blue-hit-anim (new 'static 'array int32 3 22 23 24) + :jump-wind-up-anim (new 'static 'array int32 2 30 33) + :jump-in-air-anim (new 'static 'array int32 2 31 34) + :jump-land-anim (new 'static 'array int32 2 32 35) + ) + ) + +(define *amphibian-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010401 #x0 #x0 #x0) + :idle-anim 4 + :notice-anim 28 + :hostile-anim 26 + :hit-anim 6 + :knocked-anim 6 + :knocked-land-anim 7 + :die-anim 12 + :die-falling-anim 21 + :victory-anim -1 + :jump-wind-up-anim 30 + :jump-in-air-anim 31 + :jump-land-anim 32 + :neck-joint 11 + :look-at-joint 12 + :bullseye-joint 4 + :sound-hit (static-sound-name "amphibian-hit") + :sound-die (static-sound-name "amphibian-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 20) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #x11fffdffa + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3.5) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 1 + :recover-gnd-collide-with (collide-spec backgnd crate obstacle hit-by-others-list pusher) + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 106496.0 + :knocked-soft-vxz-hi 94208.0 + :knocked-soft-vy-lo 122880.0 + :knocked-soft-vy-hi 139264.0 + :knocked-medium-vxz-lo 106496.0 + :knocked-medium-vxz-hi 94208.0 + :knocked-medium-vy-lo 122880.0 + :knocked-medium-vy-hi 139264.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 1) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint -1 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #t + :use-circling #t + :use-pacing #t + :walk-anim 16 + :turn-anim -1 + :run-anim 26 + :taunt-anim -1 + :run-travel-speed (meters 6) + :run-acceleration (meters 8) + :run-turning-acceleration (meters 10) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 4) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 180.0) + :notice-nav-radius (meters 2) + :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! (-> *amphibian-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod relocate amphibian-joint-mod ((obj amphibian-joint-mod) (arg0 int)) + (&+! (-> obj proc) arg0) + obj + ) + +(defmethod enemy-method-74 amphibian ((obj amphibian) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('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) + (when (= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) + (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + 0 + ) + (when (zero? (-> obj hit-points)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + 0 + ) + ) + ) + (go (method-of-object obj knocked)) + (if (and (logtest? (-> obj incoming penetrate-using) 16) + (nonzero? (-> obj hit-points)) + (zero? (-> obj fated-time)) + ) + 'push + #t + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +(defun amphibian-joint-mod-callback ((arg0 cspace) (arg1 transformq)) + (cspace<-parented-transformq-joint! arg0 arg1) + (let ((s3-0 (new 'stack-no-clear 'inline-array 'matrix 3)) + (s2-0 (-> arg0 param1)) + (s5-0 (-> arg0 bone transform)) + (s4-0 (-> arg0 parent bone transform)) + ) + (vector-! (the-as vector (-> s3-0 0)) (-> (the-as amphibian-joint-mod s2-0) target) (-> s4-0 trans)) + (let ((f30-0 (fmin (vector-length (the-as vector (-> s3-0 0))) (-> (the-as amphibian-joint-mod s2-0) max-length)))) + (vector-normalize! (the-as vector (-> s3-0 0)) 1.0) + (quaternion-from-two-vectors! + (the-as quaternion (-> s3-0 0 vector 1)) + (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 vector 2) 1.0) + (the-as vector (-> s3-0 0)) + ) + (quaternion->matrix (the-as matrix (-> s3-0 0 vector 2)) (the-as quaternion (-> s3-0 0 vector 1))) + (matrix*! s5-0 s5-0 (the-as matrix (-> s3-0 0 vector 2))) + (vector-normalize-copy! + (-> s5-0 trans) + (-> s5-0 vector 2) + (* f30-0 (-> (the-as amphibian (-> (the-as amphibian-joint-mod s2-0) proc)) tongue-scale)) + ) + ) + (vector+! (-> s5-0 trans) (-> s5-0 trans) (-> s4-0 trans)) + ) + (set! (-> arg0 param0) #f) + 0 + (none) + ) + +;; WARN: Return type mismatch amphibian-joint-mod vs none. +(defmethod amphibian-joint-mod-method-9 amphibian-joint-mod ((obj amphibian-joint-mod)) + (let ((v1-3 (-> obj proc node-list data (-> obj joint-index)))) + (set! (-> v1-3 param0) (the-as (function cspace matrix none) amphibian-joint-mod-callback)) + (set! (-> v1-3 param1) obj) + ) + (none) + ) + +(defmethod new amphibian-joint-mod ((allocation symbol) (type-to-make type) (arg0 process-drawable) (arg1 int)) + (let ((v0-0 (object-new allocation type-to-make (the-as int (-> type-to-make size))))) + (set! (-> v0-0 proc) arg0) + (set! (-> v0-0 joint-index) arg1) + v0-0 + ) + ) + +(defmethod enemy-method-106 amphibian ((obj amphibian) (arg0 process) (arg1 object) (arg2 int) (arg3 attack-info)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-106))) + (t9-0 obj arg0 arg1 arg2 arg3) + ) + (let ((a0-3 (enemy-method-134 obj arg0 arg3))) + (if a0-3 + (set! (-> obj attacker-handle) (process->handle a0-3)) + (set! (-> obj attacker-handle) (the-as handle #f)) + ) + ) + 0 + (none) + ) + +(defmethod enemy-method-56 amphibian ((obj amphibian) (arg0 process) (arg1 event-message-block)) + (let* ((t9-0 (method-of-type nav-enemy enemy-method-56)) + (v0-0 (t9-0 obj arg0 arg1)) + ) + (let ((v1-1 (-> obj hit-points))) + (if (> (- v1-1 v0-0) 0) + (set! v0-0 (+ v1-1 -1)) + ) + ) + v0-0 + ) + ) + +(defmethod enemy-method-51 amphibian ((obj amphibian)) + (local-vars (f0-1 float)) + 0.0 + (set! f0-1 + (cond + ((or (zero? (-> obj hit-points)) (nonzero? (-> obj fated-time))) + ((method-of-type nav-enemy enemy-method-51) obj) + ) + (else + (set! f0-1 (quaternion-y-angle (-> obj root-override2 quat))) + (let ((a0-5 (handle->process (-> obj focus handle)))) + (when a0-5 + (let ((v1-12 (get-trans (the-as process-focusable a0-5) 0))) + (set! f0-1 + (atan (- (-> v1-12 x) (-> obj root-override2 trans x)) (- (-> v1-12 z) (-> obj root-override2 trans z))) + ) + ) + ) + ) + f0-1 + ) + ) + ) + f0-1 + ) + +(defmethod enemy-method-52 amphibian ((obj amphibian) (arg0 vector)) + (cond + ((and (nonzero? (-> obj hit-points)) (zero? (-> obj fated-time)) (!= (-> obj incoming knocked-type) 6)) + (enemy-method-50 obj arg0) + (let ((f30-0 (get-rand-float-range obj 0.0 1.0))) + (vector-float*! arg0 arg0 (lerp 43417.6 58982.4 f30-0)) + (set! (-> arg0 y) (lerp 114688.0 116736.0 f30-0)) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-52) obj arg0) + ) + ) + (none) + ) + +(defmethod enemy-method-77 amphibian ((obj amphibian) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let* ((v1-3 (enemy-method-120 obj 3 (ash 1 (-> *amphibian-global-info* prev-blue-hit)))) + (s5-1 (-> obj draw art-group data (-> *amphibian-global-info* blue-hit-anim v1-3))) + ) + (set! (-> *amphibian-global-info* prev-blue-hit) v1-3) + (ja-channel-push! 1 (seconds 0.02)) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim s5-1)) + (set! (-> a0-10 param 0) (the float (+ (-> (the-as art-joint-anim s5-1) frames num-frames) -1))) + (set! (-> a0-10 param 1) 1.0) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim s5-1) num-func-seek!) + ) + ) + ) + (else + (let ((v1-11 0)) + (when (or (zero? (-> obj hit-points)) (nonzero? (-> obj fated-time))) + (let ((a2-5 (logior (ash 1 (-> *amphibian-global-info* prev-knocked)) 1))) + (set! v1-11 (enemy-method-120 obj 3 a2-5)) + ) + ) + (set! (-> *amphibian-global-info* prev-knocked) v1-11) + (set! (-> obj knocked-anim-index) v1-11) + (let ((s4-0 (-> obj draw art-group data (-> *amphibian-global-info* knocked-anim v1-11)))) + (ja-channel-push! 1 0) + (let ((a0-25 (-> obj skel root-channel 0))) + (set! (-> a0-25 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-25 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-25 param 1) (-> arg0 0)) + (set! (-> a0-25 frame-num) 0.0) + (joint-control-channel-group! a0-25 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + ) + #t + ) + +(defmethod enemy-method-78 amphibian ((obj amphibian) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (ja-channel-push! 1 (seconds 0.015)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 25))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 25)) 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 25)) num-func-seek!) + ) + #t + ) + ) + (else + (let ((s4-0 (-> obj draw art-group data (-> *amphibian-global-info* knocked-land-anim (-> obj knocked-anim-index)))) + ) + (if (zero? (-> obj knocked-anim-index)) + (ja-channel-push! 1 (seconds 0.07)) + (ja-channel-push! 1 (seconds 0.15)) + ) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-10 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + ) + ) + +(defmethod enemy-method-89 amphibian ((obj amphibian) (arg0 enemy-jump-info)) + (let ((a0-1 (-> obj skel root-channel 0))) + (set! (-> a0-1 param 0) 1.0) + (joint-control-channel-group! a0-1 (the-as art-joint-anim #f) num-func-loop!) + ) + (let* ((v1-5 (get-rand-int obj 2)) + (s4-0 (-> obj draw art-group data (-> *amphibian-global-info* jump-wind-up-anim v1-5))) + ) + (set! (-> obj jump-anim-index) v1-5) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-9 (-> obj skel root-channel 0))) + (set! (-> a0-9 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-9 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-9 param 1) (-> arg0 anim-speed)) + (set! (-> a0-9 frame-num) 0.0) + (joint-control-channel-group! a0-9 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + +(defmethod enemy-method-87 amphibian ((obj amphibian) (arg0 enemy-jump-info)) + (let ((s4-0 (-> obj draw art-group data (-> *amphibian-global-info* jump-in-air-anim (-> obj jump-anim-index))))) + (ja-channel-push! 1 (seconds 0.07)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-6 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-6 param 1) (-> arg0 anim-speed)) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! a0-6 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + +(defmethod enemy-method-88 amphibian ((obj amphibian) (arg0 enemy-jump-info)) + (let ((s4-0 (-> obj draw art-group data (-> *amphibian-global-info* jump-land-anim (-> obj jump-anim-index))))) + (if (zero? (-> obj jump-anim-index)) + (ja-channel-push! 1 (seconds 0.07)) + (ja-channel-push! 1 (seconds 0.04)) + ) + (let ((a0-7 (-> obj skel root-channel 0))) + (set! (-> a0-7 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-7 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-7 param 1) (-> arg0 anim-speed)) + (set! (-> a0-7 frame-num) 0.0) + (joint-control-channel-group! a0-7 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + +;; WARN: Return type mismatch object vs symbol. +(defmethod enemy-method-90 amphibian ((obj amphibian) (arg0 int) (arg1 enemy-jump-info)) + (when (or (= (-> obj jump-why) 3) (= (-> obj jump-why) 2)) + (cond + ((zero? arg0) + (logior! (-> obj focus-status) (focus-status touch-water under-water)) + ) + (else + (when (logtest? (-> obj focus-status) (focus-status touch-water)) + (let ((s3-0 (new 'stack-no-clear 'water-info))) + (water-info-init! (-> obj root-override2) s3-0 (collide-action solid semi-solid)) + (let ((v1-12 #f)) + (cond + ((not (logtest? (water-flags touch-water) (-> s3-0 flags))) + (if (logtest? (-> obj focus-status) (focus-status under-water)) + (set! v1-12 #t) + ) + (logclear! (-> obj focus-status) (focus-status touch-water under-water)) + ) + ((logtest? (-> obj focus-status) (focus-status under-water)) + (let* ((a0-18 (-> obj root-override2 root-prim prim-core)) + (f0-1 (+ (-> a0-18 world-sphere y) (-> a0-18 world-sphere w))) + ) + (if (< (-> s3-0 trans y) f0-1) + (set! v1-12 #t) + ) + ) + ) + ) + (when v1-12 + (logclear! (-> obj focus-status) (focus-status under-water)) + (let ((s2-0 (new 'stack-no-clear 'vector))) + (set! (-> s2-0 quad) (-> obj root-override2 trans quad)) + (when (logtest? (water-flags touch-water) (-> s3-0 flags)) + (set! (-> s2-0 y) (-> s3-0 trans y)) + (let ((s3-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s3-1 + (let ((t9-2 (method-of-type part-tracker activate))) + (t9-2 + (the-as part-tracker s3-1) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-3 run-function-in-process) + (a0-28 s3-1) + (a1-6 part-tracker-init) + (a2-6 (-> *part-group-id-table* 121)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> s2-0 quad)) + ((the-as (function object object object object object object object object none) t9-3) + a0-28 + a1-6 + a2-6 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> s3-1 ppointer) + ) + ) + (sound-play "splash-out") + ) + ) + ) + ) + ) + ) + ) + ) + ) + (the-as + symbol + (cond + ((and (= arg0 3) (= (-> obj jump-anim-index) 1)) + (let* ((v1-35 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + (s4-1 (and v1-35 (= v1-35 (-> obj draw art-group data 36)))) + ) + (cond + ((and (not s4-1) (< (-> obj root-override2 transv y) 0.0)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-37 (-> obj skel root-channel 0))) + (set! (-> a0-37 frame-group) (the-as art-joint-anim (-> obj draw art-group data 36))) + (set! (-> a0-37 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 36)) frames num-frames) -1)) + ) + (set! (-> a0-37 param 1) (-> arg1 anim-speed)) + (set! (-> a0-37 frame-num) 0.0) + (joint-control-channel-group! a0-37 (the-as art-joint-anim (-> obj draw art-group data 36)) num-func-seek!) + ) + #f + ) + (else + (set! s4-1 (and (ja-done? 0) s4-1)) + (let ((a0-39 (-> obj skel root-channel 0))) + (set! (-> a0-39 param 0) (the float (+ (-> a0-39 frame-group frames num-frames) -1))) + (set! (-> a0-39 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-39 (the-as art-joint-anim #f) num-func-seek!) + ) + (ja-blend-eval) + s4-1 + ) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-90) obj arg0 arg1) + ) + ) + ) + ) + +(defmethod amphibian-method-184 amphibian ((obj amphibian) (arg0 vector) (arg1 vector)) + (vector<-cspace! arg0 (-> obj node-list data 13)) + (vector-! arg1 (-> obj tongue-mod target) arg0) + (vector-normalize! arg1 (fmin (* (vector-length arg1) (-> obj tongue-scale)) (-> obj tongue-mod max-length))) + (vector+! arg1 arg1 arg0) + ) + +;; WARN: Return type mismatch float vs none. +(defmethod amphibian-method-185 amphibian ((obj amphibian) (arg0 amphibian-tongue-attack-info)) + (let ((a0-1 (-> obj node-list data 11 bone transform))) + (set! (-> arg0 base-dir quad) (-> a0-1 vector 2 quad)) + ) + (vector-normalize! (-> arg0 base-dir) 1.0) + (vector<-cspace! (-> arg0 start-pos) (-> obj node-list data 13)) + (let ((a0-7 (handle->process (-> obj focus handle)))) + (cond + (a0-7 + (set! (-> arg0 targ-pos quad) (-> (get-trans (the-as process-focusable a0-7) 3) quad)) + ) + (else + (vector-normalize-copy! (-> arg0 targ-pos) (-> arg0 base-dir) 36864.0) + (vector+! (-> arg0 targ-pos) (-> arg0 targ-pos) (-> arg0 start-pos)) + ) + ) + ) + (vector-! (-> arg0 targ-dir) (-> arg0 targ-pos) (-> arg0 start-pos)) + (set! (-> arg0 targ-dist) (vector-length (-> arg0 targ-dir))) + (vector-normalize! (-> arg0 targ-dir) 1.0) + (rot-zxy-from-vector! (-> arg0 targ-rot) (-> arg0 targ-dir)) + (rot-zxy-from-vector! (-> arg0 base-rot) (-> arg0 base-dir)) + (set! (-> arg0 clamped-dir quad) (-> arg0 targ-dir quad)) + (set! (-> arg0 clamped-rot quad) (-> arg0 targ-rot quad)) + (let ((f30-0 (deg- (-> arg0 clamped-rot x) (-> arg0 base-rot x))) + (f0-5 (deg- (-> arg0 clamped-rot y) (-> arg0 base-rot y))) + ) + (when (or (< 4004.9778 (fabs f30-0)) (< 4004.9778 (fabs f0-5))) + (let ((f1-3 (fmax -4004.9778 (fmin 4004.9778 f30-0))) + (f0-7 (fmax -4004.9778 (fmin 4004.9778 f0-5))) + ) + (set! (-> arg0 clamped-rot x) (+ (-> arg0 base-rot x) f1-3)) + (set! (-> arg0 clamped-rot y) (+ (-> arg0 base-rot y) f0-7)) + ) + (set-vector! (-> arg0 clamped-dir) 0.0 0.0 1.0 1.0) + (vector-rotate-around-x! (-> arg0 clamped-dir) (-> arg0 clamped-dir) (-> arg0 clamped-rot x)) + (vector-rotate-around-y! (-> arg0 clamped-dir) (-> arg0 clamped-dir) (-> arg0 clamped-rot y)) + ) + ) + (vector-normalize-copy! (-> arg0 clamped-pos) (-> arg0 clamped-dir) (fmax 6144.0 (-> arg0 targ-dist))) + (vector+! (-> arg0 clamped-pos) (-> arg0 clamped-pos) (-> arg0 start-pos)) + (let ((s4-3 (new 'stack-no-clear 'collide-query))) + (set! (-> s4-3 start-pos quad) (-> arg0 start-pos quad)) + (vector-normalize-copy! (-> s4-3 move-dist) (-> arg0 clamped-dir) 73728.0) + (let ((v1-32 s4-3)) + (set! (-> v1-32 radius) 409.6) + (set! (-> v1-32 collide-with) (collide-spec backgnd crate obstacle hit-by-others-list pusher)) + (set! (-> v1-32 ignore-process0) obj) + (set! (-> v1-32 ignore-process1) #f) + (set! (-> v1-32 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-32 action-mask) (collide-action solid)) + ) + (let ((f0-18 (fill-and-probe-using-line-sphere *collide-cache* s4-3))) + (if (>= f0-18 0.0) + (set! (-> arg0 max-length) (* 73728.0 f0-18)) + (set! (-> arg0 max-length) 73728.0) + ) + ) + ) + (none) + ) + +(defmethod amphibian-method-186 amphibian ((obj amphibian) (arg0 vector) (arg1 vector)) + (with-pp + (let ((s4-0 (new 'stack-no-clear 'collide-query)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s4-0 start-pos quad) (-> arg0 quad)) + (vector-! (-> s4-0 move-dist) arg1 arg0) + (set! (-> s5-0 quad) (-> s4-0 move-dist quad)) + (let ((v1-4 s4-0)) + (set! (-> v1-4 radius) 409.6) + (set! (-> v1-4 collide-with) (collide-spec jak bot enemy obstacle hit-by-others-list player-list pusher)) + (set! (-> v1-4 ignore-process0) obj) + (set! (-> v1-4 ignore-process1) #f) + (set! (-> v1-4 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-4 action-mask) (collide-action solid)) + ) + (when (>= (fill-and-probe-using-line-sphere *collide-cache* s4-0) 0.0) + (let* ((s3-0 (-> s4-0 best-other-tri collide-ptr)) + (s4-1 (if (type? s3-0 collide-shape-prim-sphere) + (the-as collide-shape-prim-sphere s3-0) + ) + ) + ) + (when s4-1 + (set! (-> s5-0 y) 0.0) + (vector-normalize! s5-0 1.0) + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) (process->ppointer pp)) + (set! (-> a1-4 num-params) 2) + (set! (-> a1-4 message) 'attack) + (set! (-> a1-4 param 0) (the-as uint #f)) + (let ((v1-11 (new 'static 'attack-info :mask (attack-info-mask vector shove-back shove-up id damage)))) + (let* ((a0-14 *game-info*) + (a2-2 (+ (-> a0-14 attack-id) 1)) + ) + (set! (-> a0-14 attack-id) a2-2) + (set! (-> v1-11 id) a2-2) + ) + (set! (-> v1-11 vector quad) (-> s5-0 quad)) + (set! (-> v1-11 shove-back) 16384.0) + (set! (-> v1-11 shove-up) 12288.0) + (set! (-> v1-11 damage) (the float (-> obj enemy-info-override attack-damage))) + (set! (-> a1-4 param 1) (the-as uint v1-11)) + ) + (send-event-function (-> s4-1 cshape process) a1-4) + ) + ) + ) + #t + ) + ) + ) + ) + +;; WARN: Return type mismatch int vs symbol. +(defmethod enemy-method-76 amphibian ((obj amphibian) (arg0 process) (arg1 event-message-block)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-76))) + (t9-0 obj (the-as process-focusable arg0) arg1) + ) + (the-as + symbol + (when (and (logtest? (-> (the-as process-focusable arg0) root-override root-prim prim-core collide-as) + (collide-spec jak bot) + ) + (-> obj next-state) + (let ((v1-8 (-> obj next-state name))) + (or (= v1-8 'stare) (= v1-8 'hostile)) + ) + ) + (go (method-of-object obj attack-spin)) + 0 + ) + ) + ) + +(defmethod go-stare amphibian ((obj amphibian)) + (let ((s5-0 (-> obj focus aware))) + (cond + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + (nav-enemy-method-163 obj) + ) + (go-stare2 obj) + ) + ((and (= s5-0 (enemy-aware enemy-aware-3)) (-> obj enemy-info-override use-circling)) + (go (method-of-object obj circling)) + ) + ((and (= s5-0 (enemy-aware enemy-aware-2)) (-> obj enemy-info-override use-pacing)) + (go (method-of-object obj pacing)) + ) + ((= s5-0 (enemy-aware enemy-aware-4)) + (go (method-of-object obj flee)) + ) + (else + (go-stare2 obj) + ) + ) + ) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-hostile amphibian ((obj amphibian)) + (let* ((s4-0 (handle->process (-> obj attacker-handle))) + (s5-0 (if (type? s4-0 process-focusable) + s4-0 + ) + ) + ) + (when s5-0 + (set! (-> obj attacker-handle) (the-as handle #f)) + (when (collide-check? (-> obj focus) (the-as process-focusable s5-0)) + (try-update-focus (-> obj focus) (the-as process-focusable s5-0) obj) + (go (method-of-object obj tongue-attack)) + ) + ) + ) + (go (method-of-object obj hostile)) + (none) + ) + +(defmethod enemy-method-55 amphibian ((obj amphibian)) + (set! (-> obj prev-ry) (-> obj prev-ry1)) + (set! (-> obj prev-ry1) (quaternion-y-angle (-> obj root-override2 quat))) + ((method-of-type nav-enemy enemy-method-55) obj) + (none) + ) + +(defmethod amphibian-method-187 amphibian ((obj amphibian)) + (with-pp + (let* ((f30-0 (-> obj nav state speed)) + (f26-0 0.0) + (f0-1 (quaternion-y-angle (-> obj root-override2 quat))) + (f28-0 (deg- f0-1 (-> obj prev-ry))) + ) + (let ((s5-0 #f)) + (let ((s4-0 #f)) + (let ((v1-6 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (set! f28-0 (cond + ((and v1-6 (or (= v1-6 (-> obj draw art-group data 26)) + (= v1-6 (-> obj draw art-group data 27)) + (= v1-6 (-> obj draw art-group data 16)) + ) + ) + (set! f26-0 (ja-aframe-num 0)) + (when (= (-> obj skel root-channel 0) (-> obj skel channel)) + (cond + ((>= f26-0 13.0) + (set! s4-0 #t) + ) + ((and (>= 1.0 f26-0) (logtest? (-> obj flags) 1)) + (set! s5-0 #t) + ) + ) + ) + f28-0 + ) + (else + 0.0 + ) + ) + ) + ) + (if s4-0 + (logior! (-> obj flags) 1) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + (cond + ((>= f30-0 18432.0) + (let ((v1-29 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (cond + ((and v1-29 (= v1-29 (-> obj draw art-group data 26))) + (when (and s5-0 (zero? (get-rand-int obj 5))) + (ja-channel-push! 1 (seconds 0.15)) + (let ((s5-3 (-> obj skel root-channel 0))) + (set! (-> s5-3 dist) 12288.0) + (joint-control-channel-group-eval! + s5-3 + (the-as art-joint-anim (-> obj draw art-group data 27)) + num-func-identity + ) + (set! (-> s5-3 frame-num) (ja-aframe f26-0 0)) + ) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + (else + (let ((v1-45 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (cond + ((and v1-45 (= v1-45 (-> obj draw art-group data 27))) + (when s5-0 + (ja-channel-push! 1 (seconds 0.15)) + (let ((s5-4 (-> obj skel root-channel 0))) + (set! (-> s5-4 dist) 12288.0) + (joint-control-channel-group-eval! + s5-4 + (the-as art-joint-anim (-> obj draw art-group data 26)) + num-func-identity + ) + (set! (-> s5-4 frame-num) (ja-aframe f26-0 0)) + ) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.15)) + (let ((s5-5 (-> obj skel root-channel 0))) + (set! (-> s5-5 dist) 12288.0) + (joint-control-channel-group-eval! + s5-5 + (the-as art-joint-anim (-> obj draw art-group data 26)) + num-func-identity + ) + (set! (-> s5-5 frame-num) (ja-aframe f26-0 0)) + ) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + ) + ) + ) + ) + ) + (else + (let ((v1-67 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (not (and v1-67 (= v1-67 (-> obj draw art-group data 16)))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((s5-6 (-> obj skel root-channel 0))) + (set! (-> s5-6 dist) 12288.0) + (joint-control-channel-group-eval! + s5-6 + (the-as art-joint-anim (-> obj draw art-group data 16)) + num-func-identity + ) + (set! (-> s5-6 frame-num) (ja-aframe f26-0 0)) + ) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + ) + ) + ) + (let* ((f0-15 (fmin 24576.0 (* 0.47123888 (-> pp clock frames-per-second) (fabs f28-0)))) + (f0-17 (* 0.00008680556 (fmax f30-0 f0-15))) + (a0-49 (-> obj skel root-channel 0)) + ) + (set! (-> a0-49 param 0) f0-17) + (joint-control-channel-group-eval! a0-49 (the-as art-joint-anim #f) num-func-loop!) + ) + ) + (ja-blend-eval) + (none) + ) + ) + +(defstate active (amphibian) + :virtual #t + :code (behavior () + (until #f + (set! (-> self state-time) (-> self clock frame-counter)) + (until (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1.067)) + (amphibian-method-187 self) + (suspend) + ) + (when (enemy-method-123 self 0.2) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.6)) + (let ((v1-15 self)) + (set! (-> v1-15 enemy-flags) (the-as enemy-flag (logclear (-> v1-15 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-15 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek!)) + ) + (until (not (enemy-method-123 self 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (let ((v1-83 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-83 enemy-flags))) + (set! (-> v1-83 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-83 enemy-flags)))) + ) + (set! (-> v1-83 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-83 enemy-flags)))) + (set! (-> v1-83 nav callback-info) (-> v1-83 enemy-info-override callback-info)) + ) + 0 + (nav-enemy-method-165 self) + (ja-no-eval :num! (loop!)) + (until (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1.067)) + (amphibian-method-187 self) + (suspend) + ) + ) + ) + #f + (none) + ) + ) + +(defstate notice (amphibian) + :virtual #t + :enter (behavior () + (local-vars (gp-0 vector)) + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (handle->process (-> self focus handle)))) + (set! gp-0 (cond + (a0-1 + (set! gp-0 (-> self focus-pos)) + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-1) 3) quad)) + gp-0 + ) + (else + (vector-z-quaternion! (-> self focus-pos) (-> self root-override2 quat)) + (vector-normalize! (-> self focus-pos) 24576.0) + (vector+! (-> self focus-pos) (-> self focus-pos) (-> self root-override2 trans)) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2)) + (a1-3 (-> self draw art-group data (-> *amphibian-global-info* notice-anim (get-rand-int self 2)))) + (gp-1 (new 'stack-no-clear 'vector)) + ) + (vector-! gp-1 (-> self focus-pos) (-> self root-override2 trans)) + (ja-no-eval :group! a1-3 + :num! (seek! (the float (+ (-> (the-as art-joint-anim a1-3) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) gp-1 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((v1-27 (-> self nav state))) + (set! (-> v1-27 speed) 8192.0) + ) + 0 + (let ((gp-2 (new 'stack-no-clear 'vector))) + (vector-z-quaternion! gp-2 (-> self root-override2 quat)) + (set! (-> self nav state heading quad) (-> gp-2 quad)) + ) + 0 + (enemy-method-72 self) + (none) + ) + ) + +(defstate circling (amphibian) + :virtual #t + :code (behavior () + (nav-enemy-method-165 self) + (until #f + (amphibian-method-187 self) + (suspend) + ) + #f + (none) + ) + ) + +(defstate pacing (amphibian) + :virtual #t + :code (behavior () + (until #f + (amphibian-method-187 self) + (suspend) + ) + #f + (none) + ) + ) + +(defstate stop-chase (amphibian) + :virtual #t + :code (behavior () + (until #f + (amphibian-method-187 self) + (suspend) + ) + #f + (none) + ) + ) + +(defstate stare (amphibian) + :virtual #t + :enter (behavior () + (local-vars (gp-0 vector)) + (let ((t9-0 (-> (method-of-type nav-enemy stare) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (let ((v1-8 (-> self nav))) + (set! (-> v1-8 turning-acceleration) 204800.0) + ) + 0 + (let ((a0-5 (handle->process (-> self focus handle)))) + (set! gp-0 (cond + (a0-5 + (set! gp-0 (-> self focus-pos)) + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-5) 0) quad)) + gp-0 + ) + (else + (vector-z-quaternion! (-> self focus-pos) (-> self root-override2 quat)) + (let ((f30-0 (get-rand-float-range self 8192.0 16384.0))) + (if (zero? (get-rand-int self 2)) + (set! f30-0 (- f30-0)) + ) + (vector-rotate-around-y! (-> self focus-pos) (-> self focus-pos) f30-0) + ) + (vector-normalize! (-> self focus-pos) 12288.0) + (vector+! (-> self focus-pos) (-> self focus-pos) (-> self root-override2 trans)) + ) + ) + ) + ) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy stare) exit))) + (if t9-0 + (t9-0) + ) + ) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.07)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (set-vector! s5-0 (- (-> s4-0 z)) 0.0 (-> s4-0 x) 1.0) + (vector-! gp-0 (-> self focus-pos) (-> self root-override2 trans)) + (vector-normalize! s4-0 1.0) + (vector-normalize! gp-0 1.0) + (cond + ((>= (vector-dot s4-0 gp-0) 0.707) + (ja-no-eval :group! amphibian-attack-forward-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-forward-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + ) + (else + (let ((v1-22 (>= (vector-dot s5-0 gp-0) 0.0))) + (if (logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (set! v1-22 (not v1-22)) + ) + (if v1-22 + (ja-no-eval :group! amphibian-attack-right-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-right-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + (ja-no-eval :group! amphibian-attack-left-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-left-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + ) + ) + ) + ) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 2.0 0)) + (suspend) + (ja :num! (seek!)) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 6.0 0)) + (seek-to-point-toward-point! (-> self root-override2) (-> self focus-pos) 546133.3 (seconds 0.1)) + (suspend) + (ja :num! (seek!)) + ) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (go-virtual stare-idle) + (none) + ) + ) + +(defstate stare-idle (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + ((-> (method-of-type nav-enemy stare) enter)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :exit (-> (method-of-type nav-enemy stare) exit) + :trans (-> (method-of-type nav-enemy stare) trans) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((gp-0 (get-rand-int-range self 1 3))) + (dotimes (s5-0 gp-0) + (ja-no-eval :group! amphibian-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-idle-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (go-virtual stare) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-stare-post) + ) + +(defstate hostile (amphibian) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (go-virtual attack-spin) + ) + (let ((a0-2 (enemy-method-107 self))) + (when a0-2 + (let* ((s5-0 (get-trans a0-2 0)) + (f30-0 (vector-vector-xz-distance s5-0 (-> self root-override2 trans))) + ) + (when (>= 20480.0 f30-0) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (vector-! gp-0 s5-0 (-> self root-override2 trans)) + (let ((f28-0 (quaternion-y-angle (-> self root-override2 quat))) + (f0-3 (atan (-> gp-0 x) (-> gp-0 z))) + ) + (if (>= 8192.0 (fabs (deg- f28-0 f0-3))) + (go-virtual attack-forward) + ) + ) + ) + (if (>= 14336.0 f30-0) + (go-virtual attack-spin) + ) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (until #f + (amphibian-method-187 self) + (suspend) + ) + #f + (none) + ) + ) + +(defstate attack-forward (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (let ((v1-7 (-> self nav))) + (set! (-> v1-7 turning-acceleration) 204800.0) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-11 *game-info*) + (a0-7 (+ (-> v1-11 attack-id) 1)) + ) + (set! (-> v1-11 attack-id) a0-7) + (set! (-> self attack-id) a0-7) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (enemy-method-72 self) + ) + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable gp-0) 0) quad)) + ) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.07)) + (ja-no-eval :group! amphibian-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 2.0 0)) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual attack-forward-lunge) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-simple-post) + ) + +(defstate attack-forward-lunge (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + (let ((v1-1 (-> self nav state))) + (set! (-> v1-1 speed) 51200.0) + ) + 0 + (let ((v1-3 (-> self nav))) + (set! (-> v1-3 turning-acceleration) 204800.0) + ) + 0 + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (let ((v1-7 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-7 enemy-flags))) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-7 enemy-flags)))) + ) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-7 enemy-flags)))) + (set! (-> v1-7 nav callback-info) (-> v1-7 enemy-info-override callback-info)) + ) + 0 + (let ((v1-10 self)) + (set! (-> v1-10 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-10 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (until (>= (ja-aframe-num 0) (ja-aframe 8.0 0)) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual attack-forward-end) + (none) + ) + :post (behavior () + (let ((a0-1 (handle->process (-> self focus handle)))) + (if a0-1 + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable a0-1) 0) quad)) + ) + ) + (let ((a0-4 (-> self nav state)) + (v1-8 (-> self focus-pos)) + ) + (logclear! (-> a0-4 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-4 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-4 target-post quad) (-> v1-8 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +(defstate attack-forward-end (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-4 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-simple-post) + ) + +(defstate attack-spin (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 turning-acceleration) 204800.0) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-13 *game-info*) + (a0-9 (+ (-> v1-13 attack-id) 1)) + ) + (set! (-> v1-13 attack-id) a0-9) + (set! (-> self attack-id) a0-9) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (enemy-method-72 self) + ) + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable gp-0) 0) quad)) + ) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.07)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (set-vector! s5-0 (- (-> s4-0 z)) 0.0 (-> s4-0 x) 1.0) + (vector-! gp-0 (-> self focus-pos) (-> self root-override2 trans)) + (vector-normalize! s4-0 1.0) + (vector-normalize! gp-0 1.0) + (cond + ((>= (vector-dot s4-0 gp-0) 0.707) + (ja-no-eval :group! amphibian-attack-forward-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-forward-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + ) + (else + (let ((v1-22 (>= (vector-dot s5-0 gp-0) 0.0))) + (if (logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (set! v1-22 (not v1-22)) + ) + (if v1-22 + (ja-no-eval :group! amphibian-attack-right-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-right-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + (ja-no-eval :group! amphibian-attack-left-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-left-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + ) + ) + ) + ) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 2.0 0)) + (suspend) + (ja :num! (seek!)) + ) + (let ((a0-22 (handle->process (-> self focus handle)))) + (if a0-22 + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable a0-22) 0) quad)) + ) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 6.0 0)) + (seek-to-point-toward-point! (-> self root-override2) (-> self focus-pos) 546133.3 (seconds 0.1)) + (suspend) + (ja :num! (seek!)) + ) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-simple-post) + ) + +(defstate tongue-attack (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + ((-> (method-of-type nav-enemy hostile) enter)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-4 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (set! (-> self tongue-scale) 0.0) + (set! (-> self tongue-mode) (the-as uint 0)) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (sound-play "tongue-warn") + (let ((gp-1 (new 'stack-no-clear 'amphibian-tongue-attack-info))) + (amphibian-method-185 self gp-1) + (set! (-> self tongue-mod max-length) (-> gp-1 max-length)) + (set! (-> self tongue-mod target quad) (-> gp-1 clamped-pos quad)) + ) + (none) + ) + :exit (behavior () + (set! (-> self draw bounds w) 22528.0) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (let ((v1-0 (-> self tongue-mode))) + (cond + ((zero? v1-0) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.8)) + (set! (-> self tongue-mode) (the-as uint 1)) + (sound-play "tongue-attack") + ) + ) + ((= v1-0 1) + (cond + ((= (-> self tongue-scale) 1.0) + (set! (-> self tongue-mode) (the-as uint 2)) + (seek! (-> self tongue-scale) 0.0 (* 7.0 (-> self clock seconds-per-frame))) + ) + (else + (seek! (-> self tongue-scale) 1.0 (* 7.0 (-> self clock seconds-per-frame))) + ) + ) + ) + ((= v1-0 2) + (if (= (-> self tongue-scale) 0.0) + (set! (-> self tongue-mode) (the-as uint 3)) + (seek! (-> self tongue-scale) 0.0 (* 7.0 (-> self clock seconds-per-frame))) + ) + ) + ) + ) + (cond + ((and (or (= (-> self tongue-mode) 1) (= (-> self tongue-mode) 2)) (!= (-> self tongue-scale) 0.0)) + (amphibian-joint-mod-method-9 (-> self tongue-mod)) + (let ((gp-1 (new 'stack-no-clear 'vector)) + (s5-1 (new 'stack-no-clear 'vector)) + ) + (amphibian-method-184 self gp-1 s5-1) + (let ((a1-5 (new 'stack-no-clear 'vector))) + (vector+! a1-5 (-> self draw origin) (-> self draw bounds)) + (set! (-> self draw bounds w) (fmax 22528.0 (+ 12288.0 (vector-vector-distance s5-1 a1-5)))) + ) + (if (amphibian-method-186 self gp-1 s5-1) + (set! (-> self tongue-mode) (the-as uint 2)) + ) + ) + ) + (else + (set! (-> self draw bounds w) 22528.0) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.7)) + (ja-no-eval :group! amphibian-tongue-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-tongue-attack-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-simple-post) + ) + +;; WARN: Return type mismatch nav-enemy vs amphibian. +(defmethod relocate amphibian ((obj amphibian) (arg0 int)) + (if (nonzero? (-> obj tongue-mod)) + (&+! (-> obj tongue-mod) arg0) + ) + (the-as amphibian ((method-of-type nav-enemy relocate) obj arg0)) + ) + +(defmethod enemy-method-114 amphibian ((obj amphibian)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 5) 0))) + (set! (-> s5-0 total-prims) (the-as uint 6)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 8192.0 0.0 19660.8) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-13 local-sphere) 0.0 4915.2 0.0 4915.2) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action deadly)) + (set! (-> v1-15 transform-index) 12) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 transform-index) 20) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 transform-index) 22) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 4505.6) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-with) (collide-spec backgnd obstacle hit-by-others-list)) + (set! (-> v1-21 prim-core action) (collide-action solid)) + (set-vector! (-> v1-21 local-sphere) 0.0 11468.8 0.0 11468.8) + ) + (set! (-> s5-0 nav-radius) 10240.0) + (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) + ) + +(defmethod enemy-method-115 amphibian ((obj amphibian)) + "@abstract" + (set! (-> obj attacker-handle) (the-as handle #f)) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-amphibian" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *amphibian-nav-enemy-info*) + (set! (-> obj tongue-mod) (new 'process 'amphibian-joint-mod obj 14)) + (let ((v1-6 (-> obj neck))) + (set! (-> v1-6 up) (the-as uint 1)) + (set! (-> v1-6 nose) (the-as uint 2)) + (set! (-> v1-6 ear) (the-as uint 0)) + (set-vector! (-> v1-6 twist-max) 10012.444 10012.444 0.0 1.0) + (set! (-> v1-6 ignore-angle) 20024.889) + ) + (let ((v1-8 (-> obj nav))) + (set! (-> v1-8 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (set! (-> obj prev-ry) (quaternion-y-angle (-> obj root-override2 quat))) + (set! (-> obj prev-ry1) (-> obj prev-ry)) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/common/enemy/baby_spider/tomb-baby-spider.gc b/goal_src/jak2/levels/common/enemy/baby_spider/tomb-baby-spider.gc index d6cd662b6b..4da375cacd 100644 --- a/goal_src/jak2/levels/common/enemy/baby_spider/tomb-baby-spider.gc +++ b/goal_src/jak2/levels/common/enemy/baby_spider/tomb-baby-spider.gc @@ -7,3 +7,751 @@ ;; DECOMP BEGINS +(deftype tomb-baby-spider (nav-enemy) + () + :heap-base #x1e0 + :method-count-assert 180 + :size-assert #x25c + :flag-assert #xb401e0025c + (:methods + (attack () _type_ :state 178) + (attack-stop () _type_ :state 179) + ) + ) + + +(defskelgroup skel-tomb-baby-spider tomb-baby-spider tomb-baby-spider-lod0-jg tomb-baby-spider-idle-ja + ((tomb-baby-spider-lod0-mg (meters 20)) (tomb-baby-spider-lod1-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5.5) + :shadow tomb-baby-spider-shadow-mg + ) + +(define *tomb-baby-spider-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #f + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1e0002 #x64640401 #x0 #x0) + :idle-anim 4 + :notice-anim 5 + :hostile-anim 8 + :hit-anim 4 + :knocked-anim 14 + :knocked-land-anim 15 + :die-anim 13 + :die-falling-anim 13 + :victory-anim 4 + :jump-wind-up-anim 4 + :jump-in-air-anim 4 + :jump-land-anim 4 + :neck-joint -1 + :look-at-joint 3 + :bullseye-joint 3 + :sound-die (static-sound-name "bspider-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 2) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #x11fffdffa + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 6) + :attack-shove-up (meters 3) + :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-seek-ry-clamp 2730.6667 + :knocked-soft-vxz-lo 80281.6 + :knocked-soft-vxz-hi 87654.4 + :knocked-soft-vy-lo 67993.6 + :knocked-soft-vy-hi 112230.4 + :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 55705.6 + :knocked-hard-vxz-hi 71270.4 + :knocked-hard-vy-lo 88473.6 + :knocked-hard-vy-hi 132710.4 + :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 55705.6 + :knocked-red-vxz-hi 71270.4 + :knocked-red-vy-lo 88473.6 + :knocked-red-vy-hi 132710.4 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint -1 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #f + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 5 + :turn-anim 5 + :run-anim 8 + :taunt-anim -1 + :run-travel-speed (meters 6) + :run-acceleration (meters 4) + :run-turning-acceleration (meters 18) + :walk-travel-speed (meters 4) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 180.0) + :notice-nav-radius (meters 2) + :frustration-distance (meters 6) + :frustration-time (seconds 4) + :blocked-time (seconds 0.3) + :circle-dist-lo 20480.0 + :circle-dist-hi 61440.0 + :nav-mesh #f + ) + ) + +(set! (-> *tomb-baby-spider-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defstate active (tomb-baby-spider) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override walk-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override walk-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (when (enemy-method-123 self 0.2) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (let ((v1-37 self)) + (set! (-> v1-37 enemy-flags) (the-as enemy-flag (logclear (-> v1-37 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-37 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (until (not (enemy-method-123 self 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((v1-101 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-101 enemy-flags))) + (set! (-> v1-101 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-101 enemy-flags)))) + ) + (set! (-> v1-101 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-101 enemy-flags)))) + (set! (-> v1-101 nav callback-info) (-> v1-101 enemy-info-override callback-info)) + ) + 0 + (nav-enemy-method-165 self) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override walk-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override walk-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + #f + (none) + ) + ) + +(defstate notice (tomb-baby-spider) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (let ((a0-3 (handle->process (-> self focus handle)))) + (cond + (a0-3 + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-3) 0) quad)) + ) + (else + (let ((a1-4 (-> self nav state))) + (set! (-> gp-0 quad) (-> a1-4 target-post quad)) + ) + ) + ) + ) + (ja-no-eval :group! tomb-baby-spider-notice-spin-ja + :num! (seek! + (the float (+ (-> (the-as art-joint-anim tomb-baby-spider-notice-spin-ja) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-to-point-toward-point! + (-> self root-override2) + gp-0 + (* 1.8 (-> self nav max-rotation-rate)) + (seconds 0.02) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (ja-no-eval :group! tomb-baby-spider-notice-land-ja + :num! (seek! + (the float (+ (-> (the-as art-joint-anim tomb-baby-spider-notice-land-ja) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +(defstate attack (tomb-baby-spider) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior tomb-baby-spider) + enemy-event-handler + ) + :enter (behavior () + (nav-enemy-method-166 self) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let ((v1-9 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-9 local-sphere w) 4915.2) + ) + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (let* ((v1-14 *game-info*) + (v0-2 (+ (-> v1-14 attack-id) 1)) + ) + (set! (-> v1-14 attack-id) v0-2) + (set! (-> self attack-id) v0-2) + ) + (none) + ) + :exit (behavior () + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-3 local-sphere w) 819.2) + ) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (nav-enemy-method-165 self) + (none) + ) + :trans (behavior () + (enemy-method-49 self) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + ) + (none) + ) + :code (behavior () + (let ((v1-0 (-> self nav))) + (set! (-> v1-0 target-speed) (* 2.8 (-> self enemy-info-override run-travel-speed))) + ) + 0 + (let ((v1-2 (-> self nav))) + (set! (-> v1-2 acceleration) (* 2.4 (-> self enemy-info-override run-acceleration))) + ) + 0 + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! tomb-baby-spider-attack0-start-ja + :num! (seek! + (the float (+ (-> (the-as art-joint-anim tomb-baby-spider-attack0-start-ja) frames num-frames) -1)) + 0.8 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.8)) + ) + (go-virtual attack-stop) + (none) + ) + :post (the-as (function none :behavior tomb-baby-spider) nav-enemy-chase-post) + ) + +(defstate attack-stop (tomb-baby-spider) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior tomb-baby-spider) + enemy-event-handler + ) + :enter (behavior () + (let ((v1-0 (-> self nav))) + (set! (-> v1-0 target-speed) 0.0) + ) + 0 + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :exit (behavior () + (let ((v1-0 self)) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-0 enemy-flags)))) + ) + 0 + (none) + ) + :code (behavior () + (ja-no-eval :group! tomb-baby-spider-attack0-stop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-baby-spider-attack0-stop-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (when (not (enemy-method-96 self 6371.5557 #t)) + (let ((v1-27 self)) + (set! (-> v1-27 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-27 enemy-flags)))) + ) + 0 + (let ((t9-4 vector-normalize!) + (a0-7 (new 'stack-no-clear 'vector)) + (a2-3 (-> self nav state)) + (v1-30 (new 'stack-no-clear 'vector)) + ) + (set! (-> v1-30 quad) (-> a2-3 target-post quad)) + (let* ((s5-0 (t9-4 (vector-! a0-7 v1-30 (-> self root-override2 trans)) 1.0)) + (f30-0 (deg-diff (quaternion-y-angle (-> self root-override2 quat)) (vector-y-angle s5-0))) + ) + (ja-no-eval :num! (loop!)) + (cond + ((< 0.0 f30-0) + (ja-channel-push! 1 (seconds 0.1)) + (ja :group! tomb-baby-spider-turn-left-ja :num! min) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (ja :group! tomb-baby-spider-turn-right-ja :num! min) + ) + ) + ) + ) + (until (enemy-method-96 self 910.2222 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop!)) + ) + (let ((v1-53 self)) + (set! (-> v1-53 enemy-flags) (the-as enemy-flag (logclear (-> v1-53 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (ja-channel-push! 1 (seconds 0.2)) + (let ((gp-3 (-> self clock frame-counter)) + (s5-1 (the int (* 300.0 (rand-vu-float-range 0.6 1.2)))) + (f30-2 1.0) + ) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (loop! f30-2) + :frame-num 0.0 + ) + (until (>= (- (-> self clock frame-counter) gp-3) s5-1) + (suspend) + (ja :num! (loop! f30-2)) + ) + ) + (let ((gp-4 (-> self focus aware))) + (if (or (not (enemy-method-107 self)) (!= gp-4 3)) + (go-stare self) + ) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior tomb-baby-spider) nav-enemy-face-focus-post) + ) + +(defstate hostile (tomb-baby-spider) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (enemy-method-107 self))) + (when a0-1 + (let ((a0-2 (get-trans a0-1 0))) + (if (and (< (vector-vector-distance a0-2 (-> self root-override2 trans)) 20480.0) + (enemy-method-96 self 1274.3112 #t) + ) + (go-virtual attack) + ) + ) + ) + ) + (none) + ) + ) + +(defmethod enemy-method-77 tomb-baby-spider ((obj tomb-baby-spider) (arg0 (pointer float))) + (let* ((a2-0 (the-as collide-shape-prim-group (-> obj root-override2 root-prim))) + (v1-2 (-> a2-0 child 3)) + ) + (dotimes (a3-0 3) + (set! (-> a2-0 child a3-0 local-sphere w) 819.2) + ) + (set! (-> v1-2 prim-core action) (collide-action solid)) + (set! (-> v1-2 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-2 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle player-list blocking-plane pusher) + ) + ) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((v1-6 (-> obj skel root-channel 0))) + (set! (-> v1-6 frame-group) (the-as art-joint-anim (-> obj draw art-group data 20))) + (set! (-> v1-6 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 20)) frames num-frames) -1)) + ) + (set! (-> v1-6 param 1) (-> arg0 0)) + (set! (-> v1-6 frame-num) 0.0) + (joint-control-channel-group! v1-6 (the-as art-joint-anim (-> obj draw art-group data 20)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-2) (knocked-type knocked-type-5)) + (let ((v1-11 (-> obj skel root-channel 0))) + (set! (-> v1-11 frame-group) (the-as art-joint-anim (-> obj draw art-group data 17))) + (set! (-> v1-11 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 17)) frames num-frames) -1)) + ) + (set! (-> v1-11 param 1) (-> arg0 0)) + (set! (-> v1-11 frame-num) 0.0) + (joint-control-channel-group! v1-11 (the-as art-joint-anim (-> obj draw art-group data 17)) num-func-seek!) + ) + #t + ) + (else + ((method-of-type nav-enemy enemy-method-77) obj arg0) + ) + ) + ) + +(defmethod enemy-method-78 tomb-baby-spider ((obj tomb-baby-spider) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((v1-3 (-> obj skel root-channel 0))) + (set! (-> v1-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> v1-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> v1-3 param 1) (-> arg0 0)) + (set! (-> v1-3 frame-num) 0.0) + (joint-control-channel-group! v1-3 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-2) (knocked-type knocked-type-5)) + (let ((v1-8 (-> obj skel root-channel 0))) + (set! (-> v1-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 18))) + (set! (-> v1-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 18)) frames num-frames) -1)) + ) + (set! (-> v1-8 param 1) (-> arg0 0)) + (set! (-> v1-8 frame-num) 0.0) + (joint-control-channel-group! v1-8 (the-as art-joint-anim (-> obj draw art-group data 18)) num-func-seek!) + ) + #t + ) + (else + ((method-of-type nav-enemy enemy-method-78) obj arg0) + ) + ) + ) + +(defmethod enemy-method-79 tomb-baby-spider ((obj tomb-baby-spider) (arg0 int) (arg1 enemy-knocked-info)) + (case arg0 + ((3) + (let ((s4-0 (ja-done? 0))) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 param 0) (the float (+ (-> a0-3 frame-group frames num-frames) -1))) + (set! (-> a0-3 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-3 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s4-0 + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + ) + (((knocked-type knocked-type-2) (knocked-type knocked-type-5)) + (let ((a0-7 (-> obj skel root-channel 0))) + (set! (-> a0-7 frame-group) (the-as art-joint-anim (-> obj draw art-group data 19))) + (set! (-> a0-7 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 19)) frames num-frames) -1)) + ) + (set! (-> a0-7 param 1) (-> arg1 anim-speed)) + (set! (-> a0-7 frame-num) 0.0) + (joint-control-channel-group! a0-7 (the-as art-joint-anim (-> obj draw art-group data 19)) num-func-seek!) + ) + ) + (else + (let ((a0-8 (-> obj skel root-channel 0))) + (set! (-> a0-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 16))) + (set! (-> a0-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 16)) frames num-frames) -1)) + ) + (set! (-> a0-8 param 1) (-> arg1 anim-speed)) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim (-> obj draw art-group data 16)) num-func-seek!) + ) + ) + ) + (vector-reset! (-> obj root-override2 transv)) + #t + ) + ) + ) + ((4) + (let ((s4-1 (ja-done? 0))) + (let ((a0-11 (-> obj skel root-channel 0))) + (set! (-> a0-11 param 0) (the float (+ (-> a0-11 frame-group frames num-frames) -1))) + (set! (-> a0-11 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-11 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s4-1 + (let ((v1-50 (-> obj root-override2 root-prim))) + (set! (-> (the-as collide-shape-prim-group v1-50) child 0 local-sphere w) 1638.4) + (set! (-> (the-as collide-shape-prim-group v1-50) child 1 local-sphere w) 1638.4) + (set! (-> (the-as collide-shape-prim-group v1-50) child 2 local-sphere w) 3276.8) + (set! (-> (the-as collide-shape-prim-group v1-50) child 3 prim-core action) (collide-action)) + (set! (-> (the-as collide-shape-prim-group v1-50) child 3 prim-core collide-with) (collide-spec)) + ) + 0 + ) + s4-1 + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + +(defmethod enemy-method-104 tomb-baby-spider ((obj tomb-baby-spider) (arg0 process) (arg1 uint) (arg2 uint)) + (let* ((s1-0 arg0) + (s2-0 (if (type? s1-0 process-focusable) + s1-0 + ) + ) + (s1-1 *target*) + (v1-0 (if (type? s1-1 process-focusable) + s1-1 + ) + ) + (f0-0 1.0) + ) + (if (and (= s2-0 v1-0) (logtest? (focus-status indax) (-> v1-0 focus-status))) + (set! f0-0 0.6) + ) + (let ((a1-5 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-5 from) (process->ppointer self)) + (set! (-> a1-5 num-params) 2) + (set! (-> a1-5 message) 'attack) + (set! (-> a1-5 param 0) arg1) + (let ((v1-9 (new 'static 'attack-info :mask (attack-info-mask mode shove-back shove-up id damage knock)))) + (set! (-> v1-9 id) arg2) + (set! (-> v1-9 shove-back) (* f0-0 (-> obj enemy-info-override attack-shove-back))) + (set! (-> v1-9 shove-up) (* f0-0 (-> obj enemy-info-override attack-shove-up))) + (set! (-> v1-9 mode) (-> obj enemy-info-override attack-mode)) + (set! (-> v1-9 damage) (the float (-> obj enemy-info-override attack-damage))) + (set! (-> v1-9 knock) (the-as uint 8)) + (set! (-> a1-5 param 1) (the-as uint v1-9)) + ) + (when (send-event-function arg0 a1-5) + (enemy-method-105 obj arg0) + #t + ) + ) + ) + ) + +(defmethod enemy-method-114 tomb-baby-spider ((obj tomb-baby-spider)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 5) 0))) + (set! (-> s5-0 total-prims) (the-as uint 6)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 409.6 0.0 7782.4) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-13 transform-index) 3) + (set-vector! (-> v1-13 local-sphere) 0.0 0.0 0.0 1638.4) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-15 prim-core action) (collide-action solid deadly no-standon)) + (set! (-> v1-15 transform-index) 24) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 1638.4) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-17 transform-index) 4) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (set-vector! + (-> (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)) local-sphere) + 0.0 + 2867.2 + 0.0 + 3276.8 + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-21 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-21 transform-index) 5) + (set-vector! (-> v1-21 local-sphere) 0.0 4096.0 -1228.8 1638.4) + ) + (set! (-> s5-0 nav-radius) 3686.4) + (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) + ) + +(defmethod enemy-method-115 tomb-baby-spider ((obj tomb-baby-spider)) + "@abstract" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-baby-spider" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *tomb-baby-spider-nav-enemy-info*) + (none) + ) + +(deftype dig-spider (tomb-baby-spider) + () + :heap-base #x1e0 + :method-count-assert 180 + :size-assert #x25c + :flag-assert #xb401e0025c + ) diff --git a/goal_src/jak2/levels/common/enemy/hopper.gc b/goal_src/jak2/levels/common/enemy/hopper.gc index 9d367f0f78..c9b1df994d 100644 --- a/goal_src/jak2/levels/common/enemy/hopper.gc +++ b/goal_src/jak2/levels/common/enemy/hopper.gc @@ -7,3 +7,994 @@ ;; DECOMP BEGINS +(deftype hopper (nav-enemy) + ((speed-y float :offset-assert 604) + (accel-y float :offset-assert 608) + (next-jump-time int32 :offset-assert 612) + (path-intro path-control :offset-assert 616) + (can-go-knocked? symbol :offset-assert 620) + (land-anim-index int32 :offset-assert 624) + (step-num int32 :offset-assert 628) + (best-point vector :inline :offset-assert 640) + (best-score float :offset-assert 656) + (origin vector :inline :offset-assert 672) + (direction vector :inline :offset-assert 688) + (jump-dist float :offset-assert 704) + (side float :offset-assert 708) + (jump-start-anim uint32 :offset-assert 712) + (jump-air-anim uint32 :offset-assert 716) + (jump-land-anim uint32 :offset-assert 720) + (jump-height-min float :offset-assert 724) + (jump-anim-start-frame float :offset-assert 728) + (minimap connection-minimap :offset-assert 732) + ) + :heap-base #x260 + :method-count-assert 180 + :size-assert #x2e0 + :flag-assert #xb4026002e0 + (:methods + (hopper-method-178 (_type_) symbol 178) + (hopper-method-179 (_type_) none 179) + ) + ) + + +(defskelgroup skel-hopper hopper hopper-lod0-jg hopper-idle-ja + ((hopper-lod0-mg (meters 20)) (hopper-lod1-mg (meters 999999))) + :bounds (static-spherem 0 2.25 -0.7 6.5) + :shadow hopper-shadow-mg + ) + +(deftype hopper-anim-info (structure) + ((hit-anim-index int32 :offset-assert 0) + (land-anim-index int32 :offset-assert 4) + ) + :pack-me + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + + +(deftype hopper-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (yellow-hit-anim hopper-anim-info 3 :inline :offset-assert 8) + (blue-hit-anim hopper-anim-info 3 :inline :offset-assert 32) + ) + :method-count-assert 9 + :size-assert #x38 + :flag-assert #x900000038 + ) + + +(define *hopper-global-info* (new 'static 'hopper-global-info + :yellow-hit-anim (new 'static 'inline-array hopper-anim-info 3 + (new 'static 'hopper-anim-info :hit-anim-index 25 :land-anim-index 26) + (new 'static 'hopper-anim-info :hit-anim-index 27 :land-anim-index 28) + (new 'static 'hopper-anim-info :hit-anim-index 29 :land-anim-index 30) + ) + :blue-hit-anim (new 'static 'inline-array hopper-anim-info 3 + (new 'static 'hopper-anim-info :hit-anim-index 21 :land-anim-index 24) + (new 'static 'hopper-anim-info :hit-anim-index 22 :land-anim-index 24) + (new 'static 'hopper-anim-info :hit-anim-index 23 :land-anim-index 24) + ) + ) + ) + +(defmethod enemy-method-77 hopper ((obj hopper) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let* ((a2-0 (ash 1 (-> *hopper-global-info* prev-blue-hit))) + (v1-3 (enemy-method-120 obj 3 a2-0)) + (a1-5 (-> obj draw art-group data (-> *hopper-global-info* blue-hit-anim v1-3 hit-anim-index))) + ) + (set! (-> *hopper-global-info* prev-blue-hit) v1-3) + (let ((a0-12 (-> obj skel root-channel 0))) + (set! (-> a0-12 frame-group) (the-as art-joint-anim a1-5)) + (set! (-> a0-12 param 0) (the float (+ (-> (the-as art-joint-anim a1-5) frames num-frames) -1))) + (set! (-> a0-12 param 1) 1.0) + (set! (-> a0-12 frame-num) 0.0) + (joint-control-channel-group! a0-12 (the-as art-joint-anim a1-5) num-func-seek!) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let* ((a2-2 (ash 1 (-> *hopper-global-info* prev-yellow-hit))) + (v1-13 (enemy-method-120 obj 3 a2-2)) + (a1-11 (-> obj draw art-group data (-> *hopper-global-info* yellow-hit-anim v1-13 hit-anim-index))) + ) + (set! (-> obj land-anim-index) (-> *hopper-global-info* yellow-hit-anim v1-13 land-anim-index)) + (set! (-> *hopper-global-info* prev-yellow-hit) v1-13) + (let ((a0-27 (-> obj skel root-channel 0))) + (set! (-> a0-27 frame-group) (the-as art-joint-anim a1-11)) + (set! (-> a0-27 param 0) (the float (+ (-> (the-as art-joint-anim a1-11) frames num-frames) -1))) + (set! (-> a0-27 param 1) (-> arg0 0)) + (set! (-> a0-27 frame-num) 0.0) + (joint-control-channel-group! a0-27 (the-as art-joint-anim a1-11) num-func-seek!) + ) + ) + ) + ) + #t + ) + +(defmethod enemy-method-78 hopper ((obj hopper) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((s4-0 (-> obj draw art-group data 24))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-3 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) 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 s4-0) num-func-seek!) + ) + ) + #t + ) + #f + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data (-> obj land-anim-index)))) + (set! (-> a0-5 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj land-anim-index))) 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 (-> obj draw art-group data (-> obj land-anim-index))) + num-func-seek! + ) + ) + #t + ) + ) + ) + +(define *hopper-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 #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 8 #x5010401 #x1010501 #x5010401 #x1010601 #x0 #x0 #x0 #x0) + :idle-anim 4 + :notice-anim 7 + :hostile-anim 4 + :hit-anim 4 + :knocked-anim 25 + :knocked-land-anim 26 + :die-anim 19 + :die-falling-anim 20 + :victory-anim -1 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :sound-hit (static-sound-name "hopper-hit") + :sound-die (static-sound-name "hopper-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 40) + :proximity-notice-distance (meters 4) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :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-seek-ry-clamp 4551.1113 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 5 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 1843.2 :z 1884.16 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 4 + :turn-anim 9 + :run-anim 13 + :taunt-anim -1 + :run-travel-speed (meters 1) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 2) + :walk-travel-speed (meters 1) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 2) + :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! (-> *hopper-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod enemy-method-73 hopper ((obj hopper)) + (cond + ((-> obj can-go-knocked?) + (set! (-> obj can-go-knocked?) #f) + (go (method-of-object obj knocked)) + ) + (else + ((method-of-type nav-enemy enemy-method-73) obj) + ) + ) + (none) + ) + +(defmethod enemy-method-90 hopper ((obj hopper) (arg0 int) (arg1 enemy-jump-info)) + (when (= (-> obj jump-why) 2) + (cond + ((zero? arg0) + (logior! (-> obj focus-status) (focus-status touch-water under-water)) + ) + (else + (when (logtest? (-> obj focus-status) (focus-status touch-water)) + (let ((s3-0 (new 'stack-no-clear 'water-info))) + (water-info-init! (-> obj root-override2) s3-0 (collide-action solid semi-solid)) + (let ((v1-9 #f)) + (cond + ((not (logtest? (water-flags touch-water) (-> s3-0 flags))) + (if (logtest? (-> obj focus-status) (focus-status under-water)) + (set! v1-9 #t) + ) + (logclear! (-> obj focus-status) (focus-status touch-water under-water)) + ) + ((logtest? (-> obj focus-status) (focus-status under-water)) + (let ((f0-1 (+ 11264.0 (-> obj root-override2 trans y)))) + (if (< (-> s3-0 trans y) f0-1) + (set! v1-9 #t) + ) + ) + ) + ) + (when v1-9 + (logclear! (-> obj focus-status) (focus-status under-water)) + (let ((s2-0 (new 'stack-no-clear 'vector))) + (set! (-> s2-0 quad) (-> obj root-override2 trans quad)) + (when (logtest? (water-flags touch-water) (-> s3-0 flags)) + (set! (-> s2-0 y) (-> s3-0 trans y)) + (let ((s3-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s3-1 + (let ((t9-2 (method-of-type part-tracker activate))) + (t9-2 + (the-as part-tracker s3-1) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-3 run-function-in-process) + (a0-26 s3-1) + (a1-6 part-tracker-init) + (a2-6 (-> *part-group-id-table* 121)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> s2-0 quad)) + ((the-as (function object object object object object object object object none) t9-3) + a0-26 + a1-6 + a2-6 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> s3-1 ppointer) + ) + ) + (sound-play "splash-out") + ) + ) + ) + ) + ) + ) + ) + ) + ) + ((method-of-type nav-enemy enemy-method-90) obj arg0 arg1) + ) + +(defmethod enemy-method-89 hopper ((obj hopper) (arg0 enemy-jump-info)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-2 (-> obj draw art-group data (-> obj jump-start-anim))) + (a0-4 (-> obj skel root-channel 0)) + ) + (set! (-> a0-4 frame-group) (the-as art-joint-anim a1-2)) + (set! (-> a0-4 param 0) (the float (+ (-> (the-as art-joint-anim a1-2) frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg0 anim-speed)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim a1-2) num-func-seek!) + ) + #t + ) + +(defmethod enemy-method-87 hopper ((obj hopper) (arg0 enemy-jump-info)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-2 (-> obj draw art-group data (-> obj jump-air-anim))) + (a0-4 (-> obj skel root-channel 0)) + ) + (set! (-> a0-4 frame-group) (the-as art-joint-anim a1-2)) + (set! (-> a0-4 param 0) (the float (+ (-> (the-as art-joint-anim a1-2) frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg0 anim-speed)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim a1-2) num-func-seek!) + ) + #t + ) + +(defmethod enemy-method-88 hopper ((obj hopper) (arg0 enemy-jump-info)) + (ja-channel-push! 1 (seconds 0.075)) + (let ((a1-2 (-> obj draw art-group data (-> obj jump-land-anim))) + (a0-4 (-> obj skel root-channel 0)) + ) + (set! (-> a0-4 frame-group) (the-as art-joint-anim a1-2)) + (set! (-> a0-4 param 0) (the float (+ (-> (the-as art-joint-anim a1-2) frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg0 anim-speed)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim a1-2) num-func-seek!) + ) + #t + ) + +(defstate jump (hopper) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy jump) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy jump) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self draw shadow-ctrl))) + (logclear! (-> v1-5 settings flags) (shadow-flags shdf03)) + (let ((a0-2 v1-5)) + (set! (-> a0-2 settings top-plane w) (- 4096.0)) + ) + 0 + (set! (-> v1-5 settings bot-plane w) (- -4096.0)) + ) + 0 + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy jump) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self draw shadow-ctrl))) + (logior! (-> v1-5 settings flags) (shadow-flags shdf03)) + (let ((a0-2 v1-5)) + (set! (-> a0-2 settings bot-plane w) + (- (+ (- -4096.0 (-> self root-override2 trans y)) (-> self root-override2 gspot-pos y))) + ) + ) + 0 + (set! (-> v1-5 settings top-plane w) + (- (+ (- 8192.0 (-> self root-override2 trans y)) (-> self root-override2 gspot-pos y))) + ) + ) + 0 + (none) + ) + ) + +(defmethod hopper-method-178 hopper ((obj hopper)) + (local-vars (sv-752 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (+! (-> obj step-num) -1) + (cond + ((>= (-> obj step-num) 0) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (vector-rotate-around-y! s3-0 (-> obj direction) (* 182.04445 (the float (+ (* (-> obj step-num) 16) -135)))) + (let ((a1-1 s5-0)) + (let ((v1-7 (-> obj origin))) + (let ((a0-2 s3-0)) + (let ((a2-1 (-> obj jump-dist))) + (.mov vf7 a2-1) + ) + (.lvf vf5 (&-> a0-2 quad)) + ) + (.lvf vf4 (&-> v1-7 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a1-1 quad) vf6) + ) + (let ((v1-8 (-> obj nav)) + (a0-3 s5-0) + (a1-2 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-2 point) a0-3 (-> v1-8 state mesh bounds)) + (set! (-> a1-2 y-threshold) (-> v1-8 nearest-y-threshold)) + (set! (-> a1-2 ignore) (the-as uint 2)) + (let ((s4-0 (find-poly-containing-point-local (-> v1-8 state mesh) a1-2))) + (when s4-0 + (let ((f30-0 (vector-dot s3-0 (-> obj direction)))) + (new 'stack-no-clear 'vector) + (let ((a1-3 (new 'stack-no-clear 'vector))) + (set! (-> a1-3 quad) (-> s5-0 quad)) + (set! (-> a1-3 w) 6144.0) + (when (not (add-root-sphere-to-hash! (-> obj nav) a1-3 #x8006c)) + (when (< (-> obj best-score) f30-0) + (set! (-> obj best-score) f30-0) + (let ((s2-0 (new 'stack-no-clear 'vector))) + (set! sv-752 (new 'stack-no-clear 'vector)) + (let ((s3-1 (new 'stack 'collide-query))) + (let ((s0-0 (-> obj nav)) + (s1-0 s2-0) + ) + (let* ((v1-21 s5-0) + (a0-10 (-> s0-0 state mesh)) + (t9-4 (method-of-object a0-10 project-point-onto-plane-of-poly-local)) + (a2-5 s1-0) + (t0-1 (vector-! (new 'stack-no-clear 'vector) v1-21 (-> s0-0 state mesh bounds))) + ) + (t9-4 a0-10 s4-0 a2-5 sv-752 t0-1) + ) + (vector+! s1-0 s1-0 (-> s0-0 state mesh bounds)) + ) + 0 + (set! (-> s5-0 y) (-> s2-0 y)) + (if (enemy-method-126 obj s3-1 s5-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> s5-0 y) (-> s3-1 best-other-tri intersect y)) + ) + ) + ) + (set! (-> obj best-point quad) (-> s5-0 quad)) + ) + ) + ) + ) + ) + ) + ) + ) + #t + ) + (else + #f + ) + ) + ) + ) + +(defstate stare (hopper) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy stare) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + ) + +(define *hopper-next-jump-time* (the-as time-frame 0)) + +(defstate hostile (hopper) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-4 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-7 enemy-flags)))) + ) + 0 + (set! (-> self speed-y) 0.0) + (set! (-> self accel-y) 0.0) + (set! (-> self next-jump-time) (the-as int (+ (-> self clock frame-counter) (get-rand-int-range self 0 120)))) + (set! (-> self step-num) 0) + (set! (-> self best-score) -2.0) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) exit))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (when (< *hopper-next-jump-time* (-> self clock frame-counter)) + (let ((gp-0 (handle->process (-> self focus handle)))) + (when gp-0 + (let ((s4-1 (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable gp-0) 0) + (-> self root-override2 trans) + ) + ) + ) + 0.0 + (let ((s5-0 (get-rand-int self 2))) + (set! (-> self direction y) 0.0) + (let* ((v1-12 s4-1) + (f30-0 (sqrtf (+ (* (-> v1-12 x) (-> v1-12 x)) (* (-> v1-12 z) (-> v1-12 z))))) + ) + (set! (-> self step-num) 16) + (set! (-> self direction quad) (-> s4-1 quad)) + 0.0 + (let ((s4-2 (new 'stack-no-clear 'vector)) + (f28-0 (if (zero? s5-0) + (get-rand-float-range self 4096.0 8192.0) + (get-rand-float-range self 8192.0 (fmin 40960.0 (fmax 16384.0 (* 0.5 f30-0)))) + ) + ) + ) + (vector-rotate90-around-y! s4-2 (-> self direction)) + (vector-normalize! (-> self direction) 1.0) + (if (< (+ -2048.0 f30-0) f28-0) + (set! f28-0 (+ -2048.0 f30-0)) + ) + (if (< f28-0 6144.0) + (set! s5-0 0) + ) + (set! (-> self jump-dist) f28-0) + ) + ) + (set! (-> self best-score) -2.0) + (set! (-> self origin quad) (-> self root-override2 trans quad)) + ;; cfg-17 label is never output by the decompiler + ;; (b! #t cfg-17) + (until (not (hopper-method-178 self)) + (empty) + ) + (when (!= (-> self best-score) -2.0) + (let* ((s4-4 (vector-! (new 'stack-no-clear 'vector) (-> self best-point) (-> self root-override2 trans))) + (f30-1 (deg-diff (quaternion-y-angle (-> self root-override2 quat)) (vector-y-angle s4-4))) + ) + (cond + ((< (vector-vector-xz-distance (-> self best-point) (get-trans (the-as process-focusable gp-0) 0)) 8192.0) + (when (enemy-method-107 self) + (cond + ((zero? s5-0) + (set! (-> self jump-start-anim) (the-as uint 34)) + (set! (-> self jump-air-anim) (the-as uint 35)) + (set! (-> self jump-land-anim) (the-as uint 36)) + (set! (-> self jump-height-min) 4096.0) + (set! (-> self jump-anim-start-frame) 2.0) + ) + (else + (if (< 2730.6667 (fabs f30-1)) + (set! (-> self jump-start-anim) (the-as uint (if (< 0.0 f30-1) + 11 + 12 + ) + ) + ) + (set! (-> self jump-start-anim) (the-as uint 10)) + ) + (cond + ((zero? (get-rand-int self 2)) + (set! (-> self jump-air-anim) (the-as uint 15)) + (set! (-> self jump-land-anim) (the-as uint 16)) + (set! (-> self jump-height-min) 12288.0) + (set! (-> self jump-anim-start-frame) 8.0) + ) + (else + (set! (-> self jump-air-anim) (the-as uint 17)) + (set! (-> self jump-land-anim) (the-as uint 18)) + (set! (-> self jump-height-min) 12288.0) + (set! (-> self jump-anim-start-frame) 8.0) + ) + ) + ) + ) + (set! *hopper-next-jump-time* (+ (-> self clock frame-counter) (get-rand-int-range self 4 22))) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag vulnerable)))) + (send-event self 'jump 0 (-> self best-point)) + ) + ) + (else + (cond + ((zero? s5-0) + (set! (-> self jump-start-anim) (the-as uint 31)) + (set! (-> self jump-air-anim) (the-as uint 32)) + (set! (-> self jump-land-anim) (the-as uint 33)) + (set! (-> self jump-height-min) 4096.0) + (set! (-> self jump-anim-start-frame) 2.0) + ) + (else + (if (< 2730.6667 (fabs f30-1)) + (set! (-> self jump-start-anim) (the-as uint (if (< 0.0 f30-1) + 11 + 12 + ) + ) + ) + (set! (-> self jump-start-anim) (the-as uint 10)) + ) + (set! (-> self jump-air-anim) (the-as uint 13)) + (set! (-> self jump-land-anim) (the-as uint 14)) + (set! (-> self jump-height-min) 12288.0) + (set! (-> self jump-anim-start-frame) 8.0) + ) + ) + (set! *hopper-next-jump-time* (+ (-> self clock frame-counter) (get-rand-int-range self 4 22))) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag vulnerable)))) + (send-event self 'jump 0 (-> self best-point)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (none) + ) + :post (the-as (function none :behavior hopper) nav-enemy-simple-post) + ) + +(defstate active (hopper) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! hopper-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim hopper-idle-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (the-as (function none :behavior hopper) nav-enemy-simple-post) + ) + +(defstate notice (hopper) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (if (zero? (get-rand-int self 2)) + (ja :group! hopper-notice-ja) + (ja :group! hopper-notice-alt-ja) + ) + (ja-no-eval :group! (ja-group) + :num! (seek! (the float (+ (-> (ja-group) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((a1-4 (-> self nav state))) + (set! (-> gp-0 quad) (-> a1-4 travel quad)) + ) + (seek-toward-heading-vec! (-> self root-override2) gp-0 (-> self nav max-rotation-rate) (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +(defstate ambush (hopper) + :virtual #t + :enter (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (logclear! (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (let ((gp-0 (-> self on-notice))) + (if gp-0 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (-> self root-override2 trans)) + (the-as pair gp-0) + ) + ) + ) + ) + (let ((v1-12 (-> self root-override2 root-prim))) + (set! (-> self root-override2 backup-collide-as) (-> v1-12 prim-core collide-as)) + (set! (-> self root-override2 backup-collide-with) (-> v1-12 prim-core collide-with)) + ) + (let ((v1-15 (-> self root-override2 root-prim))) + (set! (-> v1-15 prim-core collide-as) (collide-spec)) + (set! (-> v1-15 prim-core collide-with) (collide-spec)) + ) + 0 + (when (handle->process (-> self focus handle)) + (let ((gp-1 (-> self root-override2)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (let ((s4-0 (new 'stack-no-clear 'vector))) + 0.0 + (get-point-in-path! (-> self path-intro) s5-0 0.0 'exact) + (set! (-> s5-0 y) (+ -16384.0 (-> s5-0 y))) + (get-point-in-path! (-> self path-intro) s4-0 1.0 'exact) + (let ((f0-3 (deg-diff + (quaternion-y-angle (-> gp-1 quat)) + (vector-y-angle (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s4-0 s5-0) 1.0)) + ) + ) + ) + (quaternion-rotate-y! (-> gp-1 quat) (-> gp-1 quat) f0-3) + ) + ) + (set! (-> gp-1 trans quad) (-> s5-0 quad)) + ) + ) + (none) + ) + :exit (behavior () + (let ((v1-1 (-> self root-override2 root-prim))) + (set! (-> v1-1 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-1 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (logclear! (-> self draw status) (draw-control-status no-draw)) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (let ((s5-0 (new 'stack 'collide-query))) + (get-point-in-path! (-> self path-intro) gp-0 1.0 'exact) + (if (enemy-method-126 self s5-0 gp-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> gp-0 y) (-> s5-0 best-other-tri intersect y)) + ) + ) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag vulnerable)))) + (send-event self 'jump 2 gp-0) + ) + (go-virtual hostile) + (none) + ) + ) + +(defmethod enemy-method-132 hopper ((obj hopper)) + (when (-> obj minimap) + (logior! (-> obj minimap flags) (minimap-flag fade-out)) + (set! (-> obj minimap) #f) + ) + ((the-as (function enemy none) (find-parent-method hopper 132)) obj) + (none) + ) + +;; WARN: Return type mismatch process-focusable vs hopper. +(defmethod relocate hopper ((obj hopper) (arg0 int)) + (if (nonzero? (-> obj path-intro)) + (&+! (-> obj path-intro) arg0) + ) + (the-as + hopper + ((the-as (function process-focusable int process-focusable) (find-parent-method hopper 7)) obj arg0) + ) + ) + +(defmethod enemy-method-114 hopper ((obj hopper)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set! (-> s4-0 transform-index) 12) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 9216.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-14 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-14 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-14 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-14 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-14 local-sphere) 0.0 3686.4 0.0 3686.4) + ) + (let ((v1-16 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-16 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-16 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-16 prim-core action) (collide-action deadly)) + (set! (-> v1-16 transform-index) 5) + (set-vector! (-> v1-16 local-sphere) 0.0 0.0 819.2 3276.8) + ) + (set! (-> s5-0 nav-radius) 4096.0) + (let ((v1-18 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-18 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-18 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +(defmethod enemy-method-115 hopper ((obj hopper)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-hopper" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *hopper-nav-enemy-info*) + (set! (-> obj can-go-knocked?) #t) + (let ((v1-9 (-> obj neck))) + (set! (-> v1-9 up) (the-as uint 1)) + (set! (-> v1-9 nose) (the-as uint 2)) + (set! (-> v1-9 ear) (the-as uint 0)) + (set-vector! (-> v1-9 twist-max) 10922.667 12743.111 0.0 1.0) + (set! (-> v1-9 ignore-angle) 18204.445) + ) + (set! (-> obj jump-start-anim) (the-as uint 10)) + (set! (-> obj jump-air-anim) (the-as uint 13)) + (set! (-> obj jump-land-anim) (the-as uint 14)) + (set! (-> obj jump-height-min) 12288.0) + (set! (-> obj jump-anim-start-frame) 8.0) + (set! (-> obj land-anim-index) 26) + (set! (-> obj side) (get-rand-float-range obj -1.5 1.5)) + (when (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (set! (-> obj path-intro) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (if (-> obj path-intro) + (logior! (-> obj path-intro flags) (path-control-flag display draw-line draw-point draw-text)) + ) + ) + (add-connection *part-engine* obj 5 obj 318 (new 'static 'vector :x 1392.64 :y 491.52 :z 1638.4 :w 163840.0)) + (add-connection *part-engine* obj 5 obj 318 (new 'static 'vector :x -1392.64 :y 491.52 :z 1638.4 :w 163840.0)) + (logior! (-> obj nav flags) (nav-control-flag output-sphere-hash)) + (let ((v1-34 (-> obj nav))) + (set! (-> v1-34 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 327680.0) + (let ((v1-39 (-> obj nav))) + (set! (-> v1-39 nav-cull-radius) 61440.0) + ) + 0 + (set! (-> obj minimap) + (minimap-method-12 *minimap* obj (the-as uint 70) (the-as int #f) (the-as vector #t) 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 954f3c4469..47a57ef799 100644 --- a/goal_src/jak2/levels/common/enemy/metalhead_bearer/centurion.gc +++ b/goal_src/jak2/levels/common/enemy/metalhead_bearer/centurion.gc @@ -7,3 +7,1532 @@ ;; DECOMP BEGINS +(define *centurion-shield-glow-spt-scale-x* #x9000) + +(define *centurion-shield-glow-spt-scale-y* #x7000) + +(define *centurion-shield-center-spt-scale-x* 8192) + +(define *centurion-shield-center-spt-scale-y* #x4666) + +(define *centurion-shield-spt-scale-x* #x3666) + +(define *centurion-shield-spt-scale-y* #x5666) + +(define *centurion-shield-2-spt-scale-x* #x3800) + +(define *centurion-shield-2-spt-scale-y* #x5800) + +(defun centurion-shield-big () + (set! *centurion-shield-glow-spt-scale-x* #x9000) + (set! *centurion-shield-glow-spt-scale-y* #x7000) + (set! *centurion-shield-center-spt-scale-x* 8192) + (set! *centurion-shield-center-spt-scale-y* #x4666) + (set! *centurion-shield-spt-scale-x* #x3666) + (set! *centurion-shield-spt-scale-y* #x5666) + (set! *centurion-shield-2-spt-scale-x* #x3800) + (set! *centurion-shield-2-spt-scale-y* #x5800) + (none) + ) + +(defun centurion-shield-little () + (set! *centurion-shield-glow-spt-scale-x* #x4000) + (set! *centurion-shield-glow-spt-scale-y* #x3000) + (set! *centurion-shield-center-spt-scale-x* 5734) + (set! *centurion-shield-center-spt-scale-y* #x3000) + (set! *centurion-shield-spt-scale-x* #x2800) + (set! *centurion-shield-spt-scale-y* #x3800) + (set! *centurion-shield-2-spt-scale-x* #x2999) + (set! *centurion-shield-2-spt-scale-y* #x3999) + (none) + ) + +(defpartgroup group-centurion-shield + :id 474 + :duration (seconds 0.5) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 2) + :parts ((sp-item 2101 :flags (is-3d bit6 bit7)) + (sp-item 2102 :flags (is-3d bit6 bit7)) + (sp-item 2103 :flags (is-3d bit6 bit7)) + (sp-item 2104 :flags (bit6)) + ) + ) + +(defpart 2104 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-scale-x (meters 9) (meters 0.5) 1.0) + (sp-flt spt-rot-x 409.6) + (sp-rnd-flt spt-scale-y (meters 7) (meters 0.5) 1.0) + (sp-rnd-flt spt-r 64.0 64.0 1.0) + (sp-flt spt-g 0.0) + (sp-flt spt-b 128.0) + (sp-flt spt-a 40.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-flt spt-userdata 2048.0) + ) + ) + +(defpart 2103 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x29 :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-x (meters 0.1)) + (sp-flt spt-y (meters 0)) + (sp-flt spt-z (meters 0)) + (sp-rnd-flt spt-scale-x (meters 2) (meters 1) 1.0) + (sp-flt spt-rot-x 0.0) + (sp-flt spt-rot-y (degrees 0.0)) + (sp-flt spt-rot-z (degrees 90.0)) + (sp-rnd-flt spt-scale-y (meters 4.4) (meters 1) 1.0) + (sp-flt spt-r 255.0) + (sp-rnd-flt spt-g 128.0 128.0 1.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 80.0 20.0 1.0) + (sp-rnd-flt spt-accel-y -1.3653333 -4.096 1.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +(defpart 2102 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x13 :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-x (meters 0.1)) + (sp-flt spt-y (meters 0)) + (sp-flt spt-z (meters 0)) + (sp-flt spt-scale-x (meters 3.4)) + (sp-flt spt-rot-x 0.0) + (sp-flt spt-rot-y (degrees 0.0)) + (sp-flt spt-rot-z (degrees 90.0)) + (sp-flt spt-scale-y (meters 5.4)) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-flt spt-g 0.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 10.0 10.0 1.0) + (sp-rnd-flt spt-accel-y -1.3653333 -4.096 1.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +(defpart 2101 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x2c :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-x (meters 0.1)) + (sp-flt spt-y (meters 0)) + (sp-flt spt-z (meters 0)) + (sp-flt spt-scale-x (meters 3.5)) + (sp-flt spt-rot-x 0.0) + (sp-flt spt-rot-y (degrees 0.0)) + (sp-flt spt-rot-z (degrees 90.0)) + (sp-flt spt-scale-y (meters 5.5)) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-rnd-flt spt-g 0.0 64.0 1.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 128.0 128.0 1.0) + (sp-rnd-flt spt-accel-y -1.3653333 -4.096 1.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +(deftype centurion-shot (metalhead-shot) + () + :heap-base #x170 + :method-count-assert 40 + :size-assert #x1f0 + :flag-assert #x28017001f0 + ) + + +;; WARN: Return type mismatch int vs sound-id. +(defmethod play-impact-sound centurion-shot ((obj centurion-shot) (arg0 projectile-options)) + (let ((v1-0 arg0)) + (cond + ((zero? v1-0) + (sound-play "cent-shot-fire") + ) + ((= v1-0 (projectile-options lose-altitude)) + (sound-play "cent-shot-hit") + ) + ((= v1-0 (projectile-options lose-altitude proj-options-2)) + ((the-as (function projectile projectile-options sound-id) (find-parent-method centurion-shot 28)) obj arg0) + ) + ) + ) + (the-as sound-id 0) + ) + +(defmethod init-proj-settings! centurion-shot ((obj centurion-shot)) + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc + :virtual" + ((the-as (function projectile none) (find-parent-method centurion-shot 31)) obj) + (set! (-> obj max-speed) 327680.0) + (set! (-> obj timeout) (seconds 1.25)) + (none) + ) + +(deftype centurion (nav-enemy) + ((los los-control :inline :offset-assert 608) + (target-pos vector :inline :offset-assert 768) + (can-shoot? basic :offset-assert 784) + (incoming-attack-id uint32 :offset-assert 788) + (can-take-damage? symbol :offset-assert 792) + (first-shoot? symbol :offset-assert 796) + (shoot-dir vector :inline :offset-assert 800) + (tar-pos vector :inline :offset-assert 816) + (joint joint-mod :offset-assert 832) + (joint-enable symbol :offset-assert 836) + (victory-sound sound-id :offset-assert 840) + (shield-shot uint32 :offset-assert 844) + ) + :heap-base #x2d0 + :method-count-assert 183 + :size-assert #x350 + :flag-assert #xb702d00350 + (:methods + (attack () _type_ :state 178) + (fire () _type_ :state 179) + (centurion-method-180 (_type_) none 180) + (centurion-method-181 (_type_ vector) int 181) + (centurion-method-182 (_type_ vector) symbol 182) + ) + ) + + +(defskelgroup skel-centurion centurion centurion-lod0-jg centurion-idle-ja + ((centurion-lod0-mg (meters 20)) (centurion-lod1-mg (meters 999999))) + :bounds (static-spherem 0 2.25 -0.7 6.5) + :shadow centurion-shadow-mg + ) + +(deftype centurion-anim-info (structure) + ((anim-index int32 :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + + +(deftype centurion-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (yellow-hit-anim int32 1 :offset-assert 8) + (blue-hit-anim int32 3 :offset-assert 12) + ) + :pack-me + :method-count-assert 9 + :size-assert #x18 + :flag-assert #x900000018 + ) + + +(define *centurion-global-info* (new 'static 'centurion-global-info + :yellow-hit-anim (new 'static 'array int32 1 21) + :blue-hit-anim (new 'static 'array int32 3 18 20 19) + ) + ) + +(define *centurion-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 #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010601 #x0 #x0 #x0) + :idle-anim 6 + :notice-anim 8 + :hostile-anim 13 + :hit-anim 16 + :knocked-anim 21 + :knocked-land-anim 22 + :die-anim 34 + :die-falling-anim 23 + :victory-anim 4 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 8 + :look-at-joint 8 + :bullseye-joint 5 + :sound-hit (static-sound-name "centurion-hit") + :sound-die (static-sound-name "centurion-die") + :notice-distance (meters 100) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 100) + :default-hit-points 3 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :friction 0.1 + :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-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 32768.0 + :knocked-soft-vxz-hi 65536.0 + :knocked-soft-vy-lo 32768.0 + :knocked-soft-vy-hi 49152.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 16384.0 + :knocked-yellow-vxz-hi 32768.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 20480.0 + :knocked-blue-vy-hi 40960.0 + :shadow-size (meters 1) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 8 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 1843.2 :z 1146.88 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 9 + :turn-anim -1 + :run-anim -1 + :taunt-anim -1 + :run-travel-speed (meters 6) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 2) + :walk-travel-speed (meters 1.8) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 16) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 100) + :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! (-> *centurion-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod enemy-method-74 centurion ((obj centurion) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (with-pp + (case arg2 + (('jump) + #f + ) + (('touch) + (cond + ((and (-> obj next-state) (= (-> obj next-state name) 'attack)) + (let ((s4-1 (-> arg3 param 0))) + (let ((s3-1 arg0)) + (if (type? s3-1 process-focusable) + (empty) + ) + ) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer pp)) + (set! (-> a1-2 num-params) 2) + (set! (-> a1-2 message) 'attack-or-shove) + (set! (-> a1-2 param 0) s4-1) + (let ((v1-10 (new 'static 'attack-info :mask (attack-info-mask mode shove-back shove-up id)))) + (let* ((a0-6 *game-info*) + (a2-2 (+ (-> a0-6 attack-id) 1)) + ) + (set! (-> a0-6 attack-id) a2-2) + (set! (-> v1-10 id) a2-2) + ) + (set! (-> v1-10 shove-back) (* 2.0 (-> obj enemy-info-override attack-shove-back))) + (set! (-> v1-10 shove-up) (* 2.0 (-> obj enemy-info-override attack-shove-up))) + (set! (-> v1-10 mode) 'deadly) + (set! (-> a1-2 param 1) (the-as uint v1-10)) + ) + (send-event-function arg0 a1-2) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + (('attack) + (let ((v1-12 (the-as object (-> arg3 param 1)))) + (cond + ((!= (-> (the-as attack-info v1-12) id) (-> obj incoming-attack-id)) + (set! (-> obj incoming-attack-id) (-> (the-as attack-info v1-12) id)) + (cond + ((or (-> obj can-take-damage?) + (logtest? (penetrate dark-skin dark-punch dark-bomb) (-> (the-as attack-info v1-12) penetrate-using)) + ) + (cond + ((and (-> obj next-state) (= (-> obj next-state name) 'fire)) + (centurion-method-180 obj) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + (else + (+! (-> obj shield-shot) 1) + (if (= (-> obj shield-shot) 4) + (talker-spawn-func (-> *talker-speech* 58) *entity-pool* (target-pos 0) (the-as region #f)) + ) + (set! (-> *part-id-table* 2102 init-specs 13 initial-valuef) 255.0) + (set! (-> obj state-time) (-> pp clock frame-counter)) + 'back + ) + ) + ) + (else + #f + ) + ) + ) + ) + (('victory) + (if (and (not (and (-> obj next-state) (= (-> obj next-state name) 'victory))) + (and (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + ) + (go (method-of-object obj victory)) + ) + ) + (('notify) + (let ((v1-47 (handle->process (-> obj focus handle)))) + (when (and (= (-> arg3 param 0) 'attack) + (= (-> arg3 param 1) v1-47) + (-> obj next-state) + (let ((v1-52 (-> obj next-state name))) + (or (= v1-52 'hostile) (= v1-52 'fire)) + ) + ) + (let ((a1-13 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-13 from) (process->ppointer arg0)) + (set! (-> a1-13 num-params) (the-as int arg1)) + (set! (-> a1-13 message) 'victory) + (set! (-> a1-13 param 0) (-> arg3 param 0)) + (set! (-> a1-13 param 1) (-> arg3 param 1)) + (set! (-> a1-13 param 2) (-> arg3 param 2)) + (set! (-> a1-13 param 3) (-> arg3 param 3)) + (set! (-> a1-13 param 4) (-> arg3 param 4)) + (set! (-> a1-13 param 5) (-> arg3 param 5)) + (send-event-function obj a1-13) + ) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +(defmethod centurion-method-181 centurion ((obj centurion) (arg0 vector)) + (local-vars (sv-224 vector) (sv-240 vector) (sv-256 vector)) + (with-pp + (if (not (-> obj joint-enable)) + (return (the-as int #f)) + ) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> arg0 quad)) + (let* ((v0-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 4))) + (s1-0 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s5-0 v0-1) 1.0)) + (s3-0 (new 'stack-no-clear 'vector)) + ) + (new 'stack-no-clear 'vector) + (let ((s5-1 (new 'stack-no-clear 'quaternion))) + (vector-z-quaternion! + (new 'stack-no-clear 'vector) + (quaternion*! (new 'stack-no-clear 'quaternion) (-> obj joint quat) (-> obj root-override2 quat)) + ) + (let ((s4-1 (new 'stack-no-clear 'vector))) + (vector-z-quaternion! s3-0 (-> obj root-override2 quat)) + (let ((f30-0 (deg-diff (vector-y-angle s3-0) (vector-y-angle s1-0)))) + 0.0 + (new 'stack-no-clear 'vector) + (new 'stack-no-clear 'vector) + (let ((s2-2 (new 'stack-no-clear 'vector))) + (let ((s0-1 vector-rotate-around-y!)) + (set! sv-224 s4-1) + (set! sv-240 s1-0) + (let ((a2-1 (- (vector-y-angle s1-0)))) + (s0-1 sv-224 sv-240 a2-1) + ) + ) + (let ((s1-1 vector-rotate-around-y!) + (s0-2 s2-2) + ) + (set! sv-256 s3-0) + (let ((a2-2 (- (vector-y-angle s3-0)))) + (s1-1 s0-2 sv-256 a2-2) + ) + ) + (let ((f0-9 (deg-diff (atan (-> s4-1 y) (-> s4-1 z)) (atan (-> s2-2 y) (-> s2-2 z))))) + (set-vector! s4-1 f0-9 f30-0 0.0 1.0) + ) + ) + ) + (quaternion-zxy! s5-1 s4-1) + ) + (quaternion-pseudo-seek (-> obj joint quat) (-> obj joint quat) s5-1 (-> pp clock seconds-per-frame)) + ) + ) + ) + (vector-z-quaternion! + (-> obj shoot-dir) + (quaternion*! (new 'stack-no-clear 'quaternion) (-> obj joint quat) (-> obj root-override2 quat)) + ) + 0 + ) + ) + +(defstate victory (centurion) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy victory) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self root-override2 root-prim specific 0) (+ (-> self root-override2 root-prim specific 1) -1)) + (set! (-> self can-take-damage?) #t) + (centurion-shield-little) + (set! (-> self victory-sound) (new 'static 'sound-id)) + 0 + (none) + ) + :exit (behavior () + (if (nonzero? (-> self victory-sound)) + (sound-stop (-> self victory-sound)) + ) + (let ((t9-1 (-> (method-of-type nav-enemy victory) exit))) + (if t9-1 + (t9-1) + ) + ) + (set! (-> self root-override2 root-prim specific 0) (-> self root-override2 root-prim specific 1)) + (set! (-> self can-take-damage?) #f) + (centurion-shield-big) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override victory-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override victory-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (if (and (zero? (-> self victory-sound)) (>= (ja-frame-num 0) 4.0)) + (set! (-> self victory-sound) (sound-play "cent-celebrate")) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (set! (-> self victory-sound) (new 'static 'sound-id)) + 0 + (none) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-stare centurion ((obj centurion)) + (if (not (and (-> obj next-state) (= (-> obj next-state name) 'hostile))) + (go (method-of-object obj hostile)) + ) + (none) + ) + +(defstate active (centurion) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! centurion-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-idle-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (the-as (function none :behavior centurion) nav-enemy-simple-post) + ) + +(defmethod centurion-method-180 centurion ((obj centurion)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (when (-> obj can-shoot?) + (let ((s5-0 (new 'stack-no-clear 'projectile-init-by-other-params))) + (let* ((a1-0 (-> obj node-list data 29)) + (s3-0 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (cond + ((-> obj first-shoot?) + (let ((s0-0 (handle->process (-> obj focus handle))) + (s2-0 (new 'stack-no-clear 'vector)) + ) + (when s0-0 + (set! (-> s2-0 quad) (-> (get-trans (the-as process-focusable s0-0) 3) quad)) + (let ((s1-2 (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) s2-0))) + (let* ((f0-0 (vector-length s1-2)) + (f0-1 (* 0.0000030517579 f0-0)) + (a0-7 s2-0) + ) + (let ((v1-17 s2-0)) + (let ((a1-4 (-> (the-as process-focusable s0-0) root-override transv))) + (let ((a2-0 f0-1)) + (.mov vf7 a2-0) + ) + (.lvf vf5 (&-> a1-4 quad)) + ) + (.lvf vf4 (&-> v1-17 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-7 quad) vf6) + ) + (set! (-> s1-2 y) 0.0) + (vector-rotate90-around-y! s1-2 s1-2) + (vector-normalize! s1-2 12288.0) + (vector-! s4-0 s2-0 s3-0) + (vector+! s4-0 s4-0 s1-2) + ) + ) + ) + ) + (else + (vector-! s4-0 (-> obj target-pos) s3-0) + ) + ) + (vector-normalize! s4-0 327680.0) + (set! (-> s5-0 ent) (-> obj entity)) + (set! (-> s5-0 charge) 1.0) + (set! (-> s5-0 options) (projectile-options)) + (set! (-> s5-0 pos quad) (-> s3-0 quad)) + (set! (-> s5-0 vel quad) (-> s4-0 quad)) + ) + (set! (-> s5-0 notify-handle) (process->handle obj)) + (set! (-> s5-0 owner-handle) (the-as handle #f)) + (set! (-> s5-0 ignore-handle) (process->handle obj)) + (let* ((v1-32 *game-info*) + (a0-26 (+ (-> v1-32 attack-id) 1)) + ) + (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)) + (spawn-projectile centurion-shot s5-0 obj *default-dead-pool*) + ) + (set! (-> obj can-shoot?) #f) + ) + 0 + (none) + ) + ) + +(defstate fire (centurion) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior centurion) enemy-event-handler) + :enter (behavior () + (set! (-> self can-shoot?) (the-as basic #t)) + (if (and (-> self first-shoot?) (logtest? (-> self draw status) (draw-control-status on-screen))) + (set! (-> self first-shoot?) #f) + ) + (centurion-shield-little) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-8 *game-info*) + (v0-1 (+ (-> v1-8 attack-id) 1)) + ) + (set! (-> v1-8 attack-id) v0-1) + (set! (-> self attack-id) v0-1) + ) + (none) + ) + :exit (behavior () + (set! (-> self first-shoot?) #f) + (set! (-> self can-take-damage?) #f) + (set! (-> self root-override2 root-prim specific 0) (-> self root-override2 root-prim specific 1)) + (centurion-shield-big) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (let ((f30-0 1.0)) + (when (logtest? (-> self fact-info-override enemy-options) (enemy-option user0)) + (set! f30-0 0.75) + (let ((a0-1 (handle->process (-> self focus handle)))) + (if a0-1 + (set! (-> self target-pos quad) (-> (get-trans (the-as process-focusable a0-1) 3) quad)) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! centurion-shoot-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-shoot-start-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((gp-2 (handle->process (-> self focus handle)))) + (when gp-2 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable gp-2) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + (if (< (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable gp-2) 0)) + 24576.0 + ) + (go-virtual attack) + ) + ) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (set! (-> self root-override2 root-prim specific 0) (+ (-> self root-override2 root-prim specific 1) -1)) + (set! (-> self can-take-damage?) #t) + (when (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (let ((a0-20 (handle->process (-> self focus handle)))) + (if a0-20 + (set! (-> self target-pos quad) (-> (get-trans (the-as process-focusable a0-20) 3) quad)) + ) + ) + ) + (centurion-method-180 self) + (ja-no-eval :group! centurion-shoot-loop-ja :num! (seek! 2.0) :frame-num 0.0) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! 2.0)) + ) + (set! (-> self can-shoot?) (the-as basic #t)) + (when (handle->process (-> self focus handle)) + ) + (centurion-method-180 self) + (ja-no-eval :group! centurion-shoot-loop-ja :num! (seek! 2.0) :frame-num 0.0) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! 2.0)) + ) + (set! (-> self can-shoot?) (the-as basic #t)) + (when (handle->process (-> self focus handle)) + ) + (centurion-method-180 self) + (ja-no-eval :group! centurion-shoot-loop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-shoot-loop-ja) frames num-frames) -1)) 0.4) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.4)) + ) + (set! (-> self can-take-damage?) #f) + (set! (-> self root-override2 root-prim specific 0) (-> self root-override2 root-prim specific 1)) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! centurion-shoot-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-shoot-end-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior centurion) enemy-simple-post) + ) + +(defstate attack (centurion) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior centurion) enemy-event-handler) + :enter (behavior () + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3 prim-core action) + (collide-action solid deadly) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3 local-sphere w) + 10240.0 + ) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-7 *game-info*) + (v0-0 (+ (-> v1-7 attack-id) 1)) + ) + (set! (-> v1-7 attack-id) v0-0) + (set! (-> self attack-id) v0-0) + ) + (none) + ) + :exit (behavior () + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3 prim-core action) + (collide-action solid) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3 local-sphere w) 5120.0) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! centurion-hit-away-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-hit-away-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior centurion) enemy-simple-post) + ) + +(defmethod enemy-method-132 centurion ((obj centurion)) + (talker-speech-class-method-10 (-> *talker-speech* 58)) + ((the-as (function enemy none) (find-parent-method centurion 132)) obj) + (none) + ) + +(defmethod enemy-method-55 centurion ((obj centurion)) + (with-pp + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((f30-0 (* 4.0 (-> pp clock seconds-per-frame)))) + (set! (-> *part-id-table* 2104 init-specs 2 initial-valuef) + (lerp + (-> *part-id-table* 2104 init-specs 2 initial-valuef) + (the float *centurion-shield-glow-spt-scale-x*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2104 init-specs 4 initial-valuef) + (lerp + (-> *part-id-table* 2104 init-specs 4 initial-valuef) + (the float *centurion-shield-glow-spt-scale-y*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2103 init-specs 5 initial-valuef) + (lerp + (-> *part-id-table* 2103 init-specs 5 initial-valuef) + (the float *centurion-shield-center-spt-scale-x*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2103 init-specs 9 initial-valuef) + (lerp + (-> *part-id-table* 2103 init-specs 9 initial-valuef) + (the float *centurion-shield-center-spt-scale-y*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2102 init-specs 5 initial-valuef) + (lerp (-> *part-id-table* 2102 init-specs 5 initial-valuef) (the float *centurion-shield-spt-scale-x*) f30-0) + ) + (set! (-> *part-id-table* 2102 init-specs 9 initial-valuef) + (lerp (-> *part-id-table* 2102 init-specs 9 initial-valuef) (the float *centurion-shield-spt-scale-y*) f30-0) + ) + (set! (-> *part-id-table* 2101 init-specs 5 initial-valuef) + (lerp + (-> *part-id-table* 2101 init-specs 5 initial-valuef) + (the float *centurion-shield-2-spt-scale-x*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2101 init-specs 9 initial-valuef) + (lerp + (-> *part-id-table* 2101 init-specs 9 initial-valuef) + (the float *centurion-shield-2-spt-scale-y*) + f30-0 + ) + ) + (cond + ((logtest? (-> obj fact-info-override enemy-options) (enemy-option user0)) + (set! (-> *part-id-table* 2101 init-specs 10 initial-valuef) 0.0) + (set! (-> *part-id-table* 2101 init-specs 10 random-rangef) 0.0) + (set! (-> *part-id-table* 2102 init-specs 10 initial-valuef) 0.0) + (set! (-> *part-id-table* 2102 init-specs 10 random-rangef) 0.0) + (set! (-> *part-id-table* 2104 init-specs 5 initial-valuef) 0.0) + (set! (-> *part-id-table* 2104 init-specs 5 random-rangef) 0.0) + ) + (else + (set! (-> *part-id-table* 2101 init-specs 10 initial-valuef) 128.0) + (set! (-> *part-id-table* 2101 init-specs 10 random-rangef) 128.0) + (set! (-> *part-id-table* 2102 init-specs 10 initial-valuef) 128.0) + (set! (-> *part-id-table* 2102 init-specs 10 random-rangef) 128.0) + (set! (-> *part-id-table* 2104 init-specs 5 initial-valuef) 64.0) + (set! (-> *part-id-table* 2104 init-specs 5 random-rangef) 64.0) + ) + ) + (set! (-> *part-id-table* 2102 init-specs 13 initial-valuef) + (lerp (-> *part-id-table* 2102 init-specs 13 initial-valuef) 10.0 f30-0) + ) + ) + (let ((a0-11 (handle->process (-> obj focus handle)))) + (if a0-11 + (centurion-method-181 obj (get-trans (the-as process-focusable a0-11) 3)) + ) + ) + (logior! (-> obj skel status) (joint-control-status sync-math)) + (los-control-method-9 (-> obj los) (the-as process-focusable #f) (the-as vector #f) 2048.0) + (let ((t9-12 (method-of-type nav-enemy enemy-method-55))) + (t9-12 obj) + ) + (when (not (logtest? (-> obj draw status) (draw-control-status no-draw))) + (let ((s5-1 (new 'stack-no-clear 'matrix))) + (let* ((a2-10 (-> obj node-list data 12 bone transform)) + (v1-131 (-> a2-10 quad 0)) + (a0-18 (-> a2-10 quad 1)) + (a1-13 (-> a2-10 quad 2)) + (a2-11 (-> a2-10 trans quad)) + ) + (set! (-> s5-1 quad 0) v1-131) + (set! (-> s5-1 quad 1) a0-18) + (set! (-> s5-1 quad 2) a1-13) + (set! (-> s5-1 trans quad) a2-11) + ) + (let ((s4-1 (new 'stack-no-clear 'matrix))) + (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + (vector-negate-in-place! (the-as vector (-> s5-1 vector))) + ) + (matrix-rotate-y! s4-1 (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + 2548.6223 + -2548.6223 + ) + ) + (matrix*! s5-1 s4-1 s5-1) + (matrix-rotate-z! s4-1 (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + 691.76886 + -691.76886 + ) + ) + (matrix*! s5-1 s4-1 s5-1) + ) + (let ((a1-20 (-> s5-1 trans))) + (let ((v1-143 (-> s5-1 trans))) + (let ((a0-25 (-> s5-1 vector))) + (let ((a2-18 (the-as float (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + -997237719 + #x43a3d70a + ) + ) + ) + ) + (.mov vf7 a2-18) + ) + (.lvf vf5 (&-> a0-25 0 quad)) + ) + (.lvf vf4 (&-> v1-143 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a1-20 quad) vf6) + ) + (spawn-with-matrix (-> obj part) s5-1) + ) + ) + (none) + ) + ) + ) + +(defmethod nav-enemy-method-142 centurion ((obj centurion) (arg0 nav-control)) + 0 + (none) + ) + +(defmethod centurion-method-182 centurion ((obj centurion) (arg0 vector)) + (local-vars (sv-96 int) (sv-112 int)) + (when (nonzero? (-> obj path)) + (let ((s5-0 (-> obj path)) + (s4-0 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s0-0 quad) (-> arg0 quad)) + (set! sv-96 0) + (let ((gp-0 0)) + (set! (-> s0-0 y) 0.0) + (set! sv-112 0) + (while (< sv-112 4) + (get-point-in-path! s5-0 s3-0 (the float sv-112) 'interp) + (get-point-in-path! s5-0 s2-0 (the float (+ sv-112 1)) 'interp) + (vector-! s1-0 s0-0 s3-0) + (vector-! s4-0 s2-0 s3-0) + (set! (-> s4-0 y) 0.0) + (vector-rotate90-around-y! s4-0 s4-0) + (cond + ((>= (vector-dot s1-0 s4-0) 0.0) + (+! gp-0 1) + ) + (else + (set! sv-96 (+ sv-96 1)) + sv-96 + ) + ) + (set! sv-112 (+ sv-112 1)) + ) + (if (or (= sv-96 4) (= gp-0 4)) + (return #t) + ) + ) + ) + ) + #f + ) + +(defstate hostile (centurion) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (nav-enemy-method-165 self) + (set! (-> self joint-enable) #t) + (set! (-> self can-shoot?) (the-as basic #t)) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) exit))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :trans (behavior () + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((s5-0 (handle->process (-> self focus handle))) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (when s5-0 + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable s5-0) 0) quad)) + (let ((a0-4 gp-0)) + (let ((v1-11 gp-0)) + (let ((a1-3 (-> (the-as process-focusable s5-0) root-override transv))) + (let ((a2-1 0.1)) + (.mov vf7 a2-1) + ) + (.lvf vf5 (&-> a1-3 quad)) + ) + (.lvf vf4 (&-> v1-11 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-4 quad) vf6) + ) + (let ((f30-0 (vector-vector-xz-distance gp-0 (-> self root-override2 trans)))) + (cond + ((< f30-0 24576.0) + (go-virtual attack) + ) + (else + (when (-> self can-shoot?) + (if (and (enemy-method-107 self) + (>= (- (-> self clock frame-counter) (-> self state-time)) (the int (+ 60.0 (* 0.0036621094 f30-0)))) + (check-los? (-> self los) 0) + ) + (go-virtual fire) + ) + ) + (if (skip-check-los? (-> self los) 0) + (set! (-> self state-time) (-> self clock frame-counter)) + ) + ) + ) + ) + ) + ) + (none) + ) + ) + :code (behavior () + (get-rand-float-range self 0.9 1.1) + -1 + 0.0 + 1.0 + 0 + (until #f + (until #f + (let ((s5-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((f30-0 24576.0)) + (until #f + (set-vector! s5-0 (get-rand-float-range self -1.0 1.0) 0.0 (get-rand-float-range self -1.0 1.0) 1.0) + (vector-normalize! s5-0 f30-0) + (vector+! gp-0 (-> self root-override2 trans) s5-0) + (if (centurion-method-182 self gp-0) + (goto cfg-9) + ) + (set! f30-0 (+ -1024.0 f30-0)) + (if (< f30-0 0.0) + (goto cfg-9) + ) + ) + ) + #f + (label cfg-9) + (set! (-> self tar-pos quad) (-> gp-0 quad)) + ) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (let ((a0-9 (handle->process (-> self focus handle)))) + (if a0-9 + (set! (-> gp-1 quad) (-> (get-trans (the-as process-focusable a0-9) 0) quad)) + (vector+! gp-1 (-> self root-override2 trans) *z-vector*) + ) + ) + (let* ((a0-15 (vector-! (new 'stack-no-clear 'vector) gp-1 (-> self root-override2 trans))) + (gp-3 (vector-! (new 'stack-no-clear 'vector) (-> self tar-pos) (-> self root-override2 trans))) + (f28-0 (deg-diff (vector-y-angle a0-15) (vector-y-angle gp-3))) + (f30-1 0.0) + ) + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((< f28-0 -24576.0) + (ja :group! centurion-walk-forward-ja) + (set! f30-1 -1.0) + ) + ((< f28-0 -8192.0) + (ja :group! centurion-side-stepR-ja) + (set! f30-1 -1.0) + ) + ((< f28-0 8192.0) + (ja :group! centurion-walk-forward-ja) + (set! f30-1 1.0) + ) + ((< f28-0 24576.0) + (ja :group! centurion-side-stepR-ja) + (set! f30-1 1.0) + ) + ((< f28-0 40960.0) + (ja :group! centurion-walk-forward-ja) + (set! f30-1 -1.0) + ) + ) + (let ((a0-34 (-> self nav state)) + (v1-73 (-> self tar-pos)) + ) + (logclear! (-> a0-34 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-34 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-34 target-post quad) (-> v1-73 quad)) + ) + 0 + (let ((f28-1 (if (< f30-1 0.0) + 20.0 + 0.0 + ) + ) + ) + (dotimes (gp-4 2) + (until #f + (ja :num-func num-func-identity :frame-num f28-1) + (suspend) + (+! f28-1 (* f30-1 (* (ja-speed 0) (-> self clock time-adjust-ratio)))) + (when (< 20.0 f28-1) + (set! f28-1 (+ -20.0 f28-1)) + (goto cfg-38) + ) + (when (< f28-1 0.0) + (set! f28-1 (+ 20.0 f28-1)) + (goto cfg-38) + ) + ) + #f + (label cfg-38) + ) + ) + ) + ) + (+ (-> self clock frame-counter) (seconds 3)) + ) + #f + ) + #f + (none) + ) + :post (the-as (function none :behavior centurion) nav-enemy-travel-post) + ) + +(defmethod enemy-method-77 centurion ((obj centurion) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 5))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 5)) 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 5)) num-func-seek!) + ) + #t + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 (seconds 0.1)) + (let* ((a2-1 (ash 1 (-> *centurion-global-info* prev-yellow-hit))) + (v1-18 (enemy-method-120 obj 1 a2-1)) + (a1-8 (-> obj draw art-group data (-> *centurion-global-info* yellow-hit-anim v1-18))) + ) + (set! (-> *centurion-global-info* prev-yellow-hit) v1-18) + (let ((a0-15 (-> obj skel root-channel 0))) + (set! (-> a0-15 frame-group) (the-as art-joint-anim a1-8)) + (set! (-> a0-15 param 0) (the float (+ (-> (the-as art-joint-anim a1-8) frames num-frames) -1))) + (set! (-> a0-15 param 1) (-> arg0 0)) + (set! (-> a0-15 frame-num) 0.0) + (joint-control-channel-group! a0-15 (the-as art-joint-anim a1-8) num-func-seek!) + ) + ) + ) + (((knocked-type knocked-type-6)) + (let* ((a2-3 (ash 1 (-> *centurion-global-info* prev-blue-hit))) + (v1-27 (enemy-method-120 obj 3 a2-3)) + (a1-13 (-> obj draw art-group data (-> *centurion-global-info* blue-hit-anim v1-27))) + ) + (set! (-> *centurion-global-info* prev-blue-hit) v1-27) + (let ((a0-27 (-> obj skel root-channel 0))) + (set! (-> a0-27 frame-group) (the-as art-joint-anim a1-13)) + (set! (-> a0-27 param 0) (the float (+ (-> (the-as art-joint-anim a1-13) frames num-frames) -1))) + (set! (-> a0-27 param 1) 1.0) + (set! (-> a0-27 frame-num) 0.0) + (joint-control-channel-group! a0-27 (the-as art-joint-anim a1-13) num-func-seek!) + ) + ) + ) + (else + (let ((s4-0 (if (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (-> obj draw art-group data 21) + (-> obj draw art-group data 21) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-30 (-> obj skel root-channel 0))) + (set! (-> a0-30 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-30 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-30 param 1) (-> arg0 0)) + (set! (-> a0-30 frame-num) 0.0) + (joint-control-channel-group! a0-30 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + #t + ) + ) + ) + +(defmethod enemy-method-78 centurion ((obj centurion) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 33))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 33)) 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 33)) num-func-seek!) + ) + #t + ) + (else + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((s4-0 (-> obj draw art-group data 8))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> arg0 0)) + (joint-control-channel-group! a0-5 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-7 (-> obj skel root-channel 0))) + (set! (-> a0-7 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> a0-7 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> a0-7 param 1) (-> arg0 0)) + (joint-control-channel-group! a0-7 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + #t + ) + ) + #t + ) + ) + ) + +(defmethod coin-flip? centurion ((obj centurion)) + "@returns The result of a 50/50 RNG roll" + #f + ) + +;; WARN: Return type mismatch none vs symbol. +(defmethod enemy-method-63 centurion ((obj centurion) (arg0 process-focusable) (arg1 symbol)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-63))) + (the-as symbol (if (t9-0 obj arg0 arg1) + (set-dst-proc! (-> obj los) (-> obj focus handle)) + ) + ) + ) + ) + +(defmethod enemy-method-114 centurion ((obj centurion)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate dark-skin dark-punch dark-bomb)) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 7) 0))) + (set! (-> s5-0 total-prims) (the-as uint 8)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid semi-solid deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 11550.72 0.0 35840.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-13 local-sphere) 0.0 6144.0 0.0 6144.0) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 12288.0 0.0 6144.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-17 local-sphere) 0.0 18432.0 0.0 6144.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 2)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot)) + (set! (-> v1-19 prim-core action) (collide-action solid)) + (set! (-> v1-19 transform-index) 12) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 12288.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-21 prim-core action) (collide-action deadly)) + (set! (-> v1-21 transform-index) 6) + (set-vector! (-> v1-21 local-sphere) 0.0 0.0 0.0 5120.0) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-23 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-23 prim-core collide-with) (collide-spec jak bot)) + (set! (-> v1-23 prim-core action) (collide-action deadly)) + (set! (-> v1-23 transform-index) 29) + (set-vector! (-> v1-23 local-sphere) 0.0 0.0 0.0 3891.2) + ) + (let ((v1-25 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 1)))) + (set! (-> v1-25 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-25 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-25 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-25 local-sphere) 0.0 12800.0 0.0 12800.0) + ) + (set! (-> s5-0 nav-radius) 2457.6) + (let ((v1-27 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-27 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-27 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-focusable vs centurion. +(defmethod relocate centurion ((obj centurion) (arg0 int)) + (if (nonzero? (-> obj joint)) + (&+! (-> obj joint) arg0) + ) + (the-as + centurion + ((the-as (function process-focusable int process-focusable) (find-parent-method centurion 7)) obj arg0) + ) + ) + +(defmethod enemy-method-115 centurion ((obj centurion)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-centurion" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *centurion-nav-enemy-info*) + (set! (-> obj shield-shot) (the-as uint 0)) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 474) obj)) + (let ((v1-11 (-> obj neck))) + (set! (-> v1-11 up) (the-as uint 1)) + (set! (-> v1-11 nose) (the-as uint 2)) + (set! (-> v1-11 ear) (the-as uint 3)) + (set-vector! (-> v1-11 twist-max) 10922.667 12743.111 0.0 1.0) + (set! (-> v1-11 ignore-angle) 18204.445) + ) + (new-source! (-> obj los) obj (seconds 0.2) (collide-spec backgnd obstacle)) + (set! (-> obj can-take-damage?) #f) + (let ((v1-15 (-> obj nav))) + (set! (-> v1-15 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 327680.0) + (set! (-> obj joint-enable) #f) + (set! (-> obj joint) (new 'process 'joint-mod (joint-mod-mode joint-set*) obj 4)) + (add-connection *part-engine* obj 8 obj 318 (new 'static 'vector :x 942.08 :y -163.84 :z 1392.64 :w 163840.0)) + (add-connection + *part-engine* + obj + 8 + obj + 318 + (new 'static 'vector :x -942.08 :y -163.84 :z 1392.64 :w 163840.0) + ) + (if (logtest? (-> obj fact-info-override enemy-options) (enemy-option user0)) + (set! (-> obj hit-points) 1) + ) + (logclear! (-> obj nav flags) (nav-control-flag update-heading-from-facing)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag43)))) + (let ((s5-1 (-> obj nav state)) + (v1-36 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (set! (-> s5-1 heading quad) (-> v1-36 quad)) + ) + 0 + (set! (-> obj first-shoot?) #t) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/common/enemy/metalhead_brown/metalmonk.gc b/goal_src/jak2/levels/common/enemy/metalhead_brown/metalmonk.gc index 61f42edeeb..c66ab0f28e 100644 --- a/goal_src/jak2/levels/common/enemy/metalhead_brown/metalmonk.gc +++ b/goal_src/jak2/levels/common/enemy/metalhead_brown/metalmonk.gc @@ -7,3 +7,1184 @@ ;; DECOMP BEGINS +(defskelgroup skel-metalmonk metalmonk metalmonk-lod0-jg -1 + ((metalmonk-lod0-mg (meters 20)) (metalmonk-lod1-mg (meters 40)) (metalmonk-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5) + :shadow metalmonk-shadow-mg + :origin-joint-index 14 + ) + +(deftype metalmonk-anim-info (structure) + ((anim-index int32 :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + + +(deftype metalmonk-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (idle-anim int32 3 :offset-assert 8) + (patrol-anim int32 2 :offset-assert 20) + (notice-anim int32 2 :offset-assert 28) + (charge-anim int32 2 :offset-assert 36) + (attack-anim int32 2 :offset-assert 44) + (knocked-anim int32 2 :offset-assert 52) + (celebrate-anim int32 2 :offset-assert 60) + (yellow-hit-anim int32 4 :offset-assert 68) + (blue-hit-anim int32 3 :offset-assert 84) + ) + :pack-me + :method-count-assert 9 + :size-assert #x60 + :flag-assert #x900000060 + ) + + +(deftype metalmonk (nav-enemy) + ((new-facing vector :inline :offset 624) + (old-facing vector :inline :offset 640) + (high-time time-frame :offset 656) + (intro-path path-control :offset-assert 664) + ) + :heap-base #x220 + :method-count-assert 183 + :size-assert #x29c + :flag-assert #xb70220029c + (:methods + (attack () _type_ :state 178) + (metalmonk-method-179 (_type_ vector) none 179) + (metalmonk-method-180 (_type_ symbol) none 180) + (metalmonk-method-181 (_type_ float float) none 181) + (metalmonk-method-182 (_type_ float float) none 182) + ) + ) + + +(define *metalmonk-global-info* (new 'static 'metalmonk-global-info + :idle-anim (new 'static 'array int32 3 5 6 7) + :patrol-anim (new 'static 'array int32 2 8 9) + :notice-anim (new 'static 'array int32 2 10 11) + :charge-anim (new 'static 'array int32 2 12 13) + :attack-anim (new 'static 'array int32 2 14 15) + :knocked-anim (new 'static 'array int32 2 16 18) + :celebrate-anim (new 'static 'array int32 2 22 23) + :yellow-hit-anim (new 'static 'array int32 4 28 29 30 31) + :blue-hit-anim (new 'static 'array int32 3 24 25 26) + ) + ) + +(define *metalmonk-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #t + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010501 #x0 #x0 #x0) + :idle-anim 5 + :notice-anim 10 + :hostile-anim 12 + :hit-anim -1 + :knocked-anim 16 + :knocked-land-anim 17 + :die-anim 32 + :die-falling-anim 33 + :victory-anim 22 + :jump-wind-up-anim 12 + :jump-in-air-anim 12 + :jump-land-anim 12 + :neck-joint 7 + :look-at-joint 7 + :bullseye-joint 4 + :sound-hit (static-sound-name "metalmonk-hit") + :sound-die (static-sound-name "metalmonk-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 40) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :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-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 7 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #f + :use-circling #t + :use-pacing #t + :walk-anim 8 + :turn-anim -1 + :run-anim 12 + :taunt-anim 22 + :run-travel-speed (meters 7) + :run-acceleration (meters 7) + :run-turning-acceleration (meters 20) + :walk-travel-speed (meters 2) + :walk-acceleration (meters 3) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 1) + :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! (-> *metalmonk-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; WARN: Return type mismatch vector vs none. +(defmethod metalmonk-method-179 metalmonk ((obj metalmonk) (arg0 vector)) + (set! (-> arg0 quad) + (-> (quaternion->matrix (new 'stack-no-clear 'matrix) (-> obj root-override2 quat)) vector 2 quad) + ) + (none) + ) + +(defmethod metalmonk-method-181 metalmonk ((obj metalmonk) (arg0 float) (arg1 float)) + (with-pp + (let ((f28-0 (vector-dot (-> obj new-facing) (-> obj old-facing))) + (f30-1 (/ (ja-frame-num 0) (the float (ja-num-frames 0)))) + ) + (when (and (< f28-0 (cos (* 182.04445 arg0))) (let ((v1-7 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (not (and v1-7 (= v1-7 (-> obj draw art-group data 13)))) + ) + ) + (ja-channel-push! 1 (seconds 0.16)) + (let ((v1-13 (-> obj skel root-channel 0))) + (set! (-> v1-13 frame-group) (the-as art-joint-anim (-> obj draw art-group data 13))) + ) + (let ((s4-1 (-> obj skel root-channel 0))) + (set! (-> s4-1 num-func) num-func-identity) + (set! (-> s4-1 frame-num) (* f30-1 (the float (ja-num-frames 0)))) + ) + (set! (-> obj high-time) (-> pp clock frame-counter)) + ) + (let ((v1-22 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (or (not (and v1-22 (or (= v1-22 (-> obj draw art-group data 12)) (= v1-22 (-> obj draw art-group data 13))))) + (let ((v1-28 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (and (and v1-28 (= v1-28 (-> obj draw art-group data 13))) + (< (ja-frame-num 0) 3.0) + (and (< (cos (* 182.04445 arg1)) f28-0) (>= (- (-> pp clock frame-counter) (-> obj high-time)) (seconds 1))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.16)) + (let ((v1-41 (-> obj skel root-channel 0))) + (set! (-> v1-41 frame-group) (the-as art-joint-anim (-> obj draw art-group data 12))) + ) + (let ((gp-1 (-> obj skel root-channel 0))) + (set! (-> gp-1 num-func) num-func-identity) + (set! (-> gp-1 frame-num) (* f30-1 (the float (ja-num-frames 0)))) + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod metalmonk-method-182 metalmonk ((obj metalmonk) (arg0 float) (arg1 float)) + (with-pp + (let ((f28-0 (vector-dot (-> obj new-facing) (-> obj old-facing))) + (f30-1 (/ (ja-frame-num 0) (the float (ja-num-frames 0)))) + ) + (when (and (< f28-0 (cos (* 182.04445 arg0))) (let ((v1-7 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (not (and v1-7 (= v1-7 (-> obj draw art-group data 9)))) + ) + ) + (ja-channel-push! 1 (seconds 0.16)) + (let ((v1-13 (-> obj skel root-channel 0))) + (set! (-> v1-13 frame-group) (the-as art-joint-anim (-> obj draw art-group data 9))) + ) + (let ((s4-1 (-> obj skel root-channel 0))) + (set! (-> s4-1 num-func) num-func-identity) + (set! (-> s4-1 frame-num) (* f30-1 (the float (ja-num-frames 0)))) + ) + (set! (-> obj high-time) (-> pp clock frame-counter)) + ) + (let ((v1-22 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (or (not (and v1-22 (or (= v1-22 (-> obj draw art-group data 8)) (= v1-22 (-> obj draw art-group data 9))))) + (let ((v1-28 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (and (and v1-28 (= v1-28 (-> obj draw art-group data 9))) + (and (< (cos (* 182.04445 arg1)) f28-0) (>= (- (-> pp clock frame-counter) (-> obj high-time)) (seconds 1))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.5)) + (let ((v1-39 (-> obj skel root-channel 0))) + (set! (-> v1-39 frame-group) (the-as art-joint-anim (-> obj draw art-group data 8))) + ) + (let ((gp-1 (-> obj skel root-channel 0))) + (set! (-> gp-1 num-func) num-func-identity) + (set! (-> gp-1 frame-num) (* f30-1 (the float (ja-num-frames 0)))) + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod enemy-method-55 metalmonk ((obj metalmonk)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-55))) + (t9-0 obj) + ) + (set! (-> obj old-facing quad) (-> obj new-facing quad)) + (metalmonk-method-179 obj (-> obj new-facing)) + 0 + (none) + ) + +(defmethod enemy-method-74 metalmonk ((obj metalmonk) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (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)) + (let ((s5-1 (-> obj incoming knocked-type))) + (cond + ((and (= s5-1 (knocked-type knocked-type-4)) + (not (and (-> obj next-state) (let ((v1-33 (-> obj next-state name))) + (or (= v1-33 'knocked) (= v1-33 'jump) (= v1-33 'jump-land)) + ) + ) + ) + (zero? (get-rand-int obj 3)) + (let ((f0-0 (vector-vector-distance-squared (-> obj root-override2 trans) (target-pos 0))) + (f1-0 32768.0) + ) + (>= f0-0 (* f1-0 f1-0)) + ) + ) + (enemy-method-73 obj) + ) + ((or (= s5-1 (knocked-type knocked-type-4)) (= s5-1 (knocked-type knocked-type-6))) + (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + (go (method-of-object obj knocked)) + ) + (else + (go (method-of-object obj knocked)) + ) + ) + ) + ) + (else + (go (method-of-object obj knocked)) + ) + ) + #t + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +(defmethod enemy-method-104 metalmonk ((obj metalmonk) (arg0 process) (arg1 uint) (arg2 uint)) + (let* ((s3-0 arg0) + (a0-2 (if (type? s3-0 process-focusable) + s3-0 + ) + ) + (s3-1 (new 'stack-no-clear 'vector)) + ) + (let ((s1-0 (new 'stack-no-clear 'vector))) + (vector-! s3-1 (get-trans (the-as process-focusable a0-2) 0) (-> obj root-override2 trans)) + (set! (-> s3-1 y) 0.0) + (vector-normalize! s3-1 1.0) + (set-vector! s1-0 0.0 1.0 0.0 1.0) + (vector-cross! s1-0 s1-0 (-> obj old-facing)) + (vector-normalize! s1-0 1.0) + (let ((f0-6 (vector-dot s1-0 s3-1))) + (cond + ((< 0.5 (fabs f0-6)) + ) + ((< f0-6 0.0) + (vector--float*! s3-1 s3-1 s1-0 0.5) + ) + (else + (vector+float*! s3-1 s3-1 s1-0 0.5) + ) + ) + ) + ) + (vector-normalize! s3-1 (* 1.5 (-> obj enemy-info-override attack-shove-back))) + (set! (-> s3-1 y) (-> obj enemy-info-override attack-shove-up)) + (let ((a1-10 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-10 from) (process->ppointer self)) + (set! (-> a1-10 num-params) 2) + (set! (-> a1-10 message) 'attack) + (set! (-> a1-10 param 0) arg1) + (let ((v1-17 (new 'static 'attack-info :mask (attack-info-mask vector mode angle id)))) + (set! (-> v1-17 id) arg2) + (set! (-> v1-17 angle) 'front) + (set! (-> v1-17 vector quad) (-> s3-1 quad)) + (set! (-> v1-17 mode) (-> obj enemy-info-override attack-mode)) + (set! (-> a1-10 param 1) (the-as uint v1-17)) + ) + (when (send-event-function arg0 a1-10) + (enemy-method-105 obj arg0) + #t + ) + ) + ) + ) + +(defmethod enemy-method-84 metalmonk ((obj metalmonk) (arg0 enemy-jump-info)) + (let* ((f0-0 (vector-vector-xz-distance (-> arg0 start-pos) (-> arg0 dest-pos))) + (f1-1 + (fmax (-> obj enemy-info-override jump-height-min) (* (-> obj enemy-info-override jump-height-factor) f0-0)) + ) + (f0-3 (fmax (-> arg0 start-pos y) (-> arg0 dest-pos y))) + (f0-4 (- (fmax (+ (fmin (-> arg0 start-pos y) (-> arg0 dest-pos y)) f1-1) (+ 10240.0 f0-3)) f0-3)) + ) + (setup-from-to-height! (-> arg0 traj) (-> arg0 start-pos) (-> arg0 dest-pos) f0-4 -4.551111) + ) + (none) + ) + +(defmethod enemy-method-89 metalmonk ((obj metalmonk) (arg0 enemy-jump-info)) + #f + ) + +(defmethod enemy-method-87 metalmonk ((obj metalmonk) (arg0 enemy-jump-info)) + (let ((s5-0 (-> obj draw art-group data (-> obj enemy-info-override run-anim))) + (v1-6 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (not (and v1-6 (= v1-6 s5-0))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim s5-0)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim s5-0) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> arg0 anim-speed)) + (set! (-> a0-5 frame-num) 0.0) + (joint-control-channel-group! a0-5 (the-as art-joint-anim s5-0) num-func-seek!) + ) + ) + ) + #t + ) + +(defmethod enemy-method-88 metalmonk ((obj metalmonk) (arg0 enemy-jump-info)) + #f + ) + +(defmethod enemy-method-90 metalmonk ((obj metalmonk) (arg0 int) (arg1 enemy-jump-info)) + (case arg0 + ((3) + (let ((a0-1 (-> obj skel root-channel 0))) + (set! (-> a0-1 param 0) 1.0) + (joint-control-channel-group-eval! a0-1 (the-as art-joint-anim #f) num-func-loop!) + ) + #f + ) + (else + ((method-of-type nav-enemy enemy-method-90) obj arg0 arg1) + ) + ) + ) + +(defstate notice (metalmonk) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 (-> self nav))) + (set! (-> v1-4 max-rotation-rate) (* 2.0 (-> self enemy-info-override maximum-rotation-rate))) + ) + 0 + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 turning-acceleration) (* 2.0 (-> self enemy-info-override run-turning-acceleration))) + ) + 0 + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 (-> self nav))) + (set! (-> v1-4 max-rotation-rate) (-> self enemy-info-override maximum-rotation-rate)) + ) + 0 + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 turning-acceleration) (-> self enemy-info-override run-turning-acceleration)) + ) + 0 + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (ja :group! (-> self draw art-group data (-> *metalmonk-global-info* notice-anim (get-rand-int self 2)))) + (ja-no-eval :group! (ja-group) + :num! (seek! (the float (+ (-> (ja-group) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((a1-4 (-> self nav state))) + (set! (-> gp-0 quad) (-> a1-4 travel quad)) + ) + (seek-toward-heading-vec! (-> self root-override2) gp-0 131072.0 (seconds 0.01)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +(defstate hostile (metalmonk) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + (and gp-0 + (or (and (< (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + 20480.0 + ) + (let ((v1-19 (ja-group))) + (and (and v1-19 (= v1-19 metalmonk-charge0-ja)) (< (ja-frame-num 0) 3.0)) + ) + ) + (and (< (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + 16384.0 + ) + (let ((v1-29 (ja-group))) + (and v1-29 (= v1-29 metalmonk-charge1-ja)) + ) + (< (ja-frame-num 0) 8.0) + ) + ) + ) + ) + (go-virtual attack) + ) + ) + (none) + ) + :code (behavior () + (talker-spawn-func (-> *talker-speech* 95) *entity-pool* (target-pos 0) (the-as region #f)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (suspend) + (until #f + (metalmonk-method-181 self 1.2 0.1) + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + #f + (none) + ) + ) + +(defstate active (metalmonk) + :virtual #t + :code (behavior () + (let ((v1-2 (ja-group))) + (when (or (and v1-2 (or (= v1-2 metalmonk-charge0-ja) (= v1-2 metalmonk-charge1-ja))) + (let ((v1-8 (ja-group))) + (and v1-8 (or (= v1-8 metalmonk-patrol0-ja) (= v1-8 metalmonk-patrol1-ja))) + ) + ) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + ) + ) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (let ((gp-0 (-> self draw art-group data (-> (&-> *metalmonk-global-info* patrol-anim (get-rand-int self 2)) 0))) + (s5-0 (get-rand-int-range self 1 8)) + ) + (let ((v1-34 (ja-group))) + (if (not (and v1-34 (= v1-34 gp-0))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (dotimes (s4-0 s5-0) + (ja-no-eval :group! gp-0 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + (when (zero? (get-rand-int self 2)) + (let ((v1-58 self)) + (set! (-> v1-58 enemy-flags) (the-as enemy-flag (logclear (-> v1-58 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-58 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (ja-channel-push! 1 (seconds 0.3)) + (let ((gp-1 0)) + (until (not (enemy-method-123 self 0.4)) + (let* ((v1-62 (enemy-method-120 self 3 gp-1)) + (a1-16 (-> self draw art-group data (-> *metalmonk-global-info* idle-anim v1-62))) + ) + (set! gp-1 (ash 1 v1-62)) + (ja-no-eval :group! a1-16 + :num! (seek! (the float (+ (-> (the-as art-joint-anim a1-16) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + ) + (ja-no-eval :group! (ja-group) + :num! (seek! (the float (+ (-> (ja-group) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + (let ((v1-102 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-102 enemy-flags))) + (set! (-> v1-102 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-102 enemy-flags)))) + ) + (set! (-> v1-102 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-102 enemy-flags)))) + (set! (-> v1-102 nav callback-info) (-> v1-102 enemy-info-override callback-info)) + ) + 0 + ) + ) + ) + #f + (none) + ) + ) + +(defstate attack (metalmonk) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior metalmonk) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (metalmonk-method-180 self #t) + (nav-enemy-method-169 self 6144.0 #f) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) (+ 8192.0 (-> self enemy-info-override run-travel-speed))) + ) + 0 + (let ((v1-8 (-> self nav))) + (set! (-> v1-8 turning-acceleration) (* 4.0 (-> self enemy-info-override run-turning-acceleration))) + ) + 0 + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-15 *game-info*) + (v0-3 (+ (-> v1-15 attack-id) 1)) + ) + (set! (-> v1-15 attack-id) v0-3) + (set! (-> self attack-id) v0-3) + ) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (metalmonk-method-180 self #f) + (nav-enemy-method-168 self) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) (-> self enemy-info-override run-travel-speed)) + ) + 0 + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (enemy-method-49 self) + (none) + ) + :code (behavior () + (let ((gp-0 #f)) + (let* ((v1-2 (ja-group)) + (s5-0 (if (and v1-2 (= v1-2 metalmonk-charge0-ja)) + (-> self draw art-group data (-> *metalmonk-global-info* attack-anim 0)) + (-> self draw art-group data (-> *metalmonk-global-info* attack-anim 1)) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! s5-0 + :num! (seek! (the float (+ (-> (the-as art-joint-anim s5-0) frames num-frames) -1))) + :frame-num 0.0 + ) + ) + (until (ja-done? 0) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (set! gp-0 #t) + ) + (suspend) + (ja :num! (seek!)) + ) + (if gp-0 + (go-virtual victory) + (go-hostile self) + ) + ) + (none) + ) + :post (the-as (function none :behavior metalmonk) nav-enemy-chase-post) + ) + +(defstate victory (metalmonk) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy victory) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy victory) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (handle->process (-> self focus handle)))) + (if (and a0-1 (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.05)) + (let ((f0-0 (vector-vector-xz-distance-squared + (get-trans (the-as process-focusable a0-1) 0) + (-> self root-override2 trans) + ) + ) + (f1-0 14336.0) + ) + (< f0-0 (* f1-0 f1-0)) + ) + ) + ) + (enemy-method-72 self) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (ja :group! (-> self draw art-group data (-> *metalmonk-global-info* celebrate-anim (get-rand-int self 2)))) + (ja :num-func num-func-identity :frame-num 0.0) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (ja-no-eval :group! (ja-group) + :num! (seek! (the float (+ (-> (ja-group) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +(defstate circling (metalmonk) + :virtual #t + :code (behavior () + (nav-enemy-method-166 self) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (suspend) + (until #f + (metalmonk-method-181 self 1.6 1.5) + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + #f + (none) + ) + ) + +(defstate pacing (metalmonk) + :virtual #t + :code (behavior () + (let ((v1-2 (ja-group))) + (when (and v1-2 (or (= v1-2 metalmonk-charge0-ja) (= v1-2 metalmonk-charge1-ja))) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) (-> self enemy-info-override run-travel-speed)) + ) + 0 + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + ) + ) + (nav-enemy-method-165 self) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (-> self draw art-group data (-> *metalmonk-global-info* patrol-anim (get-rand-int self 2))) + (until #f + (metalmonk-method-182 self 1.2 0.5) + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + #f + (none) + ) + ) + +(defstate ambush (metalmonk) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy ambush) enter))) + (if t9-0 + (t9-0) + ) + ) + (when (not (-> self intro-path)) + (format 0 "ERROR: ~A has no intro path, skipping ambush~%" (-> self name)) + (go-virtual notice) + ) + (get-point-at-percent-along-path! (-> self intro-path) (-> self root-override2 trans) 0.0 'interp) + (none) + ) + :code (behavior () + (until #f + (let ((gp-0 (new 'stack-no-clear 'vector))) + (get-point-at-percent-along-path! (-> self intro-path) gp-0 1.0 'interp) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag vulnerable)))) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (let ((v1-4 (process->ppointer self))) + (set! (-> a1-1 from) v1-4) + ) + (set! (-> a1-1 num-params) 2) + (set! (-> a1-1 message) 'jump) + (set! (-> a1-1 param 0) (the-as uint 2)) + (set! (-> a1-1 param 1) (the-as uint gp-0)) + (send-event-function self a1-1) + ) + ) + (suspend) + ) + #f + (none) + ) + ) + +(defmethod enemy-method-77 metalmonk ((obj metalmonk) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 0) + (let* ((a2-0 (ash 1 (-> *metalmonk-global-info* prev-yellow-hit))) + (v1-3 (enemy-method-120 obj 4 a2-0)) + (a1-6 (-> obj draw art-group data (-> *metalmonk-global-info* yellow-hit-anim v1-3))) + ) + (set! (-> *metalmonk-global-info* prev-yellow-hit) v1-3) + (let ((a0-13 (-> obj skel root-channel 0))) + (set! (-> a0-13 frame-group) (the-as art-joint-anim a1-6)) + (set! (-> a0-13 param 0) (the float (+ (-> (the-as art-joint-anim a1-6) frames num-frames) -1))) + (set! (-> a0-13 param 1) (-> arg0 0)) + (set! (-> a0-13 frame-num) 0.0) + (joint-control-channel-group! a0-13 (the-as art-joint-anim a1-6) num-func-seek!) + ) + ) + ) + (((knocked-type knocked-type-6)) + (let* ((a2-2 (ash 1 (-> *metalmonk-global-info* prev-blue-hit))) + (v1-12 (enemy-method-120 obj 3 a2-2)) + (s5-1 (-> obj draw art-group data (-> *metalmonk-global-info* blue-hit-anim v1-12))) + ) + (set! (-> *metalmonk-global-info* prev-blue-hit) v1-12) + (let ((v1-15 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-15 (= v1-15 (-> obj draw art-group data 27))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + (let ((a0-31 (-> obj skel root-channel 0))) + (set! (-> a0-31 frame-group) (the-as art-joint-anim s5-1)) + (set! (-> a0-31 param 0) (the float (+ (-> (the-as art-joint-anim s5-1) frames num-frames) -1))) + (set! (-> a0-31 param 1) 1.0) + (set! (-> a0-31 frame-num) 0.0) + (joint-control-channel-group! a0-31 (the-as art-joint-anim s5-1) num-func-seek!) + ) + ) + ) + (else + (let ((s4-1 (if (< (vector-dot + (the-as vector (metalmonk-method-179 obj (new 'stack-no-clear 'vector))) + (-> obj root-override2 transv) + ) + 0.0 + ) + (-> obj draw art-group data (-> *metalmonk-global-info* knocked-anim (get-rand-int obj 2))) + (-> obj draw art-group data 20) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-38 (-> obj skel root-channel 0))) + (set! (-> a0-38 frame-group) (the-as art-joint-anim s4-1)) + (set! (-> a0-38 param 0) (the float (+ (-> (the-as art-joint-anim s4-1) frames num-frames) -1))) + (set! (-> a0-38 param 1) (-> arg0 0)) + (set! (-> a0-38 frame-num) 0.0) + (joint-control-channel-group! a0-38 (the-as art-joint-anim s4-1) num-func-seek!) + ) + ) + ) + ) + #t + ) + +(defmethod enemy-method-78 metalmonk ((obj metalmonk) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((s4-0 (-> obj draw art-group data 27))) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-3 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) 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 s4-0) num-func-seek!) + ) + ) + #t + ) + ) + ((!= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) + (let* ((v1-14 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + (s4-1 (cond + ((and v1-14 (= v1-14 (-> obj draw art-group data 16))) + (-> obj draw art-group data 17) + ) + (else + (let ((v1-21 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-21 (= v1-21 (-> obj draw art-group data 18))) + (-> obj draw art-group data 19) + (-> obj draw art-group data 21) + ) + ) + ) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-14 (-> obj skel root-channel 0))) + (set! (-> a0-14 frame-group) (the-as art-joint-anim s4-1)) + (set! (-> a0-14 param 0) (the float (+ (-> (the-as art-joint-anim s4-1) frames num-frames) -1))) + (set! (-> a0-14 param 1) (-> arg0 0)) + (set! (-> a0-14 frame-num) 0.0) + (joint-control-channel-group! a0-14 (the-as art-joint-anim s4-1) num-func-seek!) + ) + ) + #t + ) + ) + ) + +(defmethod metalmonk-method-180 metalmonk ((obj metalmonk) (arg0 symbol)) + (let ((v1-1 (-> obj root-override2 root-prim))) + (dotimes (a0-1 1) + (let ((a2-1 (-> (the-as collide-shape-prim-group v1-1) child a0-1))) + (if arg0 + (set! (-> a2-1 prim-core action) (collide-action solid deadly)) + (set! (-> a2-1 prim-core action) (collide-action solid)) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod enemy-method-114 metalmonk ((obj metalmonk)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 9) 0))) + (set! (-> s5-0 total-prims) (the-as uint 10)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 8192.0 0.0 16384.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid deadly)) + (set! (-> v1-13 transform-index) 7) + (set-vector! (-> v1-13 local-sphere) 0.0 0.0 0.0 2662.4) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid)) + (set! (-> v1-15 transform-index) 38) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid)) + (set! (-> v1-17 transform-index) 41) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec backgnd crate obstacle hit-by-others-list)) + (set! (-> v1-19 prim-core action) (collide-action solid)) + (set-vector! (-> v1-19 local-sphere) 0.0 6144.0 0.0 6144.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-21 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-21 local-sphere) 0.0 5120.0 0.0 5120.0) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-23 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-23 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-23 prim-core action) (collide-action solid)) + (set! (-> v1-23 transform-index) 4) + (set-vector! (-> v1-23 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-25 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-25 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-25 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-25 prim-core action) (collide-action solid)) + (set! (-> v1-25 transform-index) 10) + (set-vector! (-> v1-25 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (let ((v1-27 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-27 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-27 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-27 prim-core action) (collide-action solid)) + (set! (-> v1-27 transform-index) 13) + (set-vector! (-> v1-27 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (let ((v1-29 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-29 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-29 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-29 prim-core action) (collide-action solid)) + (set! (-> v1-29 transform-index) 22) + (set-vector! (-> v1-29 local-sphere) 0.0 0.0 0.0 2662.4) + ) + (set! (-> s5-0 nav-radius) 8192.0) + (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 coin-flip? metalmonk ((obj metalmonk)) + "@returns The result of a 50/50 RNG roll" + #f + ) + +;; WARN: Return type mismatch process-focusable vs metalmonk. +(defmethod relocate metalmonk ((obj metalmonk) (arg0 int)) + (if (nonzero? (-> obj intro-path)) + (&+! (-> obj intro-path) arg0) + ) + (the-as + metalmonk + ((the-as (function process-focusable int process-focusable) (find-parent-method metalmonk 7)) obj arg0) + ) + ) + +(defmethod enemy-method-115 metalmonk ((obj metalmonk)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-metalmonk" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *metalmonk-nav-enemy-info*) + (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-vector! (-> v1-8 twist-max) 10922.667 12743.111 0.0 1.0) + (set! (-> v1-8 ignore-angle) 18204.445) + ) + (let ((v1-10 (-> obj nav))) + (set! (-> v1-10 speed-scale) 1.0) + ) + 0 + (logior! (-> obj nav flags) (nav-control-flag momentum-ignore-heading)) + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (set! (-> obj intro-path) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (metalmonk-method-180 obj #f) + (set! (-> obj high-time) 0) + (add-connection + *part-engine* + obj + 7 + obj + 4986 + (new 'static 'vector :x 1064.96 :y -450.56 :z 1146.88 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 7 + obj + 4987 + (new 'static 'vector :x -1064.96 :y -450.56 :z 1146.88 :w 163840.0) + ) + (add-connection *part-engine* obj 7 obj 4988 (new 'static 'vector :y 1556.48 :z 368.64 :w 163840.0)) + 0 + (none) + ) 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 17563a88fd..63d1c4d32d 100644 --- a/goal_src/jak2/levels/common/enemy/metalhead_slinger/grenadier.gc +++ b/goal_src/jak2/levels/common/enemy/metalhead_slinger/grenadier.gc @@ -7,3 +7,1317 @@ ;; DECOMP BEGINS +(defpartgroup group-grenadier-drip + :id 1150 + :duration (seconds 0.5) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 2) + :parts ((sp-item 4985 :fade-after (meters 140) :falloff-to (meters 140))) + ) + +(defpart 1309 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #x3e8)) + (sp-rnd-flt spt-num 1.0 1.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.6) (meters 0.2) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.4) (meters 0.1) 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-rnd-flt spt-scalevel-x (meters -0.0026666666) (meters -0.0026666666) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.73333335) + (sp-flt spt-fade-g -3.4) + (sp-flt spt-fade-b -0.73333335) + (sp-rnd-flt spt-accel-y -1.3653333 -4.096 1.0) + (sp-int spt-timer 300) + (sp-cpuinfo-flags sp-cpuinfo-flag-0 sp-cpuinfo-flag-2 sp-cpuinfo-flag-14) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 640) + (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) + (sp-rnd-flt spt-conerot-radius (meters 0) (meters 0.35) 1.0) + ) + ) + +(defskelgroup skel-grenadier grenadier grenadier-lod0-jg -1 + ((grenadier-lod0-mg (meters 20)) (grenadier-lod1-mg (meters 40)) (grenadier-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5) + :shadow grenadier-shadow-mg + :origin-joint-index 4 + ) + +(deftype bank-info (structure) + ((circle sphere :inline :offset-assert 0) + (tangent-pos vector :inline :offset-assert 16) + (final-pos vector :inline :offset-assert 32) + (final-dir vector :inline :offset-assert 48) + ) + :method-count-assert 9 + :size-assert #x40 + :flag-assert #x900000040 + ) + + +(deftype grenadier (nav-enemy) + ((shot-trajectory trajectory :inline :offset-assert 608) + (hostile-path path-control :offset-assert 648) + (bank bank-info :inline :offset-assert 656) + (joint joint-mod-blend-world :offset-assert 720) + (heading symbol :offset-assert 724) + (move-pos vector :inline :offset-assert 736) + (move-angle float :offset-assert 752) + (status-flags uint64 :offset-assert 760) + (suppress-knockaside-timer time-frame :offset-assert 768) + ) + :heap-base #x290 + :method-count-assert 184 + :size-assert #x308 + :flag-assert #xb802900308 + (:methods + (attack () _type_ :state 178) + (backup () _type_ :state 179) + (spin-kick () _type_ :state 180) + (grenadier-method-181 (_type_) none 181) + (grenadier-method-182 (_type_ vector) none 182) + (grenadier-method-183 (_type_) none 183) + ) + ) + + +(define *grenadier-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #t + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 20 + #x270002 + #x6040501 + #x270002 + #x1010701 + #x1010601 + #x270002 + #x6040501 + #x1010801 + #x1010701 + #x1010601 + #x270002 + #x8040501 + #x270002 + #x1010801 + #x270002 + #x1010601 + #x0 + #x0 + #x0 + #x0 + ) + :idle-anim 5 + :notice-anim 11 + :hostile-anim 13 + :hit-anim 23 + :knocked-anim 31 + :knocked-land-anim 32 + :die-anim 33 + :die-falling-anim 34 + :victory-anim 22 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 24 + :look-at-joint 24 + :bullseye-joint 18 + :sound-hit (static-sound-name "grenadier-hit") + :sound-die (static-sound-name "grenadier-die") + :notice-distance (meters 50) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 12.5) + :default-hit-points 14 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :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-seek-ry-clamp 0.18204445 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 24 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 1802.24 :z 286.72 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 9 + :turn-anim -1 + :run-anim 13 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 50) + :walk-travel-speed (meters 2) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 50) + :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! (-> *grenadier-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod enemy-method-74 grenadier ((obj grenadier) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (with-pp + (case arg2 + (('hit-knocked) + (when (= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) + (if (and (< (- (-> pp clock frame-counter) (-> obj suppress-knockaside-timer)) (seconds 0.6)) + (and (-> obj next-state) (= (-> obj next-state name) 'attack)) + (nonzero? (-> obj hit-points)) + ) + (return #t) + ) + (logior! (-> obj status-flags) 1) + (set! (-> obj suppress-knockaside-timer) (-> pp clock frame-counter)) + ) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (('notify) + (cond + ((and (= (-> arg3 param 0) 'attack) (= (-> arg3 param 1) *target*)) + (let ((v1-23 (new 'stack-no-clear 'event-message-block))) + (set! (-> v1-23 from) (process->ppointer arg0)) + (set! (-> v1-23 num-params) (the-as int arg1)) + (set! (-> v1-23 message) 'victory) + (set! (-> v1-23 param 0) (-> arg3 param 0)) + (set! (-> v1-23 param 1) (-> arg3 param 1)) + (set! (-> v1-23 param 2) (-> arg3 param 2)) + (set! (-> v1-23 param 3) (-> arg3 param 3)) + (set! (-> v1-23 param 4) (-> arg3 param 4)) + (set! (-> v1-23 param 5) (-> arg3 param 5)) + (send-event-function obj v1-23) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +(defun pos-rotate-y<-vector+vector ((arg0 vector) (arg1 vector)) + (let ((f0-0 (rotate-y<-vector+vector arg0 arg1))) + (if (< f0-0 0.0) + (+ 65536.0 f0-0) + f0-0 + ) + ) + ) + +;; WARN: Return type mismatch vector vs none. +(defmethod grenadier-method-182 grenadier ((obj grenadier) (arg0 vector)) + (cloest-point-on-mesh (-> obj nav) arg0 arg0 (the-as nav-poly #f)) + (set! (-> obj bank final-pos quad) (-> arg0 quad)) + (set! (-> obj bank tangent-pos quad) (-> arg0 quad)) + (set! (-> obj move-pos quad) (-> obj bank tangent-pos quad)) + (none) + ) + +(defmethod grenadier-method-181 grenadier ((obj grenadier)) + (let ((s5-0 (handle->process (-> obj focus handle)))) + (when s5-0 + (cond + ((-> obj hostile-path) + (let* ((s4-0 (-> obj hostile-path)) + (f30-0 (get-path-percentage-at-furthest-point s4-0 (get-trans (the-as process-focusable s5-0) 0))) + (s3-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> obj heading) (not (-> obj heading))) + (let* ((f0-0 (rand-vu-float-range 0.2 0.45)) + (f0-1 (if (-> obj heading) + (+ f30-0 f0-0) + (- f30-0 f0-0) + ) + ) + ) + (if (< f0-1 0.0) + (set! f0-1 (+ 1.0 f0-1)) + ) + (if (< 1.0 f0-1) + (set! f0-1 (+ -1.0 f0-1)) + ) + (get-point-at-percent-along-path! s4-0 s3-1 f0-1 'interp) + ) + (grenadier-method-182 obj s3-1) + ) + ) + (else + (let* ((s4-1 (-> obj root-override2)) + (a0-10 (get-trans (the-as process-focusable s5-0) 0)) + (v1-27 (vector-! (new 'stack-no-clear 'vector) a0-10 (-> s4-1 trans))) + ) + (vector-length v1-27) + (let ((s3-2 (new 'stack-no-clear 'vector)) + (s2-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> obj heading) (not (-> obj heading))) + (if (-> obj heading) + (set-vector! s3-2 (-> v1-27 z) (-> v1-27 y) (- (-> v1-27 x)) 1.0) + (set-vector! s3-2 (- (-> v1-27 z)) (-> v1-27 y) (-> v1-27 x) 1.0) + ) + (vector-normalize! s3-2 (* 4096.0 (rand-vu-float-range 14.0 18.0))) + (grenadier-method-182 obj (vector+! s2-1 (-> s4-1 trans) s3-2)) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +(defstate active (grenadier) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let* ((f30-0 (get-rand-float-range self 0.9 1.1)) + (a0-2 '((grenadier-patrol-ja) (grenadier-patrol1-ja))) + (gp-0 ((method-of-type (rtype-of a0-2) length) a0-2)) + (s5-0 (new 'static 'array int64 2 9 10)) + (s4-0 (-> (the-as (pointer int32) (+ (* (get-rand-int self gp-0) 8) (the-as int s5-0))))) + ) + (until #f + (ja-no-eval :group! (-> self draw art-group data s4-0) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data s4-0)) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (when (enemy-method-123 self 0.2) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.6)) + (let ((v1-38 self)) + (set! (-> v1-38 enemy-flags) (the-as enemy-flag (logclear (-> v1-38 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-38 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (until (not (enemy-method-123 self 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((v1-100 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-100 enemy-flags))) + (set! (-> v1-100 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-100 enemy-flags)))) + ) + (set! (-> v1-100 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-100 enemy-flags)))) + (set! (-> v1-100 nav callback-info) (-> v1-100 enemy-info-override callback-info)) + ) + 0 + (ja-no-eval :num! (loop!)) + (set! s4-0 (-> (the-as (pointer int32) (+ (* (get-rand-int self gp-0) 8) (the-as int s5-0))))) + (ja-channel-push! 1 (seconds 0.6)) + (ja-no-eval :group! (-> self draw art-group data s4-0) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data s4-0)) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + #f + (none) + ) + ) + +(defstate notice (grenadier) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (vector-reset! (-> self root-override2 transv)) + (none) + ) + ) + +(defstate hostile (grenadier) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (grenadier-method-181 self) + (enemy-method-109 self 2) + (set! (-> self status-flags) (logand -2 (-> self status-flags))) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (handle->process (-> self focus handle)))) + (when a0-1 + (let* ((s5-0 (get-trans (the-as process-focusable a0-1) 0)) + (gp-0 (-> self root-override2 trans)) + (f30-0 (vector-vector-distance gp-0 s5-0)) + ) + (cond + ((and (< f30-0 12288.0) (enemy-method-107 self)) + (go-virtual spin-kick) + ) + ((< f30-0 40960.0) + (let ((s3-1 (vector-! (new 'stack-no-clear 'vector) gp-0 s5-0)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s4-0 quad) (-> self root-override2 trans quad)) + (new 'stack-no-clear 'vector) + (vector-normalize! s3-1 49152.0) + (cloest-point-on-mesh (-> self nav) s4-0 (vector+! s4-0 s5-0 s3-1) (the-as nav-poly #f)) + (when (< 32768.0 (vector-vector-distance gp-0 s4-0)) + (set! (-> self move-pos quad) (-> s4-0 quad)) + (let ((a0-11 (-> self nav state)) + (v1-32 (-> self move-pos)) + ) + (logclear! (-> a0-11 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-11 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-11 target-post quad) (-> v1-32 quad)) + ) + 0 + (go-virtual backup) + ) + ) + ) + ) + ) + ) + ) + (when (or (>= (- (-> self clock frame-counter) (-> self state-time)) (rand-vu-int-range (seconds 3) (seconds 9))) + (>= 8192.0 (vector-vector-xz-distance (-> self root-override2 trans) (-> self bank final-pos))) + ) + (if (and (handle->process (-> self focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> self focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + (go-virtual attack) + (go-stare self) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let* ((a0-1 '((grenadier-run-ja) (grenadier-run1-ja))) + (a1-3 ((method-of-type (rtype-of a0-1) length) a0-1)) + (gp-0 (new 'static 'array int64 2 13 14)) + (gp-1 (-> self + draw + art-group + data + (-> (the-as (pointer int32) (+ (* (get-rand-int self a1-3) 8) (the-as int gp-0)))) + ) + ) + (f30-0 (get-rand-float-range self 0.9 1.1)) + ) + (until #f + (ja-no-eval :group! gp-1 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-1) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((gp-0 (-> self bank))) + (if (< (vector-vector-xz-distance (-> self root-override2 trans) (-> gp-0 tangent-pos)) 9830.4) + (set! (-> self move-pos quad) (-> gp-0 final-pos quad)) + ) + ) + (let ((a0-3 (-> self nav state)) + (v1-5 (-> self move-pos)) + ) + (logclear! (-> a0-3 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-3 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-3 target-post quad) (-> v1-5 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +(defstate backup (grenadier) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior grenadier) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-2 enemy-flags))) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-2 enemy-flags)))) + ) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-2 enemy-flags)))) + (set! (-> v1-2 nav callback-info) (-> v1-2 enemy-info-override callback-info)) + ) + 0 + (none) + ) + :trans (behavior () + (let ((f0-0 (vector-vector-xz-distance (-> self root-override2 trans) (-> self move-pos)))) + (if (or (>= 12288.0 f0-0) (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 6))) + (go-hostile self) + ) + ) + (none) + ) + :code (behavior () + (until #f + (ja-no-eval :group! grenadier-run-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-run-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 (-> self move-pos)) + ) + (logclear! (-> a0-0 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-0 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-0 target-post quad) (-> v1-1 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +(defstate spin-kick (grenadier) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior grenadier) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (a0-7 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-7) + (set! (-> self attack-id) a0-7) + ) + (let ((v1-13 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-13 prim-core action) (collide-action deadly)) + (set! (-> v1-13 local-sphere w) 7372.8) + ) + (none) + ) + :exit (behavior () + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-3 prim-core action) (collide-action)) + (set! (-> v1-3 local-sphere w) 4096.0) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.135)) + (ja-no-eval :group! grenadier-spin-kick-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-spin-kick-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + (-> self nav max-rotation-rate) + (seconds 0.02) + ) + ) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +;; ERROR: function was not converted to expressions. Cannot decompile. + +(defmethod enemy-method-78 grenadier ((obj grenadier) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((s4-0 (-> obj draw art-group data 30))) + (ja-channel-push! 1 (seconds 0.067)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-3 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) 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 s4-0) num-func-seek!) + ) + ) + ) + #t + ) + ((or (= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) (zero? (-> obj incoming knocked-type))) + #f + ) + ((> (-> obj hit-points) 0) + (ja-channel-push! 1 (seconds 0.067)) + (let ((a1-4 (-> obj draw art-group data (-> obj enemy-info-override knocked-land-anim))) + (a0-9 (-> obj skel root-channel 0)) + ) + (set! (-> a0-9 frame-group) (the-as art-joint-anim a1-4)) + (set! (-> a0-9 param 0) (the float (+ (-> (the-as art-joint-anim a1-4) frames num-frames) -1))) + (set! (-> a0-9 param 1) (-> arg0 0)) + (set! (-> a0-9 frame-num) 0.0) + (joint-control-channel-group! a0-9 (the-as art-joint-anim a1-4) num-func-seek!) + ) + #t + ) + (else + (ja-channel-push! 1 (seconds 0.067)) + (let ((a0-11 (-> obj skel root-channel 0))) + (set! (-> a0-11 frame-group) (the-as art-joint-anim (-> obj draw art-group data 33))) + (set! (-> a0-11 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 33)) frames num-frames) -1)) + ) + (set! (-> a0-11 param 1) (-> arg0 0)) + (set! (-> a0-11 frame-num) 0.0) + (joint-control-channel-group! a0-11 (the-as art-joint-anim (-> obj draw art-group data 33)) num-func-seek!) + ) + #t + ) + ) + ) + +(defstate attack (grenadier) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (let ((s4-0 (handle->process (-> self focus handle)))) + (when s4-0 + (let ((gp-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data 34)))) + (let ((s5-1 (vector-! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable s4-0) 0) gp-0))) + (let ((s4-1 (new 'stack-no-clear 'vector))) + (let ((f0-0 (vector-length s5-1))) + 0.0 + (let ((f0-1 (fmin 245760.0 f0-0))) + (vector-normalize! s5-1 f0-1) + ) + ) + (vector+! s4-1 gp-0 s5-1) + (let ((f0-2 122880.0)) + (setup-from-to-xz-vel! (-> self shot-trajectory) gp-0 s4-1 f0-2 -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-9 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> a1-9 ent) (-> self entity)) + (set! (-> a1-9 charge) 1.0) + (set! (-> a1-9 options) (projectile-options)) + (set! (-> a1-9 pos quad) (-> gp-0 quad)) + (set! (-> a1-9 vel quad) (-> self shot-trajectory initial-velocity quad)) + (set! (-> a1-9 notify-handle) (process->handle self)) + (set! (-> a1-9 owner-handle) (the-as handle #f)) + (set! (-> a1-9 ignore-handle) (process->handle self)) + (let* ((v1-27 *game-info*) + (a0-27 (+ (-> v1-27 attack-id) 1)) + ) + (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)) + (spawn-projectile metalhead-grenade-shot a1-9 self *default-dead-pool*) + ) + ) + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (let ((v1-1 (-> self nav state)) + (a0-1 (-> self root-override2 trans)) + ) + (logclear! (-> v1-1 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-1 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-1 target-post quad) (-> a0-1 quad)) + ) + 0 + (let ((v1-4 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-4 enemy-flags))) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-4 enemy-flags)))) + ) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-4 enemy-flags)))) + (set! (-> v1-4 nav callback-info) (-> v1-4 enemy-info-override callback-info)) + ) + 0 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-7 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-11 *game-info*) + (a0-19 (+ (-> v1-11 attack-id) 1)) + ) + (set! (-> v1-11 attack-id) a0-19) + (set! (-> self attack-id) a0-19) + ) + (enemy-method-109 self 1) + (none) + ) + :exit (behavior () + (if (logtest? (enemy-flag enemy-flag43) (-> self enemy-flags)) + (logior! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + (logclear! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + ) + (set! (-> self status-flags) (logand -3 (-> self status-flags))) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (let ((f28-0 (vector-length (-> self root-override2 transv)))) + (ja-channel-push! 1 (seconds 0.2)) + (when (< 4096.0 f28-0) + (let* ((v1-8 (vector-float*! (new 'stack-no-clear 'vector) (-> self root-override2 transv) 0.3)) + (a2-2 (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) v1-8)) + ) + (set! (-> self move-pos quad) (-> self root-override2 trans quad)) + (cloest-point-on-mesh (-> self nav) (-> self move-pos) a2-2 (the-as nav-poly #f)) + ) + (let ((a0-10 (-> self nav state)) + (v1-13 (-> self move-pos)) + ) + (logclear! (-> a0-10 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-10 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-10 target-post quad) (-> v1-13 quad)) + ) + 0 + (logclear! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + (logior! (-> self status-flags) 2) + (ja-no-eval :group! grenadier-run-to-throw-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-run-to-throw-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (ja-channel-push! 1 (seconds 0.067)) + (set! (-> self status-flags) (logand -3 (-> self status-flags))) + (if (logtest? (enemy-flag enemy-flag43) (-> self enemy-flags)) + (logior! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + (logclear! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + ) + ) + ) + (let ((v1-52 self)) + (set! (-> v1-52 enemy-flags) (the-as enemy-flag (logclear (-> v1-52 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-52 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (cond + ((logtest? (-> self status-flags) 1) + (ja-channel-push! 1 (seconds 0.135)) + (ja-no-eval :group! grenadier-throw-quick-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-throw-quick-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (set! (-> self status-flags) (logand -2 (-> self status-flags))) + ) + (else + (when (not (enemy-method-96 self 1820.4445 #t)) + (let ((v1-84 self)) + (set! (-> v1-84 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-84 enemy-flags)))) + ) + 0 + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! grenadier-throw-turn-in-place-ja) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 910.2222 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-100 self)) + (set! (-> v1-100 enemy-flags) + (the-as enemy-flag (logclear (-> v1-100 enemy-flags) (enemy-flag enemy-flag37))) + ) + ) + 0 + ) + (let ((v1-102 self)) + (set! (-> v1-102 enemy-flags) + (the-as enemy-flag (logclear (-> v1-102 enemy-flags) (enemy-flag enemy-flag37))) + ) + ) + 0 + (ja-channel-push! 1 (seconds 0.067)) + (let ((a0-50 (handle->process (-> self focus handle)))) + (when a0-50 + (let ((f0-14 (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable a0-50) 0))) + ) + (cond + ((< 102400.0 f0-14) + (ja-no-eval :group! grenadier-throw-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-throw-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (else + (ja-no-eval :group! grenadier-throw1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-throw1-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + (-> self nav max-rotation-rate) + (seconds 0.02) + ) + ) + ) + ) + ) + (nav-enemy-travel-post) + (none) + ) + ) + +(defstate hit (grenadier) + :virtual #t + :code (behavior () + (local-vars (v1-10 int) (v1-44 enemy-flag) (v1-52 enemy-flag)) + (let ((gp-0 (enemy-method-50 self (new 'stack-no-clear 'vector)))) + 0 + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + gp-0 + (meters 6) + (new 'static 'rgba :r #x80 :g #x80 :b #x80 :a #x80) + ) + (add-debug-quaternion + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (-> self root-override2 quat) + ) + (let ((f0-0 (quaternion-vector-y-angle (-> self root-override2 quat) gp-0))) + (cond + ((and (< -8192.0 f0-0) (>= 8192.0 f0-0)) + (set! v1-10 26) + ) + ((and (< 8192.0 f0-0) (>= 24576.0 f0-0)) + (set! v1-10 24) + ) + ((and (< -24576.0 f0-0) (>= -8192.0 f0-0)) + (set! v1-10 25) + ) + (else + (set! v1-10 23) + ) + ) + ) + ) + (let ((gp-1 (-> self draw art-group data v1-10))) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! gp-1 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-1) frames num-frames) -1))) + :frame-num 0.0 + ) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (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-43 (-> self enemy-flags))) + (if (logtest? v1-43 (enemy-flag checking-water)) + (set! v1-44 (logior v1-43 (enemy-flag enable-on-active))) + (set! v1-44 (logclear v1-43 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-44) + (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-51 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-51) + (set! v1-52 (logior (enemy-flag check-water-backup) v1-51)) + (set! v1-52 (logclear v1-51 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-52) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (cond + ((= (-> self focus aware) (enemy-aware enemy-aware-3)) + (if (and (handle->process (-> self focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> self focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + (go-virtual attack) + ) + (go-hostile self) + ) + (else + (go-stare self) + ) + ) + (none) + ) + ) + +(defmethod go-hostile grenadier ((obj grenadier)) + (if (and (and (-> obj next-state) (= (-> obj next-state name) 'knocked)) + (and (logtest? (-> obj status-flags) 1) + (handle->process (-> obj focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> obj focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + ) + (go (method-of-object obj attack)) + ) + ((method-of-type nav-enemy go-hostile) obj) + (none) + ) + +(defstate victory (grenadier) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (cond + ((zero? (rand-vu-int-range 0 1)) + (ja-no-eval :group! grenadier-victory-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-victory-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (else + (ja-no-eval :group! grenadier-notice-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-notice-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +(defmethod nav-enemy-method-142 grenadier ((obj grenadier) (arg0 nav-control)) + (local-vars (a0-4 int) (a0-6 int)) + (b! (logtest? (-> obj status-flags) 2) cfg-6 :delay (empty-form)) + (let ((v1-3 (new 'stack-no-clear 'vector)) + (a2-0 (new 'stack-no-clear 'vector)) + ) + (vector-reset! a2-0) + (set! (-> a2-0 y) 1.0) + (let ((t0-0 (-> arg0 state))) + (set! (-> v1-3 quad) (-> t0-0 heading quad)) + ) + (let* ((a1-3 (-> *perf-stats* data 33)) + (a3-3 (-> a1-3 ctrl)) + ) + (+! (-> a1-3 count) 1) + (b! (zero? a3-3) cfg-3 :delay (nop!)) + (.mtc0 Perf 0) + (.sync.l) + (.sync.p) + (.mtpc pcr0 0) + (.mtpc pcr1 0) + (.sync.l) + (.sync.p) + (.mtc0 Perf a3-3) + ) + (.sync.l) + (.sync.p) + (label cfg-3) + 0 + (forward-up-nopitch->quaternion (-> obj root-override2 quat) v1-3 a2-0) + ) + (let ((v1-5 (-> *perf-stats* data 33))) + (b! (zero? (-> v1-5 ctrl)) cfg-5 :delay (nop!)) + (.mtc0 Perf 0) + (.sync.l) + (.sync.p) + (.mfpc a0-4 pcr0) + (+! (-> v1-5 accum0) a0-4) + (.mfpc a0-6 pcr1) + (+! (-> v1-5 accum1) a0-6) + ) + (label cfg-5) + 0 + (label cfg-6) + 0 + (none) + ) + +(defmethod enemy-method-55 grenadier ((obj grenadier)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-55))) + (t9-0 obj) + ) + (let ((a1-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 34)))) + (spawn (-> obj part) a1-1) + ) + (none) + ) + +(defmethod enemy-method-114 grenadier ((obj grenadier)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 6) 0))) + (set! (-> s5-0 total-prims) (the-as uint 7)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 12288.0 0.0 22528.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-13 local-sphere) 0.0 6553.6 0.0 6553.6) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action)) + (set! (-> v1-15 transform-index) 31) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 prim-core action) (collide-action deadly)) + (set! (-> v1-17 transform-index) 34) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 prim-core action) (collide-action deadly)) + (set! (-> v1-19 transform-index) 23) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-21 prim-core action) (collide-action deadly)) + (set! (-> v1-21 transform-index) 16) + (set-vector! (-> v1-21 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-23 prim-core collide-with) (collide-spec backgnd obstacle hit-by-others-list)) + (set! (-> v1-23 prim-core action) (collide-action solid)) + (set-vector! (-> v1-23 local-sphere) 0.0 12288.0 0.0 12288.0) + ) + (set! (-> s5-0 nav-radius) 8192.0) + (let ((v1-25 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-25 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-25 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-focusable vs grenadier. +(defmethod relocate grenadier ((obj grenadier) (arg0 int)) + (if (nonzero? (-> obj joint)) + (&+! (-> obj joint) arg0) + ) + (when (-> obj hostile-path) + (if (nonzero? (-> obj hostile-path)) + (&+! (-> obj hostile-path) arg0) + ) + ) + (the-as + grenadier + ((the-as (function process-focusable int process-focusable) (find-parent-method grenadier 7)) obj arg0) + ) + ) + +(defmethod enemy-method-115 grenadier ((obj grenadier)) + "@abstract" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-grenadier" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *grenadier-nav-enemy-info*) + (let ((v1-5 (-> obj neck))) + (when v1-5 + (set! (-> v1-5 up) (the-as uint 1)) + (set! (-> v1-5 nose) (the-as uint 2)) + (set! (-> v1-5 ear) (the-as uint 0)) + (set-vector! (-> v1-5 twist-max) 11832.889 11832.889 0.0 1.0) + (set! (-> v1-5 ignore-angle) 30947.555) + ) + ) + (let ((v1-6 (-> obj nav))) + (set! (-> v1-6 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (set! (-> obj heading) (if (rand-vu-percent? 0.5) + #t + #f + ) + ) + (set! (-> obj move-angle) 5461.3335) + (set! (-> obj status-flags) (the-as uint 0)) + (set! (-> obj suppress-knockaside-timer) 0) + (set-vector! (-> obj root-override2 scale) 1.5 1.5 1.5 1.0) + (set! (-> obj joint) (new 'process 'joint-mod-blend-world obj 17 #f 0.0)) + (logior! (-> obj joint blend-flags) (joint-mod-blend-flags rotation)) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 1150) obj)) + (set! (-> obj hostile-path) (new 'process 'path-control obj 'hostile 0.0 (-> obj entity) #t)) + (if (zero? (-> obj hostile-path)) + (set! (-> obj hostile-path) #f) + ) + (if (-> obj hostile-path) + (logior! (-> obj hostile-path flags) (path-control-flag display draw-line draw-point draw-text)) + ) + (add-connection *part-engine* obj 24 obj 318 (new 'static 'vector :x 532.48 :y -81.92 :z 1515.52 :w 163840.0)) + (add-connection + *part-engine* + obj + 24 + obj + 318 + (new 'static 'vector :x -532.48 :y -81.92 :z 1515.52 :w 163840.0) + ) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/common/grunt.gc b/goal_src/jak2/levels/common/grunt.gc index 33b5e93e72..00681acaa8 100644 --- a/goal_src/jak2/levels/common/grunt.gc +++ b/goal_src/jak2/levels/common/grunt.gc @@ -326,7 +326,6 @@ ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) ) ) - (none) ) (defmethod go-ambush grunt ((obj grunt)) diff --git a/goal_src/jak2/levels/drill_platform/ginsu.gc b/goal_src/jak2/levels/drill_platform/ginsu.gc index 621780f4d8..6464c38662 100644 --- a/goal_src/jak2/levels/drill_platform/ginsu.gc +++ b/goal_src/jak2/levels/drill_platform/ginsu.gc @@ -7,3 +7,1077 @@ ;; DECOMP BEGINS +(defpartgroup group-ginsu-sparks + :id 475 + :bounds (static-bspherem 0 0 0 8) + :parts ((sp-item 2105) (sp-item 2106 :fade-after (meters 90))) + ) + +(defpart 2105 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x92 :page #xc)) + (sp-rnd-flt spt-num 2.0 3.0 1.0) + (sp-flt spt-scale-x (meters 2.5)) + (sp-int spt-rot-x 4) + (sp-flt spt-scale-y (meters 0.033)) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 128.0) + (sp-flt spt-omega 4.096) + (sp-rnd-flt spt-vel-y (meters 0.06666667) (meters 0.06666667) 1.0) + (sp-rnd-flt spt-fade-g -0.85 -1.7 1.0) + (sp-flt spt-fade-b -8.0) + (sp-rnd-flt spt-fade-a -0.21333334 -0.21333334 1.0) + (sp-rnd-flt spt-accel-y -6.826667 -2.7306666 1.0) + (sp-flt spt-friction 0.93) + (sp-int-plain-rnd spt-timer 30 59 1) + (sp-cpuinfo-flags sp-cpuinfo-flag-3) + (sp-func spt-func 'sparticle-motion-blur) + (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 2106 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-x (meters 0.5) (meters 0.5) 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.5) 1.0) + (sp-flt spt-rot-x 409.6) + (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-omega 370688.0) + (sp-flt spt-fade-a -4.8) + (sp-int spt-timer 20) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-flt spt-userdata 409.6) + ) + ) + +(defpartgroup group-ginsu-blade + :id 476 + :duration (seconds 0.017) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 4) + :parts ((sp-item 2107 :flags (is-3d bit6 bit7)) + (sp-item 2108 :fade-after (meters 60) :flags (bit7) :period 300 :length 5) + (sp-item 2108 :fade-after (meters 60) :flags (bit7) :period 895 :length 5) + (sp-item 2108 :fade-after (meters 60) :flags (bit7) :period 1490 :length 5) + ) + ) + +(defpart 2107 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xa05)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 0.09)) + (sp-rnd-flt spt-scale-x (meters 3) (meters 0.5) 1.0) + (sp-flt spt-rot-x 0.0) + (sp-flt spt-rot-y (degrees 0.0)) + (sp-flt spt-rot-z (degrees 0.0)) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 64.0 128.0 1.0) + (sp-copy-from-other spt-g -1) + (sp-copy-from-other spt-b -1) + (sp-rnd-int spt-a 1115684864 2 64.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-12) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +(defpart 2108 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-x (meters 0.5) (meters 0.5) 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.5) 1.0) + (sp-flt spt-rot-x 204.8) + (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 64.0) + (sp-flt spt-omega 247808.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-12 glow) + (sp-flt spt-userdata 409.6) + (sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +(defskelgroup skel-ginsu ginsu ginsu-lod0-jg ginsu-idle-ja + ((ginsu-lod0-mg (meters 20)) (ginsu-lod1-mg (meters 40)) (ginsu-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 2.5) + :shadow ginsu-shadow-mg + :origin-joint-index 8 + ) + +(deftype ginsu-anim-info (structure) + ((anim-index int32 :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + + +(deftype ginsu-global-info (basic) + ((prev-blue-hit int8 :offset-assert 4) + (blue-hit-anim int32 3 :offset-assert 8) + ) + :method-count-assert 9 + :size-assert #x14 + :flag-assert #x900000014 + ) + + +(deftype ginsu (nav-enemy) + ((blade-jm joint-mod :offset-assert 604) + (blade-speed cam-float-seeker :inline :offset-assert 608) + (blade-angle float :offset-assert 632) + (desired-distance float :offset-assert 636) + (spiral-time time-frame :offset-assert 640) + (blade-part part-spawner :offset-assert 648) + (ambush-path path-control :offset-assert 652) + (path-pos float :offset-assert 656) + (ambush-started symbol :offset-assert 660) + (blade-sound uint32 :offset-assert 664) + (blade-sound-playing symbol :offset-assert 668) + (grind-sound uint32 :offset-assert 672) + (grind-sound-playing symbol :offset-assert 676) + (grind-timer time-frame :offset-assert 680) + ) + :heap-base #x230 + :method-count-assert 184 + :size-assert #x2b0 + :flag-assert #xb8023002b0 + (:methods + (anticipate-attack () _type_ :state 178) + (attack () _type_ :state 179) + (ginsu-method-180 (_type_) none 180) + (ginsu-method-181 (_type_ vector) vector 181) + (ginsu-method-182 (_type_) none 182) + (ginsu-method-183 (_type_ symbol) none 183) + ) + ) + + +(define *ginsu-global-info* + (new 'static 'ginsu-global-info :blue-hit-anim (new 'static 'array int32 3 5 5 5)) + ) + +(define *ginsu-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010501 #x0 #x0 #x0) + :idle-anim 5 + :notice-anim 10 + :hostile-anim 5 + :hit-anim 5 + :knocked-anim 11 + :knocked-land-anim 12 + :die-anim 11 + :die-falling-anim 5 + :victory-anim 5 + :jump-wind-up-anim 5 + :jump-in-air-anim 5 + :jump-land-anim 5 + :neck-joint 7 + :look-at-joint 7 + :bullseye-joint 4 + :sound-die (static-sound-name "ginsu-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 40) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot enemy hit-by-others-list player-list) + :penetrate-knocked #x11fffdffa + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 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-seek-ry-clamp 4551.1113 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 7 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #t + :use-pacing #t + :walk-anim 5 + :turn-anim 5 + :run-anim 5 + :taunt-anim -1 + :run-travel-speed (meters 16) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 100) + :walk-travel-speed (meters 16) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 1.5) + :frustration-distance (meters 8) + :frustration-time (seconds 4) + :blocked-time (seconds 0.3) + :circle-dist-lo 20480.0 + :circle-dist-hi 61440.0 + :nav-mesh #f + ) + ) + +(set! (-> *ginsu-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod ginsu-method-180 ginsu ((obj ginsu)) + (let ((v1-2 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (not (and v1-2 (or (= v1-2 (-> obj draw art-group data 11)) (= v1-2 (-> obj draw art-group data 12))))) + (update! (-> obj blade-speed) 0.0) + (let ((f0-1 (+ (-> obj blade-angle) (* 970903.75 (-> obj blade-speed value))))) + (set! (-> obj blade-angle) (- f0-1 (* (the float (the int (/ f0-1 65536.0))) 65536.0))) + ) + (quaternion-axis-angle! (-> obj blade-jm quat) 0.0 1.0 0.0 (-> obj blade-angle)) + (let ((s5-0 (new 'stack-no-clear 'matrix))) + (let* ((a2-1 (-> obj node-list data 8 bone transform)) + (v1-14 (-> a2-1 quad 0)) + (a0-10 (-> a2-1 quad 1)) + (a1-3 (-> a2-1 quad 2)) + (a2-2 (-> a2-1 trans quad)) + ) + (set! (-> s5-0 quad 0) v1-14) + (set! (-> s5-0 quad 1) a0-10) + (set! (-> s5-0 quad 2) a1-3) + (set! (-> s5-0 trans quad) a2-2) + ) + (when (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + (vector-negate! (the-as vector (-> s5-0 vector)) (the-as vector (-> s5-0 vector))) + (set! (-> s5-0 vector 0 w) 0.0) + ) + ) + (run-logic? (-> obj blade-part)) + ) + ) + 0 + (none) + ) + +(defmethod ginsu-method-181 ginsu ((obj ginsu) (arg0 vector)) + (vector-reset! arg0) + (let ((a0-2 (handle->process (-> obj focus handle)))) + (if a0-2 + (vector-! arg0 (get-trans (the-as process-focusable a0-2) 0) (-> obj root-override2 trans)) + ) + ) + arg0 + ) + +;; WARN: Return type mismatch symbol vs none. +(defmethod enemy-method-55 ginsu ((obj ginsu)) + (with-pp + (ginsu-method-180 obj) + (let ((t9-1 (method-of-type nav-enemy enemy-method-55))) + (t9-1 obj) + ) + (cond + ((not (and (-> obj next-state) (let ((v1-6 (-> obj next-state name))) + (or (= v1-6 'idle) + (= v1-6 'active) + (= v1-6 'dormant) + (= v1-6 'ambush) + (= v1-6 'knocked) + (= v1-6 'idle) + (= v1-6 'dormant) + (= v1-6 'die) + (= v1-6 'die-falling) + ) + ) + ) + ) + (sound-play "ginsu-loop" :id (the-as sound-id (-> obj blade-sound)) :position (-> obj root-override2 trans)) + (set! (-> obj blade-sound-playing) #t) + ) + ((-> obj blade-sound-playing) + (sound-stop (the-as sound-id (-> obj blade-sound))) + (set! (-> obj blade-sound-playing) #f) + ) + ) + (cond + ((and (not (and (-> obj next-state) (let ((v1-17 (-> obj next-state name))) + (or (= v1-17 'idle) + (= v1-17 'active) + (= v1-17 'dormant) + (= v1-17 'ambush) + (= v1-17 'knocked) + (= v1-17 'idle) + (= v1-17 'dormant) + (= v1-17 'die) + (= v1-17 'die-falling) + ) + ) + ) + ) + (< (- (-> pp clock frame-counter) (-> obj grind-timer)) 0) + ) + (sound-play "ginsu-grind" :id (the-as sound-id (-> obj grind-sound)) :position (-> obj root-override2 trans)) + (set! (-> obj grind-sound-playing) #t) + ) + ((-> obj grind-sound-playing) + (sound-stop (the-as sound-id (-> obj grind-sound))) + (set! (-> obj grind-sound-playing) #f) + ) + ) + (none) + ) + ) + +(defmethod ginsu-method-182 ginsu ((obj ginsu)) + (local-vars (s5-1 art-element)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'matrix)) + ) + (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + (let* ((v1-8 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + (f30-0 (if (and v1-8 (= v1-8 (-> obj draw art-group data 7))) + (cos 9102.223) + (cos 7281.778) + ) + ) + ) + (let ((a1-0 (-> obj nav state))) + (set! (-> s5-0 quad) (-> a1-0 velocity quad)) + ) + (quaternion->matrix s4-0 (-> obj root-override2 quat)) + (let ((f0-1 (vector-dot s5-0 (the-as vector (-> s4-0 vector))))) + (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + (set! f0-1 (- f0-1)) + ) + (cond + ((< (- f30-0) f0-1) + (set! s5-1 (-> obj draw art-group data 9)) + ) + ((< f0-1 f30-0) + (set! s5-1 (-> obj draw art-group data 8)) + ) + (else + (set! s5-1 (-> obj draw art-group data 7)) + ) + ) + ) + ) + ) + (let ((v1-33 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (cond + ((and v1-33 (= v1-33 s5-1)) + (let ((a0-11 (-> obj skel root-channel 0))) + (set! (-> a0-11 param 0) 1.0) + (joint-control-channel-group-eval! a0-11 (the-as art-joint-anim #f) num-func-loop!) + ) + ) + (else + (let ((f30-2 (/ (ja-frame-num 0) (the float (ja-num-frames 0))))) + (ja-channel-push! 1 (seconds 0.5)) + (set! (-> obj skel root-channel 0 frame-group) (the-as art-joint-anim s5-1)) + (let ((gp-1 (-> obj skel root-channel 0))) + (set! (-> gp-1 num-func) num-func-identity) + (set! (-> gp-1 frame-num) (* f30-2 (the float (ja-num-frames 0)))) + ) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod nav-enemy-method-142 ginsu ((obj ginsu) (arg0 nav-control)) + (with-pp + (let ((s3-0 (new 'stack-no-clear 'vector))) + (let ((a0-2 (handle->process (-> obj focus handle)))) + (cond + (a0-2 + (vector-! s3-0 (get-trans (the-as process-focusable a0-2) 0) (-> obj root-override2 trans)) + ) + (else + (let ((a0-7 (-> arg0 state))) + (set! (-> s3-0 quad) (-> a0-7 heading quad)) + ) + ) + ) + ) + (set! (-> s3-0 y) 0.0) + (vector-normalize! s3-0 1.0) + (let ((s5-3 (new 'stack-no-clear 'quaternion)) + (s4-0 (-> obj root-override2 quat)) + ) + (quaternion-set! s5-3 0.0 (sqrtf (* 0.5 (- 1.0 (-> s3-0 z)))) 0.0 (sqrtf (* 0.5 (+ 1.0 (-> s3-0 z))))) + (if (< (-> s3-0 x) 0.0) + (set! (-> s5-3 y) (- (-> s5-3 y))) + ) + (quaternion-pseudo-seek + s4-0 + s4-0 + s5-3 + (* (fmax 0.5 (* 0.00024414062 (-> obj nav state speed))) (-> pp clock seconds-per-frame)) + ) + ) + ) + 0 + (none) + ) + ) + +;; WARN: disable def twice: 11. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. +(defmethod enemy-method-74 ginsu ((obj ginsu) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (local-vars (v0-1 object)) + (with-pp + (case arg2 + (('touched) + (let ((s5-0 arg0)) + (when (if (type? s5-0 ginsu) + s5-0 + ) + (let ((s5-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 8)))) + (let ((a0-5 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 8)))) + (vector+! s5-1 s5-1 a0-5) + ) + (vector-float*! s5-1 s5-1 0.5) + (spawn (-> obj part) s5-1) + ) + (set! v0-1 (+ (-> pp clock frame-counter) (seconds 0.125))) + (set! (-> obj grind-timer) (the-as time-frame v0-1)) + v0-1 + ) + ) + ) + (('touch 'bonk 'attack) + (cond + ((or (!= arg0 *target*) (logtest? (focus-status dark) (-> *target* focus-status))) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (else + (let ((v1-15 (new 'stack-no-clear 'event-message-block))) + (set! (-> v1-15 from) (process->ppointer pp)) + (set! (-> v1-15 num-params) 2) + (set! (-> v1-15 message) 'attack) + (set! (-> v1-15 param 0) (the-as uint #f)) + (let ((a2-2 (new 'static 'attack-info :mask (attack-info-mask id)))) + (let* ((a0-19 *game-info*) + (a3-2 (+ (-> a0-19 attack-id) 1)) + ) + (set! (-> a0-19 attack-id) a3-2) + (set! (-> a2-2 id) a3-2) + ) + (set! (-> v1-15 param 1) (the-as uint a2-2)) + ) + (send-event-function arg0 v1-15) + ) + #f + ) + ) + ) + (('trigger) + (set! v0-1 #t) + (set! (-> obj ambush-started) (the-as symbol v0-1)) + v0-1 + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +(defstate circling (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy circling) enter))) + (if t9-0 + (t9-0) + ) + ) + (if (< 0.5 (rand-vu)) + (set! (-> self enemy-flags) (the-as enemy-flag (logxor (shl 256 32) (the-as int (-> self enemy-flags))))) + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy circling) trans))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-method-182 self) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + ) + +(defstate hostile (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (if (< 0.5 (rand-vu)) + (set! (-> self enemy-flags) (the-as enemy-flag (logxor (shl 256 32) (the-as int (-> self enemy-flags))))) + ) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag enemy-flag41)))) + (set! (-> self starting-time) (the-as uint (-> self clock frame-counter))) + (set! (-> self spiral-time) (-> self clock frame-counter)) + (set! (-> self desired-distance) (vector-length (ginsu-method-181 self (new 'stack-no-clear 'vector)))) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (if (and (< (vector-length (ginsu-method-181 self (new 'stack-no-clear 'vector))) 16384.0) + (logtest? (-> self draw status) (draw-control-status on-screen)) + ) + (go-virtual anticipate-attack) + ) + (if (nav-enemy-method-163 self) + (go-stare2 self) + ) + (if (logtest? (enemy-flag enemy-flag41) (-> self enemy-flags)) + (set! (-> self enemy-flags) (the-as enemy-flag (logxor (shl 256 32) (the-as int (-> self enemy-flags))))) + ) + (ginsu-method-182 self) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + :post (behavior () + (let ((s5-0 (ginsu-method-181 self (new 'stack-no-clear 'vector))) + (gp-0 (new-stack-vector0)) + ) + 0.0 + 0.0 + (set! (-> s5-0 y) 0.0) + (let* ((f0-3 (vector-normalize-ret-len! s5-0 1.0)) + (f1-1 (- 1.0 (* 0.0016666667 (the float (- (-> self clock frame-counter) (-> self spiral-time)))))) + (f2-3 (fmax 12288.0 (* 102400.0 f1-1))) + (f0-4 (- f0-3 (fmin (fmax 12288.0 (* 122880.0 f1-1)) (fmax f2-3 (-> self desired-distance))))) + (f30-0 (fmin 8192.0 (fmax -8192.0 f0-4))) + ) + (set! (-> gp-0 x) (- (-> s5-0 z))) + (set! (-> gp-0 z) (-> s5-0 x)) + (if (logtest? (enemy-flag enemy-flag40) (-> self enemy-flags)) + (vector-negate! gp-0 gp-0) + ) + (vector+float*! gp-0 (-> self root-override2 trans) gp-0 20480.0) + (vector+float*! gp-0 gp-0 s5-0 f30-0) + ) + (cloest-point-on-mesh (-> self nav) gp-0 gp-0 (the-as nav-poly #f)) + (if (< (vector-vector-xz-distance gp-0 (-> self root-override2 trans)) 409.6) + (set! (-> self enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag41) (-> self enemy-flags)))) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag enemy-flag41)))) + ) + (let ((v1-32 (-> self nav state))) + (logclear! (-> v1-32 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-32 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-32 target-post quad) (-> gp-0 quad)) + ) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + ) + +(defstate anticipate-attack (ginsu) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior ginsu) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let ((v1-4 (-> self nav))) + (set! (-> v1-4 target-speed) 8192.0) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! ginsu-idle-ja :num! min) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (if (not (and (handle->process (-> self focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> self focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + ) + (go-virtual circling) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (go-virtual circling) + ) + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.75)) + (go-virtual attack) + ) + (ja :num! (loop!)) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + :post (behavior () + (let ((gp-0 (ginsu-method-181 self (new 'stack-no-clear 'vector)))) + (set! (-> gp-0 y) 0.0) + (vector-normalize! gp-0 -819.2) + (vector+! gp-0 gp-0 (-> self root-override2 trans)) + (cloest-point-on-mesh (-> self nav) gp-0 gp-0 (the-as nav-poly #f)) + (if (< (vector-vector-xz-distance gp-0 (-> self root-override2 trans)) 409.6) + (set! (-> self enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag41) (-> self enemy-flags)))) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag enemy-flag41)))) + ) + (let ((v1-12 (-> self nav state))) + (logclear! (-> v1-12 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-12 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-12 target-post quad) (-> gp-0 quad)) + ) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + ) + +(defstate attack (ginsu) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior ginsu) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (ginsu-method-183 self #t) + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (a0-5 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-5) + (set! (-> self attack-id) a0-5) + ) + (let ((v1-10 (-> self nav))) + (set! (-> v1-10 target-speed) 49152.0) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (ja :group! ginsu-attack-ja :num! min) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (ginsu-method-183 self #f) + (none) + ) + :trans (behavior () + (enemy-method-49 self) + (if (not (and (handle->process (-> self focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> self focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + ) + (go-virtual circling) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (go-virtual circling) + ) + (ja :num! (seek!)) + (if (ja-done? 0) + (go-virtual circling) + ) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + :post (the-as (function none :behavior ginsu) nav-enemy-chase-post) + ) + +(defstate ambush (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type enemy ambush) enter))) + (if t9-0 + (t9-0) + ) + ) + (logclear! (-> self mask) (process-mask actor-pause)) + (logior! (-> self enemy-flags) (enemy-flag use-notice-distance)) + (ja-channel-set! 0) + (set! (-> self root-override2 scale x) 0.01) + (set! (-> self root-override2 scale y) 0.01) + (set! (-> self root-override2 scale z) 0.01) + (none) + ) + :exit (behavior () + (logior! (-> self mask) (process-mask actor-pause)) + (logior! (-> self enemy-flags) (enemy-flag notice)) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type enemy ambush) trans))) + (if t9-0 + (t9-0) + ) + ) + (when (-> self ambush-started) + (when (zero? (-> self skel active-channels)) + (ja-channel-push! 1 0) + (ja :group! ginsu-idle-ja :num! min) + ) + (vector-seek! (-> self root-override2 scale) (new 'static 'vector :x 1.0 :y 1.0 :z 1.0) 0.02) + (+! (-> self path-pos) (/ 2048.0 (total-distance (-> self ambush-path)))) + (let ((f30-1 (-> self path-pos))) + (when (>= f30-1 1.0) + (set! (-> self path-pos) 1.0) + (go-hostile self) + ) + (get-point-at-percent-along-path! (-> self ambush-path) (-> self root-override2 trans) f30-1 'interp) + ) + (ja :num! (loop!)) + ) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + :post (the-as (function none :behavior ginsu) enemy-simple-post) + ) + +(defbehavior ginsu-sounds-off ginsu () + (if (-> self blade-sound-playing) + (sound-stop (the-as sound-id (-> self blade-sound))) + ) + (when (-> self grind-sound-playing) + (sound-stop (the-as sound-id (-> self grind-sound))) + (set! (-> self grind-sound-playing) #f) + (set! (-> self grind-timer) 0) + 0 + ) + (none) + ) + +(defstate idle (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy idle) enter))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-sounds-off) + (none) + ) + ) + +(defstate dormant (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy dormant) enter))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-sounds-off) + (none) + ) + ) + +(defstate die (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy die) enter))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-sounds-off) + (none) + ) + ) + +(defstate die-falling (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy die-falling) enter))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-sounds-off) + (none) + ) + ) + +(defmethod go-hostile ginsu ((obj ginsu)) + (cond + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + (nav-enemy-method-163 obj) + ) + (go-stare2 obj) + ) + (else + (let* ((v1-8 (/ (the-as int (rand-uint31-gen *random-generator*)) 256)) + (v1-9 (the-as number (logior (the-as int #x3f800000) v1-8))) + ) + (if (and (< (+ -1.0 (the-as float v1-9)) 0.1) (logtest? (-> obj draw status) (draw-control-status on-screen))) + (go (method-of-object obj anticipate-attack)) + (go (method-of-object obj hostile)) + ) + ) + ) + ) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-idle ginsu ((obj ginsu)) + (if (not (logtest? (-> obj ambush-path flags) (path-control-flag not-found))) + (go (method-of-object obj ambush)) + (go (method-of-object obj idle)) + ) + (none) + ) + +(defmethod deactivate ginsu ((obj ginsu)) + (if (nonzero? (-> obj blade-part)) + ((the-as (function none :behavior part-spawner) (method-of-object (-> obj blade-part) active))) + ) + (if (-> obj blade-sound-playing) + (sound-stop (the-as sound-id (-> obj blade-sound))) + ) + (if (-> obj grind-sound-playing) + (sound-stop (the-as sound-id (-> obj grind-sound))) + ) + ((method-of-type nav-enemy deactivate) obj) + (none) + ) + +;; WARN: Return type mismatch nav-enemy vs ginsu. +(defmethod relocate ginsu ((obj ginsu) (arg0 int)) + (if (nonzero? (-> obj blade-jm)) + (&+! (-> obj blade-jm) arg0) + ) + (if (nonzero? (-> obj blade-part)) + (&+! (-> obj blade-part) arg0) + ) + (if (nonzero? (-> obj ambush-path)) + (&+! (-> obj ambush-path) arg0) + ) + (the-as ginsu ((method-of-type nav-enemy relocate) obj arg0)) + ) + +(defmethod ginsu-method-183 ginsu ((obj ginsu) (arg0 symbol)) + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> obj root-override2 root-prim)) child 1))) + (cond + (arg0 + (set! (-> v1-3 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-3 prim-core collide-with) (collide-spec jak bot)) + ) + (else + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + (set! (-> v1-3 prim-core collide-with) (collide-spec)) + 0 + ) + ) + ) + (none) + ) + +(defmethod enemy-method-46 ginsu ((obj ginsu) (arg0 int)) + "@abstract" + (case arg0 + ((1) + (let ((v1-2 (-> obj root-override2 root-prim))) + (logior! (-> v1-2 prim-core action) (collide-action solid)) + (let ((v1-4 (-> (the-as collide-shape-prim-group v1-2) child 0))) + (logior! (-> v1-4 prim-core action) (collide-action solid)) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod enemy-method-114 ginsu ((obj ginsu)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate enemy obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action deadly no-standon)) + (set! (-> s4-0 transform-index) 8) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 9216.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-14 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-14 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-14 prim-core collide-with) + (collide-spec backgnd jak bot crate enemy obstacle hit-by-others-list player-list) + ) + (set! (-> v1-14 prim-core action) (collide-action no-standon)) + (set! (-> v1-14 transform-index) 8) + (set-vector! (-> v1-14 local-sphere) 0.0 0.0 0.0 4915.2) + ) + (let ((v1-16 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-16 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-16 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-16 prim-core action) (collide-action deadly)) + (set! (-> v1-16 transform-index) 7) + (set-vector! (-> v1-16 local-sphere) 0.0 0.0 0.0 2662.4) + ) + (set! (-> s5-0 nav-radius) 4505.6) + (let ((v1-18 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-18 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-18 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> s5-0 event-self) 'touched) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +(defmethod enemy-method-115 ginsu ((obj ginsu)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-ginsu" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *ginsu-nav-enemy-info*) + (logclear! (-> obj nav flags) (nav-control-flag update-heading-from-facing)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag43)))) + (logclear! (-> obj nav flags) (nav-control-flag limit-rotation-rate)) + (let ((v1-14 (-> obj neck))) + (set! (-> v1-14 up) (the-as uint 1)) + (set! (-> v1-14 nose) (the-as uint 2)) + (set! (-> v1-14 ear) (the-as uint 0)) + (set-vector! (-> v1-14 twist-max) 10922.667 7281.778 0.0 1.0) + (set! (-> v1-14 ignore-angle) 18204.445) + ) + (let ((v1-16 (-> obj nav))) + (set! (-> v1-16 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (ginsu-method-183 obj #f) + (set! (-> obj blade-jm) (new 'process 'joint-mod (joint-mod-mode joint-set*) obj 8)) + (init (-> obj blade-speed) 1.0 0.01 0.1 0.9) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 475) obj)) + (set! (-> obj blade-part) (the-as part-spawner (create-launch-control (-> *part-group-id-table* 476) obj))) + (set! (-> obj ambush-path) (new 'process 'curve-control obj 'intro -1000000000.0)) + (set! (-> obj ambush-started) #f) + (set! (-> obj path-pos) 0.0) + (if (not (logtest? (-> obj ambush-path flags) (path-control-flag not-found))) + (logior! (-> obj ambush-path flags) (path-control-flag display draw-line draw-point draw-text)) + ) + (set! (-> obj blade-sound) (the-as uint (new-sound-id))) + (set! (-> obj blade-sound-playing) #f) + (set! (-> obj grind-sound) (the-as uint (new-sound-id))) + (set! (-> obj grind-sound-playing) #f) + (set! (-> obj grind-timer) 0) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/forest/pegasus.gc b/goal_src/jak2/levels/forest/pegasus.gc index 500743cb58..3861b772da 100644 --- a/goal_src/jak2/levels/forest/pegasus.gc +++ b/goal_src/jak2/levels/forest/pegasus.gc @@ -190,39 +190,48 @@ ) ) +;; WARN: Return type mismatch none vs object. (defmethod enemy-method-74 pegasus ((obj pegasus) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) (with-pp - (case arg2 - (('track) - ) - (('hit 'hit-knocked) - (cond - ((zero? (-> obj hit-points)) - (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) - (enemy-method-73 obj) - ) - (else - (set! (-> obj targetted-timer) (the-as uint (-> pp clock frame-counter))) + (let ((v1-0 arg2)) + (the-as + object + (cond + ((= v1-0 'track) + #f ) - ) - ) - (else - ((method-of-type enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ((or (= v1-0 'hit) (= v1-0 'hit-knocked)) + (cond + ((zero? (-> obj hit-points)) + (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) + (the-as object (enemy-method-73 obj)) + ) + (else + (let ((v0-0 (the-as object (-> pp clock frame-counter)))) + (set! (-> obj targetted-timer) (the-as uint v0-0)) + v0-0 + ) + ) + ) + ) + (else + ((method-of-type enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) ) ) - (none) ) ) @@ -375,10 +384,7 @@ 0.0 (set! f30-0 (cond - ((or (>= (-> self current-path) (-> self num-paths)) - (< (-> self current-path) 0) - (<= (-> s5-0 num-data) 0) - ) + ((or (>= (-> self current-path) (-> self num-paths)) (< (-> self current-path) 0) (<= (-> s5-0 num-data) 0)) (format 0 ": ~A has path out of range cur ~D num ~D num-data ~D~%" diff --git a/goal_src/jak2/levels/forest/predator-graph.gc b/goal_src/jak2/levels/forest/predator-graph.gc index b293286b59..3fb2bf3791 100644 --- a/goal_src/jak2/levels/forest/predator-graph.gc +++ b/goal_src/jak2/levels/forest/predator-graph.gc @@ -7,3 +7,2154 @@ ;; DECOMP BEGINS +(define *predator-graph* (new 'static 'predator-graph + :node-count #x4b + :edge-count #x182 + :node (new 'static 'inline-array predator-node 75 + (new 'static 'predator-node + :position (new 'static 'vector :x -2324131.5 :y 43518.77 :z 2557435.5) + :nav-mesh-id #x3b5c + :edge-count 3 + :radius 63208.242 + :points #xfff00003 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2182716.5 :y 15286.682 :z 2585234.8) + :nav-mesh-id #x3b5c + :edge-index 3 + :edge-count 4 + :radius 23640.064 + :points #x7ffff800 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2254212.8 :y 21254.145 :z 2728910.5) + :nav-mesh-id #x3b5c + :edge-index 7 + :edge-count 6 + :radius 40380.008 + :points #xfffc0fff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2331462.8 :y 9492.07 :z 2707181.2) + :nav-mesh-id #x3b5c + :edge-index 13 + :edge-count 7 + :radius 26837.402 + :points #x3fffffc + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2442096.2 :y 18383.668 :z 2625167.0) + :nav-mesh-id #x3b5c + :edge-index 20 + :edge-count 6 + :radius 29555.916 + :points #xfff00003 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2388848.2 :y 8798.208 :z 2776899.2) + :nav-mesh-id #x3b5c + :edge-index 26 + :edge-count 7 + :radius 35981.312 + :points #xc000ffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2512056.0 :y 25574.605 :z 2693631.5) + :nav-mesh-id #x3b5c + :edge-index 33 + :edge-count 8 + :radius 30316.135 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2454588.5 :y 20201.062 :z 2793463.5) + :nav-mesh-id #x3b5c + :edge-index 41 + :edge-count 6 + :radius 35779.38 + :points #x1fffff0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2557562.5 :y 20720.025 :z 2751488.0) + :nav-mesh-id #x3b5c + :edge-index 47 + :edge-count 7 + :radius 42917.887 + :points #xe000f7ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2631003.2 :y 18656.46 :z 2618973.5) + :nav-mesh-id #x3b5c + :edge-index 54 + :edge-count 8 + :radius 22494.412 + :points #xfc00ffcf + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2589634.2 :y 31613.748 :z 2559033.0) + :nav-mesh-id #x3b5c + :edge-index 62 + :edge-count 7 + :radius 28829.287 + :points #x3ffffe00 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2794598.0 :y 9517.875 :z 2616995.5) + :nav-mesh-id #x3b5c + :edge-index 69 + :edge-count 5 + :radius 34660.35 + :points #xe00007ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2847641.2 :y 13558.989 :z 2618473.8) + :nav-mesh-id #x3b5c + :edge-index 74 + :edge-count 4 + :radius 33491.355 + :points #xff00 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2858864.2 :y 18482.791 :z 2529550.0) + :nav-mesh-id #x3b5c + :edge-index 78 + :edge-count 5 + :radius 25489.408 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2763878.0 :y 29285.58 :z 2518937.2) + :nav-mesh-id #x3b5c + :edge-index 83 + :edge-count 6 + :radius 26371.686 + :points #xfffeff03 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2720050.5 :y 53839.46 :z 2404113.5) + :nav-mesh-id #x3b5c + :edge-index 89 + :edge-count 5 + :radius 22623.438 + :points #x7ffc0000 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2950287.0 :y 40124.824 :z 2539035.8) + :nav-mesh-id #x3b5c + :edge-index 94 + :edge-count 3 + :radius 31542.066 + :points #xfc00007f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2228284.5 :y 45842.434 :z 2831855.2) + :nav-mesh-id #x3b5c + :edge-index 97 + :edge-count 4 + :radius 38095.668 + :points #xfffffffe + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2161553.0 :y 69435.39 :z 2873138.5) + :nav-mesh-id #x3b5c + :edge-index #x65 + :edge-count 6 + :radius 62775.297 + :points #x7e0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2279034.5 :y 21656.781 :z 2882637.5) + :nav-mesh-id #x3b5c + :edge-index #x6b + :edge-count 7 + :radius 38604.8 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2479328.8 :y 12887.654 :z 2902150.2) + :nav-mesh-id #x3b5c + :edge-index #x72 + :edge-count 4 + :radius 42556.21 + :points #xfffe00ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2699611.2 :y 40017.92 :z 2932710.5) + :nav-mesh-id #x3b5c + :edge-index #x76 + :edge-count 4 + :radius 44344.523 + :points #xe001ffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2768301.8 :y 39130.316 :z 2901376.5) + :nav-mesh-id #x3b5c + :edge-index #x7a + :edge-count 3 + :radius 37495.195 + :points #xf001ffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2622648.0 :y 19407.668 :z 2821271.2) + :nav-mesh-id #x3b5c + :edge-index #x7d + :edge-count 6 + :radius 30383.309 + :points #x3fffe00 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2713251.5 :y 18592.562 :z 2784042.5) + :nav-mesh-id #x3b5c + :edge-index #x83 + :edge-count 7 + :radius 50465.996 + :points #xfffe1fff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2657464.0 :y 15094.579 :z 2704649.5) + :nav-mesh-id #x3b5c + :edge-index #x8a + :edge-count 7 + :radius 22964.225 + :points #x1fffc000 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2803568.2 :y 39347.406 :z 2708127.0) + :nav-mesh-id #x3b5c + :edge-index #x91 + :edge-count 4 + :radius 21984.05 + :points #x7fff0000 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2871152.2 :y 56349.492 :z 2772692.2) + :nav-mesh-id #x3b5c + :edge-index #x95 + :edge-count 5 + :radius 29560.014 + :points #x1fffe0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2991492.8 :y 58539.21 :z 2727558.2) + :nav-mesh-id #x3b5c + :edge-index #x9a + :edge-count 3 + :radius 35547.137 + :points #xfe00000f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2981948.5 :y 91303.52 :z 2899549.5) + :nav-mesh-id #x3b5c + :edge-index #x9d + :edge-count 4 + :radius 18809.65 + :points #x1ffff00 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2969292.5 :y 119921.87 :z 3123490.5) + :nav-mesh-id #x3b5c + :edge-index #xa1 + :edge-count 6 + :radius 23033.037 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2873487.0 :y 121214.98 :z 2924236.5) + :nav-mesh-id #x3b5c + :edge-index #xa7 + :edge-count 3 + :radius 41010.79 + :points #xfffe0001 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2760723.8 :y 139063.7 :z 2981489.8) + :nav-mesh-id #x3b5c + :edge-index #xaa + :edge-count 4 + :radius 43944.344 + :points #x7fff800 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2697318.0 :y 119486.055 :z 3070746.2) + :nav-mesh-id #x3b5c + :edge-index #xae + :edge-count 4 + :radius 40016.69 + :points #xfefff80 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2596433.0 :y 74880.2 :z 3145862.2) + :nav-mesh-id #x3b5c + :edge-index #xb2 + :edge-count 4 + :radius 40059.29 + :points #xffc0fff1 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2413096.2 :y 59520.613 :z 2999434.8) + :nav-mesh-id #x3b5c + :edge-index #xb6 + :edge-count 4 + :radius 24111.924 + :points #xffff8003 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3035156.0 :y 149131.67 :z 3272085.0) + :nav-mesh-id #x3e15 + :edge-index #xba + :edge-count 5 + :radius 15153.972 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3078204.5 :y 153213.75 :z 3387985.0) + :nav-mesh-id #x3e15 + :edge-index #xbf + :edge-count 6 + :radius 26331.137 + :points #xfff00fff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3057683.8 :y 154890.66 :z 3550129.2) + :nav-mesh-id #x3e15 + :edge-index #xc5 + :edge-count 7 + :radius 34960.18 + :points #xc0000007 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3056742.0 :y 154547.0 :z 3632541.0) + :nav-mesh-id #x3e15 + :edge-index #xcc + :edge-count 4 + :radius 35908.812 + :points #xc3c00007 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3031633.0 :y 161428.69 :z 3733810.5) + :nav-mesh-id #x3e15 + :edge-index #xd0 + :edge-count 7 + :radius 36187.75 + :points #xfc07fe0f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2952376.0 :y 164512.16 :z 3637804.8) + :nav-mesh-id #x3e15 + :edge-index #xd7 + :edge-count 7 + :radius 30886.297 + :points #xfffffe0f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2792181.2 :y 166134.17 :z 3464453.8) + :nav-mesh-id #x3e15 + :edge-index #xde + :edge-count 9 + :radius 30282.547 + :points #xffc0ffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2729881.2 :y 151591.33 :z 3431243.2) + :nav-mesh-id #x3e15 + :edge-index #xe7 + :edge-count 5 + :radius 29344.154 + :points #xfffe03ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2905312.8 :y 193297.61 :z 3324849.2) + :nav-mesh-id #x3e15 + :edge-index #xec + :edge-count 5 + :radius 23481.959 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2269572.8 :y 92133.375 :z 3864874.5) + :nav-mesh-id #x3e15 + :edge-index #xf1 + :edge-count 2 + :radius 33567.54 + :points #x3fffe0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2566287.0 :y 148446.83 :z 3850812.5) + :nav-mesh-id #x3e15 + :edge-index #xf3 + :edge-count 7 + :radius 31936.102 + :points #xf00ffff7 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2757160.2 :y 192492.34 :z 3811433.8) + :nav-mesh-id #x3e15 + :edge-index #xfa + :edge-count 5 + :radius 13925.171 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2827776.0 :y 196078.39 :z 3741732.5) + :nav-mesh-id #x3e15 + :edge-index #xff + :edge-count 7 + :radius 51901.234 + :points #xc70001ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2829782.8 :y 198469.62 :z 3631889.5) + :nav-mesh-id #x3e15 + :edge-index #x106 + :edge-count 5 + :radius 51584.613 + :points #xff800003 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2764369.0 :y 188372.98 :z 3560890.0) + :nav-mesh-id #x3e15 + :edge-index #x10b + :edge-count 4 + :radius 16382.771 + :points #xff0fffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2704690.5 :y 164491.67 :z 3619626.5) + :nav-mesh-id #x3e15 + :edge-index #x10f + :edge-count 7 + :radius 25772.852 + :points #xffe0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2603192.0 :y 191066.52 :z 3706015.0) + :nav-mesh-id #x3e15 + :edge-index #x116 + :edge-count 5 + :radius 33278.77 + :points #xffc007ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3066326.8 :y 194444.5 :z 3690315.2) + :nav-mesh-id #x3e15 + :edge-index #x11b + :edge-count 2 + :radius 23621.633 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2997022.0 :y 181973.4 :z 3941461.5) + :nav-mesh-id #x3e15 + :edge-index #x11d + :edge-count 5 + :radius 33880.473 + :points #x80007fff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1662652.0 :y 24240.947 :z 3668233.5) + :nav-mesh-id #x4b36 + :edge-index #x122 + :edge-count 3 + :radius 24385.535 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1835364.0 :y 43812.043 :z 3684552.0) + :nav-mesh-id #x4b36 + :edge-index #x125 + :edge-count 6 + :radius 44497.715 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1775226.5 :y 38207.08 :z 3775393.5) + :nav-mesh-id #x4b36 + :edge-index #x12b + :edge-count 5 + :radius 23533.979 + :points #x1fffc0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1925938.8 :y 54054.91 :z 3839045.2) + :nav-mesh-id #x4b36 + :edge-index #x130 + :edge-count 4 + :radius 11815.731 + :points #x7ffc + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2100784.8 :y 71170.46 :z 3843383.0) + :nav-mesh-id #x4b36 + :edge-index #x134 + :edge-count 4 + :radius 22117.172 + :points #x3fffe + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2248683.0 :y 32537.805 :z 3708075.5) + :nav-mesh-id #x4b36 + :edge-index #x138 + :edge-count 6 + :radius 46956.543 + :points #xfffff00f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2245119.5 :y 32537.805 :z 3660771.0) + :nav-mesh-id #x4b36 + :edge-index #x13e + :edge-count 5 + :radius 48967.68 + :points #xf01fffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2113043.8 :y 32865.895 :z 3614215.2) + :nav-mesh-id #x4b36 + :edge-index #x143 + :edge-count 4 + :radius 35588.914 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2115600.0 :y 27176.96 :z 3690397.0) + :nav-mesh-id #x4b36 + :edge-index #x147 + :edge-count 4 + :radius 48089.496 + :points #xffffffef + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1954619.0 :y 65282.867 :z 3695386.2) + :nav-mesh-id #x4b36 + :edge-index #x14b + :edge-count 6 + :radius 64820.02 + :points #xff0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1830649.5 :y 77674.086 :z 3570786.0) + :nav-mesh-id #x4b36 + :edge-index #x151 + :edge-count 8 + :radius 38815.336 + :points #xc00007ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1684487.8 :y 55552.0 :z 3592335.0) + :nav-mesh-id #x4b36 + :edge-index #x159 + :edge-count 4 + :radius 39208.96 + :points #xfffc0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1636478.6 :y 71381.4 :z 3525598.5) + :nav-mesh-id #x4b36 + :edge-index #x15d + :edge-count 4 + :radius 35352.168 + :points #xfffe0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1776230.0 :y 62159.668 :z 3410837.0) + :nav-mesh-id #x4b36 + :edge-index #x161 + :edge-count 3 + :radius 45858.816 + :points #xfffe0001 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1927675.5 :y 29462.938 :z 3431783.8) + :nav-mesh-id #x4b36 + :edge-index #x164 + :edge-count 5 + :radius 31855.002 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2596597.2 :y 22821.273 :z 3954433.8) + :nav-mesh-id #x4b36 + :edge-index #x169 + :edge-count 4 + :radius 18589.287 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2381762.2 :y 20472.627 :z 3796311.8) + :nav-mesh-id #x4b36 + :edge-index #x16d + :edge-count 6 + :radius 47302.246 + :points #xfff60 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2471218.5 :y 21400.371 :z 3501641.0) + :nav-mesh-id #x4b36 + :edge-index #x173 + :edge-count 5 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2314833.0 :y 100966.81 :z 3467267.8) + :nav-mesh-id #x3e15 + :edge-index #x178 + :edge-count 5 + :radius 42546.38 + :points #x1ff8000 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2541382.8 :y 147264.72 :z 3530809.0) + :nav-mesh-id #x3e15 + :edge-index #x17d + :edge-count 5 + :radius 27781.53 + :points #xcffff81f + ) + ) + :edge (new 'static 'inline-array predator-edge 1544 + (new 'static 'predator-edge :dest-node-id #x1) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x11) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x11) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x14) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xc) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x10) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xc) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x10) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xc) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x10) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xc) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x11) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x23) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x22) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x14) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x23) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x11) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x15) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x16) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x14) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x15) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x16) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x15) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x14) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x16) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x15) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x20) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x21) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x20) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x21) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x22) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x20) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x22) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x23) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x21) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x23) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x20) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x22) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x21) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x27) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x27) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x35) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x27) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x27) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x32) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x32) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x32) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x32) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x35) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x37) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x42) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x37) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x42) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x46) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x42) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x37) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x43) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x44) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x43) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x42) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x44) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x43) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x44) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x43) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x46) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x46) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x46) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + ) + ) + ) diff --git a/goal_src/jak2/levels/forest/predator-h.gc b/goal_src/jak2/levels/forest/predator-h.gc index 64b0a81df4..89231a12a3 100644 --- a/goal_src/jak2/levels/forest/predator-h.gc +++ b/goal_src/jak2/levels/forest/predator-h.gc @@ -47,6 +47,7 @@ ((dest-node-id uint16 :offset-assert 0) (flags predator-edge-flag :offset-assert 2) ) + :pack-me :method-count-assert 9 :size-assert #x4 :flag-assert #x900000004 @@ -54,10 +55,10 @@ (deftype predator-graph (structure) - ((node-count uint16 :offset-assert 0) - (edge-count uint16 :offset-assert 2) - (node uint32 :offset-assert 4) - (edge uint32 :offset-assert 8) + ((node-count uint16 :offset-assert 0) + (edge-count uint16 :offset-assert 2) + (node (inline-array predator-node) :offset-assert 4) + (edge (inline-array predator-edge) :offset-assert 8) ) :method-count-assert 9 :size-assert #xc diff --git a/goal_src/jak2/levels/forest/predator.gc b/goal_src/jak2/levels/forest/predator.gc index 350054e4c3..58b83f8632 100644 --- a/goal_src/jak2/levels/forest/predator.gc +++ b/goal_src/jak2/levels/forest/predator.gc @@ -7,3 +7,1716 @@ ;; DECOMP BEGINS +(defmethod draw hud-predator ((obj hud-predator)) + (set-hud-piece-position! (-> obj sprites 1) (the int (+ 480.0 (* 130.0 (-> obj offset)))) 205) + (set-as-offset-from! (the-as hud-sprite (-> obj sprites)) (the-as vector4w (-> obj sprites 1)) -44 0) + (format (clear (-> obj strings 0 text)) "~D" (-> obj values 0 current)) + (set-as-offset-from! (the-as hud-sprite (-> obj strings 0 pos)) (the-as vector4w (-> obj sprites 1)) -45 45) + ((method-of-type hud draw) obj) + 0 + (none) + ) + +(defmethod update-values hud-predator ((obj hud-predator)) + (set! (-> obj values 0 target) (the int (-> *game-info* counter))) + ((method-of-type hud update-values) obj) + 0 + (none) + ) + +(defmethod init-callback hud-predator ((obj hud-predator)) + (set! (-> obj level) (level-get *level* 'forest)) + (set! (-> obj gui-id) + (add-process *gui-control* obj (gui-channel hud-middle-right) (gui-action hidden) (-> obj name) 81920.0 0) + ) + (logior! (-> obj flags) (hud-flags show)) + (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x2 :page #xb1d))) + (set! (-> obj sprites 0 flags) (the-as uint 4)) + (set! (-> obj sprites 0 scale-x) 0.6) + (set! (-> obj sprites 0 scale-y) 0.6) + (set! (-> obj sprites 1 tex) (lookup-texture-by-id (new 'static 'texture-id :page #xb1d))) + (set! (-> obj sprites 1 flags) (the-as uint 4)) + (set! (-> obj sprites 1 scale-x) 0.6) + (set! (-> obj sprites 1 scale-y) 0.6) + (alloc-string-if-needed obj 0) + (set! (-> obj strings 0 scale) 0.6) + (set! (-> obj strings 0 flags) (font-flags kerning middle large)) + 0 + (none) + ) + +(defmethod draw hud-pegasus ((obj hud-pegasus)) + (set-hud-piece-position! + (the-as hud-sprite (-> obj sprites)) + (the int (+ 472.0 (* 130.0 (-> obj offset)))) + 190 + ) + (set! (-> obj sprites 0 flags) (the-as uint 4)) + (format (clear (-> obj strings 0 text)) "~D" (-> obj values 0 current)) + (set-as-offset-from! (the-as hud-sprite (-> obj strings 0 pos)) (the-as vector4w (-> obj sprites)) -26 35) + ((method-of-type hud draw) obj) + 0 + (none) + ) + +(defmethod update-values hud-pegasus ((obj hud-pegasus)) + (set! (-> obj values 0 target) (the int (-> *game-info* counter))) + ((method-of-type hud update-values) obj) + 0 + (none) + ) + +(defmethod init-callback hud-pegasus ((obj hud-pegasus)) + (set! (-> obj level) (level-get *level* 'forest)) + (set! (-> obj gui-id) + (add-process *gui-control* obj (gui-channel hud-middle-right) (gui-action hidden) (-> obj name) 81920.0 0) + ) + (logior! (-> obj flags) (hud-flags show)) + (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x1 :page #xb1d))) + (set! (-> obj sprites 0 scale-x) 0.8) + (set! (-> obj sprites 0 scale-y) 0.8) + (set! (-> obj sprites 0 flags) (the-as uint 4)) + (alloc-string-if-needed obj 0) + (set! (-> obj strings 0 scale) 0.6) + (set! (-> obj strings 0 flags) (font-flags kerning middle large)) + 0 + (none) + ) + +(defun point-in-line-region? ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float)) + (let* ((v1-1 (vector-normalize! (vector-! (new-stack-vector0) arg2 arg1) 1.0)) + (s5-1 (vector-! (new-stack-vector0) arg0 arg1)) + (f30-0 (vector-dot v1-1 s5-1)) + (s2-2 (vector-float*! (new-stack-vector0) v1-1 f30-0)) + ) + (if (or (< f30-0 0.0) + (< (vector-vector-distance arg1 arg2) f30-0) + (< arg3 (vector-length (vector-! (new-stack-vector0) s5-1 s2-2))) + ) + (return #f) + ) + ) + #t + ) + +(deftype predator-shot (metalhead-shot) + () + :heap-base #x170 + :method-count-assert 40 + :size-assert #x1f0 + :flag-assert #x28017001f0 + ) + + +(defmethod play-impact-sound predator-shot ((obj predator-shot) (arg0 projectile-options)) + (case arg0 + (((projectile-options lose-altitude)) + (sound-play "pred-shot-hit") + ) + (((projectile-options lose-altitude proj-options-2)) + (let ((f0-0 (doppler-pitch-shift (-> obj root-override trans) (-> obj root-override transv))) + (a0-7 (static-sound-spec "pred-shot-loop" :volume 0.0 :mask (pitch reg0))) + ) + (set! (-> a0-7 volume) 1024) + (set! (-> a0-7 pitch-mod) (the int (* 1524.0 f0-0))) + (sound-play-by-spec a0-7 (-> obj sound-id) (-> obj root-override trans)) + ) + ) + ) + ) + +(defmethod init-collision! predator-shot ((obj predator-shot)) + "Init the [[projectile]]'s [[collide-shape]]" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) + (the-as (function control-info collide-query vector vector collide-status) cshape-reaction-just-move) + ) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrate-using) (penetrate jak-yellow-shot)) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec projectile)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate civilian enemy obstacle vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid)) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 2457.6) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec projectile)) + (set! (-> v1-13 prim-core collide-with) + (collide-spec backgnd jak bot crate civilian enemy obstacle vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> v1-13 prim-core action) (collide-action solid deadly)) + (set-vector! (-> v1-13 local-sphere) 0.0 0.0 0.0 819.2) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec projectile)) + (set! (-> v1-15 prim-core collide-with) + (collide-spec jak bot crate civilian enemy vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> v1-15 prim-core action) (collide-action deadly)) + (set-vector! (-> v1-15 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-18 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-18 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-18 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 1)) + (set! (-> s5-0 event-self) 'touched) + (set! (-> obj root-override) s5-0) + ) + (set! (-> obj root-override pat-ignore-mask) + (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noproj #x1 :noendlessfall #x1) + ) + (none) + ) + +(defmethod init-proj-settings! predator-shot ((obj predator-shot)) + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc + :virtual" + (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) + (set! (-> obj attack-mode) 'predator-shot) + (set! (-> obj max-speed) 532480.0) + (set! (-> obj move) metalhead-shot-move) + (set! (-> obj update-velocity) projectile-update-velocity-space-wars) + (set! (-> obj timeout) (seconds 0.767)) + (set! (-> obj sound-id) (new-sound-id)) + (set-gravity-length (-> obj root-override dynam) 573440.0) + (none) + ) + +(defskelgroup skel-predator predator predator-lod0-jg predator-idle-ja + ((predator-lod0-mg (meters 20)) (predator-lod1-mg (meters 40)) (predator-lod2-mg (meters 999999))) + :bounds (static-spherem 0 1 0 4) + ) + +(deftype predator (nav-enemy) + ((los los-control :inline :offset-assert 608) + (want-stop symbol :offset-assert 756) + (target-pos vector :inline :offset-assert 768) + (curr-node int32 :offset-assert 784) + (hide-pos vector :inline :offset-assert 800) + (next-change uint64 :offset-assert 816) + (shoot-angle float :offset-assert 824) + (miss-amount float :offset-assert 828) + (ambient-sound-id sound-id :offset-assert 832) + (shock-effect-time time-frame :offset-assert 840) + (shock-effect-end uint64 :offset-assert 848) + (fade float :offset-assert 856) + (dest-fade float :offset-assert 860) + ) + :heap-base #x2e0 + :method-count-assert 189 + :size-assert #x360 + :flag-assert #xbd02e00360 + (:methods + (close-attack () _type_ :state 178) + (fire () _type_ :state 179) + (hide () _type_ :state 180) + (hidden () _type_ :state 181) + (set-dangerous! (_type_ symbol) symbol 182) + (predator-method-183 (_type_) none 183) + (predator-method-184 (_type_ int float) none 184) + (predator-method-185 (_type_) none 185) + (predator-method-186 (_type_) none 186) + (predator-method-187 (_type_) symbol 187) + (predator-method-188 (_type_ vector vector vector) none 188) + ) + ) + + +(define *predator-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #f + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010501 #x0 #x0 #x0) + :idle-anim 5 + :notice-anim 5 + :hostile-anim 7 + :hit-anim 5 + :knocked-anim 12 + :knocked-land-anim 13 + :die-anim 11 + :die-falling-anim 11 + :victory-anim 5 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 7 + :look-at-joint 8 + :bullseye-joint 6 + :sound-hit (static-sound-name "predator-hit") + :sound-die (static-sound-name "predator-die") + :notice-distance (meters 150) + :notice-distance-delta (meters 150) + :proximity-notice-distance (meters 4) + :default-hit-points 5 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :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-seek-ry-clamp 2730.6667 + :knocked-soft-vxz-lo 81920.0 + :knocked-soft-vxz-hi 81920.0 + :knocked-soft-vy-lo 69632.0 + :knocked-soft-vy-hi 69632.0 + :knocked-medium-vxz-lo 81920.0 + :knocked-medium-vxz-hi 81920.0 + :knocked-medium-vy-lo 69632.0 + :knocked-medium-vy-hi 69632.0 + :knocked-hard-vxz-lo 81920.0 + :knocked-hard-vxz-hi 81920.0 + :knocked-hard-vy-lo 69632.0 + :knocked-hard-vy-hi 69632.0 + :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 53248.0 + :knocked-yellow-vy-lo 40960.0 + :knocked-yellow-vy-hi 53248.0 + :knocked-red-vxz-lo 102400.0 + :knocked-red-vxz-hi 102400.0 + :knocked-red-vy-lo 81920.0 + :knocked-red-vy-hi 81920.0 + :knocked-blue-vxz-lo 32768.0 + :knocked-blue-vxz-hi 65536.0 + :knocked-blue-vy-lo 32768.0 + :knocked-blue-vy-hi 49152.0 + :shadow-size (meters 1) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 6 + :gem-offset (new 'static 'sphere :y -2252.8 :z -2170.88 :r 163840.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 6 + :turn-anim -1 + :run-anim 7 + :taunt-anim -1 + :run-travel-speed (meters 8) + :run-acceleration (meters 6) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 4) + :walk-acceleration (meters 3) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 40) + :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! (-> *predator-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod enemy-method-74 predator ((obj predator) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (with-pp + (case arg2 + (('attack) + (set! (-> obj shock-effect-end) (the-as uint (+ (-> pp clock frame-counter) (seconds 1)))) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (('death-end) + (when (nonzero? (-> obj ambient-sound-id)) + (sound-stop (-> obj ambient-sound-id)) + (set! (-> obj ambient-sound-id) (new 'static 'sound-id)) + 0 + ) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +(defmethod enemy-method-77 predator ((obj predator) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 18))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 18)) 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 18)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data 14))) + (set! (-> a0-5 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 14)) 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 (-> obj draw art-group data 14)) num-func-seek!) + ) + ) + ) + #t + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let ((v1-32 (get-rand-int obj 2))) + (cond + ((zero? v1-32) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim (-> obj draw art-group data 21))) + (set! (-> a0-10 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 21)) frames num-frames) -1)) + ) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim (-> obj draw art-group data 21)) num-func-seek!) + ) + ) + ((= v1-32 1) + (let ((a0-12 (-> obj skel root-channel 0))) + (set! (-> a0-12 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> a0-12 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> a0-12 param 1) (-> arg0 0)) + (set! (-> a0-12 frame-num) 0.0) + (joint-control-channel-group! a0-12 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + ) + ) + ) + ) + (((knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-15 (-> obj skel root-channel 0))) + (set! (-> a0-15 frame-group) (the-as art-joint-anim (-> obj draw art-group data 18))) + (set! (-> a0-15 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 18)) frames num-frames) -1)) + ) + (set! (-> a0-15 param 1) (-> arg0 0)) + (set! (-> a0-15 frame-num) 0.0) + (joint-control-channel-group! a0-15 (the-as art-joint-anim (-> obj draw art-group data 18)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-17 (-> obj skel root-channel 0))) + (set! (-> a0-17 frame-group) (the-as art-joint-anim (-> obj draw art-group data 12))) + (set! (-> a0-17 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 12)) 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 (-> obj draw art-group data 12)) num-func-seek!) + ) + ) + ) + #t + ) + ) + ) + +(defmethod enemy-method-78 predator ((obj predator) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 20))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 20)) 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 20)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data 15))) + (set! (-> a0-5 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 15)) 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 (-> obj draw art-group data 15)) num-func-seek!) + ) + ) + ) + #t + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-8 (-> obj skel root-channel 0))) + (set! (-> a0-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 23))) + (set! (-> a0-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 23)) frames num-frames) -1)) + ) + (set! (-> a0-8 param 1) (-> arg0 0)) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim (-> obj draw art-group data 23)) num-func-seek!) + ) + ) + (((knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-11 (-> obj skel root-channel 0))) + (set! (-> a0-11 frame-group) (the-as art-joint-anim (-> obj draw art-group data 19))) + (set! (-> a0-11 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 19)) frames num-frames) -1)) + ) + (set! (-> a0-11 param 1) (-> arg0 0)) + (set! (-> a0-11 frame-num) 0.0) + (joint-control-channel-group! a0-11 (the-as art-joint-anim (-> obj draw art-group data 19)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-13 (-> obj skel root-channel 0))) + (set! (-> a0-13 frame-group) (the-as art-joint-anim (-> obj draw art-group data 13))) + (set! (-> a0-13 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 13)) frames num-frames) -1)) + ) + (set! (-> a0-13 param 1) (-> arg0 0)) + (set! (-> a0-13 frame-num) 0.0) + (joint-control-channel-group! a0-13 (the-as art-joint-anim (-> obj draw art-group data 13)) num-func-seek!) + ) + ) + ) + #t + ) + ) + ) + +;; WARN: Return type mismatch symbol vs none. +(defmethod predator-method-188 predator ((obj predator) (arg0 vector) (arg1 vector) (arg2 vector)) + (let ((s5-0 (new 'stack-no-clear 'collide-query))) + (let ((f0-0 1228.8) + (f30-0 6144.0) + ) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (vector-! (-> s5-0 move-dist) arg1 arg0) + (let ((v1-4 s5-0)) + (set! (-> v1-4 radius) f0-0) + (set! (-> v1-4 collide-with) (collide-spec backgnd)) + (set! (-> v1-4 ignore-process0) obj) + (set! (-> v1-4 ignore-process1) (handle->process (-> obj focus handle))) + (set! (-> v1-4 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-4 action-mask) (collide-action solid)) + ) + (let ((f0-1 (fill-and-probe-using-line-sphere *collide-cache* s5-0))) + (cond + ((>= f0-1 0.0) + (vector-float*! (-> s5-0 move-dist) (-> s5-0 move-dist) f0-1) + (cond + ((< (vector-dot + (-> s5-0 best-other-tri normal) + (vector-! (new 'stack-no-clear 'vector) arg2 (the-as vector (-> s5-0 best-other-tri))) + ) + 0.0 + ) + ) + (else + ) + ) + ) + (else + (vector-! (-> s5-0 move-dist) arg1 arg0) + ) + ) + ) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (let ((v1-14 s5-0)) + (set! (-> v1-14 radius) f30-0) + (set! (-> v1-14 collide-with) (collide-spec enemy hit-by-player-list hit-by-others-list)) + (set! (-> v1-14 ignore-process0) obj) + (set! (-> v1-14 ignore-process1) (handle->process (-> obj focus handle))) + (set! (-> v1-14 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-14 action-mask) (collide-action solid)) + ) + ) + (cond + ((< (fill-and-probe-using-line-sphere *collide-cache* s5-0) 0.0) + #t + ) + (else + (let ((s4-1 (-> s5-0 best-other-tri collide-ptr))) + (when (and (if (type? s4-1 collide-shape-prim) + s4-1 + ) + (< (vector-dot + (-> s5-0 best-other-tri normal) + (vector-! (new 'stack-no-clear 'vector) arg2 (the-as vector (-> s5-0 best-other-tri))) + ) + 0.0 + ) + ) + ) + ) + ) + ) + ) + (none) + ) + +(defmethod predator-method-184 predator ((obj predator) (arg0 int) (arg1 float)) + (local-vars (sv-224 vector) (sv-240 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((a1-1 (-> obj node-list data arg0)) + (s5-0 (new 'stack-no-clear 'projectile-init-by-other-params)) + ) + (set! (-> s5-0 ent) (-> obj entity)) + (set! (-> s5-0 charge) 1.0) + (set! (-> s5-0 options) (projectile-options)) + (set! (-> s5-0 notify-handle) (process->handle obj)) + (set! (-> s5-0 owner-handle) (the-as handle #f)) + (set! (-> s5-0 ignore-handle) (process->handle obj)) + (let* ((v1-10 *game-info*) + (a0-11 (+ (-> v1-10 attack-id) 1)) + ) + (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)) + (vector<-cspace! (-> s5-0 pos) a1-1) + (let ((s2-0 (handle->process (-> obj focus handle))) + (s3-0 (new 'stack-no-clear 'vector)) + ) + (when s2-0 + (seek! + (-> obj miss-amount) + (* 0.5 (vector-length (-> (the-as process-focusable s2-0) root-override transv))) + 4096.0 + ) + (set! (-> s3-0 quad) (-> (get-trans (the-as process-focusable s2-0) 3) quad)) + (set! sv-224 (new 'stack-no-clear 'vector)) + (let ((v1-24 (-> s5-0 pos)) + (a0-18 s3-0) + ) + (.lvf vf4 (&-> v1-24 quad)) + (.lvf vf5 (&-> a0-18 quad)) + ) + (.mov.vf vf6 vf0 :mask #b1000) + (.sub.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> sv-224 quad) vf6) + (let* ((f0-5 (vector-length sv-224)) + (f0-6 (* 0.0000018780048 f0-5)) + ) + (set! sv-240 (new 'stack-no-clear 'vector)) + (let ((s0-0 (new 'stack-no-clear 'vector)) + (s1-1 (new 'stack-no-clear 'vector)) + ) + (let ((a0-19 s3-0)) + (let ((v1-30 s3-0)) + (let ((a1-6 (-> (the-as process-focusable s2-0) root-override transv))) + (let ((a2-2 f0-6)) + (.mov vf7 a2-2) + ) + (.lvf vf5 (&-> a1-6 quad)) + ) + (.lvf vf4 (&-> v1-30 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-19 quad) vf6) + ) + (vector-normalize! sv-224 1.0) + (vector-flatten! sv-240 *up-vector* sv-224) + (vector-normalize! sv-240 1.0) + (vector-cross! s0-0 sv-224 sv-240) + (vector-normalize! s0-0 1.0) + (let ((a2-5 (quaternion-vector-angle! (new 'stack-no-clear 'quaternion) sv-224 (-> obj shoot-angle)))) + (vector-orient-by-quat! sv-240 sv-240 a2-5) + ) + (let* ((t9-9 quaternion-vector-angle!) + (a0-27 (new 'stack-no-clear 'quaternion)) + (a2-6 (-> obj shoot-angle)) + (a2-7 (t9-9 a0-27 sv-224 a2-6)) + ) + (vector-orient-by-quat! s0-0 s0-0 a2-7) + ) + (let ((a0-29 s1-1)) + (let ((v1-32 s3-0)) + (let ((a1-17 (-> obj miss-amount))) + (.mov vf7 a1-17) + ) + (.lvf vf5 (&-> sv-240 quad)) + (.lvf vf4 (&-> v1-32 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-29 quad) vf6) + ) + (let ((v1-33 s3-0)) + (let ((a0-30 (* arg1 (-> obj miss-amount)))) + (.mov vf7 a0-30) + ) + (.lvf vf5 (&-> s0-0 quad)) + (.lvf vf4 (&-> s1-1 quad)) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> v1-33 quad) vf6) + ) + ) + ) + (vector-! (-> s5-0 vel) s3-0 (-> s5-0 pos)) + (vector-normalize! (-> s5-0 vel) 409600.0) + (vector-normalize! (-> s5-0 vel) 532480.0) + (spawn-projectile predator-shot s5-0 obj *default-dead-pool*) + ) + ) + ) + 0 + (none) + ) + ) + +(set! (-> *lightning-spec-id-table* 18) (new 'static 'lightning-spec + :name "lightning-predator-shock-skel" + :flags (lightning-spec-flags lsf0) + :rand-func #x2 + :start-color (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80) + :end-color (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80) + :fade-to-color (new 'static 'rgba :r #xbf :b #x8f :a #x5) + :fade-start-factor 0.2 + :fade-time 120.0 + :texture (new 'static 'texture-id :index #x83 :page #xc) + :reduction 0.8 + :num-points 32 + :box-size 2048.0 + :merge-factor 0.8 + :merge-count 2 + :radius 2048.0 + :duration 30.0 + :sound (static-sound-spec "predator-zap") + ) + ) + +(defmethod predator-method-183 predator ((obj predator)) + (with-pp + (cond + ((< (-> obj hit-points) 2) + (when (!= (-> obj dest-fade) 128.0) + (sound-play "pred-uncloak") + (stop! (-> obj sound)) + (set! (-> obj sound) (the-as ambient-sound 0)) + 0 + ) + (set! (-> obj dest-fade) 128.0) + ) + (else + (set! (-> obj dest-fade) 0.0) + ) + ) + (seek! (-> obj fade) (-> obj dest-fade) (* 60.0 (-> pp clock seconds-per-frame))) + (set! (-> obj draw force-fade) (the-as uint (the int (-> obj fade)))) + (cond + ((zero? (-> obj draw force-fade)) + (setup-masks (-> obj draw) 8 0) + (setup-masks (-> obj draw) 0 4) + (logclear! (-> obj draw status) (draw-control-status force-fade warp-cross-fade)) + ) + ((= (-> obj draw force-fade) 128) + (setup-masks (-> obj draw) 0 8) + (setup-masks (-> obj draw) 4 0) + (logclear! (-> obj draw status) (draw-control-status force-fade warp-cross-fade)) + ) + (else + (setup-masks (-> obj draw) 8 0) + (setup-masks (-> obj draw) 4 0) + (logior! (-> obj draw status) (draw-control-status force-fade warp-cross-fade)) + ) + ) + (if (< 245760.0 (vector-vector-distance (-> obj root-override2 trans) (camera-pos))) + (setup-masks (-> obj draw) 0 8) + ) + (when (< (-> pp clock frame-counter) (the-as time-frame (-> obj shock-effect-end))) + (when (>= (- (-> pp clock frame-counter) (-> obj shock-effect-time)) (seconds 0.04)) + (set! (-> obj shock-effect-time) (-> pp clock frame-counter)) + (process-drawable-shock-skel-effect + obj + (-> *lightning-spec-id-table* 18) + lightning-probe-callback + (-> *part-id-table* 166) + 2048.0 + -1 + -1 + ) + ) + ) + 0 + (none) + ) + ) + +(defstate active (predator) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! predator-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-idle-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (the-as (function none :behavior predator) nav-enemy-simple-post) + ) + +(defstate notice (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (go-virtual hostile) + (none) + ) + ) + +(defstate idle (predator) + :virtual #t + :post (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy idle) post))) + (if t9-0 + ((the-as (function none) t9-0)) + ) + ) + (predator-method-183 self) + (none) + ) + ) + +(defstate fire (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-2 *game-info*) + (v0-0 (+ (-> v1-2 attack-id) 1)) + ) + (set! (-> v1-2 attack-id) v0-0) + (set! (-> self attack-id) v0-0) + ) + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (if (not (handle->process (-> self focus handle))) + (go-virtual active) + ) + (none) + ) + :code (behavior () + (until #f + 1.0 + (let ((gp-0 0)) + (set! (-> self shoot-angle) (* 182.04445 (rand-vu-float-range -45.0 45.0))) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! predator-shoot-guns0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-shoot-guns0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and (< 9.0 (ja-frame-num 0)) (zero? gp-0)) + (set! gp-0 1) + (predator-method-184 self 12 1.0) + ) + (when (and (< 11.0 (ja-frame-num 0)) (= gp-0 1)) + (set! gp-0 2) + (predator-method-184 self 16 -1.0) + ) + (let ((s5-0 (handle->process (-> self focus handle)))) + (when s5-0 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable s5-0) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + (if (< (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable s5-0) 0)) + 24576.0 + ) + (go-virtual close-attack) + ) + ) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (b! #t cfg-26 :delay (nop!)) + ) + (the-as none #f) + (label cfg-26) + (go-virtual hide) + (none) + ) + :post (the-as (function none :behavior predator) enemy-simple-post) + ) + +(defstate close-attack (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (set-dangerous! self #t) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-6 *game-info*) + (a0-3 (+ (-> v1-6 attack-id) 1)) + ) + (set! (-> v1-6 attack-id) a0-3) + (set! (-> self attack-id) a0-3) + ) + (let ((v1-7 (-> self nav))) + (set! (-> v1-7 target-speed) 0.0) + ) + 0 + (none) + ) + :exit (behavior () + (set-dangerous! self #f) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! predator-close-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-close-attack-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((v1-25 (-> self nav state))) + (set! (-> v1-25 speed) 0.0) + ) + 0 + (ja-no-eval :group! predator-close-attack-recover-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-close-attack-recover-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (if (zero? (get-rand-int self 3)) + (sound-play "pred-talk") + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior predator) nav-enemy-chase-post) + ) + +(defstate hidden (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (set! (-> self next-change) + (the-as uint (+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 2.0 5.0))))) + ) + (none) + ) + :trans (behavior () + (predator-method-186 self) + (let ((a0-1 (-> self nav state)) + (v1-3 (-> self hide-pos)) + ) + (logclear! (-> a0-1 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-1 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-1 target-post quad) (-> v1-3 quad)) + ) + 0 + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-virtual active) + ) + (when gp-0 + (if (< (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + 49152.0 + ) + (go-virtual hostile) + ) + ) + ) + (if (< (the-as time-frame (-> self next-change)) (-> self clock frame-counter)) + (go-virtual hide) + ) + (none) + ) + :code (behavior () + (until #f + (ja-channel-push! 1 (seconds 0.2)) + (until (logtest? (-> self nav state flags) (nav-state-flag at-target)) + (ja-no-eval :group! predator-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-run0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (ja-channel-push! 1 (seconds 0.2)) + (until (not (logtest? (-> self nav state flags) (nav-state-flag at-target))) + (ja-no-eval :group! predator-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-idle-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +(defstate hide (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (nav-enemy-method-166 self) + (let ((v1-4 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-4 enemy-flags))) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-4 enemy-flags)))) + ) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-4 enemy-flags)))) + (set! (-> v1-4 nav callback-info) (-> v1-4 enemy-info-override callback-info)) + ) + 0 + (predator-method-187 self) + (set! (-> self next-change) (the-as uint 0)) + 0 + (none) + ) + :trans (behavior () + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-virtual active) + ) + (when gp-0 + (if (< (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + 65536.0 + ) + (go-virtual hostile) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (check-los? (-> self los) 0) + (zero? (logand (-> self draw status) (draw-control-status on-screen))) + ) + (go-virtual fire) + ) + ) + ) + (predator-method-186 self) + (let ((a0-12 (-> self nav state)) + (v1-30 (-> self hide-pos)) + ) + (logclear! (-> a0-12 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-12 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-12 target-post quad) (-> v1-30 quad)) + ) + 0 + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (logtest? (-> self nav state flags) (nav-state-flag at-target)) + ) + (go-virtual hidden) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! predator-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-run0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +(defstate hostile (predator) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self want-stop) #f) + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self next-change) + (the-as uint (+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 4.0 8.0))))) + ) + (if (zero? (get-rand-int self 3)) + (sound-play "pred-talk") + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 5)) + (go-virtual hide) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-virtual active) + ) + (when (enemy-method-107 self) + (when (and gp-0 + (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + ) + (let ((f0-0 + (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + ) + ) + (cond + ((< f0-0 16384.0) + (go-virtual close-attack) + ) + ((< 57344.0 f0-0) + (go-virtual hide) + ) + ) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! predator-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-run0-ja) frames num-frames) -1))) + :frame-num 6.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (until #f + (ja-no-eval :group! predator-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-run0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + ) + +;; WARN: Return type mismatch symbol vs none. +(defmethod predator-method-186 predator ((obj predator)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((f30-0 0.0) + (s5-0 -1) + (s4-0 (-> *predator-graph* node (-> obj curr-node))) + ) + (dotimes (s3-0 32) + (when (logtest? (the-as int (-> s4-0 points)) (ash 1 s3-0)) + (let ((s1-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + ) + (vector-rotate-around-y! s1-0 *x-vector* (* 182.04445 (* 11.25 (the float s3-0)))) + (let ((a0-6 s2-0)) + (let ((v1-7 (-> s4-0 position))) + (let ((a1-3 (-> s4-0 radius))) + (.mov vf7 a1-3) + ) + (.lvf vf5 (&-> s1-0 quad)) + (.lvf vf4 (&-> v1-7 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-6 quad) vf6) + ) + (let ((f0-3 (vector-vector-distance (target-pos 0) s2-0))) + (when (or (= s5-0 -1) (< f30-0 f0-3)) + (set! s5-0 s3-0) + (set! f30-0 f0-3) + (set! (-> obj hide-pos quad) (-> s2-0 quad)) + ) + ) + ) + ) + ) + ) + (none) + ) + ) + +(defmethod predator-method-185 predator ((obj predator)) + (let ((f30-0 0.0) + (s5-0 -1) + ) + -1 + (dotimes (s4-0 (the-as int (-> *predator-graph* node-count))) + (let* ((s3-0 (-> *predator-graph* node s4-0)) + (f0-0 (vector-vector-distance (-> s3-0 position) (-> obj root-override2 trans))) + ) + (when (and (not (logtest? (-> s3-0 flags) (predator-node-flag taken))) (or (= s5-0 -1) (< f0-0 f30-0))) + (set! f30-0 f0-0) + (set! s5-0 s4-0) + ) + ) + ) + (set! (-> obj curr-node) s5-0) + (logior! (-> *predator-graph* node s5-0 flags) (predator-node-flag taken)) + ) + (predator-method-186 obj) + (none) + ) + +(defmethod predator-method-187 predator ((obj predator)) + (let* ((s5-0 (-> *predator-graph* node (-> obj curr-node))) + (s4-0 (rand-vu-int-count (-> s5-0 edge-count))) + ) + (dotimes (s3-0 (-> s5-0 edge-count)) + (let* ((s2-0 + (-> (the-as (pointer uint16) (+ (* (+ (-> s5-0 edge-index) (mod (+ s3-0 s4-0) (-> s5-0 edge-count))) 16) + (the-as int (-> *predator-graph* edge)) + ) + ) + ) + ) + (s1-0 (-> *predator-graph* node s2-0)) + ) + (when (and (not (point-in-line-region? (target-pos 0) (-> s5-0 position) (-> s1-0 position) 61440.0)) + (zero? (logand (-> s1-0 flags) (predator-node-flag taken))) + ) + (logior! (-> s1-0 flags) (predator-node-flag taken)) + (logclear! (-> s5-0 flags) (predator-node-flag taken)) + (set! (-> obj curr-node) (the-as int s2-0)) + (return #t) + ) + ) + ) + ) + #f + ) + +(defmethod enemy-method-55 predator ((obj predator)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-55))) + (t9-0 obj) + ) + (predator-method-183 obj) + (los-control-method-9 (-> obj los) (the-as process-focusable #f) (the-as vector #f) 2048.0) + (when (nonzero? (-> obj sound)) + (update-trans! (-> obj sound) (-> obj root-override2 trans)) + (update! (-> obj sound)) + ) + (none) + ) + +(defmethod set-dangerous! predator ((obj predator) (arg0 symbol)) + (let ((v1-1 (-> obj root-override2 root-prim))) + (dotimes (a0-1 (the-as int (-> v1-1 specific 0))) + (let ((a2-1 (-> (the-as collide-shape-prim-group v1-1) child a0-1))) + (if arg0 + (logior! (-> a2-1 prim-core action) (collide-action deadly)) + (logclear! (-> a2-1 prim-core action) (collide-action deadly)) + ) + ) + ) + ) + #f + ) + +(defmethod enemy-method-114 predator ((obj predator)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 5) 0))) + (set! (-> s5-0 total-prims) (the-as uint 6)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 11264.0 0.0 17203.2) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 5120.0 0.0 5120.0) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 transform-index) 16) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 transform-index) 12) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-19 local-sphere) 0.0 9216.0 0.0 5120.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-with) (collide-spec backgnd obstacle hit-by-others-list)) + (set! (-> v1-21 prim-core action) (collide-action solid)) + (set-vector! (-> v1-21 local-sphere) 0.0 12288.0 0.0 12288.0) + ) + (set! (-> s5-0 nav-radius) 6144.0) + (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 process-focusable vs predator. +(defmethod relocate predator ((obj predator) (arg0 int)) + (the-as + predator + ((the-as (function process-focusable int process-focusable) (find-parent-method predator 7)) obj arg0) + ) + ) + +(defmethod nav-enemy-method-167 predator ((obj predator)) + (let ((v1-0 (-> obj nav))) + (set! (-> v1-0 target-speed) 0.0) + ) + 0 + (let ((v1-2 (-> obj nav))) + (set! (-> v1-2 acceleration) (-> obj enemy-info-override walk-acceleration)) + ) + 0 + 0 + (none) + ) + +(defmethod run-logic? predator ((obj predator)) + #t + ) + +;; WARN: Return type mismatch none vs symbol. +(defmethod enemy-method-63 predator ((obj predator) (arg0 process-focusable) (arg1 symbol)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-63))) + (the-as symbol (if (t9-0 obj arg0 arg1) + (set-dst-proc! (-> obj los) (-> obj focus handle)) + ) + ) + ) + ) + +;; WARN: Return type mismatch entity-perm-status vs none. +(defmethod init-from-entity! predator ((obj predator) (arg0 entity-actor)) + (process-entity-status! obj (entity-perm-status dead) #t) + (none) + ) + +(defmethod enemy-method-113 predator ((obj predator) (arg0 nav-enemy-info)) + (set! (-> arg0 nav-mesh) *default-nav-mesh*) + (let ((t9-0 (method-of-type nav-enemy enemy-method-113))) + (t9-0 obj arg0) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + 0 + (none) + ) + +(defmethod enemy-method-115 predator ((obj predator)) + "@abstract" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-predator" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *predator-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 327680.0) + (add-connection *part-engine* obj 8 obj 318 (new 'static 'vector :x 1228.8 :y 450.56 :z 983.04 :w 614400.0)) + (add-connection *part-engine* obj 8 obj 318 (new 'static 'vector :x -1228.8 :y 450.56 :z 983.04 :w 614400.0)) + (new-source! (-> obj los) obj (seconds 0.2) (collide-spec backgnd enemy obstacle)) + (setup-masks (-> obj draw) 8 0) + (setup-masks (-> obj draw) 4 0) + (logior! (-> obj draw status) (draw-control-status force-fade warp-cross-fade)) + (set! (-> obj draw force-fade) (the-as uint 0)) + (set! (-> obj fade) 0.0) + (set! (-> obj dest-fade) 0.0) + (set! (-> obj curr-node) -1) + (set! (-> obj next-change) (the-as uint 0)) + (set! (-> obj miss-amount) 16384.0) + (set! (-> obj ambient-sound-id) (new 'static 'sound-id)) + (predator-method-185 obj) + (set! (-> obj sound) (new + 'process + 'ambient-sound + (static-sound-spec "pred-hum" :fo-min 2 :fo-max 30) + (-> obj root-override2 trans) + ) + ) + (set! (-> obj enemy-flags) (logior (enemy-flag trackable-backup enable-on-hostile) (-> obj enemy-flags))) + (minimap-method-12 *minimap* obj (the-as uint 16) (the-as int #f) (the-as vector #t) 0) + 0 + (none) + ) + +(deftype predator-manager (process) + ((predator-count uint32 :offset-assert 128) + (predator-h handle 32 :offset-assert 136) + (hud-counter handle :offset-assert 392) + (actor-group (pointer actor-group) :offset-assert 400) + (actor-group-count int32 :offset-assert 404) + ) + :heap-base #x120 + :method-count-assert 17 + :size-assert #x198 + :flag-assert #x1101200198 + (:methods + (idle () _type_ :state 14) + (closed () _type_ :state 15) + (predator-manager-method-16 (_type_) none 16) + ) + ) + + +(define *predator-manager* (the-as predator-manager #f)) + +;; WARN: Return type mismatch process vs predator-manager. +(defmethod relocate predator-manager ((obj predator-manager) (arg0 int)) + (set! *predator-manager* obj) + (if *predator-manager* + (set! *predator-manager* (&+ *predator-manager* arg0)) + ) + (the-as predator-manager ((method-of-type process relocate) obj arg0)) + ) + +(defmethod predator-manager-method-16 predator-manager ((obj predator-manager)) + 0 + (none) + ) + +(defstate idle (predator-manager) + :virtual #t + :enter (behavior () + (set! (-> self hud-counter) (ppointer->handle (process-spawn hud-predator :init hud-init-by-other :to self))) + (none) + ) + :exit (behavior () + (when (-> self hud-counter) + (send-event (handle->process (-> self hud-counter)) 'hide-and-die) + (set! (-> self hud-counter) (the-as handle #f)) + ) + (none) + ) + :trans (behavior () + (predator-manager-method-16 self) + (let ((gp-0 0)) + (dotimes (v1-2 (the-as int (-> self predator-count))) + (if (handle->process (-> self predator-h v1-2)) + (+! gp-0 1) + ) + ) + (dotimes (s5-0 (length (-> self actor-group 0))) + (if (not (logtest? (-> self actor-group 0 data s5-0 actor extra perm status) (entity-perm-status dead))) + (+! gp-0 1) + ) + ) + (set! (-> *game-info* counter) (the float gp-0)) + (when (zero? gp-0) + (task-node-close! (game-task-node forest-hunt-resolution)) + (when (-> self hud-counter) + (send-event (handle->process (-> self hud-counter)) 'hide-and-die) + (set! (-> self hud-counter) (the-as handle #f)) + (talker-spawn-func (-> *talker-speech* 89) *entity-pool* (target-pos 0) (the-as region #f)) + ) + ) + ) + (none) + ) + :code (the-as (function none :behavior predator-manager) sleep-code) + ) + +(defstate closed (predator-manager) + :virtual #t + :code (the-as (function none :behavior predator-manager) sleep-code) + ) + +;; WARN: Return type mismatch object vs none. +;; WARN: new jak 2 until loop case, check carefully +(defmethod init-from-entity! predator-manager ((obj predator-manager) (arg0 entity-actor)) + (local-vars (sv-16 res-tag)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (cond + ((task-node-closed? (game-task-node forest-hunt-resolution)) + (go (method-of-object obj closed)) + ) + (else + (dotimes (v1-2 (the-as int (-> *predator-graph* node-count))) + (let ((a0-4 (-> *predator-graph* node v1-2))) + (logior! (-> a0-4 flags) (predator-node-flag spawnable)) + (logclear! (-> a0-4 flags) (predator-node-flag taken)) + ) + ) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-6 (res-lump-data (-> obj entity) 'actor-groups pointer :tag-ptr (& sv-16)))) + (cond + ((and v1-6 (nonzero? (-> sv-16 elt-count))) + (set! (-> obj actor-group) (the-as (pointer actor-group) v1-6)) + (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) + (go process-drawable-art-error "actor-group predator-manager") + ) + ) + ) + (dotimes (s5-0 (length (-> obj actor-group 0))) + (let ((t0-1 (-> obj actor-group 0 data s5-0 actor))) + (if t0-1 + (minimap-method-12 *minimap* obj (the-as uint 16) (the-as int #f) (the-as vector t0-1) 0) + ) + ) + ) + (dotimes (s5-1 (the-as int (-> *predator-graph* node-count))) + (let ((s4-0 (-> *predator-graph* node s5-1))) + (when (logtest? (-> s4-0 flags) (predator-node-flag spawnable)) + (dotimes (s3-0 (the-as int (-> *predator-graph* node-count))) + (let ((s2-0 (-> *predator-graph* node s3-0))) + (when (and (!= s5-1 s3-0) (logtest? (-> s2-0 flags) (predator-node-flag spawnable))) + (if (< (vector-vector-distance (-> s4-0 position) (-> s2-0 position)) 180224.0) + (logclear! (-> s2-0 flags) (predator-node-flag spawnable)) + ) + ) + ) + ) + ) + ) + ) + (let ((s5-2 0)) + (dotimes (s4-1 (the-as int (-> *predator-graph* node-count))) + (let ((s3-1 (-> *predator-graph* node s4-1))) + (when (logtest? (-> s3-1 flags) (predator-node-flag spawnable)) + (let ((s2-1 (new 'stack-no-clear 'transformq))) + (new 'stack-no-clear 'vector) + (let ((s0-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-52 0)) + (until #f + (when (logtest? (-> s3-1 points) (ash 1 v1-52)) + (vector-rotate-around-y! s0-0 *x-vector* (* 182.04445 (* 11.25 (the float v1-52)))) + (let ((a0-29 s1-0)) + (let ((v1-53 (-> s3-1 position))) + (let ((a1-17 (-> s3-1 radius))) + (.mov vf7 a1-17) + ) + (.lvf vf5 (&-> s0-0 quad)) + (.lvf vf4 (&-> v1-53 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-29 quad) vf6) + ) + (goto cfg-40) + ) + (+! v1-52 1) + ) + ) + #f + (label cfg-40) + (set! (-> s2-1 trans quad) (-> s1-0 quad)) + ) + (quaternion-copy! (-> s2-1 quat) *unity-quaternion*) + (set! (-> s2-1 scale x) (the-as float (-> obj actor-group 1 data s5-2 actor))) + (set! (-> s2-1 scale y) (the-as float #f)) + (set! (-> s2-1 scale z) (the-as float #f)) + (let* ((s1-2 (ppointer->process (process-spawn predator :init enemy-init-by-other obj s2-1 :to obj))) + (s2-2 (if (type? s1-2 process-focusable) + s1-2 + ) + ) + (s3-2 (entity-nav-mesh-by-aid (the-as actor-id (-> s3-1 nav-mesh-id)))) + (v1-66 (if (type? s3-2 entity-nav-mesh) + s3-2 + ) + ) + ) + (set! (-> obj predator-h (-> obj predator-count)) (process->handle (the-as process s2-2))) + (+! (-> obj predator-count) 1) + (when v1-66 + (change-to (-> v1-66 nav-mesh) (the-as process-drawable s2-2)) + (let ((v1-70 (-> (the-as process-drawable s2-2) nav state))) + (set! (-> v1-70 current-poly) (the-as nav-poly #f)) + ) + 0 + ) + ) + ) + (+! s5-2 1) + ) + ) + ) + ) + (go (method-of-object obj idle)) + ) + ) + (none) + ) + ) diff --git a/goal_src/jak2/levels/mars_tomb/monster-frog.gc b/goal_src/jak2/levels/mars_tomb/monster-frog.gc index 52b5dbd9fb..f7c8f40841 100644 --- a/goal_src/jak2/levels/mars_tomb/monster-frog.gc +++ b/goal_src/jak2/levels/mars_tomb/monster-frog.gc @@ -7,3 +7,1025 @@ ;; DECOMP BEGINS +(defskelgroup skel-monster-frog monster-frog monster-frog-lod0-jg monster-frog-idle0-ja + ((monster-frog-lod0-mg (meters 20)) (monster-frog-lod1-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5) + :shadow monster-frog-shadow-mg + :origin-joint-index 12 + ) + +(deftype monster-frog (nav-enemy) + () + :heap-base #x1e0 + :method-count-assert 181 + :size-assert #x25c + :flag-assert #xb501e0025c + (:methods + (attack (vector) _type_ :state 178) + (attack-recover () _type_ :state 179) + (turn () _type_ :state 180) + ) + ) + + +(define *monster-frog-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #f + :use-victory #f + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 8 #x1e0002 #x3020401 #x1e0002 #x2010501 #x0 #x0 #x0 #x0) + :idle-anim 4 + :notice-anim 8 + :hostile-anim 18 + :hit-anim 30 + :knocked-anim 30 + :knocked-land-anim 31 + :die-anim 4 + :die-falling-anim 4 + :victory-anim -1 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :sound-hit (static-sound-name "monster-frog-hi") + :sound-die (static-sound-name "monster-frog-di") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 40) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #x11fffdffa + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :recover-gnd-collide-with (collide-spec backgnd crate obstacle hit-by-others-list pusher) + :jump-height-min (meters 2.87) + :jump-height-factor 0.1 + :knocked-seek-ry-clamp 4551.1113 + :knocked-soft-vxz-lo 75776.0 + :knocked-soft-vxz-hi 75776.0 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 81920.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 79872.0 + :knocked-hard-vxz-hi 79872.0 + :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 75776.0 + :knocked-yellow-vxz-hi 75776.0 + :knocked-yellow-vy-lo 81920.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 73728.0 + :knocked-red-vxz-hi 73728.0 + :knocked-red-vy-lo 96256.0 + :knocked-red-vy-hi 96256.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint -1 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #t + :use-pacing #t + :walk-anim 16 + :turn-anim 16 + :run-anim 18 + :taunt-anim -1 + :run-travel-speed (meters 18) + :run-acceleration (meters 10) + :run-turning-acceleration (meters 80) + :walk-travel-speed (meters 11.44) + :walk-acceleration (meters 5) + :walk-turning-acceleration (meters 20) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 1.5) + :frustration-distance (meters 8) + :frustration-time (seconds 4) + :blocked-time (seconds 0.3) + :circle-dist-lo 20480.0 + :circle-dist-hi 61440.0 + :nav-mesh #f + ) + ) + +(set! (-> *monster-frog-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; WARN: new jak 2 until loop case, check carefully +(defbehavior monster-frog-hop-slow-code monster-frog () + (until #f + (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 + (dotimes (gp-0 (get-rand-int-range self 2 3)) + (cond + ((zero? (get-rand-int self 4)) + (let ((v1-7 (ja-group))) + (if (not (and v1-7 (= v1-7 monster-frog-idle0-ja))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (ja-no-eval :group! monster-frog-idle0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-idle0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (let ((v1-38 (ja-group))) + (if (not (and v1-38 (= v1-38 monster-frog-idle1-ja))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (ja-no-eval :group! monster-frog-idle1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-idle1-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + ) + (let ((v1-71 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-71 enemy-flags))) + (set! (-> v1-71 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-71 enemy-flags)))) + ) + (set! (-> v1-71 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-71 enemy-flags)))) + (set! (-> v1-71 nav callback-info) (-> v1-71 enemy-info-override callback-info)) + ) + 0 + (ja-channel-push! 1 (seconds 0.035)) + (let ((v1-74 self)) + (set! (-> v1-74 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-74 enemy-flags)))) + ) + 0 + (nav-enemy-method-165 self) + (let ((v1-78 (-> self nav))) + (set! (-> v1-78 target-speed) (* 1.4 (-> self enemy-info-override walk-travel-speed))) + ) + 0 + (let ((v1-80 self)) + (set! (-> v1-80 enemy-flags) (the-as enemy-flag (logclear (-> v1-80 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (ja-no-eval :group! monster-frog-hop-slow-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-start-ja) frames num-frames) -1)) 1.4) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 1.4)) + ) + (nav-enemy-method-167 self) + (ja-no-eval :group! monster-frog-hop-slow-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-end-ja) frames num-frames) -1)) 1.4) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 1.4)) + ) + ) + #f + ) + +;; WARN: new jak 2 until loop case, check carefully +(defbehavior monster-frog-hop-fast-code monster-frog () + (until #f + (nav-enemy-method-166 self) + (ja-no-eval :group! monster-frog-hop-slow-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-start-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (nav-enemy-method-167 self) + (ja-no-eval :group! monster-frog-hop-slow-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-end-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + ) + +(defstate ambush (monster-frog) + :virtual #t + :enter (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (logclear! (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (let ((gp-0 (-> self on-notice))) + (if gp-0 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (-> self root-override2 trans)) + (the-as pair gp-0) + ) + ) + ) + ) + (let ((v1-12 (-> self root-override2 root-prim))) + (set! (-> v1-12 prim-core collide-as) (collide-spec)) + (set! (-> v1-12 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (none) + ) + :code (behavior () + (enemy-method-129 self) + (let ((a0-2 (handle->process (-> self focus handle)))) + (when a0-2 + (let* ((gp-0 (-> self root-override2)) + (s3-0 + (vector-normalize! + (vector-! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable a0-2) 0) (-> gp-0 trans)) + 1.0 + ) + ) + (f0-0 (deg-diff (quaternion-y-angle (-> gp-0 quat)) (vector-y-angle s3-0))) + ) + (quaternion-rotate-y! (-> gp-0 quat) (-> gp-0 quat) f0-0) + ) + ) + ) + (logclear! (-> self draw status) (draw-control-status no-draw)) + (ja-no-eval :group! monster-frog-popup0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-popup0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((v1-37 (-> self root-override2 root-prim))) + (set! (-> v1-37 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-37 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior monster-frog) nav-enemy-simple-post) + ) + +(defstate notice (monster-frog) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (new 'stack-no-clear 'vector) + (ja-no-eval :group! monster-frog-notice0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-notice0-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (ja-no-eval :group! monster-frog-notice0-jump-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-notice0-jump-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((a0-7 (handle->process (-> self focus handle)))) + (if a0-7 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-7) 0) + (* 98304.0 f30-0) + (seconds 0.02) + ) + ) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (ja-no-eval :group! monster-frog-notice0-land-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-notice0-land-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +(defstate active (monster-frog) + :virtual #t + :code (behavior () + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (nav-enemy-method-165 self) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! monster-frog-hop-slow-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-start-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (nav-enemy-method-167 self) + (ja-no-eval :group! monster-frog-hop-slow-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-end-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (when (enemy-method-123 self 0.2) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.6)) + (let ((v1-57 self)) + (set! (-> v1-57 enemy-flags) (the-as enemy-flag (logclear (-> v1-57 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-57 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (until (not (enemy-method-123 self 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((v1-121 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-121 enemy-flags))) + (set! (-> v1-121 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-121 enemy-flags)))) + ) + (set! (-> v1-121 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-121 enemy-flags)))) + (set! (-> v1-121 nav callback-info) (-> v1-121 enemy-info-override callback-info)) + ) + 0 + (nav-enemy-method-165 self) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.6)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override walk-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override walk-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + #f + (none) + ) + ) + +(defstate pacing (monster-frog) + :virtual #t + :code (the-as (function none :behavior monster-frog) monster-frog-hop-slow-code) + ) + +(defstate circling (monster-frog) + :virtual #t + :code (the-as (function none :behavior monster-frog) monster-frog-hop-slow-code) + ) + +(defstate stare (monster-frog) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy stare) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + ) + +(defstate hostile (monster-frog) + :virtual #t + :enter (behavior () + (logclear! (-> self enemy-flags) (enemy-flag chase-startup)) + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-6 self)) + (set! (-> v1-6 enemy-flags) (the-as enemy-flag (logclear (-> v1-6 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :trans (behavior () + (nav-enemy-method-160 self) + (if (and (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) (-> self enemy-info-override use-victory)) + (go-virtual victory) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + (if (nav-enemy-method-163 self) + (go-stare2 self) + ) + (let ((gp-0 (-> self focus aware))) + (cond + ((>= 1 (the-as int gp-0)) + (if (-> self enemy-info-override use-stop-chase) + (go-virtual stop-chase) + (go-virtual active) + ) + ) + ((or (>= 2 (the-as int gp-0)) (not (enemy-method-107 self))) + (go-stare self) + ) + ((= gp-0 (enemy-aware enemy-aware-4)) + (go-flee self) + ) + ) + ) + (when (and (-> self enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> self enemy-flags))) + (if (-> self enemy-info-override use-stop-chase) + (go-virtual stop-chase) + (go-stare self) + ) + ) + ) + (none) + ) + :code (behavior () + (until #f + (let* ((gp-0 (handle->process (-> self focus handle))) + (a0-4 (if (type? gp-0 process-focusable) + gp-0 + ) + ) + ) + (cond + (a0-4 + (let* ((s5-0 (get-trans (the-as process-focusable a0-4) 0)) + (a1-4 (vector-! (new 'stack-no-clear 'vector) s5-0 (-> self root-override2 trans))) + (f30-0 (vector-length a1-4)) + (gp-1 (-> self enemy-info-override)) + ) + (let ((a1-5 (vector-normalize-copy! (new 'stack-no-clear 'vector) a1-4 1.0))) + (if (not (enemy-method-94 self a1-5 6371.5557)) + (go-virtual turn) + ) + ) + (if (< f30-0 32768.0) + (go-virtual attack s5-0) + ) + (let* ((f28-0 (fmax 0.0 (fmin 1.0 (* 0.000034877234 (+ -32768.0 f30-0))))) + (f26-0 (lerp 0.5 1.0 f28-0)) + (f30-1 (lerp 0.0 1.0 f28-0)) + (f28-1 (lerp 1.4 1.0 f28-0)) + ) + (let ((v1-21 (-> self nav))) + (set! (-> v1-21 target-speed) (/ (* f26-0 (-> gp-1 run-travel-speed)) f28-1)) + ) + 0 + (let ((v1-23 (-> self nav))) + (set! (-> v1-23 acceleration) (-> gp-1 run-acceleration)) + ) + 0 + (let ((v1-25 (-> self nav))) + (set! (-> v1-25 turning-acceleration) (-> gp-1 run-turning-acceleration)) + ) + 0 + (ja-channel-push! 2 (seconds 0.01)) + (ja-no-eval :group! monster-frog-hop-small-start-ja + :num! (seek! + (the float (+ (-> (the-as art-joint-anim monster-frog-hop-small-start-ja) frames num-frames) -1)) + f28-1 + ) + :frame-num 0.0 + ) + (let ((a0-15 (-> self skel root-channel 1))) + (set! (-> a0-15 frame-interp 1) f30-1) + (set! (-> a0-15 frame-interp 0) f30-1) + (set! (-> a0-15 frame-group) (the-as art-joint-anim monster-frog-hop-slow-start-ja)) + (set! (-> a0-15 param 0) 0.0) + (set! (-> a0-15 frame-num) 0.0) + (joint-control-channel-group! a0-15 (the-as art-joint-anim monster-frog-hop-slow-start-ja) num-func-chan) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f28-1)) + (let ((a0-17 (-> self skel root-channel 1))) + (set! (-> a0-17 frame-interp 1) f30-1) + (set! (-> a0-17 frame-interp 0) f30-1) + (set! (-> a0-17 param 0) 0.0) + (joint-control-channel-group-eval! a0-17 (the-as art-joint-anim #f) num-func-chan) + ) + ) + (nav-enemy-method-167 self) + (ja-no-eval :group! monster-frog-hop-small-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-small-end-ja) frames num-frames) -1)) f28-1) + :frame-num 0.0 + ) + (let ((a0-21 (-> self skel root-channel 1))) + (set! (-> a0-21 frame-interp 1) f30-1) + (set! (-> a0-21 frame-interp 0) f30-1) + (set! (-> a0-21 frame-group) (the-as art-joint-anim monster-frog-hop-slow-end-ja)) + (set! (-> a0-21 param 0) 0.0) + (set! (-> a0-21 frame-num) 0.0) + (joint-control-channel-group! a0-21 (the-as art-joint-anim monster-frog-hop-slow-end-ja) num-func-chan) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f28-1)) + (let ((a0-23 (-> self skel root-channel 1))) + (set! (-> a0-23 frame-interp 1) f30-1) + (set! (-> a0-23 frame-interp 0) f30-1) + (set! (-> a0-23 param 0) 0.0) + (joint-control-channel-group-eval! a0-23 (the-as art-joint-anim #f) num-func-chan) + ) + ) + ) + ) + ) + (else + (suspend) + 0 + ) + ) + ) + ) + #f + (none) + ) + ) + +(defstate turn (monster-frog) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior monster-frog) enemy-event-handler) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((v1-0 self)) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-0 enemy-flags)))) + ) + 0 + (ja-no-eval :group! monster-frog-rotate-left-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-rotate-left-start-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((v1-26 self)) + (set! (-> v1-26 enemy-flags) (the-as enemy-flag (logclear (-> v1-26 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (ja-no-eval :group! monster-frog-rotate-left-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-rotate-left-end-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (enemy-method-72 self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + 81920.0 + (seconds 0.02) + ) + ) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate attack (monster-frog) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior monster-frog) enemy-event-handler) + :enter (behavior ((arg0 vector)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-2 enemy-flags))) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-2 enemy-flags)))) + ) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-2 enemy-flags)))) + (set! (-> v1-2 nav callback-info) (-> v1-2 enemy-info-override callback-info)) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (a1-15 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a1-15) + (set! (-> self attack-id) a1-15) + ) + (let* ((gp-0 (-> self root-override2 trans)) + (s5-1 (vector-! (new 'stack-no-clear 'vector) arg0 gp-0)) + ) + (let ((f0-0 (vector-length s5-1))) + (vector-normalize! s5-1 (fmin f0-0 (-> self enemy-info-override run-travel-speed))) + ) + (let ((a0-3 (-> self nav state)) + (v1-17 (vector+! (new 'stack-no-clear 'vector) gp-0 s5-1)) + ) + (logclear! (-> a0-3 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-3 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-3 target-post quad) (-> v1-17 quad)) + ) + ) + 0 + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior ((arg0 vector)) + (ja-channel-push! 1 (seconds 0.04)) + (nav-enemy-method-166 self) + (ja-no-eval :group! monster-frog-attack0-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-attack0-start-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (nav-enemy-method-167 self) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (go-virtual attack-recover) + (none) + ) + :post (the-as (function none :behavior monster-frog) nav-enemy-travel-post) + ) + +(defstate attack-recover (monster-frog) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior monster-frog) enemy-event-handler) + :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 + (none) + ) + :code (behavior () + (ja-no-eval :group! monster-frog-attack0-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-attack0-end-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (cond + ((zero? (get-rand-int self 4)) + (let ((v1-28 (ja-group))) + (if (not (and v1-28 (= v1-28 monster-frog-idle0-ja))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (ja-no-eval :group! monster-frog-idle0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-idle0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (let ((v1-59 (ja-group))) + (if (not (and v1-59 (= v1-59 monster-frog-idle1-ja))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (ja-no-eval :group! monster-frog-idle1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-idle1-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior monster-frog) nav-enemy-simple-post) + ) + +(defmethod enemy-method-77 monster-frog ((obj monster-frog) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 0) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 26))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 26)) 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 26)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 0) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> a0-6 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> a0-6 param 1) (-> arg0 0)) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! a0-6 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + #t + ) + (else + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + (ja-channel-push! 1 0) + (let ((a0-8 (-> obj skel root-channel 0))) + (set! (-> a0-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 30))) + (set! (-> a0-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 30)) frames num-frames) -1)) + ) + (set! (-> a0-8 param 1) (-> arg0 0)) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim (-> obj draw art-group data 30)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 0) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim (-> obj draw art-group data 32))) + (set! (-> a0-10 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 32)) frames num-frames) -1)) + ) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim (-> obj draw art-group data 32)) num-func-seek!) + ) + ) + ) + #t + ) + ) + ) + +(defmethod enemy-method-78 monster-frog ((obj monster-frog) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 27))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 27)) 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 27)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) (the-as art-joint-anim (-> obj draw art-group data 23))) + (set! (-> a0-6 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 23)) frames num-frames) -1)) + ) + (set! (-> a0-6 param 1) (-> arg0 0)) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! a0-6 (the-as art-joint-anim (-> obj draw art-group data 23)) num-func-seek!) + ) + #t + ) + (else + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + (ja-channel-push! 1 0) + (let ((a0-8 (-> obj skel root-channel 0))) + (set! (-> a0-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 31))) + (set! (-> a0-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 31)) frames num-frames) -1)) + ) + (set! (-> a0-8 param 1) (-> arg0 0)) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim (-> obj draw art-group data 31)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 0) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim (-> obj draw art-group data 33))) + (set! (-> a0-10 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 33)) frames num-frames) -1)) + ) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim (-> obj draw art-group data 33)) num-func-seek!) + ) + ) + ) + #t + ) + ) + ) + +(defmethod enemy-method-55 monster-frog ((obj monster-frog)) + (water-control-method-10 (-> obj water)) + ((method-of-type nav-enemy enemy-method-55) obj) + (none) + ) + +(defmethod enemy-method-114 monster-frog ((obj monster-frog)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 4096.0 0.0 8192.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-13 prim-core action) (collide-action solid deadly no-standon)) + (set-vector! (-> v1-13 local-sphere) 0.0 4096.0 1638.4 3276.8) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action deadly)) + (set! (-> v1-15 transform-index) 5) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 2048.0 2662.4) + ) + (set! (-> s5-0 nav-radius) 4915.2) + (let ((v1-17 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-17 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-17 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +(defmethod enemy-method-115 monster-frog ((obj monster-frog)) + "@abstract" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-monster-frog" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *monster-frog-nav-enemy-info*) + (set! (-> obj water) (new 'process 'water-control obj 5 0.0 8192.0 2048.0)) + (set! (-> obj water flags) + (water-flags active use-water-anim touch-water part-splash part-drip part-rings part-water find-water) + ) + (set! (-> obj water height) (res-lump-float (-> obj entity) 'water-height)) + (set! (-> obj water ripple-size) 12288.0) + (set! (-> obj water wake-size) 6144.0) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/ruins/rapid-gunner.gc b/goal_src/jak2/levels/ruins/rapid-gunner.gc index f63d542a38..3eb03095f1 100644 --- a/goal_src/jak2/levels/ruins/rapid-gunner.gc +++ b/goal_src/jak2/levels/ruins/rapid-gunner.gc @@ -7,3 +7,1499 @@ ;; DECOMP BEGINS +(deftype rapid-gunner (nav-enemy) + ((los los-control :inline :offset-assert 608) + (joint joint-mod :offset-assert 756) + (joint-blend float :offset-assert 760) + (joint-enable symbol :offset-assert 764) + (shot-timer uint64 :offset-assert 768) + (predict-timer uint64 :offset-assert 776) + (target-prev-pos vector :inline :offset-assert 784) + (target-next-pos vector :inline :offset-assert 800) + (focus-dir vector :inline :offset-assert 816) + (y-diff float :offset-assert 832) + (shots-fired uint32 :offset-assert 836) + (spin-up-angle float :offset-assert 840) + (spin-up-timer time-frame :offset-assert 848) + (shoot-anim-index int32 :offset-assert 856) + (status-flags uint64 :offset-assert 864) + (start-pos vector :inline :offset-assert 880) + (dest-pos vector :inline :offset-assert 896) + (hop-dir vector :inline :offset-assert 912) + (roam-radius float :offset-assert 928) + ) + :heap-base #x330 + :method-count-assert 187 + :size-assert #x3a4 + :flag-assert #xbb033003a4 + (:methods + (attack () _type_ :state 178) + (spin-attack () _type_ :state 179) + (hop () _type_ :state 180) + (hop-turn () _type_ :state 181) + (cool-down () _type_ :state 182) + (reload () _type_ :state 183) + (rapid-gunner-method-184 (_type_ float) symbol 184) + (rapid-gunner-method-185 (_type_ vector float) none 185) + (rapid-gunner-method-186 (_type_ int float int int) none 186) + ) + ) + + +(defskelgroup skel-rapid-gunner rapid-gunner 0 5 + ((1 (meters 20)) (2 (meters 40)) (3 (meters 999999))) + :bounds (static-spherem 0 1.5 0 7) + :shadow 4 + ) + +(define *rapid-gunner-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 #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010501 #x0 #x0 #x0) + :idle-anim 5 + :notice-anim 6 + :hostile-anim -1 + :hit-anim 20 + :knocked-anim 23 + :knocked-land-anim 30 + :die-anim 28 + :die-falling-anim 29 + :victory-anim -1 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 7 + :look-at-joint 8 + :bullseye-joint 6 + :sound-hit (static-sound-name "rapid-gunne-hit") + :sound-die (static-sound-name "rapid-gunne-die") + :notice-distance (meters 100) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 25) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :friction 0.6 + :attack-shove-back (meters 6) + :attack-shove-up (meters 3) + :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-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 32768.0 + :knocked-soft-vxz-hi 57344.0 + :knocked-soft-vy-lo 32768.0 + :knocked-soft-vy-hi 65536.0 + :knocked-medium-vxz-lo 40960.0 + :knocked-medium-vxz-hi 65536.0 + :knocked-medium-vy-lo 53248.0 + :knocked-medium-vy-hi 86016.0 + :knocked-hard-vxz-lo 57344.0 + :knocked-hard-vxz-hi 81920.0 + :knocked-hard-vy-lo 61440.0 + :knocked-hard-vy-hi 90112.0 + :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 65536.0 + :knocked-red-vy-lo 24576.0 + :knocked-red-vy-hi 57344.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 6 + :gem-seg #x2 + :gem-offset (new 'static 'sphere :y -2252.8 :z -2170.88 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim -1 + :turn-anim 7 + :run-anim -1 + :taunt-anim -1 + :run-travel-speed (meters 4) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 5) + :walk-travel-speed (meters 2) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 60.0) + :notice-nav-radius (meters 100) + :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! (-> *rapid-gunner-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod enemy-method-74 rapid-gunner ((obj rapid-gunner) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('hit '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) + (go (method-of-object obj knocked)) + ) + (('notify) + (if (= (-> arg3 param 0) 'attack) + (sound-play "rgun-shot-hit") + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +;; WARN: Return type mismatch object vs symbol. +;; WARN: Using new Jak 2 rtype-of +;; WARN: Using new Jak 2 rtype-of +(defmethod enemy-method-77 rapid-gunner ((obj rapid-gunner) (arg0 (pointer float))) + (let ((v1-0 (-> obj incoming knocked-type))) + (the-as + symbol + (cond + ((or (= v1-0 (knocked-type knocked-type-4)) (= v1-0 (knocked-type knocked-type-0))) + (cond + ((zero? (-> obj hit-points)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj enemy-info-override knocked-anim))) + ) + (set! (-> a0-3 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj enemy-info-override knocked-anim))) + 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 (-> obj enemy-info-override knocked-anim))) + num-func-seek! + ) + ) + ) + (else + (let* ((a0-4 '((rapid-gunner-hit-ja) (rapid-gunner-hit-left-ja) (rapid-gunner-hit-right-ja))) + (a1-11 ((method-of-type (rtype-of a0-4) length) a0-4)) + (s4-0 (new 'static 'array int64 3 20 21 22)) + (s3-0 (new 'static 'array int32 4 0 0 0 0)) + (a2-1 (ash 1 (-> s3-0 0))) + (v1-27 (enemy-method-120 obj a1-11 a2-1)) + (s4-1 (-> obj draw art-group data (-> (the-as (pointer int32) (+ (* v1-27 8) (the-as int s4-0)))))) + ) + (set! (-> s3-0 0) v1-27) + (let ((v1-30 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-30 (= v1-30 (-> obj draw art-group data 27))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + (let ((a0-19 (-> obj skel root-channel 0))) + (set! (-> a0-19 frame-group) (the-as art-joint-anim s4-1)) + (set! (-> a0-19 param 0) (the float (+ (-> (the-as art-joint-anim s4-1) frames num-frames) -1))) + (set! (-> a0-19 param 1) (-> arg0 0)) + (set! (-> a0-19 frame-num) 0.0) + (joint-control-channel-group! a0-19 (the-as art-joint-anim s4-1) num-func-seek!) + ) + ) + ) + ) + #t + ) + ((= v1-0 (knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.067)) + (let ((a0-22 (-> obj skel root-channel 0))) + (set! (-> a0-22 frame-group) (the-as art-joint-anim (-> obj draw art-group data 20))) + (set! (-> a0-22 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 20)) frames num-frames) -1)) + ) + (set! (-> a0-22 param 1) (-> arg0 0)) + (set! (-> a0-22 frame-num) 0.0) + (joint-control-channel-group! a0-22 (the-as art-joint-anim (-> obj draw art-group data 20)) num-func-seek!) + ) + ) + ((= v1-0 (knocked-type knocked-type-6)) + (let* ((a0-24 '((rapid-gunner-blue-hit0-ja) (rapid-gunner-blue-hit1-ja) (rapid-gunner-blue-hit2-ja))) + (a1-21 ((method-of-type (rtype-of a0-24) length) a0-24)) + (s5-1 (new 'static 'array int64 3 24 25 26)) + (s4-2 (new 'static 'array int32 4 0 0 0 0)) + (a2-4 (ash 1 (-> s4-2 0))) + (v1-59 (enemy-method-120 obj a1-21 a2-4)) + (s5-2 (-> obj draw art-group data (-> (the-as (pointer int32) (+ (* v1-59 8) (the-as int s5-1)))))) + ) + (set! (-> s4-2 0) v1-59) + (let ((v1-62 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-62 (= v1-62 (-> obj draw art-group data 27))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + (let ((a0-39 (-> obj skel root-channel 0))) + (set! (-> a0-39 frame-group) (the-as art-joint-anim s5-2)) + (set! (-> a0-39 param 0) (the float (+ (-> (the-as art-joint-anim s5-2) frames num-frames) -1))) + (set! (-> a0-39 param 1) 1.0) + (set! (-> a0-39 frame-num) 0.0) + (joint-control-channel-group! a0-39 (the-as art-joint-anim s5-2) num-func-seek!) + ) + ) + #t + ) + (else + (ja-channel-push! 1 (seconds 0.067)) + (let ((a1-28 (-> obj draw art-group data (-> obj enemy-info-override knocked-anim))) + (a0-43 (-> obj skel root-channel 0)) + ) + (set! (-> a0-43 frame-group) (the-as art-joint-anim a1-28)) + (set! (-> a0-43 param 0) (the float (+ (-> (the-as art-joint-anim a1-28) frames num-frames) -1))) + (set! (-> a0-43 param 1) (-> arg0 0)) + (set! (-> a0-43 frame-num) 0.0) + (joint-control-channel-group! a0-43 (the-as art-joint-anim a1-28) num-func-seek!) + ) + #t + ) + ) + ) + ) + ) + +(defmethod enemy-method-52 rapid-gunner ((obj rapid-gunner) (arg0 vector)) + (cond + ((> (-> obj hit-points) 0) + (-> obj enemy-info-override) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (vector-reset! arg0) + ) + (else + ((method-of-type nav-enemy enemy-method-52) obj arg0) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-52) obj arg0) + ) + ) + (none) + ) + +(defmethod enemy-method-78 rapid-gunner ((obj rapid-gunner) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 27))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 27)) 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 27)) num-func-seek!) + ) + #t + ) + ) + (((knocked-type knocked-type-4) (knocked-type knocked-type-0)) + #t + ) + (((knocked-type knocked-type-5)) + (when (zero? (-> obj hit-points)) + (ja-channel-push! 1 (seconds 0.067)) + (let ((a1-5 (-> obj draw art-group data (-> obj enemy-info-override die-anim))) + (a0-10 (-> obj skel root-channel 0)) + ) + (set! (-> a0-10 frame-group) (the-as art-joint-anim a1-5)) + (set! (-> a0-10 param 0) (the float (+ (-> (the-as art-joint-anim a1-5) frames num-frames) -1))) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim a1-5) num-func-seek!) + ) + #t + ) + ) + (else + (let ((a1-6 (-> obj draw art-group data (-> obj enemy-info-override knocked-land-anim))) + (a0-13 (-> obj skel root-channel 0)) + ) + (set! (-> a0-13 frame-group) (the-as art-joint-anim a1-6)) + (set! (-> a0-13 param 0) (the float (+ (-> (the-as art-joint-anim a1-6) frames num-frames) -1))) + (set! (-> a0-13 param 1) (-> arg0 0)) + (set! (-> a0-13 frame-num) 0.0) + (joint-control-channel-group! a0-13 (the-as art-joint-anim a1-6) num-func-seek!) + ) + #t + ) + ) + ) + +(defmethod enemy-method-98 rapid-gunner ((obj rapid-gunner) (arg0 process-focusable) (arg1 vector)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-98))) + (and (t9-0 obj arg0 arg1) + (or (not (logtest? (-> obj fact-info-override enemy-options) (enemy-option user8))) + (and (not (logtest? (-> arg0 focus-status) (focus-status in-air))) + (>= 4096.0 (fabs (- (-> (get-trans arg0 0) y) (-> obj root-override2 trans y)))) + ) + ) + ) + ) + ) + +;; WARN: Function (method 185 rapid-gunner) has a return type of none, but the expression builder found a return statement. +(defmethod rapid-gunner-method-185 rapid-gunner ((obj rapid-gunner) (arg0 vector) (arg1 float)) + (if (not (-> obj joint-enable)) + (return #f) + ) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> arg0 quad)) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (set! (-> s4-0 quad) (-> obj root-override2 root-prim prim-core world-sphere quad)) + (let ((s3-1 (vector-! (new 'stack-no-clear 'vector) s5-0 s4-0))) + (set! (-> s4-0 w) 1.0) + (when (< (vector-vector-distance s5-0 s4-0) 29491.2) + (vector-normalize! s3-1 29491.2) + (vector+! s5-0 s4-0 s3-1) + ) + ) + ) + (let* ((v1-16 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 18))) + (s4-1 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s5-0 v1-16) 1.0)) + (s3-2 + (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> obj node-list data 4 bone transform vector 2) 1.0) + ) + (s5-1 (new 'stack-no-clear 'quaternion)) + ) + (let* ((s1-0 (forward-up-nopitch->quaternion (new 'stack-no-clear 'quaternion) s4-1 *up-vector*)) + (s2-0 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) s4-1 s1-0)) + (f0-2 (vector-x-angle s2-0)) + ) + (when (< 2730.6667 (fabs f0-2)) + (let ((f30-0 (fmax -2730.6667 (fmin 2730.6667 f0-2)))) + (set! (-> s2-0 y) 0.0) + (vector-normalize! s2-0 1.0) + (vector-rotate-x! s2-0 s2-0 (- f30-0)) + ) + (vector-orient-by-quat! s4-1 s2-0 s1-0) + ) + ) + (quaternion-from-two-vectors-max-angle-partial! s5-1 s3-2 s4-1 16384.0 (-> obj joint-blend)) + (quaternion-slerp! (-> obj joint quat) (-> obj joint quat) s5-1 0.1) + ) + ) + 0 + (none) + ) + +(defun vector-average-copy! ((arg0 vector) (arg1 vector) (arg2 float)) + (let ((f0-1 (- 1.0 arg2))) + (set! (-> arg0 x) (+ (* f0-1 (-> arg0 x)) (* arg2 (-> arg1 x)))) + (set! (-> arg0 y) (+ (* f0-1 (-> arg0 y)) (* arg2 (-> arg1 y)))) + (set! (-> arg0 z) (+ (* f0-1 (-> arg0 z)) (* arg2 (-> arg1 z)))) + ) + (set! (-> arg0 w) 1.0) + arg0 + ) + +(define *aim-pos* (new 'static 'vector)) + +(defbehavior rapid-gunner-common-post rapid-gunner () + (let ((a0-1 (handle->process (-> self focus handle)))) + (cond + (a0-1 + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-1) 0) quad)) + (let ((s5-1 (vector-! (new 'stack-no-clear 'vector) gp-0 (-> self target-prev-pos)))) + (let* ((a1-3 (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data 18))) + (f0-0 (vector-vector-distance gp-0 a1-3)) + ) + (vector-normalize! s5-1 (* 0.00028170072 f0-0 (vector-length s5-1))) + ) + (set! (-> s5-1 y) 0.0) + (vector-average-copy! (-> self focus-dir) s5-1 0.08) + ) + (vector+! (-> self target-next-pos) (-> self focus-dir) gp-0) + (set! (-> self target-prev-pos quad) (-> gp-0 quad)) + ) + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + ) + (else + (set! (-> self target-next-pos quad) (-> self target-prev-pos quad)) + (vector-reset! (-> self focus-dir)) + ) + ) + ) + 0 + (none) + ) + +(defmethod enemy-method-55 rapid-gunner ((obj rapid-gunner)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-55))) + (t9-0 obj) + ) + (los-control-method-9 (-> obj los) (the-as process-focusable #f) (the-as vector #f) 2048.0) + 0 + (none) + ) + +(defmethod enemy-method-96 rapid-gunner ((obj rapid-gunner) (arg0 float) (arg1 symbol)) + (enemy-method-95 obj (-> obj target-next-pos) arg0) + ) + +(defmethod rapid-gunner-method-184 rapid-gunner ((obj rapid-gunner) (arg0 float)) + (let* ((s4-0 (-> obj node-list data 18)) + (v1-1 (vector<-cspace! (new 'stack-no-clear 'vector) s4-0)) + (s5-1 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) (-> obj target-next-pos) v1-1) 1.0)) + (s4-1 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s4-0 bone transform vector 2) 1.0)) + ) + (set! (-> s4-1 y) 0.0) + (vector-xz-normalize! s4-1 1.0) + (set! (-> s5-1 y) 0.0) + (vector-xz-normalize! s5-1 1.0) + (>= (vector-dot s4-1 s5-1) (cos arg0)) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-stare rapid-gunner ((obj rapid-gunner)) + (go (method-of-object obj hostile)) + (none) + ) + +(defstate notice (rapid-gunner) + :virtual #t + :enter (behavior () + (logior! (-> self enemy-flags) (enemy-flag use-notice-distance)) + (enemy-method-109 self 1) + (when (logtest? (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (logclear! (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (let ((gp-0 (-> self on-notice))) + (if gp-0 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (-> self root-override2 trans)) + (the-as pair gp-0) + ) + ) + ) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag chase-startup)) + (go-virtual hostile) + ) + (logior! (-> self enemy-flags) (enemy-flag chase-startup)) + (let ((v1-23 self)) + (set! (-> v1-23 enemy-flags) (the-as enemy-flag (logclear (-> v1-23 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-23 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-26 self)) + (set! (-> v1-26 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-26 enemy-flags)))) + ) + 0 + (let ((v1-28 (-> self nav))) + (set! (-> v1-28 target-speed) 0.0) + ) + 0 + (let* ((gp-1 (handle->process (-> self focus handle))) + (a0-14 (if (type? gp-1 process-focusable) + gp-1 + ) + ) + ) + (when a0-14 + (let ((v1-34 (get-trans (the-as process-focusable a0-14) 3))) + (set! (-> self target-next-pos quad) (-> v1-34 quad)) + (set! (-> self target-prev-pos quad) (-> v1-34 quad)) + ) + (vector-reset! (-> self focus-dir)) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override notice-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override notice-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + (* 196608.0 (-> self clock frames-per-second)) + (seconds 0.2) + ) + ) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate attack (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self predict-timer) (the-as uint (+ (-> self clock frame-counter) 1))) + (set! (-> self shot-timer) (the-as uint (-> self clock frame-counter))) + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-7 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-10 self)) + (set! (-> v1-10 enemy-flags) (the-as enemy-flag (logclear (-> v1-10 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self joint-enable) #t) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-15 *game-info*) + (a0-6 (+ (-> v1-15 attack-id) 1)) + ) + (set! (-> v1-15 attack-id) a0-6) + (set! (-> self attack-id) a0-6) + ) + (when (logtest? (-> self status-flags) 2) + (set! (-> self spin-up-timer) (+ (-> self clock frame-counter) (seconds 2))) + (set! (-> self status-flags) (logand -3 (-> self status-flags))) + ) + (if (zero? (rand-vu-int-range 0 3)) + (set! (-> self shoot-anim-index) 15) + (set! (-> self shoot-anim-index) 14) + ) + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (seek! (-> self joint-blend) 0.95 (-> self clock seconds-per-frame)) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-virtual hostile) + ) + (let ((s5-0 (get-trans (the-as process-focusable gp-0) 0)) + (f0-3 (vector-vector-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans))) + ) + (cond + ((and (< f0-3 20480.0) + (and (< (fabs (- (-> s5-0 y) (-> self root-override2 trans y))) 6144.0) + gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (go-virtual spin-attack) + ) + ((< 430080.0 f0-3) + (go-hostile self) + ) + ((skip-check-los? (-> self los) 90) + (vector-normalize-copy! (-> self hop-dir) (-> self focus-dir) -1.0) + (go-virtual hop) + ) + ((not (enemy-method-96 self 16384.0 #t)) + (go-virtual hop-turn) + ) + ((>= (-> self shots-fired) (the-as uint 12)) + (when (skip-check-los? (-> self los) 0) + (vector-normalize-copy! (-> self hop-dir) (-> self focus-dir) -1.0) + (go-virtual hop) + ) + (go-virtual reload) + ) + ((>= (- (-> self clock frame-counter) (the-as int (-> self shot-timer))) (seconds 0.25)) + (when (rapid-gunner-method-184 self 2184.5334) + (let* ((a1-11 (-> self node-list data 18)) + (f30-0 (fmax 0.0 (the float (- (-> self spin-up-timer) (-> self clock frame-counter))))) + (s5-1 (vector<-cspace! (new 'stack-no-clear 'vector) a1-11)) + (s4-2 + (vector+! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable gp-0) 0) (-> self focus-dir)) + ) + ) + (+! (-> s4-2 y) (lerp 2457.6 819.2 (* 0.000048828126 (vector-length (-> self focus-dir))))) + (let* ((gp-2 (vector-! (new 'stack-no-clear 'vector) s4-2 s5-1)) + (f28-1 (vector-length gp-2)) + ) + (vector-normalize! gp-2 1.0) + (vector-rotate-x! gp-2 gp-2 (* 0.9102223 f30-0)) + (vector+float*! s4-2 s5-1 gp-2 f28-1) + ) + (sound-play "rgun-shot-fire" :position s5-1) + (spawn-metalhead-projectile (the-as metalhead-shot self) s5-1 s4-2 532480.0) + ) + (+! (-> self shots-fired) 1) + ) + (set! (-> self shot-timer) (the-as uint (-> self clock frame-counter))) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (until #f + (when (not (enemy-method-96 self 2730.6667 #t)) + (let ((v1-3 self)) + (set! (-> v1-3 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-3 enemy-flags)))) + ) + 0 + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! (-> self draw art-group data 17)) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 910.2222 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-19 self)) + (set! (-> v1-19 enemy-flags) (the-as enemy-flag (logclear (-> v1-19 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (let ((v1-23 (ja-group))) + (if (not (and v1-23 (or (= v1-23 (-> self draw art-group data 14)) (= v1-23 (-> self draw art-group data 15))))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (ja-no-eval :group! (-> self draw art-group data (-> self shoot-anim-index)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self shoot-anim-index))) frames num-frames) -1) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (rapid-gunner-method-185 self (-> self target-next-pos) 4.0) + (let ((a0-2 (handle->process (-> self focus handle)))) + (if (and a0-2 (let ((a1-2 self)) + (logtest? (enemy-flag enemy-flag37) (-> a1-2 enemy-flags)) + ) + ) + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-2) 3) + (* 0.5 (-> self nav max-rotation-rate)) + (seconds 0.5) + ) + ) + ) + (rapid-gunner-common-post) + (nav-enemy-simple-post) + (none) + ) + ) + +;; WARN: Return type mismatch art-element vs none. +(defmethod rapid-gunner-method-186 rapid-gunner ((obj rapid-gunner) (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 ((a1-2 (-> obj skel root-channel arg0))) + (let ((f0-2 (fabs arg1))) + (set! (-> a1-2 frame-interp 1) f0-2) + (set! (-> a1-2 frame-interp 0) f0-2) + ) + (set! (-> a1-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data v1-1))) + ) + (none) + ) + +(defstate hop (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + (let ((v1-2 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-2 enemy-flags))) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-2 enemy-flags)))) + ) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-2 enemy-flags)))) + (set! (-> v1-2 nav callback-info) (-> v1-2 enemy-info-override callback-info)) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (v0-0 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) v0-0) + (set! (-> self attack-id) v0-0) + ) + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (set! (-> self shots-fired) (the-as uint (min 12 (the-as int (+ (-> self shots-fired) 2))))) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (let ((s5-0 (-> self root-override2 trans))) + (let ((a2-0 (new 'stack-no-clear 'vector))) + (let ((v1-3 s5-0)) + (let ((a0-2 (-> self hop-dir))) + (let ((a1-1 8192.0)) + (.mov vf7 a1-1) + ) + (.lvf vf5 (&-> a0-2 quad)) + ) + (.lvf vf4 (&-> v1-3 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a2-0 quad) vf6) + (set! (-> self dest-pos quad) (-> s5-0 quad)) + (cloest-point-on-mesh (-> self nav) (-> self dest-pos) a2-0 (the-as nav-poly #f)) + ) + (if (< (vector-vector-distance s5-0 (-> self dest-pos)) 6144.0) + (go-hostile self) + ) + (let ((a0-8 (-> self nav state)) + (v1-12 (-> 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-12 quad)) + ) + 0 + (vector-! gp-0 (-> self dest-pos) s5-0) + ) + (set! (-> gp-0 y) 0.0) + (vector-normalize! gp-0 1.0) + (let ((a0-13 (-> self nav state)) + (v1-17 gp-0) + ) + (set! (-> a0-13 heading quad) (-> v1-17 quad)) + ) + 0 + (ja-channel-push! 2 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 5) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 5)) frames num-frames) -1))) + :frame-num 0.0 + ) + (let ((a0-17 (-> self skel root-channel 1))) + (let ((f0-7 0.0)) + (set! (-> a0-17 frame-interp 1) f0-7) + (set! (-> a0-17 frame-interp 0) f0-7) + ) + (set! (-> a0-17 frame-group) (the-as art-joint-anim (-> self draw art-group data 5))) + (set! (-> a0-17 param 0) + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 5)) frames num-frames) -1)) + ) + (set! (-> a0-17 param 1) 1.0) + (set! (-> a0-17 frame-num) 0.0) + (joint-control-channel-group! a0-17 (the-as art-joint-anim (-> self draw art-group data 5)) num-func-seek!) + ) + (until (ja-done? 0) + (let ((s5-1 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) gp-0 (-> self root-override2 quat)))) + (rapid-gunner-method-186 self 0 (-> s5-1 x) 10 11) + (rapid-gunner-method-186 self 1 (-> s5-1 z) 8 9) + ) + (suspend) + (ja :num! (seek!)) + (ja :chan 1 :num! (chan 0)) + ) + ) + (let ((v1-67 self)) + (set! (-> v1-67 enemy-flags) (the-as enemy-flag (logclear (-> v1-67 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-67 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (go-hostile self) + (none) + ) + ) + :post (behavior () + (rapid-gunner-common-post) + (nav-enemy-travel-post) + (none) + ) + ) + +(defstate hop-turn (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (v0-0 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) v0-0) + (set! (-> self attack-id) v0-0) + ) + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (seek! (-> self joint-blend) 0.0 (-> self clock seconds-per-frame)) + (when (enemy-method-96 self 6371.5557 #t) + (rapid-gunner-method-185 self (-> self target-next-pos) 24.0) + (when (skip-check-los? (-> self los) 30) + (vector-normalize-copy! (-> self hop-dir) (-> self focus-dir) -1.0) + (go-virtual hop) + ) + (go-hostile self) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! (-> self draw art-group data 7) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 7)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (rapid-gunner-method-185 self (-> self target-next-pos) 4.0) + (let ((a0-2 (handle->process (-> self focus handle)))) + (if (and a0-2 (let ((a1-2 self)) + (logtest? (enemy-flag enemy-flag37) (-> a1-2 enemy-flags)) + ) + ) + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-2) 3) + (* 4.0 (-> self nav max-rotation-rate)) + (seconds 0.5) + ) + ) + ) + (rapid-gunner-common-post) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate cool-down (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self shots-fired) (the-as uint 0)) + 0 + (none) + ) + :trans (behavior () + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (go-hostile self) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! (-> self draw art-group data 12) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 12)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (rapid-gunner-common-post) + (nav-enemy-face-focus-post) + (none) + ) + ) + +(defstate reload (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + (set! (-> self shots-fired) (the-as uint 0)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data 19) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 19)) frames num-frames) -1)) 0.5) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.5)) + ) + (when (skip-check-los? (-> self los) 30) + (vector-normalize-copy! (-> self hop-dir) (-> self focus-dir) -1.0) + (go-virtual hop) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (rapid-gunner-common-post) + (nav-enemy-face-focus-post) + (none) + ) + ) + +(defstate hostile (rapid-gunner) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + (cond + ((handle->process (-> self focus handle)) + (if (check-los? (-> self los) 0) + (set! (-> self status-flags) (logand -3 (-> self status-flags))) + (logior! (-> self status-flags) 2) + ) + ) + (else + (logior! (-> self status-flags) 2) + ) + ) + (let ((v1-18 self)) + (set! (-> v1-18 enemy-flags) (the-as enemy-flag (logclear (-> v1-18 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-18 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (none) + ) + :trans (behavior () + (if (and (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) (-> self enemy-info-override use-victory)) + (go-virtual victory) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (when gp-0 + (let* ((s5-0 (get-trans (the-as process-focusable gp-0) 0)) + (f30-0 (vector-vector-distance s5-0 (-> self root-override2 trans))) + ) + (if (and (< f30-0 20480.0) + (and (< (fabs (- (-> s5-0 y) (-> self root-override2 trans y))) 6144.0) + gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (go-virtual spin-attack) + ) + (when (and (< f30-0 409600.0) (check-los? (-> self los) 0)) + (if (>= (-> self shots-fired) (the-as uint 12)) + (go-virtual reload) + ) + (go-virtual attack) + ) + ) + ) + ) + (when (skip-check-los? (-> self los) 1500) + (let ((a1-6 (vector-! (new 'stack-no-clear 'vector) (-> self start-pos) (-> self root-override2 trans)))) + (when (< 4096.0 (vector-length a1-6)) + (vector-normalize-copy! (-> self hop-dir) a1-6 1.0) + (go-virtual hop) + ) + ) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.1)) + (if (>= 1 (the-as int (-> self focus aware))) + (go-virtual active) + ) + ) + (none) + ) + :code (behavior () + (when (not (enemy-method-96 self 2730.6667 #t)) + (let ((v1-3 self)) + (set! (-> v1-3 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-3 enemy-flags)))) + ) + 0 + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! (-> self draw art-group data 17)) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 910.2222 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-19 self)) + (set! (-> v1-19 enemy-flags) (the-as enemy-flag (logclear (-> v1-19 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (let ((v1-23 (ja-group))) + (when (not (and v1-23 (= v1-23 (-> self draw art-group data 12)))) + (let ((v1-29 (ja-group))) + (if (and v1-29 (= v1-29 (-> self draw art-group data 17))) + (ja-channel-push! 1 (seconds 0.067)) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + ) + ) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! (-> self draw art-group data 12) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 12)) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (rapid-gunner-method-185 self (-> self target-next-pos) 3.6) + (rapid-gunner-common-post) + (nav-enemy-face-focus-post) + (none) + ) + ) + +(defstate spin-attack (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (a0-7 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-7) + (set! (-> self attack-id) a0-7) + ) + (let ((v1-13 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-13 prim-core action) (collide-action deadly)) + (set! (-> v1-13 local-sphere w) 7372.8) + ) + (none) + ) + :exit (behavior () + (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-9 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-9 prim-core action) (collide-action)) + (set! (-> v1-9 local-sphere w) 4096.0) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.135)) + (ja-no-eval :group! (-> self draw art-group data 18) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 18)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + (-> self nav max-rotation-rate) + (seconds 0.02) + ) + ) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate active (rapid-gunner) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-4 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (none) + ) + :code (behavior () + (let ((v1-2 (ja-group))) + (when (not (and v1-2 (= v1-2 (-> self draw art-group data (-> self enemy-info-override idle-anim))))) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (loop!) + :frame-num 0.0 + ) + ) + ) + (until #f + (suspend) + (ja :num! (loop!)) + ) + #f + (none) + ) + :post (the-as (function none :behavior rapid-gunner) nav-enemy-simple-post) + ) + +(defmethod nav-enemy-method-142 rapid-gunner ((obj rapid-gunner) (arg0 nav-control)) + 0 + (none) + ) + +;; WARN: Return type mismatch none vs symbol. +(defmethod enemy-method-63 rapid-gunner ((obj rapid-gunner) (arg0 process-focusable) (arg1 symbol)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-63))) + (the-as symbol (if (t9-0 obj arg0 arg1) + (set-dst-proc! (-> obj los) (-> obj focus handle)) + ) + ) + ) + ) + +(defmethod enemy-method-114 rapid-gunner ((obj rapid-gunner)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 5) 0))) + (set! (-> s5-0 total-prims) (the-as uint 6)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 11264.0 0.0 17203.2) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 5120.0 0.0 5120.0) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action deadly)) + (set! (-> v1-15 transform-index) 18) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 -2048.0 3072.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-17 local-sphere) 0.0 9216.0 0.0 5120.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 prim-core action) (collide-action no-standon)) + (set! (-> v1-19 transform-index) 7) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-with) (collide-spec backgnd obstacle hit-by-others-list)) + (set! (-> v1-21 prim-core action) (collide-action solid)) + (set-vector! (-> v1-21 local-sphere) 0.0 12288.0 0.0 12288.0) + ) + (set! (-> s5-0 nav-radius) 8192.0) + (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 process-focusable vs rapid-gunner. +(defmethod relocate rapid-gunner ((obj rapid-gunner) (arg0 int)) + (if (nonzero? (-> obj joint)) + (&+! (-> obj joint) arg0) + ) + (the-as + rapid-gunner + ((the-as (function process-focusable int process-focusable) (find-parent-method rapid-gunner 7)) obj arg0) + ) + ) + +(defmethod enemy-method-115 rapid-gunner ((obj rapid-gunner)) + "@abstract" + (local-vars (sv-48 int)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-rapid-gunner" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *rapid-gunner-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)) + (new-source! (-> obj los) obj (seconds 0.2) (collide-spec backgnd obstacle)) + (set! (-> obj joint) (new 'process 'joint-mod (joint-mod-mode joint-set*-world) obj 5)) + (set-vector! (-> obj root-override2 scale) 1.2 1.2 1.2 1.0) + (let ((a0-13 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (v1-14 (new 'stack-no-clear 'vector)) + ) + (let ((a1-7 (-> obj root-override2 trans))) + (let ((a2-5 409600.0)) + (.mov vf7 a2-5) + ) + (.lvf vf5 (&-> a0-13 quad)) + (.lvf vf4 (&-> a1-7 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> v1-14 quad) vf6) + (set! (-> obj target-next-pos quad) (-> v1-14 quad)) + (set! (-> obj target-prev-pos quad) (-> v1-14 quad)) + ) + (set! (-> obj shots-fired) (the-as uint 0)) + (set! (-> obj spin-up-timer) 0) + (set! (-> obj status-flags) (logand -2 (-> obj status-flags))) + (logior! (-> obj status-flags) 2) + (let ((f30-0 3640.889)) + (set! sv-48 0) + (let ((v1-22 (res-lump-data (-> obj entity) 'spinup-angle pointer :tag-ptr (the-as (pointer res-tag) (& sv-48))))) + (if v1-22 + (set! f30-0 (-> (the-as (pointer float) v1-22))) + ) + ) + (set! (-> obj spin-up-angle) f30-0) + ) + (vector-reset! (-> obj focus-dir)) + (set! (-> obj shoot-anim-index) -1) + (let ((v1-26 (-> obj nav))) + (set! (-> v1-26 speed-scale) 1.0) + ) + 0 + (logclear! (-> obj nav flags) (nav-control-flag update-heading-from-facing)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag43)))) + (set! (-> obj start-pos quad) (-> obj root-override2 trans quad)) + (set! (-> obj roam-radius) 16384.0) + (add-connection *part-engine* obj 8 obj 1310 (new 'static 'vector :x 1146.88 :y 450.56 :z 901.12 :w 163840.0)) + (add-connection + *part-engine* + obj + 8 + obj + 1311 + (new 'static 'vector :x -1146.88 :y 450.56 :z 901.12 :w 163840.0) + ) + (add-connection *part-engine* obj 18 obj 1312 (new 'static 'vector :w 163840.0)) + 0 + (none) + ) + ) + +(deftype shield-gunner (rapid-gunner) + () + :heap-base #x330 + :method-count-assert 187 + :size-assert #x3a4 + :flag-assert #xbb033003a4 + ) diff --git a/goal_src/jak2/levels/temple/rhino-wall.gc b/goal_src/jak2/levels/temple/rhino-wall.gc index 5313e5e7c7..3b4f948137 100644 --- a/goal_src/jak2/levels/temple/rhino-wall.gc +++ b/goal_src/jak2/levels/temple/rhino-wall.gc @@ -7,3 +7,301 @@ ;; DECOMP BEGINS +(deftype rhino-wall (process-focusable) + ((anim spool-anim :offset-assert 204) + (art-name string :offset-assert 208) + (id int8 :offset-assert 212) + ) + :heap-base #x60 + :method-count-assert 31 + :size-assert #xd5 + :flag-assert #x1f006000d5 + (:methods + (unbroken () _type_ :state 27) + (hit () _type_ :state 28) + (broken () _type_ :state 29) + (rhino-wall-method-30 (_type_) none 30) + ) + ) + + +(defskelgroup skel-rhino-wall-1 rhino-wall rhino-wall-1-lod0-jg rhino-wall-1-idle-ja + ((rhino-wall-1-lod0-mg (meters 999999))) + :bounds (static-spherem 0.3 9 -3 11) + ) + +(defskelgroup skel-rhino-wall-2 rhino-wall rhino-wall-2-lod0-jg rhino-wall-2-idle-ja + ((rhino-wall-2-lod0-mg (meters 999999))) + :bounds (static-spherem 0.3 13.5 0 14.5) + ) + +;; WARN: Return type mismatch vector vs none. +(defmethod rhino-wall-method-30 rhino-wall ((obj rhino-wall)) + (let ((v1-1 (-> obj root-override root-prim))) + (countdown (a1-0 (-> v1-1 specific 0)) + (let ((a2-1 (-> (the-as collide-shape-prim-group v1-1) child a1-0))) + (cond + ((zero? a1-0) + (set! (-> a2-1 prim-core collide-as) (collide-spec)) + 0 + ) + (else + (set! (-> a2-1 prim-core collide-as) (collide-spec obstacle)) + ) + ) + ) + ) + (case (-> obj id) + ((1) + (set! (-> obj draw origin-joint-index) (the-as uint 2)) + (set-vector! (-> obj draw bounds) 0.0 0.0 81920.0 131072.0) + (set! (-> v1-1 transform-index) 2) + (set-vector! (-> v1-1 local-sphere) 0.0 0.0 81920.0 122880.0) + ) + ((2) + (set! (-> obj draw origin-joint-index) (the-as uint 2)) + (set-vector! (-> obj draw bounds) 0.0 0.0 81920.0 131072.0) + (set! (-> v1-1 transform-index) 2) + (set-vector! (-> v1-1 local-sphere) 0.0 0.0 81920.0 122880.0) + ) + ) + ) + (none) + ) + +(defstate unbroken (rhino-wall) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('trigger) + (go-virtual hit) + ) + ) + ) + :code (behavior () + (add-process *gui-control* self (gui-channel art-load) (gui-action queue) (-> self anim name) -99.0 0) + (transform-post) + (suspend) + (transform-post) + (sleep-code) + (none) + ) + ) + +(defstate hit (rhino-wall) + :virtual #t + :code (behavior () + (process-entity-status! self (entity-perm-status subtask-complete) #t) + (rhino-wall-method-30 self) + (set! (-> self draw bounds w) 573440.0) + (let* ((gp-0 (-> self draw art-group)) + (s5-0 (method-of-object gp-0 get-art-by-name-method)) + ) + (format (clear *temp-string*) "~S-end" (-> self art-name)) + (let ((a2-3 (s5-0 gp-0 *temp-string* art-joint-anim))) + ;; added cast + (ja-play-spooled-anim (-> self anim) (ja-group) (the-as art-joint-anim a2-3) (the-as (function process-drawable symbol) false-func)) + ) + ) + (go-virtual broken) + (none) + ) + :post (the-as (function none :behavior rhino-wall) transform-post) + ) + +(defstate broken (rhino-wall) + :virtual #t + :code (behavior () + (rhino-wall-method-30 self) + (let* ((gp-0 (-> self draw art-group)) + (s5-0 (method-of-object gp-0 get-art-by-name-method)) + ) + (format (clear *temp-string*) "~S-end" (-> self art-name)) + (let ((gp-1 (s5-0 gp-0 *temp-string* art-joint-anim))) + (ja-channel-set! 1) + ;; added cast + (set! (-> self skel root-channel 0 frame-group) (the-as art-joint-anim gp-1)) + ) + ) + (logior! (-> self skel status) (joint-control-status sync-math)) + (transform-post) + (logclear! (-> self skel status) (joint-control-status sync-math)) + (suspend) + (transform-post) + (sleep-code) + (none) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod init-from-entity! rhino-wall ((obj rhino-wall) (arg0 entity-actor)) + (stack-size-set! (-> obj main-thread) 512) + (set! (-> obj mask) (logior (process-mask collectable) (-> obj mask))) + (let ((s3-0 (res-lump-struct (-> obj entity) 'art-name structure)) + (s4-0 (art-group-get-by-name *level* "skel-rhino-wall-1" (the-as (pointer uint32) #f))) + ) + (set! (-> obj art-name) (the-as string s3-0)) + (cond + ((string= (the-as string s3-0) "rhino-wall-1") + (set! (-> obj id) 1) + (let ((s4-1 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s4-1 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-1 reaction) cshape-reaction-default) + (set! (-> s4-1 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s4-1 penetrated-by) (penetrate)) + (let ((s3-1 (new 'process 'collide-shape-prim-group s4-1 (the-as uint 9) 0))) + (set! (-> s4-1 total-prims) (the-as uint 10)) + (set! (-> s3-1 prim-core collide-as) (collide-spec obstacle)) + (set! (-> s3-1 prim-core action) (collide-action solid)) + (set! (-> s3-1 transform-index) 3) + (set-vector! (-> s3-1 local-sphere) 14336.0 -8192.0 0.0 40960.0) + (set! (-> s4-1 root-prim) s3-1) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 1) (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec obstacle)) + (set! (-> v1-19 prim-core action) (collide-action solid)) + (set! (-> v1-19 transform-index) 3) + (set-vector! (-> v1-19 local-sphere) 14336.0 -8192.0 0.0 40960.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 8) (the-as uint 0)))) + (set! (-> v1-21 prim-core action) (collide-action solid)) + (set! (-> v1-21 transform-index) 43) + (set-vector! (-> v1-21 local-sphere) 0.0 0.0 0.0 32768.0) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 2) (the-as uint 0)))) + (set! (-> v1-23 prim-core action) (collide-action solid)) + (set! (-> v1-23 transform-index) 7) + (set-vector! (-> v1-23 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-25 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 5) (the-as uint 0)))) + (set! (-> v1-25 prim-core action) (collide-action solid)) + (set! (-> v1-25 transform-index) 12) + (set-vector! (-> v1-25 local-sphere) 8192.0 0.0 0.0 12288.0) + ) + (let ((v1-27 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 6) (the-as uint 0)))) + (set! (-> v1-27 prim-core action) (collide-action solid)) + (set! (-> v1-27 transform-index) 16) + (set-vector! (-> v1-27 local-sphere) 0.0 0.0 0.0 10240.0) + ) + (let ((v1-29 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 0) (the-as uint 0)))) + (set! (-> v1-29 prim-core action) (collide-action solid)) + (set! (-> v1-29 transform-index) 3) + (set-vector! (-> v1-29 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-31 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 4) (the-as uint 0)))) + (set! (-> v1-31 prim-core action) (collide-action solid)) + (set! (-> v1-31 transform-index) 9) + (set-vector! (-> v1-31 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-33 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 7) (the-as uint 0)))) + (set! (-> v1-33 prim-core action) (collide-action solid)) + (set! (-> v1-33 transform-index) 28) + (set-vector! (-> v1-33 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-35 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 3) (the-as uint 0)))) + (set! (-> v1-35 prim-core action) (collide-action solid)) + (set! (-> v1-35 transform-index) 8) + (set-vector! (-> v1-35 local-sphere) 0.0 0.0 0.0 16384.0) + ) + (set! (-> s4-1 nav-radius) (* 0.75 (-> s4-1 root-prim local-sphere w))) + (let ((v1-38 (-> s4-1 root-prim))) + (set! (-> s4-1 backup-collide-as) (-> v1-38 prim-core collide-as)) + (set! (-> s4-1 backup-collide-with) (-> v1-38 prim-core collide-with)) + ) + (set! (-> obj root-override) s4-1) + ) + (set! s4-0 (art-group-get-by-name *level* "skel-rhino-wall-1" (the-as (pointer uint32) #f))) + (set! (-> obj anim) + (new 'static 'spool-anim :name "rhino-wall-1" :anim-name "1-break" :parts 2 :command-list '()) + ) + ) + ((string= (the-as string s3-0) "rhino-wall-2") + (set! (-> obj id) 2) + (let ((s4-2 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s4-2 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-2 reaction) cshape-reaction-default) + (set! (-> s4-2 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s4-2 penetrated-by) (penetrate)) + (let ((s3-2 (new 'process 'collide-shape-prim-group s4-2 (the-as uint 9) 0))) + (set! (-> s4-2 total-prims) (the-as uint 10)) + (set! (-> s3-2 prim-core collide-as) (collide-spec obstacle)) + (set! (-> s3-2 prim-core action) (collide-action solid)) + (set! (-> s3-2 transform-index) 3) + (set-vector! (-> s3-2 local-sphere) -8192.0 -4096.0 0.0 40960.0) + (set! (-> s4-2 root-prim) s3-2) + ) + (let ((v1-55 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 0) (the-as uint 0)))) + (set! (-> v1-55 prim-core collide-as) (collide-spec obstacle)) + (set! (-> v1-55 prim-core action) (collide-action solid)) + (set! (-> v1-55 transform-index) 3) + (set-vector! (-> v1-55 local-sphere) -8192.0 -4096.0 0.0 40960.0) + ) + (let ((v1-57 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 1) (the-as uint 0)))) + (set! (-> v1-57 prim-core action) (collide-action solid)) + (set! (-> v1-57 transform-index) 4) + (set-vector! (-> v1-57 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-59 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 2) (the-as uint 0)))) + (set! (-> v1-59 prim-core action) (collide-action solid)) + (set! (-> v1-59 transform-index) 7) + (set-vector! (-> v1-59 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-61 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 3) (the-as uint 0)))) + (set! (-> v1-61 prim-core action) (collide-action solid)) + (set! (-> v1-61 transform-index) 15) + (set-vector! (-> v1-61 local-sphere) 0.0 0.0 0.0 12288.0) + ) + (let ((v1-63 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 4) (the-as uint 0)))) + (set! (-> v1-63 prim-core action) (collide-action solid)) + (set! (-> v1-63 transform-index) 16) + (set-vector! (-> v1-63 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-65 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 5) (the-as uint 0)))) + (set! (-> v1-65 prim-core action) (collide-action solid)) + (set! (-> v1-65 transform-index) 26) + (set-vector! (-> v1-65 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-67 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 6) (the-as uint 0)))) + (set! (-> v1-67 prim-core action) (collide-action solid)) + (set! (-> v1-67 transform-index) 27) + (set-vector! (-> v1-67 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-69 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 7) (the-as uint 0)))) + (set! (-> v1-69 prim-core action) (collide-action solid)) + (set! (-> v1-69 transform-index) 28) + (set-vector! (-> v1-69 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-71 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 9) (the-as uint 0)))) + (set! (-> v1-71 prim-core action) (collide-action solid)) + (set! (-> v1-71 transform-index) 58) + (set-vector! (-> v1-71 local-sphere) 0.0 12288.0 0.0 32768.0) + ) + (set! (-> s4-2 nav-radius) (* 0.75 (-> s4-2 root-prim local-sphere w))) + (let ((v1-74 (-> s4-2 root-prim))) + (set! (-> s4-2 backup-collide-as) (-> v1-74 prim-core collide-as)) + (set! (-> s4-2 backup-collide-with) (-> v1-74 prim-core collide-with)) + ) + (set! (-> obj root-override) s4-2) + ) + (set! s4-0 (art-group-get-by-name *level* "skel-rhino-wall-2" (the-as (pointer uint32) #f))) + (set! (-> obj anim) + (new 'static 'spool-anim :name "rhino-wall-2" :anim-name "2-break" :parts 1 :command-list '()) + ) + ) + (else + (go process-drawable-art-error (the-as string s3-0)) + ) + ) + (process-drawable-from-entity! obj arg0) + (initialize-skeleton obj (the-as skeleton-group s4-0) (the-as pair 0)) + ) + (if (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status subtask-complete))) + (go (method-of-object obj broken)) + (go (method-of-object obj unbroken)) + ) + (none) + ) diff --git a/goal_src/jak2/levels/temple/rhino.gc b/goal_src/jak2/levels/temple/rhino.gc index 2731a56765..f86eb0a2c8 100644 --- a/goal_src/jak2/levels/temple/rhino.gc +++ b/goal_src/jak2/levels/temple/rhino.gc @@ -5,5 +5,1767 @@ ;; name in dgo: rhino ;; dgos: MTN +(declare-type rhino-wall process-focusable) + ;; DECOMP BEGINS +(defpartgroup group-rhino-slide-poof-pmt + :id 350 + :duration (seconds 0.035) + :linger-duration (seconds 1.5) + :bounds (static-bspherem 0 0 0 2) + :parts ((sp-item 1488)) + ) + +(defpart 1488 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 6.0 6.0 1.0) + (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 64.0 1.0) + (sp-rnd-flt spt-g 70.0 32.0 1.0) + (sp-rnd-flt spt-b 40.0 20.0 1.0) + (sp-rnd-flt spt-a 16.0 16.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.0033333334) 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-rnd-flt spt-fade-a -0.07111111 -0.07111111 1.0) + (sp-flt spt-accel-y -0.27306667) + (sp-flt spt-friction 0.94) + (sp-int spt-timer 450) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14) + (sp-rnd-flt spt-conerot-x (degrees 60.0) (degrees 30.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +(defpartgroup group-rhino-slide-poof-grs + :id 351 + :duration (seconds 0.035) + :linger-duration (seconds 1.5) + :bounds (static-bspherem 0 0 0 2) + :parts ((sp-item 1489) (sp-item 1490)) + ) + +(defpart 1489 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 6.0 6.0 1.0) + (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 96.0 32.0 1.0) + (sp-rnd-flt spt-g 128.0 32.0 1.0) + (sp-rnd-flt spt-b 0.0 64.0 1.0) + (sp-rnd-flt spt-a 16.0 16.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.0033333334) 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-rnd-flt spt-fade-a -0.07111111 -0.07111111 1.0) + (sp-flt spt-accel-y -0.27306667) + (sp-flt spt-friction 0.94) + (sp-int spt-timer 450) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14) + (sp-rnd-flt spt-conerot-x (degrees 60.0) (degrees 30.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + ) + ) + +(defpart 1490 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x2f :page #xc)) + (sp-rnd-flt spt-num 0.0 8.0 1.0) + (sp-rnd-flt spt-x (meters -0.4) (meters 0.8) 1.0) + (sp-rnd-flt spt-y (meters -0.1) (meters 0.4) 1.0) + (sp-rnd-flt spt-z (meters -0.4) (meters 0.8) 1.0) + (sp-rnd-flt spt-scale-x (meters 0.15) (meters 0.35) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-scale-y (meters 0.15)) + (sp-rnd-flt spt-r 128.0 2.0 64.0) + (sp-rnd-int spt-g 1132396544 0 1.0) + (sp-rnd-flt spt-a 128.0 64.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.015) (meters 0.01) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -2.4) (degrees 4.8) 1.0) + (sp-flt spt-fade-a -0.42666668) + (sp-rnd-flt spt-accel-y -4.096 2.048 1.0) + (sp-int spt-timer 300) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14) + (sp-rnd-flt spt-conerot-x (degrees 30.0) (degrees 50.000004) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-radius (meters 0.5)) + ) + ) + +(defskelgroup skel-rhino rhino rhino-lod0-jg -1 + ((rhino-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 1 7) + :shadow rhino-shadow-mg + :origin-joint-index 16 + ) + +(deftype rhino (nav-enemy) + ((wall rhino-wall :offset-assert 604) + (path-intro path-control :offset-assert 608) + (charge-aware uint64 :offset-assert 616) + (anim-skid-left int32 :offset-assert 624) + (anim-skid-right int32 :offset-assert 628) + (anim-victory-hit int32 :offset-assert 632) + (circle-backward? symbol :offset-assert 636) + (skid-speed float :offset 672) + (angle float :offset-assert 676) + (angle-speed float :offset-assert 680) + (dest vector :inline :offset-assert 688) + (charge-straight symbol :offset-assert 704) + (in-stop-run symbol :offset-assert 708) + (smush-target smush-control :offset-assert 712) + (num-hit-flinch int32 :offset-assert 716) + (frame-die-smush float :offset-assert 720) + (quat quaternion :inline :offset-assert 736) + (can-hit? symbol :offset-assert 752) + (interest int32 :offset-assert 756) + (victory-count uint32 :offset-assert 760) + (stomach-touched-once? symbol :offset-assert 764) + ) + :heap-base #x280 + :method-count-assert 183 + :size-assert #x300 + :flag-assert #xb702800300 + (:methods + (attack () _type_ :state 178) + (stop-run () _type_ :state 179) + (run-away () _type_ :state 180) + (charge () _type_ :state 181) + (rhino-method-182 (_type_ process event-message-block) symbol 182) + ) + ) + +;; ERROR: failed type prop at 48: Could not figure out load: (set! a2 (l.wu (+ gp 636))) + +(define *rhino-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #f + :use-victory #t + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 8 #x1e0002 #x4010301 #x1e0002 #x4010401 #x0 #x0 #x0 #x0) + :idle-anim 3 + :notice-anim 7 + :hostile-anim 10 + :hit-anim 23 + :knocked-anim -1 + :knocked-land-anim -1 + :die-anim 14 + :die-falling-anim 14 + :victory-anim 11 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 5 + :look-at-joint 6 + :bullseye-joint 4 + :sound-hit (static-sound-name "rhino-hit") + :sound-die (static-sound-name "rhino-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 2) + :default-hit-points 35 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-flinch #xfffffffff5dfffff + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 4) + :attack-shove-up (meters 4) + :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-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 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 6 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 2170.88 :z 1761.28 :r 163840.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 6 + :turn-anim -1 + :run-anim 10 + :taunt-anim -1 + :run-travel-speed (meters 14) + :run-acceleration (meters 40) + :run-turning-acceleration (meters 26) + :walk-travel-speed (meters 1) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 180.0) + :notice-nav-radius (meters 4) + :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! (-> *rhino-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod rhino-method-182 rhino ((obj rhino) (arg0 process) (arg1 event-message-block)) + (let* ((gp-0 (-> arg1 param 0)) + (s5-0 arg0) + (s2-0 (if (type? s5-0 process-drawable) + s5-0 + ) + ) + ) + (cond + ((and (-> obj can-hit?) gp-0 ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry gp-0) + (-> obj root-override2) + (the-as uint 1) + ) + ) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (gp-1 (new 'stack-no-clear 'vector)) + (s5-1 (new 'stack-no-clear 'vector)) + ) + (vector-z-quaternion! s4-0 (-> obj root-override2 quat)) + (vector-x-quaternion! gp-1 (-> obj root-override2 quat)) + (vector-! s5-1 (-> (the-as process-drawable s2-0) root trans) (-> obj root-override2 trans)) + (if (and (< 0.0 (vector-dot s5-1 s4-0)) (< (fabs (vector-dot s5-1 gp-1)) 10240.0)) + #t + #f + ) + ) + ) + (else + #f + ) + ) + ) + ) + +(defmethod enemy-method-58 rhino ((obj rhino) (arg0 process) (arg1 event-message-block)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-58))) + (t9-0 obj arg0 arg1) + ) + (if (rhino-method-182 obj arg0 arg1) + 'hit + 'hit-flinch + ) + ) + +;; WARN: Return type mismatch none vs object. +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 10] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 30] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 151] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 216] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 272] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 318] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 323] +(defmethod enemy-method-74 rhino ((obj rhino) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (local-vars + (sv-96 int) + (sv-112 symbol) + (sv-128 symbol) + (sv-144 symbol) + (sv-160 vector) + (sv-176 matrix) + (sv-192 int) + (sv-208 symbol) + (sv-224 symbol) + (sv-240 symbol) + (sv-256 vector) + (sv-272 matrix) + ) + (let ((v1-0 arg2)) + (the-as + object + (cond + ((= v1-0 'charge) + (if (-> obj wall) + (go (method-of-object obj charge)) + ) + ) + ((= v1-0 'hit) + (cond + ((zero? (-> obj hit-points)) + (set! (-> *rhino-nav-enemy-info* die-anim) 15) + (set! (-> obj frame-die-smush) 11.0) + (enemy-method-73 obj) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ((= v1-0 'hit-flinch) + (cond + ((zero? (-> obj hit-points)) + (set! (-> *rhino-nav-enemy-info* die-anim) 14) + (set! (-> obj frame-die-smush) 16.0) + (enemy-method-73 obj) + ) + (else + (let* ((s5-0 arg0) + (s2-0 (if (type? s5-0 process-drawable) + s5-0 + ) + ) + (s3-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s5-1 (new 'stack-no-clear 'vector)) + ) + (vector-z-quaternion! s3-0 (-> obj root-override2 quat)) + (vector-x-quaternion! s4-0 (-> obj root-override2 quat)) + (vector-! s5-1 (-> (the-as process-focusable s2-0) root-override trans) (-> obj root-override2 trans)) + (set! (-> s5-1 y) 0.0) + (vector-normalize! s5-1 1.0) + (let* ((f30-0 (vector-dot s3-0 s5-1)) + (f28-0 (vector-dot s4-0 s5-1)) + (a0-16 (cond + ((>= f30-0 (cos 8192.0)) + (-> obj draw art-group data 16) + ) + ((>= (cos 24576.0) f30-0) + (-> obj draw art-group data 19) + ) + ((>= f28-0 (cos 8192.0)) + (-> obj draw art-group data 17) + ) + ((>= (cos 24576.0) f28-0) + (-> obj draw art-group data 18) + ) + (else + (-> obj draw art-group data 16) + ) + ) + ) + (v0-9 (ja-channel-float! (the-as art-joint-anim a0-16) 0.0 0.0 0.0)) + ) + (when v0-9 + (set! (-> obj skel interp-select 0) (the-as int (the-as uint #x1c9002228))) + (set! (-> obj skel interp-select 1) 0) + (set! (-> v0-9 param 0) 1.0) + (set! (-> v0-9 param 1) 1.0) + (set! (-> v0-9 param 2) 3.0) + (set! (-> v0-9 num-func) num-func-interp1-play!) + ) + ) + ) + (+! (-> obj num-hit-flinch) 1) + 'back + ) + ) + ) + ((= v1-0 'event-slide-poof) + (let ((s5-2 (-> arg3 param 1))) + (cond + ((= (-> obj root-override2 ground-pat material) (pat-material grass)) + (let ((s4-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s4-1 + (let ((t9-14 (method-of-type part-tracker activate))) + (t9-14 (the-as part-tracker s4-1) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((s3-1 run-function-in-process) + (s2-1 s4-1) + (s1-0 part-tracker-init) + (s0-0 (-> *part-group-id-table* 351)) + ) + (set! sv-96 0) + (set! sv-112 (the-as symbol #f)) + (set! sv-128 (the-as symbol #f)) + (set! sv-144 (the-as symbol #f)) + (set! sv-176 *launch-matrix*) + (set! sv-160 (-> sv-176 trans)) + (let ((v1-52 (-> (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data s5-2)) quad))) + (set! (-> sv-160 quad) v1-52) + ) + ((the-as (function object object object object object object object object none) s3-1) + s2-1 + s1-0 + s0-0 + sv-96 + sv-112 + sv-128 + sv-144 + sv-176 + ) + ) + (-> s4-1 ppointer) + ) + ) + ) + (else + (let ((s4-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when s4-2 + (let ((t9-18 (method-of-type part-tracker activate))) + (t9-18 (the-as part-tracker s4-2) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((s3-2 run-function-in-process) + (s2-2 s4-2) + (s1-1 part-tracker-init) + (s0-1 (-> *part-group-id-table* 350)) + ) + (set! sv-192 0) + (set! sv-208 (the-as symbol #f)) + (set! sv-224 (the-as symbol #f)) + (set! sv-240 (the-as symbol #f)) + (set! sv-272 *launch-matrix*) + (set! sv-256 (-> sv-272 trans)) + (let ((v1-64 (-> (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data s5-2)) quad))) + (set! (-> sv-256 quad) v1-64) + ) + ((the-as (function object object object object object object object object none) s3-2) + s2-2 + s1-1 + s0-1 + sv-192 + sv-208 + sv-224 + sv-240 + sv-272 + ) + ) + (-> s4-2 ppointer) + ) + ) + ) + ) + ) + ) + ((= v1-0 'interesting) + (+! (-> obj interest) 1) + (let ((v1-67 (process->ppointer obj))) + (set-setting! 'handle-of-interest v1-67 0 (-> v1-67 0 pid)) + ) + ) + ((= v1-0 'uninteresting) + (+! (-> obj interest) -1) + (when (<= (-> obj interest) 0) + (set! (-> obj interest) 0) + (remove-setting! 'handle-of-interest) + ) + ) + ((= v1-0 'death-end) + (let ((v1-74 (-> obj root-override2 root-prim))) + (set! (-> v1-74 prim-core collide-as) (collide-spec)) + (set! (-> v1-74 prim-core collide-with) (collide-spec)) + ) + 0 + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + ) + +(defstate idle (rhino) + :virtual #t + :enter (behavior () + (remove-setting! 'sound-mode) + (remove-setting! 'sound-excitement) + (set! (-> self interest) 0) + (let ((t9-2 (-> (method-of-type nav-enemy idle) enter))) + (if t9-2 + (t9-2) + ) + ) + (logclear! (-> self enemy-flags) (enemy-flag enable-on-active)) + (none) + ) + :exit (behavior () + (local-vars (v0-1 enemy-flag)) + (let ((t9-0 (-> (method-of-type nav-enemy idle) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 (-> self enemy-flags))) + (if (logtest? v1-4 (enemy-flag checking-water)) + (set! v0-1 (logior v1-4 (enemy-flag enable-on-active))) + (set! v0-1 (logclear v1-4 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v0-1) + (none) + ) + :trans (behavior () + (cond + ((-> self wall) + (debug-draw (-> self path-intro)) + (when (and (>= (the-as int (-> self focus aware)) (the-as int (-> self charge-aware))) + *target* + (and (>= 122880.0 (vector-vector-distance (-> self root-override2 trans) (-> *target* control trans))) + (zero? (logand (focus-status teleporting) (-> *target* focus-status))) + ) + ) + (process-entity-status! self (entity-perm-status subtask-complete) #t) + (go-virtual charge) + ) + ) + (else + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self state-timeout))) + (> (the-as int (-> self focus aware)) 0) + ) + (go-virtual active) + ) + ) + ) + (none) + ) + ) + +(defstate die (rhino) + :virtual #t + :enter (behavior () + (remove-setting! 'sound-mode) + (enemy-method-132 self) + (set! (-> self hit-points) 0) + 0 + (none) + ) + :code (behavior () + (set! (-> self smush-target) (the-as smush-control #t)) + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2)) + (gp-0 #t) + ) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override die-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override die-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and gp-0 (>= (ja-frame-num 0) (-> self frame-die-smush))) + (activate! *camera-smush-control* 819.2 37 600 1.0 0.1 (-> self clock)) + (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 204 (seconds 0.5)) + (set! gp-0 #f) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (send-event self 'death-end) + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + ) + +(defstate hit (rhino) + :virtual #t + :code (behavior () + (local-vars (v1-67 enemy-flag) (v1-75 enemy-flag)) + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override hit-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override hit-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (let ((gp-0 #t)) + (ja-no-eval :group! rhino-victory-hit2-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-victory-hit2-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and gp-0 (>= (ja-frame-num 0) 5.0)) + (activate! *camera-smush-control* 819.2 37 600 1.0 0.1 (-> self clock)) + (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 204 (seconds 0.5)) + (set! gp-0 #f) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.075)) + (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-66 (-> self enemy-flags))) + (if (logtest? v1-66 (enemy-flag checking-water)) + (set! v1-67 (logior v1-66 (enemy-flag enable-on-active))) + (set! v1-67 (logclear v1-66 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-67) + (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-74 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-74) + (set! v1-75 (logior (enemy-flag check-water-backup) v1-74)) + (set! v1-75 (logclear v1-74 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-75) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (go-hostile self) + (none) + ) + ) + +(defmethod enemy-method-56 rhino ((obj rhino) (arg0 process) (arg1 event-message-block)) + (-> arg1 param 1) + (let ((f30-0 (the float (penetrate-using->damage (the-as penetrate (-> obj incoming penetrate-using)))))) + (cond + ((rhino-method-182 obj arg0 arg1) + (set! (-> obj stomach-touched-once?) #t) + (the int (* 4.0 f30-0)) + ) + ((logtest? #xc0000 (-> obj incoming penetrate-using)) + (if (and (logtest? #x40000 (-> obj incoming penetrate-using)) + (logtest? #x80000 (-> obj incoming penetrate-using)) + ) + #x420c0000 + (the int (* 1.8 f30-0)) + ) + ) + ((logtest? #x20000 (-> obj incoming penetrate-using)) + (the int (* 2.0 f30-0)) + ) + (else + (the int (* 0.5 f30-0)) + ) + ) + ) + ) + +;; WARN: Return type mismatch symbol vs none. +(defmethod enemy-method-75 rhino ((obj rhino) (arg0 process) (arg1 touching-shapes-entry)) + (let* ((s5-0 (-> arg1 handle1)) + (s3-0 arg0) + (v1-0 (if (type? s3-0 process-focusable) + s3-0 + ) + ) + ) + (when (and s5-0 v1-0) + (cond + ((and (logtest? (-> obj focus-status) (focus-status dangerous)) + ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s5-0) + (-> obj root-override2) + (collide-action deadly) + (collide-action) + ) + ) + (let ((a3-2 (if ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s5-0) + (-> obj root-override2) + (collide-action persistent-attack) + (collide-action) + ) + (-> obj persistent-attack-id) + (-> obj attack-id) + ) + ) + ) + (enemy-method-104 obj arg0 (the-as uint s5-0) a3-2) + ) + ) + (((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s5-0) + (-> obj root-override2) + (collide-action no-standon) + (collide-action) + ) + (send-shoves (-> obj root-override2) arg0 (the-as touching-shapes-entry s5-0) 0.7 6144.0 16384.0) + ) + ) + ) + ) + (none) + ) + +(defmethod enemy-method-104 rhino ((obj rhino) (arg0 process) (arg1 uint) (arg2 uint)) + (if (and (-> obj next-state) (= (-> obj next-state name) 'victory)) + 'attack-or-shove + 'attack + ) + (let* ((s2-0 (if (-> obj smush-target) + 'smush + (-> obj enemy-info-override attack-mode) + ) + ) + (s1-0 arg0) + (a0-3 (if (type? s1-0 process-focusable) + s1-0 + ) + ) + (s1-1 (new 'stack-no-clear 'vector)) + ) + (vector-! s1-1 (get-trans (the-as process-focusable a0-3) 0) (-> obj root-override2 trans)) + (set! (-> s1-1 y) 0.0) + (vector-normalize! s1-1 1.0) + (vector+float*! s1-1 s1-1 (-> obj root-override2 transv) 0.5) + (set! (-> s1-1 y) 20480.0) + (let ((a1-6 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-6 from) (process->ppointer self)) + (set! (-> a1-6 num-params) 2) + (set! (-> a1-6 message) 'attack) + (set! (-> a1-6 param 0) arg1) + (let ((v1-16 (new 'static 'attack-info :mask (attack-info-mask vector mode angle id)))) + (set! (-> v1-16 id) arg2) + (set! (-> v1-16 angle) 'front) + (set! (-> v1-16 vector quad) (-> s1-1 quad)) + (set! (-> v1-16 mode) s2-0) + (set! (-> a1-6 param 1) (the-as uint v1-16)) + ) + (when (send-event-function arg0 a1-6) + (enemy-method-105 obj arg0) + #t + ) + ) + ) + ) + +(defstate active (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + ) + +(defstate notice (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + ) + +(defstate victory (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy victory) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-as) + (collide-spec) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-with) + (collide-spec) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core action) + (collide-action deadly) + ) + (set! (-> self can-hit?) #t) + (let ((v1-13 (-> self nav state))) + (set! (-> v1-13 speed) 0.0) + ) + 0 + (+! (-> self victory-count) 1) + (if (and (= (-> self victory-count) 3) (not (-> self stomach-touched-once?))) + (talker-spawn-func (-> *talker-speech* 59) *entity-pool* (target-pos 0) (the-as region #f)) + ) + (none) + ) + :exit (behavior () + (set! (-> self can-hit?) #f) + (set! (-> self smush-target) #f) + (let ((t9-0 (-> (method-of-type nav-enemy victory) exit))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-as) + (collide-spec) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-with) + (collide-spec) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (ja-no-eval :group! rhino-victory-begin-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-victory-begin-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-as) + (collide-spec enemy) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-with) + (collide-spec jak bot player-list) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core action) + (collide-action solid no-standon) + ) + (until #f + (ja-no-eval :group! rhino-victory-loop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-victory-loop-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (cond + (gp-0 + (if (or (< 10240.0 + (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + ) + (and gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (goto cfg-25) + ) + ) + (else + (goto cfg-25) + ) + ) + ) + ) + #f + (label cfg-25) + (set! (-> self can-hit?) #f) + (set! (-> self smush-target) (the-as smush-control #t)) + (let* ((v1-68 *game-info*) + (a0-24 (+ (-> v1-68 attack-id) 1)) + ) + (set! (-> v1-68 attack-id) a0-24) + (set! (-> self attack-id) a0-24) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core action) + (collide-action deadly) + ) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-72 *game-info*) + (a0-29 (+ (-> v1-72 attack-id) 1)) + ) + (set! (-> v1-72 attack-id) a0-29) + (set! (-> self attack-id) a0-29) + ) + (let ((gp-1 #t)) + (ja-no-eval :group! rhino-victory-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-victory-end-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and gp-1 (>= (ja-frame-num 0) 12.0)) + (activate! *camera-smush-control* 819.2 37 600 1.0 0.1 (-> self clock)) + (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 204 (seconds 0.5)) + (set! gp-1 #f) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (let ((a0-37 (handle->process (-> self focus handle)))) + (cond + (a0-37 + (cond + ((< 22528.0 + (vector-vector-xz-distance (get-trans (the-as process-focusable a0-37) 0) (-> self root-override2 trans)) + ) + (ja-channel-push! 1 (seconds 0.075)) + (enemy-method-72 self) + ) + (else + (go-virtual run-away) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.075)) + (enemy-method-72 self) + ) + ) + ) + (none) + ) + ) + +(defstate run-away (rhino) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rhino) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (nav-enemy-method-166 self) + (let ((v1-4 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-4 enemy-flags))) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-4 enemy-flags)))) + ) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-4 enemy-flags)))) + (set! (-> v1-4 nav callback-info) (-> v1-4 enemy-info-override callback-info)) + ) + 0 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-7 enemy-flags)))) + ) + 0 + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (let ((s5-0 (-> self path curve num-cverts))) + (if (<= s5-0 0) + (go process-drawable-art-error "no path") + ) + 0 + (let ((f30-0 0.0) + (s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (dotimes (s3-0 s5-0) + (get-point-in-path! (-> self path) s4-0 (the float s3-0) 'interp) + (let ((f0-2 (vector-vector-xz-distance s4-0 (-> self root-override2 trans)))) + (when (< f30-0 f0-2) + (set! f30-0 f0-2) + (set! (-> gp-0 quad) (-> s4-0 quad)) + ) + ) + ) + (let ((v1-25 (-> self nav state))) + (logclear! (-> v1-25 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-25 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-25 target-post quad) (-> gp-0 quad)) + ) + ) + ) + 0 + (none) + ) + :trans (behavior () + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1.5)) + (go-virtual active) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.05)) + (until #f + (ja-no-eval :group! rhino-charge-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-charge-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (suspend) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-travel-post) + (none) + ) + ) + +(defstate hostile (rhino) + :virtual #t + :enter (behavior () + (set-setting! 'sound-mode #f 0 1) + (set-setting! 'sound-excitement 'abs 0 0) + (let ((t9-2 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-2 + (t9-2) + ) + ) + (set! (-> self charge-straight) #f) + (nav-enemy-method-166 self) + (set! (-> self state-time) (-> self clock frame-counter)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((s3-0 (handle->process (-> self focus handle)))) + (when s3-0 + (let ((s2-0 (get-trans (the-as process-focusable s3-0) 0)) + (s5-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + 0.0 + 0.0 + (vector-z-quaternion! s5-0 (-> self root-override2 quat)) + (vector-! s1-0 s2-0 (-> self root-override2 trans)) + (let ((f28-0 (vector-dot s1-0 s5-0))) + (vector-normalize! s1-0 1.0) + (let ((f30-0 (vector-dot s1-0 s5-0))) + (vector-! gp-0 s2-0 (-> self root-override2 trans)) + (vector-normalize! gp-0 (+ 16384.0 (vector-length gp-0))) + (vector+! s4-0 (-> self root-override2 trans) gp-0) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + (if (and (< (vector-vector-xz-distance (get-trans (the-as process-focusable s3-0) 0) (-> self root-override2 trans)) + 40960.0 + ) + (< 0.9 f30-0) + ) + (set! (-> self charge-straight) #t) + ) + ) + (cond + ((-> self charge-straight) + (cond + ((>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + (if (< (vector-vector-xz-distance (get-trans (the-as process-focusable s3-0) 0) (-> self root-override2 trans)) + 20480.0 + ) + (go-virtual attack) + ) + (when (and (< f30-0 0.7) (>= 9.0 (ja-frame-num 0))) + (set! (-> self charge-straight) #f) + (go-virtual stop-run) + ) + ) + (else + (set! (-> self dest quad) (-> s4-0 quad)) + ) + ) + ) + ((and (< f28-0 8192.0) + (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 2)) (>= 9.0 (ja-frame-num 0))) + ) + (go-virtual stop-run) + ) + (else + (set! (-> self dest quad) (-> s4-0 quad)) + ) + ) + ) + ) + (vector-float*! gp-0 s5-0 40960.0) + (let* ((s5-1 (-> self nav)) + (v1-67 s5-1) + (a0-31 (-> self root-override2 trans)) + (a1-12 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-12 point) a0-31 (-> v1-67 state mesh bounds)) + (set! (-> a1-12 y-threshold) (-> v1-67 nearest-y-threshold)) + (set! (-> a1-12 ignore) (the-as uint 2)) + (let ((s3-1 (find-poly-containing-point-local (-> v1-67 state mesh) a1-12)) + (s4-2 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (when s3-1 + (clamp-vector-to-mesh-no-gaps s5-1 (-> self root-override2 trans) s3-1 gp-0 s4-2) + (when (-> s4-2 found-boundary) + (if (and (< (vector-length gp-0) 32768.0) (and (-> self charge-straight) (>= 9.0 (ja-frame-num 0)))) + (go-virtual stop-run) + ) + ) + ) + ) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! (-> self draw art-group data (-> self enemy-info-override hostile-anim))) + (ja :num-func num-func-identity :frame-num 0.0) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 (-> self dest)) + ) + (logclear! (-> a0-0 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-0 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-0 target-post quad) (-> v1-1 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +(defstate attack (rhino) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rhino) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-4 *game-info*) + (a0-2 (+ (-> v1-4 attack-id) 1)) + ) + (set! (-> v1-4 attack-id) a0-2) + (set! (-> self attack-id) a0-2) + ) + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (nav-enemy-method-166 self) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (new 'stack-no-clear 'vector) + (vector-z-quaternion! gp-0 (-> self root-override2 quat)) + (vector-float*! gp-0 gp-0 40960.0) + (vector+! (-> self dest) (-> self root-override2 trans) gp-0) + ) + (let ((a0-10 (-> self nav state)) + (v1-17 (-> self dest)) + ) + (logclear! (-> a0-10 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-10 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-10 target-post quad) (-> v1-17 quad)) + ) + 0 + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (enemy-method-49 self) + (none) + ) + :code (behavior () + (let ((gp-0 #f)) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! rhino-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-attack-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (set! gp-0 #t) + ) + (suspend) + (ja :num! (seek!)) + ) + (if gp-0 + (go-virtual victory) + (go-hostile self) + ) + ) + (none) + ) + :post (the-as (function none :behavior rhino) nav-enemy-travel-post) + ) + +(defmethod nav-enemy-method-142 rhino ((obj rhino) (arg0 nav-control)) + (if (-> obj in-stop-run) + (quaternion*! + (-> obj root-override2 quat) + (-> obj quat) + (quaternion-axis-angle! (new 'stack-no-clear 'quaternion) 0.0 1.0 0.0 (* 182.04445 (* 180.0 (-> obj angle)))) + ) + ((method-of-type nav-enemy nav-enemy-method-142) obj arg0) + ) + 0 + (none) + ) + +(defstate stop-run (rhino) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rhino) enemy-event-handler) + :enter (behavior () + (let ((gp-0 (new 'stack-no-clear 'vector))) + (new 'stack-no-clear 'vector) + (vector-z-quaternion! gp-0 (-> self root-override2 quat)) + (vector-float*! gp-0 gp-0 40960.0) + (vector+! (-> self dest) (-> self root-override2 trans) gp-0) + (let* ((s5-0 (-> self nav)) + (v1-6 s5-0) + (a0-5 (-> self root-override2 trans)) + (a1-3 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-3 point) a0-5 (-> v1-6 state mesh bounds)) + (set! (-> a1-3 y-threshold) (-> v1-6 nearest-y-threshold)) + (set! (-> a1-3 ignore) (the-as uint 2)) + (let ((s3-0 (find-poly-containing-point-local (-> v1-6 state mesh) a1-3)) + (s4-0 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (when s3-0 + (clamp-vector-to-mesh-no-gaps s5-0 (-> self root-override2 trans) s3-0 gp-0 s4-0) + (if (-> s4-0 found-boundary) + (vector+! (-> self dest) (-> self root-override2 trans) gp-0) + ) + ) + ) + ) + ) + (let ((a0-12 (-> self nav state)) + (v1-18 (-> self dest)) + ) + (logclear! (-> a0-12 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-12 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-12 target-post quad) (-> v1-18 quad)) + ) + 0 + (set! (-> self skid-speed) 57344.0) + (set! (-> self in-stop-run) #t) + (quaternion-copy! (-> self quat) (-> self root-override2 quat)) + (set! (-> self angle) 0.0) + (set! (-> self angle-speed) 0.0) + (set! (-> self num-hit-flinch) 0) + 0 + (none) + ) + :exit (behavior () + (let ((v1-1 (-> self nav state))) + (set! (-> v1-1 speed) 0.0) + ) + 0 + (let ((v1-3 (-> self nav))) + (set! (-> v1-3 target-speed) (-> self enemy-info-override walk-travel-speed)) + ) + 0 + (set! (-> self in-stop-run) #f) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! rhino-skid-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-skid-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (set! (-> self skid-speed) (fmax 0.0 (- (-> self skid-speed) (* 32768.0 (-> self clock seconds-per-frame))))) + (suspend) + (ja :num! (seek!)) + ) + (let ((a0-5 (handle->process (-> self focus handle))) + (v1-30 0) + ) + (when a0-5 + (let ((s5-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + 0.0 + (vector-! s5-0 (get-trans (the-as process-focusable a0-5) 0) (-> self root-override2 trans)) + (vector-normalize! s5-0 1.0) + (vector-x-quaternion! gp-0 (-> self root-override2 quat)) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (set! (-> self angle-speed) (* 0.5 (- 1.0 (vector-dot s5-0 s4-0)))) + (set! v1-30 (cond + ((< (vector-dot s5-0 gp-0) 0.0) + (set! v1-30 (-> self anim-skid-right)) + (set! (-> self angle-speed) (- (-> self angle-speed))) + v1-30 + ) + (else + (-> self anim-skid-left) + ) + ) + ) + ) + ) + (ja-no-eval :group! (-> self draw art-group data v1-30) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data v1-30)) frames num-frames) -1))) + :frame-num 0.0 + ) + ) + (until (ja-done? 0) + (set! (-> self skid-speed) (fmax 0.0 (- (-> self skid-speed) (* 32768.0 (-> self clock seconds-per-frame))))) + (let ((v1-45 (-> self nav))) + (set! (-> v1-45 target-speed) (-> self skid-speed)) + ) + 0 + (if (and (>= (ja-frame-num 0) 0.0) (>= 15.0 (ja-frame-num 0))) + (+! (-> self angle) (* (-> self angle-speed) (-> self clock seconds-per-frame))) + ) + (let ((a0-20 (-> self nav state)) + (v1-54 (-> self dest)) + ) + (logclear! (-> a0-20 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-20 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-20 target-post quad) (-> v1-54 quad)) + ) + 0 + (suspend) + (ja :num! (seek!)) + ) + (if (zero? (-> self num-hit-flinch)) + (go-virtual victory) + (go-virtual hostile) + ) + (none) + ) + :post (the-as (function none :behavior rhino) nav-enemy-travel-post) + ) + +(defstate charge (rhino) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rhino) enemy-event-handler) + :enter (behavior () + (set-setting! 'sound-mode #f 0 1) + (set-setting! 'sound-excitement 'abs 0 0) + (set! (-> self state-time) (-> self clock frame-counter)) + (nav-enemy-method-166 self) + (let ((v1-8 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-8 enemy-flags))) + (set! (-> v1-8 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-8 enemy-flags)))) + ) + (set! (-> v1-8 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-8 enemy-flags)))) + (set! (-> v1-8 nav callback-info) (-> v1-8 enemy-info-override callback-info)) + ) + 0 + (let ((v1-11 self)) + (set! (-> v1-11 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-11 enemy-flags)))) + ) + 0 + (let* ((gp-0 (get-point-in-path! (-> self path-intro) (new 'stack-no-clear 'vector) 0.0 'exact)) + (v1-15 (get-point-in-path! (-> self path-intro) (new 'stack-no-clear 'vector) 1.0 'exact)) + (s5-1 (vector-! (new 'stack-no-clear 'vector) v1-15 gp-0)) + ) + (set! (-> s5-1 y) 0.0) + (vector-xz-normalize! s5-1 163840.0) + (vector+! (-> self dest) gp-0 s5-1) + ) + (none) + ) + :exit (behavior () + (set! (-> self wall) #f) + (none) + ) + :code (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) 'trigger) + (let ((t9-0 send-event-function) + (v1-2 (-> self wall)) + ) + (t9-0 + (if v1-2 + (-> v1-2 child 3) + ) + a1-0 + ) + ) + ) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! rhino-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-attack-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! rhino-charge-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-charge-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (ja-no-eval :group! rhino-charge-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-charge-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual victory) + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 (-> self dest)) + ) + (logclear! (-> a0-0 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-0 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-0 target-post quad) (-> v1-1 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +(defstate stare (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy stare) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + ) + +(defstate circling (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy circling) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self nav state))) + (set! (-> v1-5 speed) 0.0) + ) + 0 + (none) + ) + :code (behavior () + (let ((v1-2 (ja-group))) + (when (and v1-2 (= v1-2 (-> self draw art-group data (-> self enemy-info-override walk-anim)))) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + ) + ) + (until #f + (let ((v1-15 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-15 enemy-flags))) + (set! (-> v1-15 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-15 enemy-flags)))) + ) + (set! (-> v1-15 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-15 enemy-flags)))) + (set! (-> v1-15 nav callback-info) (-> v1-15 enemy-info-override callback-info)) + ) + 0 + (let ((v1-18 self)) + (set! (-> v1-18 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-18 enemy-flags)))) + ) + 0 + (let ((v1-20 (-> self nav))) + (set! (-> v1-20 target-speed) 4096.0) + ) + 0 + (let ((v1-22 (-> self nav))) + (set! (-> v1-22 acceleration) (-> self enemy-info-override run-acceleration)) + ) + 0 + (let ((v1-24 (-> self nav))) + (set! (-> v1-24 turning-acceleration) (-> self enemy-info-override run-turning-acceleration)) + ) + 0 + (let ((gp-0 (-> self draw art-group data (-> self enemy-info-override walk-anim)))) + (let ((v1-32 (ja-group))) + (if (not (and v1-32 (= v1-32 gp-0))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (let ((s5-0 (get-rand-int self 8)) + (f30-0 (get-rand-float-range self 0.9 1.1)) + ) + (while (nonzero? s5-0) + (+! s5-0 -1) + (ja-no-eval :group! gp-0 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + (when (< 20480.0 (vector-vector-xz-distance (-> self focus-pos) (-> self root-override2 trans))) + (let ((v1-59 self)) + (set! (-> v1-59 enemy-flags) (the-as enemy-flag (logclear (-> v1-59 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-59 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-62 self)) + (set! (-> v1-62 enemy-flags) (the-as enemy-flag (logclear (-> v1-62 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (vector-reset! (-> self root-override2 transv)) + (let ((v1-68 (ja-group))) + (if (not (and v1-68 (= v1-68 (-> self draw art-group data (-> self enemy-info-override victory-anim))))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (let ((f30-2 (get-rand-float-range self 0.9 1.1))) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override victory-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override victory-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-2 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-2)) + ) + ) + ) + ) + #f + (none) + ) + ) + +(defmethod enemy-method-114 rhino ((obj rhino)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate)) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 6) 0))) + (set! (-> s5-0 total-prims) (the-as uint 7)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid semi-solid deadly no-standon)) + (set! (-> s4-0 transform-index) 4) + (set-vector! (-> s4-0 local-sphere) 0.0 -2048.0 0.0 27648.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-13 transform-index) 4) + (set-vector! (-> v1-13 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 1)))) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-15 transform-index) 4) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 2048.0 10240.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec backgnd jak bot crate hit-by-others-list player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-17 transform-index) 16) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 6144.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 2)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 prim-core action) (collide-action semi-solid deadly)) + (set! (-> v1-19 transform-index) 6) + (set-vector! (-> v1-19 local-sphere) 0.0 -2048.0 0.0 7372.8) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-21 prim-core action) (collide-action deadly persistent-attack)) + (set! (-> v1-21 transform-index) 4) + (set-vector! (-> v1-21 local-sphere) 0.0 0.0 -3072.0 4915.2) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-23 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-23 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-23 prim-core action) (collide-action deadly persistent-attack)) + (set! (-> v1-23 transform-index) 21) + (set-vector! (-> v1-23 local-sphere) 0.0 2252.8 0.0 3276.8) + ) + (set! (-> s5-0 nav-radius) 3686.4) + (let ((v1-25 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-25 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-25 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-focusable vs rhino. +(defmethod relocate rhino ((obj rhino) (arg0 int)) + (if (nonzero? (-> obj path-intro)) + (&+! (-> obj path-intro) arg0) + ) + (the-as + rhino + ((the-as (function process-focusable int process-focusable) (find-parent-method rhino 7)) obj arg0) + ) + ) + +(defmethod enemy-method-115 rhino ((obj rhino)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-rhino" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *rhino-nav-enemy-info*) + (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-vector! (-> v1-8 twist-max) 10922.667 12743.111 0.0 1.0) + (set! (-> v1-8 ignore-angle) 18204.445) + ) + (set! (-> obj wall) #f) + (set! (-> obj wall) (the-as rhino-wall (entity-actor-lookup (-> obj entity) 'alt-actor 0))) + (when (-> obj wall) + (set! (-> obj path-intro) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (if (-> obj path-intro) + (logior! (-> obj path-intro flags) (path-control-flag display draw-line draw-point draw-text)) + ) + (when (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status subtask-complete))) + (format #t "~S : sub task done~%" (-> obj name)) + (get-point-in-path! (-> obj path-intro) (-> obj root-override2 trans) 1.0 'exact) + (set! (-> obj wall) #f) + ) + ) + (set! (-> obj charge-aware) (the-as uint 1)) + (if (>= (res-lump-value (-> obj entity) 'extra-id int :default (the-as uint128 -1) :time -1000000000.0) 0) + (set! (-> obj charge-aware) (the-as uint 2)) + ) + (set! (-> obj charge-straight) #f) + (set! (-> obj in-stop-run) #f) + (set! (-> obj smush-target) #f) + (set! (-> obj num-hit-flinch) 0) + (set! (-> obj can-hit?) #f) + (set! (-> obj anim-skid-left) 21) + (set! (-> obj anim-skid-right) 22) + (set! (-> obj anim-victory-hit) 23) + (set! (-> obj interest) 0) + (set! (-> obj victory-count) (the-as uint 0)) + (set! (-> obj stomach-touched-once?) #f) + (add-connection + *part-engine* + obj + 6 + obj + 318 + (new 'static 'vector :x 1433.6 :y -1105.92 :z 1925.12 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 6 + obj + 318 + (new 'static 'vector :x -1433.6 :y -1105.92 :z 1925.12 :w 163840.0) + ) + (let ((v1-38 (-> obj nav))) + (set! (-> v1-38 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (logior! (-> obj nav flags) (nav-control-flag momentum-ignore-heading)) + (logior! (-> obj focus-status) (focus-status dangerous)) + (logior! (-> obj enemy-flags) (enemy-flag check-water)) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/engine/ai/enemy-h_REF.gc b/test/decompiler/reference/jak2/engine/ai/enemy-h_REF.gc index cc6102784f..e9ec83fe8a 100644 --- a/test/decompiler/reference/jak2/engine/ai/enemy-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/ai/enemy-h_REF.gc @@ -438,12 +438,12 @@ (enemy-method-55 (_type_) none 55) (enemy-method-56 (_type_ process event-message-block) int 56) (enemy-method-57 (_type_ process-focusable enemy-best-focus) enemy-aware 57) - (enemy-method-58 (_type_) symbol 58) + (enemy-method-58 (_type_ process event-message-block) symbol 58) (enemy-method-59 (_type_) penetrate 59) (coin-flip? (_type_) symbol 60) (enemy-method-61 (_type_ int) int :behavior enemy 61) (enemy-method-62 (_type_) none 62) - (enemy-method-63 (_type_ process-focusable symbol) none 63) + (enemy-method-63 (_type_ process-focusable symbol) symbol 63) (enemy-method-64 (_type_) none 64) (enemy-method-65 (_type_) none 65) (go-ambush (_type_) none 66) @@ -454,7 +454,7 @@ (go-flee (_type_) none 71) (enemy-method-72 (_type_) none 72) (enemy-method-73 (_type_) none 73) - (enemy-method-74 (_type_ process object symbol event-message-block) none 74) + (enemy-method-74 (_type_ process object symbol event-message-block) object 74) (enemy-method-75 (_type_ process touching-shapes-entry) none 75) (enemy-method-76 (_type_ process event-message-block) symbol 76) (enemy-method-77 (_type_ (pointer float)) symbol 77) diff --git a/test/decompiler/reference/jak2/engine/ai/enemy_REF.gc b/test/decompiler/reference/jak2/engine/ai/enemy_REF.gc index 3e8ef72806..066e985f9f 100644 --- a/test/decompiler/reference/jak2/engine/ai/enemy_REF.gc +++ b/test/decompiler/reference/jak2/engine/ai/enemy_REF.gc @@ -426,13 +426,11 @@ ) ;; definition for method 63 of type enemy -;; WARN: Return type mismatch symbol vs none. (defmethod enemy-method-63 enemy ((obj enemy) (arg0 process-focusable) (arg1 symbol)) (if arg1 (enemy-focus-method-13 (-> obj focus) arg0 (the-as enemy-aware arg1)) (try-update-focus (-> obj focus) arg0 obj) ) - (none) ) ;; definition for method 62 of type enemy @@ -1678,124 +1676,162 @@ ;; definition for method 74 of type enemy ;; INFO: Used lq/sq +;; WARN: Return type mismatch none vs object. +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 17] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 28] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 89] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 202] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 274] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 346] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 413] ;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 490] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 493] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 530] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 560] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 610] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 641] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 774] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 807] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 814] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 850] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 933] (defmethod enemy-method-74 enemy ((obj enemy) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) (local-vars (s5-5 rgbaf) (sv-432 process) (sv-448 event-message-block)) (with-pp - (cond - ((= arg2 'track) - (and (nonzero? (-> obj hit-points)) - (logtest? (-> obj enemy-flags) (enemy-flag enable-on-active)) - (logtest? (enemy-flag check-water-backup) (-> obj enemy-flags)) - ) - ) - ((= arg2 'combo) - (and (not (logtest? (enemy-flag multi-focus) (-> obj enemy-flags))) (nonzero? (-> obj hit-points))) - ) - ((= arg2 'touch) - (enemy-method-75 obj arg0 (the-as touching-shapes-entry arg3)) - ) - ((= arg2 'touched) - (when (logtest? (-> obj enemy-flags) (enemy-flag attackable-backup)) - (let* ((s3-1 arg0) - (v1-20 (if (type? s3-1 process-drawable) - (the-as process-drawable s3-1) - ) - ) - ) - (when v1-20 - (let* ((s3-2 (-> v1-20 root)) - (a1-4 (if (type? s3-2 collide-shape) - s3-2 - ) - ) - (s3-3 (-> arg3 param 0)) - ) - (if (and a1-4 - s3-3 - ((method-of-type touching-shapes-entry prims-touching-action?) - (the-as touching-shapes-entry s3-3) - (the-as collide-shape a1-4) - (collide-action solid) - (collide-action) - ) - ((method-of-type touching-shapes-entry prims-touching-action?) - (the-as touching-shapes-entry s3-3) - (-> obj root-override2) - (collide-action solid) - (collide-action) - ) - ) - (set! (-> obj auto-reset-penetrate-time) (the-as uint (-> pp clock frame-counter))) - ) - ) - ) - ) - ) - (enemy-method-76 obj arg0 arg3) - ) - ((= arg2 'attack-invinc) - (case (-> (the-as attack-info (-> arg3 param 1)) mode) - (('endlessfall) - (let ((v1-31 (-> obj root-override2 root-prim))) - (set! (-> v1-31 prim-core collide-as) (collide-spec)) - (set! (-> v1-31 prim-core collide-with) (collide-spec)) - ) - 0 - (enemy-method-73 obj) - ) - ) - ) - ((= arg2 'attack) - (let ((s2-0 (the-as object (-> arg3 param 1)))) - (when (!= (-> (the-as attack-info s2-0) id) (-> obj incoming attack-id)) - (cond - ((and (logtest? (-> obj enemy-flags) (enemy-flag enable-on-active)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (let* ((s1-0 obj) - (s0-0 (method-of-object s1-0 enemy-method-106)) - ) - (set! sv-432 arg0) - (set! sv-448 arg3) - (let ((a3-3 (get-penetrate-using-from-attack-event (the-as process-drawable arg0) arg3))) - (s0-0 s1-0 sv-432 sv-448 (the-as int a3-3) (the-as attack-info s2-0)) - ) - ) - (send-event (ppointer->process (-> obj parent)) 'child-hit) - 0 - (if (not *debug-unkillable*) - (enemy-method-48 obj arg0 arg3) - ) - (let ((s2-1 (the-as attack-info (enemy-method-58 obj)))) - (when s2-1 - (logclear! (-> obj enemy-flags) (enemy-flag called-dying)) - (enemy-method-108 obj (the-as enemy arg0) arg3) - (let ((a1-13 (new 'stack-no-clear 'event-message-block))) - (set! (-> a1-13 from) (process->ppointer arg0)) - (set! (-> a1-13 num-params) (the-as int arg1)) - (set! (-> a1-13 message) (the-as symbol s2-1)) - (set! (-> a1-13 param 0) (-> arg3 param 0)) - (set! (-> a1-13 param 1) (-> arg3 param 1)) - (set! (-> a1-13 param 2) (-> arg3 param 2)) - (set! (-> a1-13 param 3) (-> arg3 param 3)) - (set! (-> a1-13 param 4) (-> arg3 param 4)) - (set! (-> a1-13 param 5) (-> arg3 param 5)) - (send-event-function obj a1-13) - ) - ) - ) + (the-as + object + (cond + ((= arg2 'track) + (and (nonzero? (-> obj hit-points)) + (logtest? (-> obj enemy-flags) (enemy-flag enable-on-active)) + (logtest? (enemy-flag check-water-backup) (-> obj enemy-flags)) ) - (else - (set! (-> obj incoming attack-id) (-> (the-as attack-info s2-0) id)) - (enemy-method-75 obj arg0 (the-as touching-shapes-entry arg3)) + ) + ((= arg2 'combo) + (and (not (logtest? (enemy-flag multi-focus) (-> obj enemy-flags))) (nonzero? (-> obj hit-points))) + ) + ((= arg2 'touch) + (enemy-method-75 obj arg0 (the-as touching-shapes-entry arg3)) + ) + ((= arg2 'touched) + (when (logtest? (-> obj enemy-flags) (enemy-flag attackable-backup)) + (let* ((s3-1 arg0) + (v1-20 (if (type? s3-1 process-drawable) + (the-as process-drawable s3-1) + ) + ) + ) + (when v1-20 + (let* ((s3-2 (-> v1-20 root)) + (a1-4 (if (type? s3-2 collide-shape) + s3-2 + ) + ) + (s3-3 (-> arg3 param 0)) + ) + (if (and a1-4 + s3-3 + ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s3-3) + (the-as collide-shape a1-4) + (collide-action solid) + (collide-action) + ) + ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s3-3) + (-> obj root-override2) + (collide-action solid) + (collide-action) + ) + ) + (set! (-> obj auto-reset-penetrate-time) (the-as uint (-> pp clock frame-counter))) + ) + ) + ) + ) + ) + (enemy-method-76 obj arg0 arg3) + ) + ((= arg2 'attack-invinc) + (case (-> (the-as attack-info (-> arg3 param 1)) mode) + (('endlessfall) + (let ((v1-31 (-> obj root-override2 root-prim))) + (set! (-> v1-31 prim-core collide-as) (collide-spec)) + (set! (-> v1-31 prim-core collide-with) (collide-spec)) + ) + 0 + (enemy-method-73 obj) + ) + ) + ) + ((= arg2 'attack) + (let ((s2-0 (the-as object (-> arg3 param 1)))) + (when (!= (-> (the-as attack-info s2-0) id) (-> obj incoming attack-id)) + (cond + ((and (logtest? (-> obj enemy-flags) (enemy-flag enable-on-active)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + (let* ((s1-0 obj) + (s0-0 (method-of-object s1-0 enemy-method-106)) + ) + (set! sv-432 arg0) + (set! sv-448 arg3) + (let ((a3-3 (get-penetrate-using-from-attack-event (the-as process-drawable arg0) arg3))) + (s0-0 s1-0 sv-432 sv-448 (the-as int a3-3) (the-as attack-info s2-0)) + ) + ) + (send-event (ppointer->process (-> obj parent)) 'child-hit) + 0 + (if (not *debug-unkillable*) + (enemy-method-48 obj arg0 arg3) + ) + (let ((s2-1 (the-as attack-info (enemy-method-58 obj arg0 arg3)))) + (when s2-1 + (logclear! (-> obj enemy-flags) (enemy-flag called-dying)) + (enemy-method-108 obj (the-as enemy arg0) arg3) + (let ((a1-13 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-13 from) (process->ppointer arg0)) + (set! (-> a1-13 num-params) (the-as int arg1)) + (set! (-> a1-13 message) (the-as symbol s2-1)) + (set! (-> a1-13 param 0) (-> arg3 param 0)) + (set! (-> a1-13 param 1) (-> arg3 param 1)) + (set! (-> a1-13 param 2) (-> arg3 param 2)) + (set! (-> a1-13 param 3) (-> arg3 param 3)) + (set! (-> a1-13 param 4) (-> arg3 param 4)) + (set! (-> a1-13 param 5) (-> arg3 param 5)) + (send-event-function obj a1-13) + ) + ) + ) + ) + (else + (set! (-> obj incoming attack-id) (-> (the-as attack-info s2-0) id)) + (enemy-method-75 obj arg0 (the-as touching-shapes-entry arg3)) + ) ) ) ) ) - ) - ((= arg2 'hit-flinch) - (when (zero? (-> obj hit-points)) + ((= arg2 'hit-flinch) + (when (zero? (-> obj hit-points)) + (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) + (enemy-method-73 obj) + ) + #t + ) + ((= arg2 '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)) @@ -1809,138 +1845,17 @@ (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) (process-contact-action arg0) (send-event arg0 'get-attack-count 1) - (enemy-method-73 obj) - ) - #t - ) - ((= arg2 '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) - (when (zero? (-> obj hit-points)) - (case (-> obj incoming knocked-type) - (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) - (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) - 0 - ) - ) - ) - (go (method-of-object obj knocked)) - ) - ((= arg2 'hit) - (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)) - (enemy-method-73 obj) - (go (method-of-object obj hit)) - ) - ) - ((= arg2 'cue-chase) - (when (and (> (-> obj hit-points) 0) - (zero? (-> obj fated-time)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (let ((v1-162 (logtest? (enemy-flag alert) (-> obj enemy-flags)))) - (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice alert victory called-dying)) - (set! (-> obj enemy-flags) (logior (enemy-flag dangerous-backup) (-> obj enemy-flags))) - (logclear! (-> obj mask) (process-mask actor-pause)) - (cond - (v1-162 - (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) - (go-ambush obj) - (go-hostile obj) - ) - ) - ((and (-> obj next-state) (let ((v1-173 (-> obj next-state name))) - (or (= v1-173 'dormant) (= v1-173 'dormant-aware)) - ) - ) - (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) - (go-ambush obj) - (go (method-of-object obj notice)) - ) + (when (zero? (-> obj hit-points)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + 0 ) ) ) - #t + (go (method-of-object obj knocked)) ) - ) - ((= arg2 'cue-wake) - (when (and (> (-> obj hit-points) 0) - (zero? (-> obj fated-time)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (logclear! (-> obj enemy-flags) (enemy-flag alert victory called-dying)) - (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) - (go-ambush obj) - (enemy-method-72 obj) - ) - #t - ) - ) - ((= arg2 'jump) - (when (and (> (-> obj hit-points) 0) - (zero? (-> obj fated-time)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (logclear! (-> obj mask) (process-mask actor-pause)) - (set! (-> obj jump-why) (-> arg3 param 0)) - (set! (-> obj event-param-point quad) (-> (the-as vector (-> arg3 param 1)) quad)) - (go (method-of-object obj jump)) - ) - ) - ((= arg2 'death-start) - (set! (-> obj enemy-flags) (the-as enemy-flag (logior (enemy-flag recover) (-> obj enemy-flags)))) - (send-event (ppointer->process (-> obj parent)) 'child-die) - (drop-pickup (-> obj fact-info-override) #t *entity-pool* (-> obj fact-info-override) 0) - (let ((s5-1 (-> obj on-death))) - (if s5-1 - (eval! - (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (-> obj root-override2 trans)) - (the-as pair s5-1) - ) - ) - ) - ) - ((= arg2 'death-end) - (if (-> obj skel effect) - (logior! (-> obj skel effect flags) (effect-control-flag ecf2)) - ) - (logior! (-> obj draw status) (draw-control-status no-draw)) - (logclear! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) - (logclear! (-> obj focus-status) (focus-status dangerous)) - (logclear! (-> obj enemy-flags) (enemy-flag check-water)) - ) - ((= arg2 'instant-death) - (when (and (> (-> obj hit-points) 0) (zero? (-> obj fated-time))) - (set! (-> obj hit-points) 0) - (set! (-> obj root-override2 penetrated-by) (enemy-method-59 obj)) - (let ((s5-2 (enemy-method-50 obj (new 'stack-no-clear 'vector)))) - (vector-z-quaternion! s5-2 (-> obj root-override2 quat)) - (vector-float*! s5-2 s5-2 -1.0) - (vector-normalize! s5-2 1.0) - ) + ((= arg2 'hit) (logclear! (-> obj mask) (process-mask actor-pause)) (logclear! (-> obj focus-status) (focus-status dangerous)) (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) @@ -1952,88 +1867,187 @@ (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))) - (enemy-method-73 obj) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (if (zero? (-> obj hit-points)) + (enemy-method-73 obj) + (go (method-of-object obj hit)) + ) ) - ) - ((= arg2 'die-fast) - (logior! (-> obj draw status) (draw-control-status no-draw)) - (enemy-method-132 obj) - (send-event (ppointer->process (-> obj parent)) 'child-die) - (let ((s5-3 (-> obj on-death))) - (if s5-3 - (eval! - (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (-> obj root-override2 trans)) - (the-as pair s5-3) + ((= arg2 'cue-chase) + (when (and (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + (let ((v1-162 (logtest? (enemy-flag alert) (-> obj enemy-flags)))) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice alert victory called-dying)) + (set! (-> obj enemy-flags) (logior (enemy-flag dangerous-backup) (-> obj enemy-flags))) + (logclear! (-> obj mask) (process-mask actor-pause)) + (cond + (v1-162 + (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (go-ambush obj) + (go-hostile obj) + ) + ) + ((and (-> obj next-state) (let ((v1-173 (-> obj next-state name))) + (or (= v1-173 'dormant) (= v1-173 'dormant-aware)) + ) + ) + (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (go-ambush obj) + (go (method-of-object obj notice)) + ) + ) ) ) - ) - (cleanup-for-death obj) - (go (method-of-object obj die-fast)) - ) - ((= arg2 'victory) - (if (and (-> obj enemy-info use-victory) - (not (and (-> obj next-state) (= (-> obj next-state name) 'victory))) - (> (-> obj hit-points) 0) - (zero? (-> obj fated-time)) - (zero? (logand (-> obj focus-status) (focus-status grabbed))) - ) - (go (method-of-object obj victory)) - ) - ) - ((= arg2 'nav-control) - (if (nonzero? (-> obj nav)) - (-> obj nav) - ) - ) - ((= arg2 'push-trans) - (move-by-vector! (-> obj root-override2) (the-as vector (-> arg3 param 0))) - ) - ((= arg2 'move-trans) - (move-to-point! (-> obj root-override2) (the-as vector (-> arg3 param 0))) - ) - ((= arg2 'shadow) - (cond - ((-> arg3 param 0) - (let ((v1-320 (-> obj draw shadow-ctrl))) - (logclear! (-> v1-320 settings flags) (shadow-flags disable-draw)) - ) - 0 - ) - (else - (let ((v1-323 (-> obj draw shadow-ctrl))) - (logior! (-> v1-323 settings flags) (shadow-flags disable-draw)) - ) - 0 + #t ) ) - ) - ((= arg2 'color-effect) - (let ((v1-325 (-> arg3 param 0))) - (set! s5-5 - (cond - ((= v1-325 'dark) - (let ((f30-0 (rand-vu-float-range 0.2 1.0))) - (set-vector! (-> obj draw color-mult) (lerp 1.0 1.0 f30-0) (lerp 1.0 0.0 f30-0) (lerp 1.0 1.0 f30-0) 1.0) - (set! s5-5 (-> obj draw color-emissive)) - (set! (-> s5-5 x) (lerp 0.0 0.3 f30-0)) - (set! (-> s5-5 y) (lerp 0.0 0.0 f30-0)) - (set! (-> s5-5 z) (lerp 0.0 0.3 f30-0)) + ((= arg2 'cue-wake) + (when (and (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) ) - (set! (-> s5-5 w) 1.0) - s5-5 - ) - ((= v1-325 #f) - (set-vector! (-> obj draw color-mult) 1.0 1.0 1.0 1.0) - (set! s5-5 (-> obj draw color-emissive)) - (set! (-> s5-5 quad) (the-as uint128 0)) - s5-5 - ) + (logclear! (-> obj enemy-flags) (enemy-flag alert victory called-dying)) + (if (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (go-ambush obj) + (enemy-method-72 obj) + ) + #t + ) + ) + ((= arg2 'jump) + (when (and (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (set! (-> obj jump-why) (-> arg3 param 0)) + (set! (-> obj event-param-point quad) (-> (the-as vector (-> arg3 param 1)) quad)) + (go (method-of-object obj jump)) + ) + ) + ((= arg2 'death-start) + (set! (-> obj enemy-flags) (the-as enemy-flag (logior (enemy-flag recover) (-> obj enemy-flags)))) + (send-event (ppointer->process (-> obj parent)) 'child-die) + (drop-pickup (-> obj fact-info-override) #t *entity-pool* (-> obj fact-info-override) 0) + (let ((s5-1 (-> obj on-death))) + (if s5-1 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (-> obj root-override2 trans)) + (the-as pair s5-1) ) ) + ) ) - ) + ((= arg2 'death-end) + (if (-> obj skel effect) + (logior! (-> obj skel effect flags) (effect-control-flag ecf2)) + ) + (logior! (-> obj draw status) (draw-control-status no-draw)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (set! (-> obj enemy-flags) (logclear (-> obj enemy-flags) (enemy-flag check-water))) + ) + ((= arg2 'instant-death) + (when (and (> (-> obj hit-points) 0) (zero? (-> obj fated-time))) + (set! (-> obj hit-points) 0) + (set! (-> obj root-override2 penetrated-by) (enemy-method-59 obj)) + (let ((s5-2 (enemy-method-50 obj (new 'stack-no-clear 'vector)))) + (vector-z-quaternion! s5-2 (-> obj root-override2 quat)) + (vector-float*! s5-2 s5-2 -1.0) + (vector-normalize! s5-2 1.0) + ) + (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))) + (enemy-method-73 obj) + ) + ) + ((= arg2 'die-fast) + (logior! (-> obj draw status) (draw-control-status no-draw)) + (enemy-method-132 obj) + (send-event (ppointer->process (-> obj parent)) 'child-die) + (let ((s5-3 (-> obj on-death))) + (if s5-3 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer pp)) pp (-> obj root-override2 trans)) + (the-as pair s5-3) + ) + ) + ) + (cleanup-for-death obj) + (go (method-of-object obj die-fast)) + ) + ((= arg2 'victory) + (if (and (-> obj enemy-info use-victory) + (not (and (-> obj next-state) (= (-> obj next-state name) 'victory))) + (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + (go (method-of-object obj victory)) + ) + ) + ((= arg2 'nav-control) + (if (nonzero? (-> obj nav)) + (-> obj nav) + ) + ) + ((= arg2 'push-trans) + (move-by-vector! (-> obj root-override2) (the-as vector (-> arg3 param 0))) + ) + ((= arg2 'move-trans) + (move-to-point! (-> obj root-override2) (the-as vector (-> arg3 param 0))) + ) + ((= arg2 'shadow) + (cond + ((-> arg3 param 0) + (let ((v1-320 (-> obj draw shadow-ctrl))) + (logclear! (-> v1-320 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + (else + (let ((v1-323 (-> obj draw shadow-ctrl))) + (logior! (-> v1-323 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + ) + ((= arg2 'color-effect) + (case (-> arg3 param 0) + (('dark) + (let ((f30-0 (rand-vu-float-range 0.2 1.0))) + (set-vector! (-> obj draw color-mult) (lerp 1.0 1.0 f30-0) (lerp 1.0 0.0 f30-0) (lerp 1.0 1.0 f30-0) 1.0) + (set! s5-5 (-> obj draw color-emissive)) + (set! (-> s5-5 x) (lerp 0.0 0.3 f30-0)) + (set! (-> s5-5 y) (lerp 0.0 0.0 f30-0)) + (set! (-> s5-5 z) (lerp 0.0 0.3 f30-0)) + ) + (set! (-> s5-5 w) 1.0) + s5-5 + ) + ((#f) + (set-vector! (-> obj draw color-mult) 1.0 1.0 1.0 1.0) + (set! s5-5 (-> obj draw color-emissive)) + (set! (-> s5-5 quad) (the-as uint128 0)) + s5-5 + ) + ) + ) + ) ) - (none) ) ) @@ -2048,7 +2062,7 @@ ) ;; definition for method 58 of type enemy -(defmethod enemy-method-58 enemy ((obj enemy)) +(defmethod enemy-method-58 enemy ((obj enemy) (arg0 process) (arg1 event-message-block)) (let ((v1-0 (-> obj incoming penetrate-using))) (cond ((logtest? (the-as penetrate v1-0) (-> obj penetrated-flinch)) @@ -2188,9 +2202,8 @@ ) ;; definition for function enemy-event-handler -;; WARN: Return type mismatch none vs object. (defbehavior enemy-event-handler enemy ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) - (the-as object (enemy-method-74 self arg0 arg1 arg2 arg3)) + (enemy-method-74 self arg0 arg1 arg2 arg3) ) ;; definition for function enemy-simple-post diff --git a/test/decompiler/reference/jak2/engine/nav/nav-control-h_REF.gc b/test/decompiler/reference/jak2/engine/nav/nav-control-h_REF.gc index fbc1f102f8..32a2c18ba9 100644 --- a/test/decompiler/reference/jak2/engine/nav/nav-control-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/nav/nav-control-h_REF.gc @@ -304,7 +304,7 @@ (clamp-vector-to-mesh-no-gaps (_type_ vector nav-poly vector clamp-travel-vector-to-mesh-return-info) none 21) (find-first-sphere-and-update-avoid-params (_type_ vector nav-avoid-spheres-params) float 22) (set-spheres-from-nav-ids (_type_) none 23) - (add-root-sphere-to-hash! (_type_ vector int) none 24) + (add-root-sphere-to-hash! (_type_ vector int) symbol 24) (get-max-rotation-rate (_type_) float 25) (get-sphere-mask (_type_) uint 26) (get-target-speed (_type_) meters 27) diff --git a/test/decompiler/reference/jak2/engine/nav/nav-control_REF.gc b/test/decompiler/reference/jak2/engine/nav/nav-control_REF.gc index 5750cfbc5d..7d35ac53e0 100644 --- a/test/decompiler/reference/jak2/engine/nav/nav-control_REF.gc +++ b/test/decompiler/reference/jak2/engine/nav/nav-control_REF.gc @@ -949,12 +949,14 @@ (a1-31 (-> s5-0 temp-dir v1-30)) (a0-39 (-> s5-0 in-dir)) (a2-14 (-> s5-0 right-dir)) - (a3-7 (vector-dot a1-31 a2-14)) + (a3-7 (the-as number (vector-dot a1-31 a2-14))) (t0-1 #xffffffff80000000) (a2-16 #x3f800000) - (f0-30 - (* f0-29 (* (the-as float (logior (logand a3-7 (the-as uint t0-1)) a2-16)) (- 1.0 (vector-dot a1-31 a0-39)))) - ) + (f0-30 (* f0-29 (* (the-as float (logior (logand (the-as uint a3-7) (the-as uint t0-1)) a2-16)) + (- 1.0 (vector-dot a1-31 a0-39)) + ) + ) + ) ) (when (< (-> s5-0 best-dir-angle s3-0) f0-30) (set! (-> s5-0 best-dir s3-0 quad) (-> s5-0 temp-dir v1-30 quad)) @@ -2120,7 +2122,6 @@ (the-as int (-> obj root-sphere-id)) ) ) - (none) ) ;; definition for method 47 of type nav-state diff --git a/test/decompiler/reference/jak2/engine/nav/nav-enemy_REF.gc b/test/decompiler/reference/jak2/engine/nav/nav-enemy_REF.gc index 0fc61dd5ae..719acb5f79 100644 --- a/test/decompiler/reference/jak2/engine/nav/nav-enemy_REF.gc +++ b/test/decompiler/reference/jak2/engine/nav/nav-enemy_REF.gc @@ -23,27 +23,34 @@ ) ;; definition for method 74 of type nav-enemy +;; WARN: Return type mismatch none vs object. +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 7] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 15] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 23] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 33] (defmethod enemy-method-74 nav-enemy ((obj nav-enemy) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) - (case arg2 - (('nav-mesh-kill) - (deactivate obj) - #t - ) - (('nav-mesh-new) - (set! (-> obj water-max-height) (-> obj nav state mesh water-max-height)) - #t - ) - (('debug-control-on) - (go (method-of-object obj debug-control)) - ) - (('debug-control-off) - (enemy-method-72 obj) - ) - (else - ((method-of-type enemy enemy-method-74) obj arg0 arg1 arg2 arg3) - ) + (let ((v1-0 arg2)) + (the-as object (cond + ((= v1-0 'nav-mesh-kill) + (deactivate obj) + #t + ) + ((= v1-0 'nav-mesh-new) + (set! (-> obj water-max-height) (-> obj nav state mesh water-max-height)) + #t + ) + ((= v1-0 'debug-control-on) + (go (method-of-object obj debug-control)) + ) + ((= v1-0 'debug-control-off) + (enemy-method-72 obj) + ) + (else + ((method-of-type enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) ) - (none) ) ;; definition for symbol *nav-enemy-dummy-shadow-control*, type shadow-control @@ -2827,13 +2834,12 @@ ;; definition for method 82 of type nav-enemy ;; INFO: Used lq/sq -;; WARN: Return type mismatch none vs symbol. (defmethod enemy-method-82 nav-enemy ((obj nav-enemy) (arg0 enemy-jump-info)) "@abstract" (let ((v1-0 (new 'stack-no-clear 'vector))) (set! (-> v1-0 quad) (-> arg0 dest-pos quad)) (set! (-> v1-0 w) (-> obj nav-radius-backup)) - (the-as symbol (add-root-sphere-to-hash! (-> obj nav) v1-0 #x80068)) + (add-root-sphere-to-hash! (-> obj nav) v1-0 #x80068) ) ) diff --git a/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash-h_REF.gc b/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash-h_REF.gc index a0391fff00..6c9ad5d114 100644 --- a/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/spatial-hash/spatial-hash-h_REF.gc @@ -155,7 +155,7 @@ (update-from-spheres (_type_) none 28) (sphere-hash-method-29 (_type_ find-nav-sphere-ids-params int int int) none 29) (find-nav-sphere-ids (_type_ find-nav-sphere-ids-params) none 30) - (add-sphere-with-mask-and-id (_type_ vector int int) none 31) + (add-sphere-with-mask-and-id (_type_ vector int int) symbol 31) (sphere-hash-method-32 (_type_ vector vector float int) symbol 32) (remove-by-id (_type_ sphere int) none 33) ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/amphibian/amphibian_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/amphibian/amphibian_REF.gc new file mode 100644 index 0000000000..7fd4f7aa72 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/amphibian/amphibian_REF.gc @@ -0,0 +1,1975 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type amphibian-tongue-attack-info +(deftype amphibian-tongue-attack-info (structure) + ((targ-dist float :offset-assert 0) + (max-length float :offset-assert 4) + (start-pos vector :inline :offset-assert 16) + (base-dir vector :inline :offset-assert 32) + (base-rot vector :inline :offset-assert 48) + (targ-pos vector :inline :offset-assert 64) + (targ-dir vector :inline :offset-assert 80) + (targ-rot vector :inline :offset-assert 96) + (clamped-pos vector :inline :offset-assert 112) + (clamped-dir vector :inline :offset-assert 128) + (clamped-rot vector :inline :offset-assert 144) + ) + :method-count-assert 9 + :size-assert #xa0 + :flag-assert #x9000000a0 + ) + +;; definition for method 3 of type amphibian-tongue-attack-info +(defmethod inspect amphibian-tongue-attack-info ((obj amphibian-tongue-attack-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'amphibian-tongue-attack-info) + (format #t "~1Ttarg-dist: ~f~%" (-> obj targ-dist)) + (format #t "~1Tmax-length: ~f~%" (-> obj max-length)) + (format #t "~1Tstart-pos: #~%" (-> obj start-pos)) + (format #t "~1Tbase-dir: #~%" (-> obj base-dir)) + (format #t "~1Tbase-rot: #~%" (-> obj base-rot)) + (format #t "~1Ttarg-pos: #~%" (-> obj targ-pos)) + (format #t "~1Ttarg-dir: #~%" (-> obj targ-dir)) + (format #t "~1Ttarg-rot: #~%" (-> obj targ-rot)) + (format #t "~1Tclamped-pos: #~%" (-> obj clamped-pos)) + (format #t "~1Tclamped-dir: #~%" (-> obj clamped-dir)) + (format #t "~1Tclamped-rot: #~%" (-> obj clamped-rot)) + (label cfg-4) + obj + ) + +;; definition of type amphibian-joint-mod +(deftype amphibian-joint-mod (basic) + ((joint-index int32 :offset-assert 4) + (proc process-drawable :offset-assert 8) + (max-length float :offset-assert 12) + (target vector :inline :offset-assert 16) + ) + :method-count-assert 10 + :size-assert #x20 + :flag-assert #xa00000020 + (:methods + (new (symbol type process-drawable int) _type_ 0) + (amphibian-joint-mod-method-9 (_type_) none 9) + ) + ) + +;; definition for method 3 of type amphibian-joint-mod +(defmethod inspect amphibian-joint-mod ((obj amphibian-joint-mod)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tjoint-index: ~D~%" (-> obj joint-index)) + (format #t "~1Tproc: ~A~%" (-> obj proc)) + (format #t "~1Tmax-length: ~f~%" (-> obj max-length)) + (format #t "~1Ttarget: #~%" (-> obj target)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-amphibian amphibian amphibian-lod0-jg -1 + ((amphibian-lod0-mg (meters 20)) (amphibian-lod1-mg (meters 999999))) + :bounds (static-spherem 0 1 0 5.5) + :shadow amphibian-shadow-mg + ) + +;; definition of type amphibian-anim-info +(deftype amphibian-anim-info (structure) + ((anim-index int32 :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + +;; definition for method 3 of type amphibian-anim-info +(defmethod inspect amphibian-anim-info ((obj amphibian-anim-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'amphibian-anim-info) + (format #t "~1Tanim-index: ~D~%" (-> obj anim-index)) + (label cfg-4) + obj + ) + +;; definition of type amphibian-global-info +(deftype amphibian-global-info (basic) + ((prev-blue-hit int8 :offset-assert 4) + (prev-knocked int8 :offset-assert 5) + (notice-anim int32 2 :offset-assert 8) + (run-anim int32 2 :offset-assert 16) + (knocked-anim int32 3 :offset-assert 24) + (knocked-land-anim int32 3 :offset-assert 36) + (blue-hit-anim int32 3 :offset-assert 48) + (jump-wind-up-anim int32 2 :offset-assert 60) + (jump-in-air-anim int32 2 :offset-assert 68) + (jump-land-anim int32 2 :offset-assert 76) + ) + :method-count-assert 9 + :size-assert #x54 + :flag-assert #x900000054 + ) + +;; definition for method 3 of type amphibian-global-info +(defmethod inspect amphibian-global-info ((obj amphibian-global-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tprev-blue-hit: ~D~%" (-> obj prev-blue-hit)) + (format #t "~1Tprev-knocked: ~D~%" (-> obj prev-knocked)) + (format #t "~1Tnotice-anim[2] @ #x~X~%" (-> obj notice-anim)) + (format #t "~1Trun-anim[2] @ #x~X~%" (-> obj run-anim)) + (format #t "~1Tknocked-anim[3] @ #x~X~%" (-> obj knocked-anim)) + (format #t "~1Tknocked-land-anim[3] @ #x~X~%" (-> obj knocked-land-anim)) + (format #t "~1Tblue-hit-anim[3] @ #x~X~%" (-> obj blue-hit-anim)) + (format #t "~1Tjump-wind-up-anim[2] @ #x~X~%" (-> obj jump-wind-up-anim)) + (format #t "~1Tjump-in-air-anim[2] @ #x~X~%" (-> obj jump-in-air-anim)) + (format #t "~1Tjump-land-anim[2] @ #x~X~%" (-> obj jump-land-anim)) + (label cfg-4) + obj + ) + +;; definition of type amphibian +(deftype amphibian (nav-enemy) + ((tongue-scale float :offset-assert 604) + (flags uint8 :offset-assert 608) + (knocked-anim-index int8 :offset-assert 609) + (jump-anim-index int8 :offset-assert 610) + (tongue-mode uint64 :offset-assert 616) + (tongue-mod amphibian-joint-mod :offset-assert 624) + (attacker-handle handle :offset-assert 632) + (prev-ry float :offset-assert 640) + (prev-ry1 float :offset-assert 644) + ) + :heap-base #x210 + :method-count-assert 188 + :size-assert #x288 + :flag-assert #xbc02100288 + (:methods + (attack-forward () _type_ :state 178) + (attack-forward-lunge () _type_ :state 179) + (attack-forward-end () _type_ :state 180) + (attack-spin () _type_ :state 181) + (stare-idle () _type_ :state 182) + (tongue-attack () _type_ :state 183) + (amphibian-method-184 (_type_ vector vector) vector 184) + (amphibian-method-185 (_type_ amphibian-tongue-attack-info) none 185) + (amphibian-method-186 (_type_ vector vector) symbol 186) + (amphibian-method-187 (_type_) none 187) + ) + ) + +;; definition for method 3 of type amphibian +(defmethod inspect amphibian ((obj amphibian)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Ttongue-scale: ~f~%" (-> obj tongue-scale)) + (format #t "~2Tflags: ~D~%" (-> obj flags)) + (format #t "~2Tknocked-anim-index: ~D~%" (-> obj knocked-anim-index)) + (format #t "~2Tjump-anim-index: ~D~%" (-> obj jump-anim-index)) + (format #t "~2Ttongue-mode: ~D~%" (-> obj tongue-mode)) + (format #t "~2Ttongue-mod: ~A~%" (-> obj tongue-mod)) + (format #t "~2Tattacker-handle: ~D~%" (-> obj attacker-handle)) + (format #t "~2Tprev-ry: ~f~%" (-> obj prev-ry)) + (format #t "~2Tprev-ry1: ~f~%" (-> obj prev-ry1)) + (label cfg-4) + obj + ) + +;; definition for symbol *amphibian-global-info*, type amphibian-global-info +(define *amphibian-global-info* (new 'static 'amphibian-global-info + :notice-anim (new 'static 'array int32 2 28 29) + :run-anim (new 'static 'array int32 2 26 27) + :knocked-anim (new 'static 'array int32 3 6 8 10) + :knocked-land-anim (new 'static 'array int32 3 7 9 11) + :blue-hit-anim (new 'static 'array int32 3 22 23 24) + :jump-wind-up-anim (new 'static 'array int32 2 30 33) + :jump-in-air-anim (new 'static 'array int32 2 31 34) + :jump-land-anim (new 'static 'array int32 2 32 35) + ) + ) + +;; definition for symbol *amphibian-nav-enemy-info*, type nav-enemy-info +(define *amphibian-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010401 #x0 #x0 #x0) + :idle-anim 4 + :notice-anim 28 + :hostile-anim 26 + :hit-anim 6 + :knocked-anim 6 + :knocked-land-anim 7 + :die-anim 12 + :die-falling-anim 21 + :victory-anim -1 + :jump-wind-up-anim 30 + :jump-in-air-anim 31 + :jump-land-anim 32 + :neck-joint 11 + :look-at-joint 12 + :bullseye-joint 4 + :sound-hit (static-sound-name "amphibian-hit") + :sound-die (static-sound-name "amphibian-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 20) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #x11fffdffa + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3.5) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 1 + :recover-gnd-collide-with (collide-spec backgnd crate obstacle hit-by-others-list pusher) + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 106496.0 + :knocked-soft-vxz-hi 94208.0 + :knocked-soft-vy-lo 122880.0 + :knocked-soft-vy-hi 139264.0 + :knocked-medium-vxz-lo 106496.0 + :knocked-medium-vxz-hi 94208.0 + :knocked-medium-vy-lo 122880.0 + :knocked-medium-vy-hi 139264.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 1) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint -1 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #t + :use-circling #t + :use-pacing #t + :walk-anim 16 + :turn-anim -1 + :run-anim 26 + :taunt-anim -1 + :run-travel-speed (meters 6) + :run-acceleration (meters 8) + :run-turning-acceleration (meters 10) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 4) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 180.0) + :notice-nav-radius (meters 2) + :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! (-> *amphibian-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 7 of type amphibian-joint-mod +(defmethod relocate amphibian-joint-mod ((obj amphibian-joint-mod) (arg0 int)) + (&+! (-> obj proc) arg0) + obj + ) + +;; definition for method 74 of type amphibian +(defmethod enemy-method-74 amphibian ((obj amphibian) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('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) + (when (= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) + (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + 0 + ) + (when (zero? (-> obj hit-points)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + 0 + ) + ) + ) + (go (method-of-object obj knocked)) + (if (and (logtest? (-> obj incoming penetrate-using) 16) + (nonzero? (-> obj hit-points)) + (zero? (-> obj fated-time)) + ) + 'push + #t + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +;; definition for function amphibian-joint-mod-callback +;; WARN: Return type mismatch int vs none. +(defun amphibian-joint-mod-callback ((arg0 cspace) (arg1 transformq)) + (cspace<-parented-transformq-joint! arg0 arg1) + (let ((s3-0 (new 'stack-no-clear 'inline-array 'matrix 3)) + (s2-0 (-> arg0 param1)) + (s5-0 (-> arg0 bone transform)) + (s4-0 (-> arg0 parent bone transform)) + ) + (vector-! (the-as vector (-> s3-0 0)) (-> (the-as amphibian-joint-mod s2-0) target) (-> s4-0 trans)) + (let ((f30-0 (fmin (vector-length (the-as vector (-> s3-0 0))) (-> (the-as amphibian-joint-mod s2-0) max-length)))) + (vector-normalize! (the-as vector (-> s3-0 0)) 1.0) + (quaternion-from-two-vectors! + (the-as quaternion (-> s3-0 0 vector 1)) + (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s5-0 vector 2) 1.0) + (the-as vector (-> s3-0 0)) + ) + (quaternion->matrix (the-as matrix (-> s3-0 0 vector 2)) (the-as quaternion (-> s3-0 0 vector 1))) + (matrix*! s5-0 s5-0 (the-as matrix (-> s3-0 0 vector 2))) + (vector-normalize-copy! + (-> s5-0 trans) + (-> s5-0 vector 2) + (* f30-0 (-> (the-as amphibian (-> (the-as amphibian-joint-mod s2-0) proc)) tongue-scale)) + ) + ) + (vector+! (-> s5-0 trans) (-> s5-0 trans) (-> s4-0 trans)) + ) + (set! (-> arg0 param0) #f) + 0 + (none) + ) + +;; definition for method 9 of type amphibian-joint-mod +;; WARN: Return type mismatch amphibian-joint-mod vs none. +(defmethod amphibian-joint-mod-method-9 amphibian-joint-mod ((obj amphibian-joint-mod)) + (let ((v1-3 (-> obj proc node-list data (-> obj joint-index)))) + (set! (-> v1-3 param0) (the-as (function cspace matrix none) amphibian-joint-mod-callback)) + (set! (-> v1-3 param1) obj) + ) + (none) + ) + +;; definition for method 0 of type amphibian-joint-mod +(defmethod new amphibian-joint-mod ((allocation symbol) (type-to-make type) (arg0 process-drawable) (arg1 int)) + (let ((v0-0 (object-new allocation type-to-make (the-as int (-> type-to-make size))))) + (set! (-> v0-0 proc) arg0) + (set! (-> v0-0 joint-index) arg1) + v0-0 + ) + ) + +;; definition for method 106 of type amphibian +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-106 amphibian ((obj amphibian) (arg0 process) (arg1 object) (arg2 int) (arg3 attack-info)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-106))) + (t9-0 obj arg0 arg1 arg2 arg3) + ) + (let ((a0-3 (enemy-method-134 obj arg0 arg3))) + (if a0-3 + (set! (-> obj attacker-handle) (process->handle a0-3)) + (set! (-> obj attacker-handle) (the-as handle #f)) + ) + ) + 0 + (none) + ) + +;; definition for method 56 of type amphibian +(defmethod enemy-method-56 amphibian ((obj amphibian) (arg0 process) (arg1 event-message-block)) + (let* ((t9-0 (method-of-type nav-enemy enemy-method-56)) + (v0-0 (t9-0 obj arg0 arg1)) + ) + (let ((v1-1 (-> obj hit-points))) + (if (> (- v1-1 v0-0) 0) + (set! v0-0 (+ v1-1 -1)) + ) + ) + v0-0 + ) + ) + +;; definition for method 51 of type amphibian +(defmethod enemy-method-51 amphibian ((obj amphibian)) + (local-vars (f0-1 float)) + 0.0 + (set! f0-1 + (cond + ((or (zero? (-> obj hit-points)) (nonzero? (-> obj fated-time))) + ((method-of-type nav-enemy enemy-method-51) obj) + ) + (else + (set! f0-1 (quaternion-y-angle (-> obj root-override2 quat))) + (let ((a0-5 (handle->process (-> obj focus handle)))) + (when a0-5 + (let ((v1-12 (get-trans (the-as process-focusable a0-5) 0))) + (set! f0-1 + (atan (- (-> v1-12 x) (-> obj root-override2 trans x)) (- (-> v1-12 z) (-> obj root-override2 trans z))) + ) + ) + ) + ) + f0-1 + ) + ) + ) + f0-1 + ) + +;; definition for method 52 of type amphibian +(defmethod enemy-method-52 amphibian ((obj amphibian) (arg0 vector)) + (cond + ((and (nonzero? (-> obj hit-points)) (zero? (-> obj fated-time)) (!= (-> obj incoming knocked-type) 6)) + (enemy-method-50 obj arg0) + (let ((f30-0 (get-rand-float-range obj 0.0 1.0))) + (vector-float*! arg0 arg0 (lerp 43417.6 58982.4 f30-0)) + (set! (-> arg0 y) (lerp 114688.0 116736.0 f30-0)) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-52) obj arg0) + ) + ) + (none) + ) + +;; definition for method 77 of type amphibian +(defmethod enemy-method-77 amphibian ((obj amphibian) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let* ((v1-3 (enemy-method-120 obj 3 (ash 1 (-> *amphibian-global-info* prev-blue-hit)))) + (s5-1 (-> obj draw art-group data (-> *amphibian-global-info* blue-hit-anim v1-3))) + ) + (set! (-> *amphibian-global-info* prev-blue-hit) v1-3) + (ja-channel-push! 1 (seconds 0.02)) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim s5-1)) + (set! (-> a0-10 param 0) (the float (+ (-> (the-as art-joint-anim s5-1) frames num-frames) -1))) + (set! (-> a0-10 param 1) 1.0) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim s5-1) num-func-seek!) + ) + ) + ) + (else + (let ((v1-11 0)) + (when (or (zero? (-> obj hit-points)) (nonzero? (-> obj fated-time))) + (let ((a2-5 (logior (ash 1 (-> *amphibian-global-info* prev-knocked)) 1))) + (set! v1-11 (enemy-method-120 obj 3 a2-5)) + ) + ) + (set! (-> *amphibian-global-info* prev-knocked) v1-11) + (set! (-> obj knocked-anim-index) v1-11) + (let ((s4-0 (-> obj draw art-group data (-> *amphibian-global-info* knocked-anim v1-11)))) + (ja-channel-push! 1 0) + (let ((a0-25 (-> obj skel root-channel 0))) + (set! (-> a0-25 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-25 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-25 param 1) (-> arg0 0)) + (set! (-> a0-25 frame-num) 0.0) + (joint-control-channel-group! a0-25 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + ) + #t + ) + +;; definition for method 78 of type amphibian +(defmethod enemy-method-78 amphibian ((obj amphibian) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (ja-channel-push! 1 (seconds 0.015)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 25))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 25)) 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 25)) num-func-seek!) + ) + #t + ) + ) + (else + (let ((s4-0 (-> obj draw art-group data (-> *amphibian-global-info* knocked-land-anim (-> obj knocked-anim-index)))) + ) + (if (zero? (-> obj knocked-anim-index)) + (ja-channel-push! 1 (seconds 0.07)) + (ja-channel-push! 1 (seconds 0.15)) + ) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-10 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + ) + ) + +;; definition for method 89 of type amphibian +(defmethod enemy-method-89 amphibian ((obj amphibian) (arg0 enemy-jump-info)) + (let ((a0-1 (-> obj skel root-channel 0))) + (set! (-> a0-1 param 0) 1.0) + (joint-control-channel-group! a0-1 (the-as art-joint-anim #f) num-func-loop!) + ) + (let* ((v1-5 (get-rand-int obj 2)) + (s4-0 (-> obj draw art-group data (-> *amphibian-global-info* jump-wind-up-anim v1-5))) + ) + (set! (-> obj jump-anim-index) v1-5) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-9 (-> obj skel root-channel 0))) + (set! (-> a0-9 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-9 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-9 param 1) (-> arg0 anim-speed)) + (set! (-> a0-9 frame-num) 0.0) + (joint-control-channel-group! a0-9 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + +;; definition for method 87 of type amphibian +(defmethod enemy-method-87 amphibian ((obj amphibian) (arg0 enemy-jump-info)) + (let ((s4-0 (-> obj draw art-group data (-> *amphibian-global-info* jump-in-air-anim (-> obj jump-anim-index))))) + (ja-channel-push! 1 (seconds 0.07)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-6 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-6 param 1) (-> arg0 anim-speed)) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! a0-6 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + +;; definition for method 88 of type amphibian +(defmethod enemy-method-88 amphibian ((obj amphibian) (arg0 enemy-jump-info)) + (let ((s4-0 (-> obj draw art-group data (-> *amphibian-global-info* jump-land-anim (-> obj jump-anim-index))))) + (if (zero? (-> obj jump-anim-index)) + (ja-channel-push! 1 (seconds 0.07)) + (ja-channel-push! 1 (seconds 0.04)) + ) + (let ((a0-7 (-> obj skel root-channel 0))) + (set! (-> a0-7 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-7 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-7 param 1) (-> arg0 anim-speed)) + (set! (-> a0-7 frame-num) 0.0) + (joint-control-channel-group! a0-7 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + +;; definition for method 90 of type amphibian +;; INFO: Used lq/sq +;; WARN: Return type mismatch object vs symbol. +(defmethod enemy-method-90 amphibian ((obj amphibian) (arg0 int) (arg1 enemy-jump-info)) + (when (or (= (-> obj jump-why) 3) (= (-> obj jump-why) 2)) + (cond + ((zero? arg0) + (logior! (-> obj focus-status) (focus-status touch-water under-water)) + ) + (else + (when (logtest? (-> obj focus-status) (focus-status touch-water)) + (let ((s3-0 (new 'stack-no-clear 'water-info))) + (water-info-init! (-> obj root-override2) s3-0 (collide-action solid semi-solid)) + (let ((v1-12 #f)) + (cond + ((not (logtest? (water-flags touch-water) (-> s3-0 flags))) + (if (logtest? (-> obj focus-status) (focus-status under-water)) + (set! v1-12 #t) + ) + (logclear! (-> obj focus-status) (focus-status touch-water under-water)) + ) + ((logtest? (-> obj focus-status) (focus-status under-water)) + (let* ((a0-18 (-> obj root-override2 root-prim prim-core)) + (f0-1 (+ (-> a0-18 world-sphere y) (-> a0-18 world-sphere w))) + ) + (if (< (-> s3-0 trans y) f0-1) + (set! v1-12 #t) + ) + ) + ) + ) + (when v1-12 + (logclear! (-> obj focus-status) (focus-status under-water)) + (let ((s2-0 (new 'stack-no-clear 'vector))) + (set! (-> s2-0 quad) (-> obj root-override2 trans quad)) + (when (logtest? (water-flags touch-water) (-> s3-0 flags)) + (set! (-> s2-0 y) (-> s3-0 trans y)) + (let ((s3-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s3-1 + (let ((t9-2 (method-of-type part-tracker activate))) + (t9-2 + (the-as part-tracker s3-1) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-3 run-function-in-process) + (a0-28 s3-1) + (a1-6 part-tracker-init) + (a2-6 (-> *part-group-id-table* 121)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> s2-0 quad)) + ((the-as (function object object object object object object object object none) t9-3) + a0-28 + a1-6 + a2-6 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> s3-1 ppointer) + ) + ) + (sound-play "splash-out") + ) + ) + ) + ) + ) + ) + ) + ) + ) + (the-as + symbol + (cond + ((and (= arg0 3) (= (-> obj jump-anim-index) 1)) + (let* ((v1-35 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + (s4-1 (and v1-35 (= v1-35 (-> obj draw art-group data 36)))) + ) + (cond + ((and (not s4-1) (< (-> obj root-override2 transv y) 0.0)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-37 (-> obj skel root-channel 0))) + (set! (-> a0-37 frame-group) (the-as art-joint-anim (-> obj draw art-group data 36))) + (set! (-> a0-37 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 36)) frames num-frames) -1)) + ) + (set! (-> a0-37 param 1) (-> arg1 anim-speed)) + (set! (-> a0-37 frame-num) 0.0) + (joint-control-channel-group! a0-37 (the-as art-joint-anim (-> obj draw art-group data 36)) num-func-seek!) + ) + #f + ) + (else + (set! s4-1 (and (ja-done? 0) s4-1)) + (let ((a0-39 (-> obj skel root-channel 0))) + (set! (-> a0-39 param 0) (the float (+ (-> a0-39 frame-group frames num-frames) -1))) + (set! (-> a0-39 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-39 (the-as art-joint-anim #f) num-func-seek!) + ) + (ja-blend-eval) + s4-1 + ) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-90) obj arg0 arg1) + ) + ) + ) + ) + +;; definition for method 184 of type amphibian +(defmethod amphibian-method-184 amphibian ((obj amphibian) (arg0 vector) (arg1 vector)) + (vector<-cspace! arg0 (-> obj node-list data 13)) + (vector-! arg1 (-> obj tongue-mod target) arg0) + (vector-normalize! arg1 (fmin (* (vector-length arg1) (-> obj tongue-scale)) (-> obj tongue-mod max-length))) + (vector+! arg1 arg1 arg0) + ) + +;; definition for method 185 of type amphibian +;; INFO: Used lq/sq +;; WARN: Return type mismatch float vs none. +(defmethod amphibian-method-185 amphibian ((obj amphibian) (arg0 amphibian-tongue-attack-info)) + (let ((a0-1 (-> obj node-list data 11 bone transform))) + (set! (-> arg0 base-dir quad) (-> a0-1 vector 2 quad)) + ) + (vector-normalize! (-> arg0 base-dir) 1.0) + (vector<-cspace! (-> arg0 start-pos) (-> obj node-list data 13)) + (let ((a0-7 (handle->process (-> obj focus handle)))) + (cond + (a0-7 + (set! (-> arg0 targ-pos quad) (-> (get-trans (the-as process-focusable a0-7) 3) quad)) + ) + (else + (vector-normalize-copy! (-> arg0 targ-pos) (-> arg0 base-dir) 36864.0) + (vector+! (-> arg0 targ-pos) (-> arg0 targ-pos) (-> arg0 start-pos)) + ) + ) + ) + (vector-! (-> arg0 targ-dir) (-> arg0 targ-pos) (-> arg0 start-pos)) + (set! (-> arg0 targ-dist) (vector-length (-> arg0 targ-dir))) + (vector-normalize! (-> arg0 targ-dir) 1.0) + (rot-zxy-from-vector! (-> arg0 targ-rot) (-> arg0 targ-dir)) + (rot-zxy-from-vector! (-> arg0 base-rot) (-> arg0 base-dir)) + (set! (-> arg0 clamped-dir quad) (-> arg0 targ-dir quad)) + (set! (-> arg0 clamped-rot quad) (-> arg0 targ-rot quad)) + (let ((f30-0 (deg- (-> arg0 clamped-rot x) (-> arg0 base-rot x))) + (f0-5 (deg- (-> arg0 clamped-rot y) (-> arg0 base-rot y))) + ) + (when (or (< 4004.9778 (fabs f30-0)) (< 4004.9778 (fabs f0-5))) + (let ((f1-3 (fmax -4004.9778 (fmin 4004.9778 f30-0))) + (f0-7 (fmax -4004.9778 (fmin 4004.9778 f0-5))) + ) + (set! (-> arg0 clamped-rot x) (+ (-> arg0 base-rot x) f1-3)) + (set! (-> arg0 clamped-rot y) (+ (-> arg0 base-rot y) f0-7)) + ) + (set-vector! (-> arg0 clamped-dir) 0.0 0.0 1.0 1.0) + (vector-rotate-around-x! (-> arg0 clamped-dir) (-> arg0 clamped-dir) (-> arg0 clamped-rot x)) + (vector-rotate-around-y! (-> arg0 clamped-dir) (-> arg0 clamped-dir) (-> arg0 clamped-rot y)) + ) + ) + (vector-normalize-copy! (-> arg0 clamped-pos) (-> arg0 clamped-dir) (fmax 6144.0 (-> arg0 targ-dist))) + (vector+! (-> arg0 clamped-pos) (-> arg0 clamped-pos) (-> arg0 start-pos)) + (let ((s4-3 (new 'stack-no-clear 'collide-query))) + (set! (-> s4-3 start-pos quad) (-> arg0 start-pos quad)) + (vector-normalize-copy! (-> s4-3 move-dist) (-> arg0 clamped-dir) 73728.0) + (let ((v1-32 s4-3)) + (set! (-> v1-32 radius) 409.6) + (set! (-> v1-32 collide-with) (collide-spec backgnd crate obstacle hit-by-others-list pusher)) + (set! (-> v1-32 ignore-process0) obj) + (set! (-> v1-32 ignore-process1) #f) + (set! (-> v1-32 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-32 action-mask) (collide-action solid)) + ) + (let ((f0-18 (fill-and-probe-using-line-sphere *collide-cache* s4-3))) + (if (>= f0-18 0.0) + (set! (-> arg0 max-length) (* 73728.0 f0-18)) + (set! (-> arg0 max-length) 73728.0) + ) + ) + ) + (none) + ) + +;; definition for method 186 of type amphibian +;; INFO: Used lq/sq +(defmethod amphibian-method-186 amphibian ((obj amphibian) (arg0 vector) (arg1 vector)) + (with-pp + (let ((s4-0 (new 'stack-no-clear 'collide-query)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s4-0 start-pos quad) (-> arg0 quad)) + (vector-! (-> s4-0 move-dist) arg1 arg0) + (set! (-> s5-0 quad) (-> s4-0 move-dist quad)) + (let ((v1-4 s4-0)) + (set! (-> v1-4 radius) 409.6) + (set! (-> v1-4 collide-with) (collide-spec jak bot enemy obstacle hit-by-others-list player-list pusher)) + (set! (-> v1-4 ignore-process0) obj) + (set! (-> v1-4 ignore-process1) #f) + (set! (-> v1-4 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-4 action-mask) (collide-action solid)) + ) + (when (>= (fill-and-probe-using-line-sphere *collide-cache* s4-0) 0.0) + (let* ((s3-0 (-> s4-0 best-other-tri collide-ptr)) + (s4-1 (if (type? s3-0 collide-shape-prim-sphere) + (the-as collide-shape-prim-sphere s3-0) + ) + ) + ) + (when s4-1 + (set! (-> s5-0 y) 0.0) + (vector-normalize! s5-0 1.0) + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) (process->ppointer pp)) + (set! (-> a1-4 num-params) 2) + (set! (-> a1-4 message) 'attack) + (set! (-> a1-4 param 0) (the-as uint #f)) + (let ((v1-11 (new 'static 'attack-info :mask (attack-info-mask vector shove-back shove-up id damage)))) + (let* ((a0-14 *game-info*) + (a2-2 (+ (-> a0-14 attack-id) 1)) + ) + (set! (-> a0-14 attack-id) a2-2) + (set! (-> v1-11 id) a2-2) + ) + (set! (-> v1-11 vector quad) (-> s5-0 quad)) + (set! (-> v1-11 shove-back) 16384.0) + (set! (-> v1-11 shove-up) 12288.0) + (set! (-> v1-11 damage) (the float (-> obj enemy-info-override attack-damage))) + (set! (-> a1-4 param 1) (the-as uint v1-11)) + ) + (send-event-function (-> s4-1 cshape process) a1-4) + ) + ) + ) + #t + ) + ) + ) + ) + +;; definition for method 76 of type amphibian +;; WARN: Return type mismatch int vs symbol. +(defmethod enemy-method-76 amphibian ((obj amphibian) (arg0 process) (arg1 event-message-block)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-76))) + (t9-0 obj (the-as process-focusable arg0) arg1) + ) + (the-as + symbol + (when (and (logtest? (-> (the-as process-focusable arg0) root-override root-prim prim-core collide-as) + (collide-spec jak bot) + ) + (-> obj next-state) + (let ((v1-8 (-> obj next-state name))) + (or (= v1-8 'stare) (= v1-8 'hostile)) + ) + ) + (go (method-of-object obj attack-spin)) + 0 + ) + ) + ) + +;; definition for method 67 of type amphibian +(defmethod go-stare amphibian ((obj amphibian)) + (let ((s5-0 (-> obj focus aware))) + (cond + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + (nav-enemy-method-163 obj) + ) + (go-stare2 obj) + ) + ((and (= s5-0 (enemy-aware enemy-aware-3)) (-> obj enemy-info-override use-circling)) + (go (method-of-object obj circling)) + ) + ((and (= s5-0 (enemy-aware enemy-aware-2)) (-> obj enemy-info-override use-pacing)) + (go (method-of-object obj pacing)) + ) + ((= s5-0 (enemy-aware enemy-aware-4)) + (go (method-of-object obj flee)) + ) + (else + (go-stare2 obj) + ) + ) + ) + (none) + ) + +;; definition for method 70 of type amphibian +;; WARN: Return type mismatch object vs none. +(defmethod go-hostile amphibian ((obj amphibian)) + (let* ((s4-0 (handle->process (-> obj attacker-handle))) + (s5-0 (if (type? s4-0 process-focusable) + s4-0 + ) + ) + ) + (when s5-0 + (set! (-> obj attacker-handle) (the-as handle #f)) + (when (collide-check? (-> obj focus) (the-as process-focusable s5-0)) + (try-update-focus (-> obj focus) (the-as process-focusable s5-0) obj) + (go (method-of-object obj tongue-attack)) + ) + ) + ) + (go (method-of-object obj hostile)) + (none) + ) + +;; definition for method 55 of type amphibian +(defmethod enemy-method-55 amphibian ((obj amphibian)) + (set! (-> obj prev-ry) (-> obj prev-ry1)) + (set! (-> obj prev-ry1) (quaternion-y-angle (-> obj root-override2 quat))) + ((method-of-type nav-enemy enemy-method-55) obj) + (none) + ) + +;; definition for method 187 of type amphibian +;; WARN: Return type mismatch int vs none. +(defmethod amphibian-method-187 amphibian ((obj amphibian)) + (with-pp + (let* ((f30-0 (-> obj nav state speed)) + (f26-0 0.0) + (f0-1 (quaternion-y-angle (-> obj root-override2 quat))) + (f28-0 (deg- f0-1 (-> obj prev-ry))) + ) + (let ((s5-0 #f)) + (let ((s4-0 #f)) + (let ((v1-6 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (set! f28-0 (cond + ((and v1-6 (or (= v1-6 (-> obj draw art-group data 26)) + (= v1-6 (-> obj draw art-group data 27)) + (= v1-6 (-> obj draw art-group data 16)) + ) + ) + (set! f26-0 (ja-aframe-num 0)) + (when (= (-> obj skel root-channel 0) (-> obj skel channel)) + (cond + ((>= f26-0 13.0) + (set! s4-0 #t) + ) + ((and (>= 1.0 f26-0) (logtest? (-> obj flags) 1)) + (set! s5-0 #t) + ) + ) + ) + f28-0 + ) + (else + 0.0 + ) + ) + ) + ) + (if s4-0 + (logior! (-> obj flags) 1) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + (cond + ((>= f30-0 18432.0) + (let ((v1-29 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (cond + ((and v1-29 (= v1-29 (-> obj draw art-group data 26))) + (when (and s5-0 (zero? (get-rand-int obj 5))) + (ja-channel-push! 1 (seconds 0.15)) + (let ((s5-3 (-> obj skel root-channel 0))) + (set! (-> s5-3 dist) 12288.0) + (joint-control-channel-group-eval! + s5-3 + (the-as art-joint-anim (-> obj draw art-group data 27)) + num-func-identity + ) + (set! (-> s5-3 frame-num) (ja-aframe f26-0 0)) + ) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + (else + (let ((v1-45 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (cond + ((and v1-45 (= v1-45 (-> obj draw art-group data 27))) + (when s5-0 + (ja-channel-push! 1 (seconds 0.15)) + (let ((s5-4 (-> obj skel root-channel 0))) + (set! (-> s5-4 dist) 12288.0) + (joint-control-channel-group-eval! + s5-4 + (the-as art-joint-anim (-> obj draw art-group data 26)) + num-func-identity + ) + (set! (-> s5-4 frame-num) (ja-aframe f26-0 0)) + ) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.15)) + (let ((s5-5 (-> obj skel root-channel 0))) + (set! (-> s5-5 dist) 12288.0) + (joint-control-channel-group-eval! + s5-5 + (the-as art-joint-anim (-> obj draw art-group data 26)) + num-func-identity + ) + (set! (-> s5-5 frame-num) (ja-aframe f26-0 0)) + ) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + ) + ) + ) + ) + ) + (else + (let ((v1-67 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (not (and v1-67 (= v1-67 (-> obj draw art-group data 16)))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((s5-6 (-> obj skel root-channel 0))) + (set! (-> s5-6 dist) 12288.0) + (joint-control-channel-group-eval! + s5-6 + (the-as art-joint-anim (-> obj draw art-group data 16)) + num-func-identity + ) + (set! (-> s5-6 frame-num) (ja-aframe f26-0 0)) + ) + (set! (-> obj flags) (logand -2 (-> obj flags))) + ) + ) + ) + ) + ) + (let* ((f0-15 (fmin 24576.0 (* 0.47123888 (-> pp clock frames-per-second) (fabs f28-0)))) + (f0-17 (* 0.00008680556 (fmax f30-0 f0-15))) + (a0-49 (-> obj skel root-channel 0)) + ) + (set! (-> a0-49 param 0) f0-17) + (joint-control-channel-group-eval! a0-49 (the-as art-joint-anim #f) num-func-loop!) + ) + ) + (ja-blend-eval) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate active (amphibian) + :virtual #t + :code (behavior () + (until #f + (set! (-> self state-time) (-> self clock frame-counter)) + (until (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1.067)) + (amphibian-method-187 self) + (suspend) + ) + (when (enemy-method-123 self 0.2) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.6)) + (let ((v1-15 self)) + (set! (-> v1-15 enemy-flags) (the-as enemy-flag (logclear (-> v1-15 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-15 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek!)) + ) + (until (not (enemy-method-123 self 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (let ((v1-83 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-83 enemy-flags))) + (set! (-> v1-83 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-83 enemy-flags)))) + ) + (set! (-> v1-83 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-83 enemy-flags)))) + (set! (-> v1-83 nav callback-info) (-> v1-83 enemy-info-override callback-info)) + ) + 0 + (nav-enemy-method-165 self) + (ja-no-eval :num! (loop!)) + (until (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1.067)) + (amphibian-method-187 self) + (suspend) + ) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate notice (amphibian) + :virtual #t + :enter (behavior () + (local-vars (gp-0 vector)) + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (handle->process (-> self focus handle)))) + (set! gp-0 (cond + (a0-1 + (set! gp-0 (-> self focus-pos)) + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-1) 3) quad)) + gp-0 + ) + (else + (vector-z-quaternion! (-> self focus-pos) (-> self root-override2 quat)) + (vector-normalize! (-> self focus-pos) 24576.0) + (vector+! (-> self focus-pos) (-> self focus-pos) (-> self root-override2 trans)) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2)) + (a1-3 (-> self draw art-group data (-> *amphibian-global-info* notice-anim (get-rand-int self 2)))) + (gp-1 (new 'stack-no-clear 'vector)) + ) + (vector-! gp-1 (-> self focus-pos) (-> self root-override2 trans)) + (ja-no-eval :group! a1-3 + :num! (seek! (the float (+ (-> (the-as art-joint-anim a1-3) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) gp-1 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((v1-27 (-> self nav state))) + (set! (-> v1-27 speed) 8192.0) + ) + 0 + (let ((gp-2 (new 'stack-no-clear 'vector))) + (vector-z-quaternion! gp-2 (-> self root-override2 quat)) + (set! (-> self nav state heading quad) (-> gp-2 quad)) + ) + 0 + (enemy-method-72 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate circling (amphibian) + :virtual #t + :code (behavior () + (nav-enemy-method-165 self) + (until #f + (amphibian-method-187 self) + (suspend) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate pacing (amphibian) + :virtual #t + :code (behavior () + (until #f + (amphibian-method-187 self) + (suspend) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate stop-chase (amphibian) + :virtual #t + :code (behavior () + (until #f + (amphibian-method-187 self) + (suspend) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate stare (amphibian) + :virtual #t + :enter (behavior () + (local-vars (gp-0 vector)) + (let ((t9-0 (-> (method-of-type nav-enemy stare) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (let ((v1-8 (-> self nav))) + (set! (-> v1-8 turning-acceleration) 204800.0) + ) + 0 + (let ((a0-5 (handle->process (-> self focus handle)))) + (set! gp-0 (cond + (a0-5 + (set! gp-0 (-> self focus-pos)) + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-5) 0) quad)) + gp-0 + ) + (else + (vector-z-quaternion! (-> self focus-pos) (-> self root-override2 quat)) + (let ((f30-0 (get-rand-float-range self 8192.0 16384.0))) + (if (zero? (get-rand-int self 2)) + (set! f30-0 (- f30-0)) + ) + (vector-rotate-around-y! (-> self focus-pos) (-> self focus-pos) f30-0) + ) + (vector-normalize! (-> self focus-pos) 12288.0) + (vector+! (-> self focus-pos) (-> self focus-pos) (-> self root-override2 trans)) + ) + ) + ) + ) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy stare) exit))) + (if t9-0 + (t9-0) + ) + ) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.07)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (set-vector! s5-0 (- (-> s4-0 z)) 0.0 (-> s4-0 x) 1.0) + (vector-! gp-0 (-> self focus-pos) (-> self root-override2 trans)) + (vector-normalize! s4-0 1.0) + (vector-normalize! gp-0 1.0) + (cond + ((>= (vector-dot s4-0 gp-0) 0.707) + (ja-no-eval :group! amphibian-attack-forward-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-forward-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + ) + (else + (let ((v1-22 (>= (vector-dot s5-0 gp-0) 0.0))) + (if (logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (set! v1-22 (not v1-22)) + ) + (if v1-22 + (ja-no-eval :group! amphibian-attack-right-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-right-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + (ja-no-eval :group! amphibian-attack-left-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-left-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + ) + ) + ) + ) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 2.0 0)) + (suspend) + (ja :num! (seek!)) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 6.0 0)) + (seek-to-point-toward-point! (-> self root-override2) (-> self focus-pos) 546133.3 (seconds 0.1)) + (suspend) + (ja :num! (seek!)) + ) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (go-virtual stare-idle) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate stare-idle (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + ((-> (method-of-type nav-enemy stare) enter)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :exit (-> (method-of-type nav-enemy stare) exit) + :trans (-> (method-of-type nav-enemy stare) trans) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((gp-0 (get-rand-int-range self 1 3))) + (dotimes (s5-0 gp-0) + (ja-no-eval :group! amphibian-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-idle-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (go-virtual stare) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-stare-post) + ) + +;; failed to figure out what this is: +(defstate hostile (amphibian) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (go-virtual attack-spin) + ) + (let ((a0-2 (enemy-method-107 self))) + (when a0-2 + (let* ((s5-0 (get-trans a0-2 0)) + (f30-0 (vector-vector-xz-distance s5-0 (-> self root-override2 trans))) + ) + (when (>= 20480.0 f30-0) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (vector-! gp-0 s5-0 (-> self root-override2 trans)) + (let ((f28-0 (quaternion-y-angle (-> self root-override2 quat))) + (f0-3 (atan (-> gp-0 x) (-> gp-0 z))) + ) + (if (>= 8192.0 (fabs (deg- f28-0 f0-3))) + (go-virtual attack-forward) + ) + ) + ) + (if (>= 14336.0 f30-0) + (go-virtual attack-spin) + ) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (until #f + (amphibian-method-187 self) + (suspend) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack-forward (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (let ((v1-7 (-> self nav))) + (set! (-> v1-7 turning-acceleration) 204800.0) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-11 *game-info*) + (a0-7 (+ (-> v1-11 attack-id) 1)) + ) + (set! (-> v1-11 attack-id) a0-7) + (set! (-> self attack-id) a0-7) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (enemy-method-72 self) + ) + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable gp-0) 0) quad)) + ) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.07)) + (ja-no-eval :group! amphibian-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 2.0 0)) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual attack-forward-lunge) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate attack-forward-lunge (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + (let ((v1-1 (-> self nav state))) + (set! (-> v1-1 speed) 51200.0) + ) + 0 + (let ((v1-3 (-> self nav))) + (set! (-> v1-3 turning-acceleration) 204800.0) + ) + 0 + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (let ((v1-7 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-7 enemy-flags))) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-7 enemy-flags)))) + ) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-7 enemy-flags)))) + (set! (-> v1-7 nav callback-info) (-> v1-7 enemy-info-override callback-info)) + ) + 0 + (let ((v1-10 self)) + (set! (-> v1-10 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-10 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (until (>= (ja-aframe-num 0) (ja-aframe 8.0 0)) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual attack-forward-end) + (none) + ) + :post (behavior () + (let ((a0-1 (handle->process (-> self focus handle)))) + (if a0-1 + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable a0-1) 0) quad)) + ) + ) + (let ((a0-4 (-> self nav state)) + (v1-8 (-> self focus-pos)) + ) + (logclear! (-> a0-4 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-4 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-4 target-post quad) (-> v1-8 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack-forward-end (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-4 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate attack-spin (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 turning-acceleration) 204800.0) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-13 *game-info*) + (a0-9 (+ (-> v1-13 attack-id) 1)) + ) + (set! (-> v1-13 attack-id) a0-9) + (set! (-> self attack-id) a0-9) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (enemy-method-72 self) + ) + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable gp-0) 0) quad)) + ) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "amphib-hit") + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.07)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (set-vector! s5-0 (- (-> s4-0 z)) 0.0 (-> s4-0 x) 1.0) + (vector-! gp-0 (-> self focus-pos) (-> self root-override2 trans)) + (vector-normalize! s4-0 1.0) + (vector-normalize! gp-0 1.0) + (cond + ((>= (vector-dot s4-0 gp-0) 0.707) + (ja-no-eval :group! amphibian-attack-forward-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-forward-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + ) + (else + (let ((v1-22 (>= (vector-dot s5-0 gp-0) 0.0))) + (if (logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (set! v1-22 (not v1-22)) + ) + (if v1-22 + (ja-no-eval :group! amphibian-attack-right-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-right-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + (ja-no-eval :group! amphibian-attack-left-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-attack-left-ja) frames num-frames) -1))) + :frame-num (ja-aframe 0.0 0) + ) + ) + ) + ) + ) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 2.0 0)) + (suspend) + (ja :num! (seek!)) + ) + (let ((a0-22 (handle->process (-> self focus handle)))) + (if a0-22 + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable a0-22) 0) quad)) + ) + ) + (until (>= (ja-aframe-num 0) (ja-aframe 6.0 0)) + (seek-to-point-toward-point! (-> self root-override2) (-> self focus-pos) 546133.3 (seconds 0.1)) + (suspend) + (ja :num! (seek!)) + ) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate tongue-attack (amphibian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior amphibian) enemy-event-handler) + :enter (behavior () + ((-> (method-of-type nav-enemy hostile) enter)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-4 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (set! (-> self tongue-scale) 0.0) + (set! (-> self tongue-mode) (the-as uint 0)) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (sound-play "tongue-warn") + (let ((gp-1 (new 'stack-no-clear 'amphibian-tongue-attack-info))) + (amphibian-method-185 self gp-1) + (set! (-> self tongue-mod max-length) (-> gp-1 max-length)) + (set! (-> self tongue-mod target quad) (-> gp-1 clamped-pos quad)) + ) + (none) + ) + :exit (behavior () + (set! (-> self draw bounds w) 22528.0) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (let ((v1-0 (-> self tongue-mode))) + (cond + ((zero? v1-0) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.8)) + (set! (-> self tongue-mode) (the-as uint 1)) + (sound-play "tongue-attack") + ) + ) + ((= v1-0 1) + (cond + ((= (-> self tongue-scale) 1.0) + (set! (-> self tongue-mode) (the-as uint 2)) + (seek! (-> self tongue-scale) 0.0 (* 7.0 (-> self clock seconds-per-frame))) + ) + (else + (seek! (-> self tongue-scale) 1.0 (* 7.0 (-> self clock seconds-per-frame))) + ) + ) + ) + ((= v1-0 2) + (if (= (-> self tongue-scale) 0.0) + (set! (-> self tongue-mode) (the-as uint 3)) + (seek! (-> self tongue-scale) 0.0 (* 7.0 (-> self clock seconds-per-frame))) + ) + ) + ) + ) + (cond + ((and (or (= (-> self tongue-mode) 1) (= (-> self tongue-mode) 2)) (!= (-> self tongue-scale) 0.0)) + (amphibian-joint-mod-method-9 (-> self tongue-mod)) + (let ((gp-1 (new 'stack-no-clear 'vector)) + (s5-1 (new 'stack-no-clear 'vector)) + ) + (amphibian-method-184 self gp-1 s5-1) + (let ((a1-5 (new 'stack-no-clear 'vector))) + (vector+! a1-5 (-> self draw origin) (-> self draw bounds)) + (set! (-> self draw bounds w) (fmax 22528.0 (+ 12288.0 (vector-vector-distance s5-1 a1-5)))) + ) + (if (amphibian-method-186 self gp-1 s5-1) + (set! (-> self tongue-mode) (the-as uint 2)) + ) + ) + ) + (else + (set! (-> self draw bounds w) 22528.0) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.7)) + (ja-no-eval :group! amphibian-tongue-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim amphibian-tongue-attack-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior amphibian) nav-enemy-simple-post) + ) + +;; definition for method 7 of type amphibian +;; WARN: Return type mismatch nav-enemy vs amphibian. +(defmethod relocate amphibian ((obj amphibian) (arg0 int)) + (if (nonzero? (-> obj tongue-mod)) + (&+! (-> obj tongue-mod) arg0) + ) + (the-as amphibian ((method-of-type nav-enemy relocate) obj arg0)) + ) + +;; definition for method 114 of type amphibian +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 amphibian ((obj amphibian)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 5) 0))) + (set! (-> s5-0 total-prims) (the-as uint 6)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 8192.0 0.0 19660.8) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-13 local-sphere) 0.0 4915.2 0.0 4915.2) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action deadly)) + (set! (-> v1-15 transform-index) 12) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 transform-index) 20) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 transform-index) 22) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 4505.6) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-with) (collide-spec backgnd obstacle hit-by-others-list)) + (set! (-> v1-21 prim-core action) (collide-action solid)) + (set-vector! (-> v1-21 local-sphere) 0.0 11468.8 0.0 11468.8) + ) + (set! (-> s5-0 nav-radius) 10240.0) + (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 115 of type amphibian +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 amphibian ((obj amphibian)) + "@abstract" + (set! (-> obj attacker-handle) (the-as handle #f)) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-amphibian" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *amphibian-nav-enemy-info*) + (set! (-> obj tongue-mod) (new 'process 'amphibian-joint-mod obj 14)) + (let ((v1-6 (-> obj neck))) + (set! (-> v1-6 up) (the-as uint 1)) + (set! (-> v1-6 nose) (the-as uint 2)) + (set! (-> v1-6 ear) (the-as uint 0)) + (set-vector! (-> v1-6 twist-max) 10012.444 10012.444 0.0 1.0) + (set! (-> v1-6 ignore-angle) 20024.889) + ) + (let ((v1-8 (-> obj nav))) + (set! (-> v1-8 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (set! (-> obj prev-ry) (quaternion-y-angle (-> obj root-override2 quat))) + (set! (-> obj prev-ry1) (-> obj prev-ry)) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/baby_spider/tomb-baby-spider_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/baby_spider/tomb-baby-spider_REF.gc new file mode 100644 index 0000000000..9999c508de --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/baby_spider/tomb-baby-spider_REF.gc @@ -0,0 +1,796 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type tomb-baby-spider +(deftype tomb-baby-spider (nav-enemy) + () + :heap-base #x1e0 + :method-count-assert 180 + :size-assert #x25c + :flag-assert #xb401e0025c + (:methods + (attack () _type_ :state 178) + (attack-stop () _type_ :state 179) + ) + ) + +;; definition for method 3 of type tomb-baby-spider +(defmethod inspect tomb-baby-spider ((obj tomb-baby-spider)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-tomb-baby-spider tomb-baby-spider tomb-baby-spider-lod0-jg tomb-baby-spider-idle-ja + ((tomb-baby-spider-lod0-mg (meters 20)) (tomb-baby-spider-lod1-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5.5) + :shadow tomb-baby-spider-shadow-mg + ) + +;; definition for symbol *tomb-baby-spider-nav-enemy-info*, type nav-enemy-info +(define *tomb-baby-spider-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #f + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1e0002 #x64640401 #x0 #x0) + :idle-anim 4 + :notice-anim 5 + :hostile-anim 8 + :hit-anim 4 + :knocked-anim 14 + :knocked-land-anim 15 + :die-anim 13 + :die-falling-anim 13 + :victory-anim 4 + :jump-wind-up-anim 4 + :jump-in-air-anim 4 + :jump-land-anim 4 + :neck-joint -1 + :look-at-joint 3 + :bullseye-joint 3 + :sound-die (static-sound-name "bspider-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 2) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #x11fffdffa + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 6) + :attack-shove-up (meters 3) + :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-seek-ry-clamp 2730.6667 + :knocked-soft-vxz-lo 80281.6 + :knocked-soft-vxz-hi 87654.4 + :knocked-soft-vy-lo 67993.6 + :knocked-soft-vy-hi 112230.4 + :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 55705.6 + :knocked-hard-vxz-hi 71270.4 + :knocked-hard-vy-lo 88473.6 + :knocked-hard-vy-hi 132710.4 + :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 55705.6 + :knocked-red-vxz-hi 71270.4 + :knocked-red-vy-lo 88473.6 + :knocked-red-vy-hi 132710.4 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint -1 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #f + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 5 + :turn-anim 5 + :run-anim 8 + :taunt-anim -1 + :run-travel-speed (meters 6) + :run-acceleration (meters 4) + :run-turning-acceleration (meters 18) + :walk-travel-speed (meters 4) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 180.0) + :notice-nav-radius (meters 2) + :frustration-distance (meters 6) + :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! (-> *tomb-baby-spider-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; failed to figure out what this is: +(defstate active (tomb-baby-spider) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override walk-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override walk-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (when (enemy-method-123 self 0.2) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (let ((v1-37 self)) + (set! (-> v1-37 enemy-flags) (the-as enemy-flag (logclear (-> v1-37 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-37 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (until (not (enemy-method-123 self 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((v1-101 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-101 enemy-flags))) + (set! (-> v1-101 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-101 enemy-flags)))) + ) + (set! (-> v1-101 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-101 enemy-flags)))) + (set! (-> v1-101 nav callback-info) (-> v1-101 enemy-info-override callback-info)) + ) + 0 + (nav-enemy-method-165 self) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override walk-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override walk-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate notice (tomb-baby-spider) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (let ((a0-3 (handle->process (-> self focus handle)))) + (cond + (a0-3 + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-3) 0) quad)) + ) + (else + (let ((a1-4 (-> self nav state))) + (set! (-> gp-0 quad) (-> a1-4 target-post quad)) + ) + ) + ) + ) + (ja-no-eval :group! tomb-baby-spider-notice-spin-ja + :num! (seek! + (the float (+ (-> (the-as art-joint-anim tomb-baby-spider-notice-spin-ja) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-to-point-toward-point! + (-> self root-override2) + gp-0 + (* 1.8 (-> self nav max-rotation-rate)) + (seconds 0.02) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (ja-no-eval :group! tomb-baby-spider-notice-land-ja + :num! (seek! + (the float (+ (-> (the-as art-joint-anim tomb-baby-spider-notice-land-ja) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (tomb-baby-spider) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior tomb-baby-spider) + enemy-event-handler + ) + :enter (behavior () + (nav-enemy-method-166 self) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let ((v1-9 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-9 local-sphere w) 4915.2) + ) + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (let* ((v1-14 *game-info*) + (v0-2 (+ (-> v1-14 attack-id) 1)) + ) + (set! (-> v1-14 attack-id) v0-2) + (set! (-> self attack-id) v0-2) + ) + (none) + ) + :exit (behavior () + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-3 local-sphere w) 819.2) + ) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (nav-enemy-method-165 self) + (none) + ) + :trans (behavior () + (enemy-method-49 self) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + ) + (none) + ) + :code (behavior () + (let ((v1-0 (-> self nav))) + (set! (-> v1-0 target-speed) (* 2.8 (-> self enemy-info-override run-travel-speed))) + ) + 0 + (let ((v1-2 (-> self nav))) + (set! (-> v1-2 acceleration) (* 2.4 (-> self enemy-info-override run-acceleration))) + ) + 0 + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! tomb-baby-spider-attack0-start-ja + :num! (seek! + (the float (+ (-> (the-as art-joint-anim tomb-baby-spider-attack0-start-ja) frames num-frames) -1)) + 0.8 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.8)) + ) + (go-virtual attack-stop) + (none) + ) + :post (the-as (function none :behavior tomb-baby-spider) nav-enemy-chase-post) + ) + +;; failed to figure out what this is: +(defstate attack-stop (tomb-baby-spider) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior tomb-baby-spider) + enemy-event-handler + ) + :enter (behavior () + (let ((v1-0 (-> self nav))) + (set! (-> v1-0 target-speed) 0.0) + ) + 0 + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :exit (behavior () + (let ((v1-0 self)) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-0 enemy-flags)))) + ) + 0 + (none) + ) + :code (behavior () + (ja-no-eval :group! tomb-baby-spider-attack0-stop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-baby-spider-attack0-stop-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (when (not (enemy-method-96 self 6371.5557 #t)) + (let ((v1-27 self)) + (set! (-> v1-27 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-27 enemy-flags)))) + ) + 0 + (let ((t9-4 vector-normalize!) + (a0-7 (new 'stack-no-clear 'vector)) + (a2-3 (-> self nav state)) + (v1-30 (new 'stack-no-clear 'vector)) + ) + (set! (-> v1-30 quad) (-> a2-3 target-post quad)) + (let* ((s5-0 (t9-4 (vector-! a0-7 v1-30 (-> self root-override2 trans)) 1.0)) + (f30-0 (deg-diff (quaternion-y-angle (-> self root-override2 quat)) (vector-y-angle s5-0))) + ) + (ja-no-eval :num! (loop!)) + (cond + ((< 0.0 f30-0) + (ja-channel-push! 1 (seconds 0.1)) + (ja :group! tomb-baby-spider-turn-left-ja :num! min) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (ja :group! tomb-baby-spider-turn-right-ja :num! min) + ) + ) + ) + ) + (until (enemy-method-96 self 910.2222 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop!)) + ) + (let ((v1-53 self)) + (set! (-> v1-53 enemy-flags) (the-as enemy-flag (logclear (-> v1-53 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (ja-channel-push! 1 (seconds 0.2)) + (let ((gp-3 (-> self clock frame-counter)) + (s5-1 (the int (* 300.0 (rand-vu-float-range 0.6 1.2)))) + (f30-2 1.0) + ) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (loop! f30-2) + :frame-num 0.0 + ) + (until (>= (- (-> self clock frame-counter) gp-3) s5-1) + (suspend) + (ja :num! (loop! f30-2)) + ) + ) + (let ((gp-4 (-> self focus aware))) + (if (or (not (enemy-method-107 self)) (!= gp-4 3)) + (go-stare self) + ) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior tomb-baby-spider) nav-enemy-face-focus-post) + ) + +;; failed to figure out what this is: +(defstate hostile (tomb-baby-spider) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (enemy-method-107 self))) + (when a0-1 + (let ((a0-2 (get-trans a0-1 0))) + (if (and (< (vector-vector-distance a0-2 (-> self root-override2 trans)) 20480.0) + (enemy-method-96 self 1274.3112 #t) + ) + (go-virtual attack) + ) + ) + ) + ) + (none) + ) + ) + +;; definition for method 77 of type tomb-baby-spider +(defmethod enemy-method-77 tomb-baby-spider ((obj tomb-baby-spider) (arg0 (pointer float))) + (let* ((a2-0 (the-as collide-shape-prim-group (-> obj root-override2 root-prim))) + (v1-2 (-> a2-0 child 3)) + ) + (dotimes (a3-0 3) + (set! (-> a2-0 child a3-0 local-sphere w) 819.2) + ) + (set! (-> v1-2 prim-core action) (collide-action solid)) + (set! (-> v1-2 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-2 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle player-list blocking-plane pusher) + ) + ) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((v1-6 (-> obj skel root-channel 0))) + (set! (-> v1-6 frame-group) (the-as art-joint-anim (-> obj draw art-group data 20))) + (set! (-> v1-6 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 20)) frames num-frames) -1)) + ) + (set! (-> v1-6 param 1) (-> arg0 0)) + (set! (-> v1-6 frame-num) 0.0) + (joint-control-channel-group! v1-6 (the-as art-joint-anim (-> obj draw art-group data 20)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-2) (knocked-type knocked-type-5)) + (let ((v1-11 (-> obj skel root-channel 0))) + (set! (-> v1-11 frame-group) (the-as art-joint-anim (-> obj draw art-group data 17))) + (set! (-> v1-11 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 17)) frames num-frames) -1)) + ) + (set! (-> v1-11 param 1) (-> arg0 0)) + (set! (-> v1-11 frame-num) 0.0) + (joint-control-channel-group! v1-11 (the-as art-joint-anim (-> obj draw art-group data 17)) num-func-seek!) + ) + #t + ) + (else + ((method-of-type nav-enemy enemy-method-77) obj arg0) + ) + ) + ) + +;; definition for method 78 of type tomb-baby-spider +(defmethod enemy-method-78 tomb-baby-spider ((obj tomb-baby-spider) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((v1-3 (-> obj skel root-channel 0))) + (set! (-> v1-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> v1-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> v1-3 param 1) (-> arg0 0)) + (set! (-> v1-3 frame-num) 0.0) + (joint-control-channel-group! v1-3 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-2) (knocked-type knocked-type-5)) + (let ((v1-8 (-> obj skel root-channel 0))) + (set! (-> v1-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 18))) + (set! (-> v1-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 18)) frames num-frames) -1)) + ) + (set! (-> v1-8 param 1) (-> arg0 0)) + (set! (-> v1-8 frame-num) 0.0) + (joint-control-channel-group! v1-8 (the-as art-joint-anim (-> obj draw art-group data 18)) num-func-seek!) + ) + #t + ) + (else + ((method-of-type nav-enemy enemy-method-78) obj arg0) + ) + ) + ) + +;; definition for method 79 of type tomb-baby-spider +(defmethod enemy-method-79 tomb-baby-spider ((obj tomb-baby-spider) (arg0 int) (arg1 enemy-knocked-info)) + (case arg0 + ((3) + (let ((s4-0 (ja-done? 0))) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 param 0) (the float (+ (-> a0-3 frame-group frames num-frames) -1))) + (set! (-> a0-3 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-3 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s4-0 + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + ) + (((knocked-type knocked-type-2) (knocked-type knocked-type-5)) + (let ((a0-7 (-> obj skel root-channel 0))) + (set! (-> a0-7 frame-group) (the-as art-joint-anim (-> obj draw art-group data 19))) + (set! (-> a0-7 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 19)) frames num-frames) -1)) + ) + (set! (-> a0-7 param 1) (-> arg1 anim-speed)) + (set! (-> a0-7 frame-num) 0.0) + (joint-control-channel-group! a0-7 (the-as art-joint-anim (-> obj draw art-group data 19)) num-func-seek!) + ) + ) + (else + (let ((a0-8 (-> obj skel root-channel 0))) + (set! (-> a0-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 16))) + (set! (-> a0-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 16)) frames num-frames) -1)) + ) + (set! (-> a0-8 param 1) (-> arg1 anim-speed)) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim (-> obj draw art-group data 16)) num-func-seek!) + ) + ) + ) + (vector-reset! (-> obj root-override2 transv)) + #t + ) + ) + ) + ((4) + (let ((s4-1 (ja-done? 0))) + (let ((a0-11 (-> obj skel root-channel 0))) + (set! (-> a0-11 param 0) (the float (+ (-> a0-11 frame-group frames num-frames) -1))) + (set! (-> a0-11 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-11 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s4-1 + (let ((v1-50 (-> obj root-override2 root-prim))) + (set! (-> (the-as collide-shape-prim-group v1-50) child 0 local-sphere w) 1638.4) + (set! (-> (the-as collide-shape-prim-group v1-50) child 1 local-sphere w) 1638.4) + (set! (-> (the-as collide-shape-prim-group v1-50) child 2 local-sphere w) 3276.8) + (set! (-> (the-as collide-shape-prim-group v1-50) child 3 prim-core action) (collide-action)) + (set! (-> (the-as collide-shape-prim-group v1-50) child 3 prim-core collide-with) (collide-spec)) + ) + 0 + ) + s4-1 + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + +;; definition for method 104 of type tomb-baby-spider +(defmethod enemy-method-104 tomb-baby-spider ((obj tomb-baby-spider) (arg0 process) (arg1 uint) (arg2 uint)) + (let* ((s1-0 arg0) + (s2-0 (if (type? s1-0 process-focusable) + s1-0 + ) + ) + (s1-1 *target*) + (v1-0 (if (type? s1-1 process-focusable) + s1-1 + ) + ) + (f0-0 1.0) + ) + (if (and (= s2-0 v1-0) (logtest? (focus-status indax) (-> v1-0 focus-status))) + (set! f0-0 0.6) + ) + (let ((a1-5 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-5 from) (process->ppointer self)) + (set! (-> a1-5 num-params) 2) + (set! (-> a1-5 message) 'attack) + (set! (-> a1-5 param 0) arg1) + (let ((v1-9 (new 'static 'attack-info :mask (attack-info-mask mode shove-back shove-up id damage knock)))) + (set! (-> v1-9 id) arg2) + (set! (-> v1-9 shove-back) (* f0-0 (-> obj enemy-info-override attack-shove-back))) + (set! (-> v1-9 shove-up) (* f0-0 (-> obj enemy-info-override attack-shove-up))) + (set! (-> v1-9 mode) (-> obj enemy-info-override attack-mode)) + (set! (-> v1-9 damage) (the float (-> obj enemy-info-override attack-damage))) + (set! (-> v1-9 knock) (the-as uint 8)) + (set! (-> a1-5 param 1) (the-as uint v1-9)) + ) + (when (send-event-function arg0 a1-5) + (enemy-method-105 obj arg0) + #t + ) + ) + ) + ) + +;; definition for method 114 of type tomb-baby-spider +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 tomb-baby-spider ((obj tomb-baby-spider)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 5) 0))) + (set! (-> s5-0 total-prims) (the-as uint 6)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 409.6 0.0 7782.4) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-13 transform-index) 3) + (set-vector! (-> v1-13 local-sphere) 0.0 0.0 0.0 1638.4) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-15 prim-core action) (collide-action solid deadly no-standon)) + (set! (-> v1-15 transform-index) 24) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 1638.4) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-17 transform-index) 4) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (set-vector! + (-> (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)) local-sphere) + 0.0 + 2867.2 + 0.0 + 3276.8 + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-21 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-21 transform-index) 5) + (set-vector! (-> v1-21 local-sphere) 0.0 4096.0 -1228.8 1638.4) + ) + (set! (-> s5-0 nav-radius) 3686.4) + (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 115 of type tomb-baby-spider +(defmethod enemy-method-115 tomb-baby-spider ((obj tomb-baby-spider)) + "@abstract" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-baby-spider" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *tomb-baby-spider-nav-enemy-info*) + (none) + ) + +;; definition of type dig-spider +(deftype dig-spider (tomb-baby-spider) + () + :heap-base #x1e0 + :method-count-assert 180 + :size-assert #x25c + :flag-assert #xb401e0025c + ) + +;; definition for method 3 of type dig-spider +(defmethod inspect dig-spider ((obj dig-spider)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type tomb-baby-spider inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +0 diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hopper_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hopper_REF.gc new file mode 100644 index 0000000000..5ccc7afb56 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/hopper_REF.gc @@ -0,0 +1,946 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type hopper +(deftype hopper (nav-enemy) + ((speed-y float :offset-assert 604) + (accel-y float :offset-assert 608) + (next-jump-time int32 :offset-assert 612) + (path-intro path-control :offset-assert 616) + (can-go-knocked? symbol :offset-assert 620) + (land-anim-index int32 :offset-assert 624) + (step-num int32 :offset-assert 628) + (best-point vector :inline :offset-assert 640) + (best-score float :offset-assert 656) + (origin vector :inline :offset-assert 672) + (direction vector :inline :offset-assert 688) + (jump-dist float :offset-assert 704) + (side float :offset-assert 708) + (jump-start-anim uint32 :offset-assert 712) + (jump-air-anim uint32 :offset-assert 716) + (jump-land-anim uint32 :offset-assert 720) + (jump-height-min float :offset-assert 724) + (jump-anim-start-frame float :offset-assert 728) + (minimap connection-minimap :offset-assert 732) + ) + :heap-base #x260 + :method-count-assert 180 + :size-assert #x2e0 + :flag-assert #xb4026002e0 + (:methods + (hopper-method-178 (_type_) symbol 178) + (hopper-method-179 (_type_) none 179) + ) + ) + +;; definition for method 3 of type hopper +(defmethod inspect hopper ((obj hopper)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tspeed-y: ~f~%" (-> obj speed-y)) + (format #t "~2Taccel-y: ~f~%" (-> obj accel-y)) + (format #t "~2Tnext-jump-time: ~D~%" (-> obj next-jump-time)) + (format #t "~2Tpath-intro: ~A~%" (-> obj path-intro)) + (format #t "~2Tcan-go-knocked?: ~A~%" (-> obj can-go-knocked?)) + (format #t "~2Tland-anim-index: ~D~%" (-> obj land-anim-index)) + (format #t "~2Tstep-num: ~D~%" (-> obj step-num)) + (format #t "~2Tbest-point: #~%" (-> obj best-point)) + (format #t "~2Tbest-score: ~f~%" (-> obj best-score)) + (format #t "~2Torigin: #~%" (-> obj origin)) + (format #t "~2Tdirection: #~%" (-> obj direction)) + (format #t "~2Tjump-dist: ~f~%" (-> obj jump-dist)) + (format #t "~2Tside: ~f~%" (-> obj side)) + (format #t "~2Tjump-start-anim: ~D~%" (-> obj jump-start-anim)) + (format #t "~2Tjump-air-anim: ~D~%" (-> obj jump-air-anim)) + (format #t "~2Tjump-land-anim: ~D~%" (-> obj jump-land-anim)) + (format #t "~2Tjump-height-min: ~f~%" (-> obj jump-height-min)) + (format #t "~2Tjump-anim-start-frame: ~f~%" (-> obj jump-anim-start-frame)) + (format #t "~2Tminimap: #~%" (-> obj minimap)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-hopper hopper hopper-lod0-jg hopper-idle-ja + ((hopper-lod0-mg (meters 20)) (hopper-lod1-mg (meters 999999))) + :bounds (static-spherem 0 2.25 -0.7 6.5) + :shadow hopper-shadow-mg + ) + +;; definition of type hopper-anim-info +(deftype hopper-anim-info (structure) + ((hit-anim-index int32 :offset-assert 0) + (land-anim-index int32 :offset-assert 4) + ) + :pack-me + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +;; definition for method 3 of type hopper-anim-info +(defmethod inspect hopper-anim-info ((obj hopper-anim-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'hopper-anim-info) + (format #t "~1Thit-anim-index: ~D~%" (-> obj hit-anim-index)) + (format #t "~1Tland-anim-index: ~D~%" (-> obj land-anim-index)) + (label cfg-4) + obj + ) + +;; definition of type hopper-global-info +(deftype hopper-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (yellow-hit-anim hopper-anim-info 3 :inline :offset-assert 8) + (blue-hit-anim hopper-anim-info 3 :inline :offset-assert 32) + ) + :method-count-assert 9 + :size-assert #x38 + :flag-assert #x900000038 + ) + +;; definition for method 3 of type hopper-global-info +(defmethod inspect hopper-global-info ((obj hopper-global-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tprev-yellow-hit: ~D~%" (-> obj prev-yellow-hit)) + (format #t "~1Tprev-blue-hit: ~D~%" (-> obj prev-blue-hit)) + (format #t "~1Tyellow-hit-anim[3] @ #x~X~%" (-> obj yellow-hit-anim)) + (format #t "~1Tblue-hit-anim[3] @ #x~X~%" (-> obj blue-hit-anim)) + (label cfg-4) + obj + ) + +;; definition for symbol *hopper-global-info*, type hopper-global-info +(define *hopper-global-info* (new 'static 'hopper-global-info + :yellow-hit-anim (new 'static 'inline-array hopper-anim-info 3 + (new 'static 'hopper-anim-info :hit-anim-index 25 :land-anim-index 26) + (new 'static 'hopper-anim-info :hit-anim-index 27 :land-anim-index 28) + (new 'static 'hopper-anim-info :hit-anim-index 29 :land-anim-index 30) + ) + :blue-hit-anim (new 'static 'inline-array hopper-anim-info 3 + (new 'static 'hopper-anim-info :hit-anim-index 21 :land-anim-index 24) + (new 'static 'hopper-anim-info :hit-anim-index 22 :land-anim-index 24) + (new 'static 'hopper-anim-info :hit-anim-index 23 :land-anim-index 24) + ) + ) + ) + +;; definition for method 77 of type hopper +(defmethod enemy-method-77 hopper ((obj hopper) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let* ((a2-0 (ash 1 (-> *hopper-global-info* prev-blue-hit))) + (v1-3 (enemy-method-120 obj 3 a2-0)) + (a1-5 (-> obj draw art-group data (-> *hopper-global-info* blue-hit-anim v1-3 hit-anim-index))) + ) + (set! (-> *hopper-global-info* prev-blue-hit) v1-3) + (let ((a0-12 (-> obj skel root-channel 0))) + (set! (-> a0-12 frame-group) (the-as art-joint-anim a1-5)) + (set! (-> a0-12 param 0) (the float (+ (-> (the-as art-joint-anim a1-5) frames num-frames) -1))) + (set! (-> a0-12 param 1) 1.0) + (set! (-> a0-12 frame-num) 0.0) + (joint-control-channel-group! a0-12 (the-as art-joint-anim a1-5) num-func-seek!) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let* ((a2-2 (ash 1 (-> *hopper-global-info* prev-yellow-hit))) + (v1-13 (enemy-method-120 obj 3 a2-2)) + (a1-11 (-> obj draw art-group data (-> *hopper-global-info* yellow-hit-anim v1-13 hit-anim-index))) + ) + (set! (-> obj land-anim-index) (-> *hopper-global-info* yellow-hit-anim v1-13 land-anim-index)) + (set! (-> *hopper-global-info* prev-yellow-hit) v1-13) + (let ((a0-27 (-> obj skel root-channel 0))) + (set! (-> a0-27 frame-group) (the-as art-joint-anim a1-11)) + (set! (-> a0-27 param 0) (the float (+ (-> (the-as art-joint-anim a1-11) frames num-frames) -1))) + (set! (-> a0-27 param 1) (-> arg0 0)) + (set! (-> a0-27 frame-num) 0.0) + (joint-control-channel-group! a0-27 (the-as art-joint-anim a1-11) num-func-seek!) + ) + ) + ) + ) + #t + ) + +;; definition for method 78 of type hopper +(defmethod enemy-method-78 hopper ((obj hopper) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((s4-0 (-> obj draw art-group data 24))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-3 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) 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 s4-0) num-func-seek!) + ) + ) + #t + ) + #f + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data (-> obj land-anim-index)))) + (set! (-> a0-5 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj land-anim-index))) 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 (-> obj draw art-group data (-> obj land-anim-index))) + num-func-seek! + ) + ) + #t + ) + ) + ) + +;; definition for symbol *hopper-nav-enemy-info*, type nav-enemy-info +(define *hopper-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 #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 8 #x5010401 #x1010501 #x5010401 #x1010601 #x0 #x0 #x0 #x0) + :idle-anim 4 + :notice-anim 7 + :hostile-anim 4 + :hit-anim 4 + :knocked-anim 25 + :knocked-land-anim 26 + :die-anim 19 + :die-falling-anim 20 + :victory-anim -1 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :sound-hit (static-sound-name "hopper-hit") + :sound-die (static-sound-name "hopper-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 40) + :proximity-notice-distance (meters 4) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :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-seek-ry-clamp 4551.1113 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 5 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 1843.2 :z 1884.16 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 4 + :turn-anim 9 + :run-anim 13 + :taunt-anim -1 + :run-travel-speed (meters 1) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 2) + :walk-travel-speed (meters 1) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 2) + :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! (-> *hopper-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 73 of type hopper +(defmethod enemy-method-73 hopper ((obj hopper)) + (cond + ((-> obj can-go-knocked?) + (set! (-> obj can-go-knocked?) #f) + (go (method-of-object obj knocked)) + ) + (else + ((method-of-type nav-enemy enemy-method-73) obj) + ) + ) + (none) + ) + +;; definition for method 90 of type hopper +;; INFO: Used lq/sq +(defmethod enemy-method-90 hopper ((obj hopper) (arg0 int) (arg1 enemy-jump-info)) + (when (= (-> obj jump-why) 2) + (cond + ((zero? arg0) + (logior! (-> obj focus-status) (focus-status touch-water under-water)) + ) + (else + (when (logtest? (-> obj focus-status) (focus-status touch-water)) + (let ((s3-0 (new 'stack-no-clear 'water-info))) + (water-info-init! (-> obj root-override2) s3-0 (collide-action solid semi-solid)) + (let ((v1-9 #f)) + (cond + ((not (logtest? (water-flags touch-water) (-> s3-0 flags))) + (if (logtest? (-> obj focus-status) (focus-status under-water)) + (set! v1-9 #t) + ) + (logclear! (-> obj focus-status) (focus-status touch-water under-water)) + ) + ((logtest? (-> obj focus-status) (focus-status under-water)) + (let ((f0-1 (+ 11264.0 (-> obj root-override2 trans y)))) + (if (< (-> s3-0 trans y) f0-1) + (set! v1-9 #t) + ) + ) + ) + ) + (when v1-9 + (logclear! (-> obj focus-status) (focus-status under-water)) + (let ((s2-0 (new 'stack-no-clear 'vector))) + (set! (-> s2-0 quad) (-> obj root-override2 trans quad)) + (when (logtest? (water-flags touch-water) (-> s3-0 flags)) + (set! (-> s2-0 y) (-> s3-0 trans y)) + (let ((s3-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s3-1 + (let ((t9-2 (method-of-type part-tracker activate))) + (t9-2 + (the-as part-tracker s3-1) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-3 run-function-in-process) + (a0-26 s3-1) + (a1-6 part-tracker-init) + (a2-6 (-> *part-group-id-table* 121)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> s2-0 quad)) + ((the-as (function object object object object object object object object none) t9-3) + a0-26 + a1-6 + a2-6 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> s3-1 ppointer) + ) + ) + (sound-play "splash-out") + ) + ) + ) + ) + ) + ) + ) + ) + ) + ((method-of-type nav-enemy enemy-method-90) obj arg0 arg1) + ) + +;; definition for method 89 of type hopper +(defmethod enemy-method-89 hopper ((obj hopper) (arg0 enemy-jump-info)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-2 (-> obj draw art-group data (-> obj jump-start-anim))) + (a0-4 (-> obj skel root-channel 0)) + ) + (set! (-> a0-4 frame-group) (the-as art-joint-anim a1-2)) + (set! (-> a0-4 param 0) (the float (+ (-> (the-as art-joint-anim a1-2) frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg0 anim-speed)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim a1-2) num-func-seek!) + ) + #t + ) + +;; definition for method 87 of type hopper +(defmethod enemy-method-87 hopper ((obj hopper) (arg0 enemy-jump-info)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-2 (-> obj draw art-group data (-> obj jump-air-anim))) + (a0-4 (-> obj skel root-channel 0)) + ) + (set! (-> a0-4 frame-group) (the-as art-joint-anim a1-2)) + (set! (-> a0-4 param 0) (the float (+ (-> (the-as art-joint-anim a1-2) frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg0 anim-speed)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim a1-2) num-func-seek!) + ) + #t + ) + +;; definition for method 88 of type hopper +(defmethod enemy-method-88 hopper ((obj hopper) (arg0 enemy-jump-info)) + (ja-channel-push! 1 (seconds 0.075)) + (let ((a1-2 (-> obj draw art-group data (-> obj jump-land-anim))) + (a0-4 (-> obj skel root-channel 0)) + ) + (set! (-> a0-4 frame-group) (the-as art-joint-anim a1-2)) + (set! (-> a0-4 param 0) (the float (+ (-> (the-as art-joint-anim a1-2) frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg0 anim-speed)) + (set! (-> a0-4 frame-num) 0.0) + (joint-control-channel-group! a0-4 (the-as art-joint-anim a1-2) num-func-seek!) + ) + #t + ) + +;; failed to figure out what this is: +(defstate jump (hopper) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy jump) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy jump) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self draw shadow-ctrl))) + (logclear! (-> v1-5 settings flags) (shadow-flags shdf03)) + (let ((a0-2 v1-5)) + (set! (-> a0-2 settings top-plane w) (- 4096.0)) + ) + 0 + (set! (-> v1-5 settings bot-plane w) (- -4096.0)) + ) + 0 + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy jump) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self draw shadow-ctrl))) + (logior! (-> v1-5 settings flags) (shadow-flags shdf03)) + (let ((a0-2 v1-5)) + (set! (-> a0-2 settings bot-plane w) + (- (+ (- -4096.0 (-> self root-override2 trans y)) (-> self root-override2 gspot-pos y))) + ) + ) + 0 + (set! (-> v1-5 settings top-plane w) + (- (+ (- 8192.0 (-> self root-override2 trans y)) (-> self root-override2 gspot-pos y))) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 178 of type hopper +;; INFO: Used lq/sq +(defmethod hopper-method-178 hopper ((obj hopper)) + (local-vars (sv-752 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (+! (-> obj step-num) -1) + (cond + ((>= (-> obj step-num) 0) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (vector-rotate-around-y! s3-0 (-> obj direction) (* 182.04445 (the float (+ (* (-> obj step-num) 16) -135)))) + (let ((a1-1 s5-0)) + (let ((v1-7 (-> obj origin))) + (let ((a0-2 s3-0)) + (let ((a2-1 (-> obj jump-dist))) + (.mov vf7 a2-1) + ) + (.lvf vf5 (&-> a0-2 quad)) + ) + (.lvf vf4 (&-> v1-7 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a1-1 quad) vf6) + ) + (let ((v1-8 (-> obj nav)) + (a0-3 s5-0) + (a1-2 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-2 point) a0-3 (-> v1-8 state mesh bounds)) + (set! (-> a1-2 y-threshold) (-> v1-8 nearest-y-threshold)) + (set! (-> a1-2 ignore) (the-as uint 2)) + (let ((s4-0 (find-poly-containing-point-local (-> v1-8 state mesh) a1-2))) + (when s4-0 + (let ((f30-0 (vector-dot s3-0 (-> obj direction)))) + (new 'stack-no-clear 'vector) + (let ((a1-3 (new 'stack-no-clear 'vector))) + (set! (-> a1-3 quad) (-> s5-0 quad)) + (set! (-> a1-3 w) 6144.0) + (when (not (add-root-sphere-to-hash! (-> obj nav) a1-3 #x8006c)) + (when (< (-> obj best-score) f30-0) + (set! (-> obj best-score) f30-0) + (let ((s2-0 (new 'stack-no-clear 'vector))) + (set! sv-752 (new 'stack-no-clear 'vector)) + (let ((s3-1 (new 'stack 'collide-query))) + (let ((s0-0 (-> obj nav)) + (s1-0 s2-0) + ) + (let* ((v1-21 s5-0) + (a0-10 (-> s0-0 state mesh)) + (t9-4 (method-of-object a0-10 project-point-onto-plane-of-poly-local)) + (a2-5 s1-0) + (t0-1 (vector-! (new 'stack-no-clear 'vector) v1-21 (-> s0-0 state mesh bounds))) + ) + (t9-4 a0-10 s4-0 a2-5 sv-752 t0-1) + ) + (vector+! s1-0 s1-0 (-> s0-0 state mesh bounds)) + ) + 0 + (set! (-> s5-0 y) (-> s2-0 y)) + (if (enemy-method-126 obj s3-1 s5-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> s5-0 y) (-> s3-1 best-other-tri intersect y)) + ) + ) + ) + (set! (-> obj best-point quad) (-> s5-0 quad)) + ) + ) + ) + ) + ) + ) + ) + ) + #t + ) + (else + #f + ) + ) + ) + ) + +;; failed to figure out what this is: +(defstate stare (hopper) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy stare) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + ) + +;; definition for symbol *hopper-next-jump-time*, type time-frame +(define *hopper-next-jump-time* (the-as time-frame 0)) + +;; failed to figure out what this is: +(defstate hostile (hopper) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-4 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-7 enemy-flags)))) + ) + 0 + (set! (-> self speed-y) 0.0) + (set! (-> self accel-y) 0.0) + (set! (-> self next-jump-time) (the-as int (+ (-> self clock frame-counter) (get-rand-int-range self 0 120)))) + (set! (-> self step-num) 0) + (set! (-> self best-score) -2.0) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) exit))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :post (the-as (function none :behavior hopper) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate active (hopper) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! hopper-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim hopper-idle-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (the-as (function none :behavior hopper) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate notice (hopper) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (if (zero? (get-rand-int self 2)) + (ja :group! hopper-notice-ja) + (ja :group! hopper-notice-alt-ja) + ) + (ja-no-eval :group! (ja-group) + :num! (seek! (the float (+ (-> (ja-group) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((a1-4 (-> self nav state))) + (set! (-> gp-0 quad) (-> a1-4 travel quad)) + ) + (seek-toward-heading-vec! (-> self root-override2) gp-0 (-> self nav max-rotation-rate) (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate ambush (hopper) + :virtual #t + :enter (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (logclear! (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (let ((gp-0 (-> self on-notice))) + (if gp-0 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (-> self root-override2 trans)) + (the-as pair gp-0) + ) + ) + ) + ) + (let ((v1-12 (-> self root-override2 root-prim))) + (set! (-> self root-override2 backup-collide-as) (-> v1-12 prim-core collide-as)) + (set! (-> self root-override2 backup-collide-with) (-> v1-12 prim-core collide-with)) + ) + (let ((v1-15 (-> self root-override2 root-prim))) + (set! (-> v1-15 prim-core collide-as) (collide-spec)) + (set! (-> v1-15 prim-core collide-with) (collide-spec)) + ) + 0 + (when (handle->process (-> self focus handle)) + (let ((gp-1 (-> self root-override2)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (let ((s4-0 (new 'stack-no-clear 'vector))) + 0.0 + (get-point-in-path! (-> self path-intro) s5-0 0.0 'exact) + (set! (-> s5-0 y) (+ -16384.0 (-> s5-0 y))) + (get-point-in-path! (-> self path-intro) s4-0 1.0 'exact) + (let ((f0-3 (deg-diff + (quaternion-y-angle (-> gp-1 quat)) + (vector-y-angle (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s4-0 s5-0) 1.0)) + ) + ) + ) + (quaternion-rotate-y! (-> gp-1 quat) (-> gp-1 quat) f0-3) + ) + ) + (set! (-> gp-1 trans quad) (-> s5-0 quad)) + ) + ) + (none) + ) + :exit (behavior () + (let ((v1-1 (-> self root-override2 root-prim))) + (set! (-> v1-1 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-1 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (logclear! (-> self draw status) (draw-control-status no-draw)) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (let ((s5-0 (new 'stack 'collide-query))) + (get-point-in-path! (-> self path-intro) gp-0 1.0 'exact) + (if (enemy-method-126 self s5-0 gp-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> gp-0 y) (-> s5-0 best-other-tri intersect y)) + ) + ) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag vulnerable)))) + (send-event self 'jump 2 gp-0) + ) + (go-virtual hostile) + (none) + ) + ) + +;; definition for method 132 of type hopper +(defmethod enemy-method-132 hopper ((obj hopper)) + (when (-> obj minimap) + (logior! (-> obj minimap flags) (minimap-flag fade-out)) + (set! (-> obj minimap) #f) + ) + ((the-as (function enemy none) (find-parent-method hopper 132)) obj) + (none) + ) + +;; definition for method 7 of type hopper +;; WARN: Return type mismatch process-focusable vs hopper. +(defmethod relocate hopper ((obj hopper) (arg0 int)) + (if (nonzero? (-> obj path-intro)) + (&+! (-> obj path-intro) arg0) + ) + (the-as + hopper + ((the-as (function process-focusable int process-focusable) (find-parent-method hopper 7)) obj arg0) + ) + ) + +;; definition for method 114 of type hopper +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 hopper ((obj hopper)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set! (-> s4-0 transform-index) 12) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 9216.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-14 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-14 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-14 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-14 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-14 local-sphere) 0.0 3686.4 0.0 3686.4) + ) + (let ((v1-16 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-16 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-16 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-16 prim-core action) (collide-action deadly)) + (set! (-> v1-16 transform-index) 5) + (set-vector! (-> v1-16 local-sphere) 0.0 0.0 819.2 3276.8) + ) + (set! (-> s5-0 nav-radius) 4096.0) + (let ((v1-18 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-18 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-18 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 115 of type hopper +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 hopper ((obj hopper)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-hopper" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *hopper-nav-enemy-info*) + (set! (-> obj can-go-knocked?) #t) + (let ((v1-9 (-> obj neck))) + (set! (-> v1-9 up) (the-as uint 1)) + (set! (-> v1-9 nose) (the-as uint 2)) + (set! (-> v1-9 ear) (the-as uint 0)) + (set-vector! (-> v1-9 twist-max) 10922.667 12743.111 0.0 1.0) + (set! (-> v1-9 ignore-angle) 18204.445) + ) + (set! (-> obj jump-start-anim) (the-as uint 10)) + (set! (-> obj jump-air-anim) (the-as uint 13)) + (set! (-> obj jump-land-anim) (the-as uint 14)) + (set! (-> obj jump-height-min) 12288.0) + (set! (-> obj jump-anim-start-frame) 8.0) + (set! (-> obj land-anim-index) 26) + (set! (-> obj side) (get-rand-float-range obj -1.5 1.5)) + (when (logtest? (enemy-option ambush) (-> obj fact-info-override enemy-options)) + (set! (-> obj path-intro) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (if (-> obj path-intro) + (logior! (-> obj path-intro flags) (path-control-flag display draw-line draw-point draw-text)) + ) + ) + (add-connection *part-engine* obj 5 obj 318 (new 'static 'vector :x 1392.64 :y 491.52 :z 1638.4 :w 163840.0)) + (add-connection *part-engine* obj 5 obj 318 (new 'static 'vector :x -1392.64 :y 491.52 :z 1638.4 :w 163840.0)) + (logior! (-> obj nav flags) (nav-control-flag output-sphere-hash)) + (let ((v1-34 (-> obj nav))) + (set! (-> v1-34 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 327680.0) + (let ((v1-39 (-> obj nav))) + (set! (-> v1-39 nav-cull-radius) 61440.0) + ) + 0 + (set! (-> obj minimap) + (minimap-method-12 *minimap* obj (the-as uint 70) (the-as int #f) (the-as vector #t) 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 new file mode 100644 index 0000000000..abd876a450 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/metalhead_bearer/centurion_REF.gc @@ -0,0 +1,1650 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol *centurion-shield-glow-spt-scale-x*, type int +(define *centurion-shield-glow-spt-scale-x* #x9000) + +;; definition for symbol *centurion-shield-glow-spt-scale-y*, type int +(define *centurion-shield-glow-spt-scale-y* #x7000) + +;; definition for symbol *centurion-shield-center-spt-scale-x*, type int +(define *centurion-shield-center-spt-scale-x* 8192) + +;; definition for symbol *centurion-shield-center-spt-scale-y*, type int +(define *centurion-shield-center-spt-scale-y* #x4666) + +;; definition for symbol *centurion-shield-spt-scale-x*, type int +(define *centurion-shield-spt-scale-x* #x3666) + +;; definition for symbol *centurion-shield-spt-scale-y*, type int +(define *centurion-shield-spt-scale-y* #x5666) + +;; definition for symbol *centurion-shield-2-spt-scale-x*, type int +(define *centurion-shield-2-spt-scale-x* #x3800) + +;; definition for symbol *centurion-shield-2-spt-scale-y*, type int +(define *centurion-shield-2-spt-scale-y* #x5800) + +;; definition for function centurion-shield-big +;; WARN: Return type mismatch int vs none. +(defun centurion-shield-big () + (set! *centurion-shield-glow-spt-scale-x* #x9000) + (set! *centurion-shield-glow-spt-scale-y* #x7000) + (set! *centurion-shield-center-spt-scale-x* 8192) + (set! *centurion-shield-center-spt-scale-y* #x4666) + (set! *centurion-shield-spt-scale-x* #x3666) + (set! *centurion-shield-spt-scale-y* #x5666) + (set! *centurion-shield-2-spt-scale-x* #x3800) + (set! *centurion-shield-2-spt-scale-y* #x5800) + (none) + ) + +;; definition for function centurion-shield-little +;; WARN: Return type mismatch int vs none. +(defun centurion-shield-little () + (set! *centurion-shield-glow-spt-scale-x* #x4000) + (set! *centurion-shield-glow-spt-scale-y* #x3000) + (set! *centurion-shield-center-spt-scale-x* 5734) + (set! *centurion-shield-center-spt-scale-y* #x3000) + (set! *centurion-shield-spt-scale-x* #x2800) + (set! *centurion-shield-spt-scale-y* #x3800) + (set! *centurion-shield-2-spt-scale-x* #x2999) + (set! *centurion-shield-2-spt-scale-y* #x3999) + (none) + ) + +;; failed to figure out what this is: +(defpartgroup group-centurion-shield + :id 474 + :duration (seconds 0.5) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 2) + :parts ((sp-item 2101 :flags (is-3d bit6 bit7)) + (sp-item 2102 :flags (is-3d bit6 bit7)) + (sp-item 2103 :flags (is-3d bit6 bit7)) + (sp-item 2104 :flags (bit6)) + ) + ) + +;; failed to figure out what this is: +(defpart 2104 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-scale-x (meters 9) (meters 0.5) 1.0) + (sp-flt spt-rot-x 409.6) + (sp-rnd-flt spt-scale-y (meters 7) (meters 0.5) 1.0) + (sp-rnd-flt spt-r 64.0 64.0 1.0) + (sp-flt spt-g 0.0) + (sp-flt spt-b 128.0) + (sp-flt spt-a 40.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-flt spt-userdata 2048.0) + ) + ) + +;; failed to figure out what this is: +(defpart 2103 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x29 :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-x (meters 0.1)) + (sp-flt spt-y (meters 0)) + (sp-flt spt-z (meters 0)) + (sp-rnd-flt spt-scale-x (meters 2) (meters 1) 1.0) + (sp-flt spt-rot-x 0.0) + (sp-flt spt-rot-y (degrees 0.0)) + (sp-flt spt-rot-z (degrees 90.0)) + (sp-rnd-flt spt-scale-y (meters 4.4) (meters 1) 1.0) + (sp-flt spt-r 255.0) + (sp-rnd-flt spt-g 128.0 128.0 1.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 80.0 20.0 1.0) + (sp-rnd-flt spt-accel-y -1.3653333 -4.096 1.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +;; failed to figure out what this is: +(defpart 2102 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x13 :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-x (meters 0.1)) + (sp-flt spt-y (meters 0)) + (sp-flt spt-z (meters 0)) + (sp-flt spt-scale-x (meters 3.4)) + (sp-flt spt-rot-x 0.0) + (sp-flt spt-rot-y (degrees 0.0)) + (sp-flt spt-rot-z (degrees 90.0)) + (sp-flt spt-scale-y (meters 5.4)) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-flt spt-g 0.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 10.0 10.0 1.0) + (sp-rnd-flt spt-accel-y -1.3653333 -4.096 1.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +;; failed to figure out what this is: +(defpart 2101 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x2c :page #xc)) + (sp-flt spt-num 1.0) + (sp-flt spt-x (meters 0.1)) + (sp-flt spt-y (meters 0)) + (sp-flt spt-z (meters 0)) + (sp-flt spt-scale-x (meters 3.5)) + (sp-flt spt-rot-x 0.0) + (sp-flt spt-rot-y (degrees 0.0)) + (sp-flt spt-rot-z (degrees 90.0)) + (sp-flt spt-scale-y (meters 5.5)) + (sp-rnd-flt spt-r 128.0 128.0 1.0) + (sp-rnd-flt spt-g 0.0 64.0 1.0) + (sp-flt spt-b 255.0) + (sp-rnd-flt spt-a 128.0 128.0 1.0) + (sp-rnd-flt spt-accel-y -1.3653333 -4.096 1.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +;; definition of type centurion-shot +(deftype centurion-shot (metalhead-shot) + () + :heap-base #x170 + :method-count-assert 40 + :size-assert #x1f0 + :flag-assert #x28017001f0 + ) + +;; definition for method 3 of type centurion-shot +(defmethod inspect centurion-shot ((obj centurion-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 centurion-shot +;; WARN: Return type mismatch int vs sound-id. +(defmethod play-impact-sound centurion-shot ((obj centurion-shot) (arg0 projectile-options)) + (let ((v1-0 arg0)) + (cond + ((zero? v1-0) + (sound-play "cent-shot-fire") + ) + ((= v1-0 (projectile-options lose-altitude)) + (sound-play "cent-shot-hit") + ) + ((= v1-0 (projectile-options lose-altitude proj-options-2)) + ((the-as (function projectile projectile-options sound-id) (find-parent-method centurion-shot 28)) obj arg0) + ) + ) + ) + (the-as sound-id 0) + ) + +;; definition for method 31 of type centurion-shot +;; WARN: Return type mismatch int vs none. +(defmethod init-proj-settings! centurion-shot ((obj centurion-shot)) + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc + :virtual" + ((the-as (function projectile none) (find-parent-method centurion-shot 31)) obj) + (set! (-> obj max-speed) 327680.0) + (set! (-> obj timeout) (seconds 1.25)) + (none) + ) + +;; definition of type centurion +(deftype centurion (nav-enemy) + ((los los-control :inline :offset-assert 608) + (target-pos vector :inline :offset-assert 768) + (can-shoot? basic :offset-assert 784) + (incoming-attack-id uint32 :offset-assert 788) + (can-take-damage? symbol :offset-assert 792) + (first-shoot? symbol :offset-assert 796) + (shoot-dir vector :inline :offset-assert 800) + (tar-pos vector :inline :offset-assert 816) + (joint joint-mod :offset-assert 832) + (joint-enable symbol :offset-assert 836) + (victory-sound sound-id :offset-assert 840) + (shield-shot uint32 :offset-assert 844) + ) + :heap-base #x2d0 + :method-count-assert 183 + :size-assert #x350 + :flag-assert #xb702d00350 + (:methods + (attack () _type_ :state 178) + (fire () _type_ :state 179) + (centurion-method-180 (_type_) none 180) + (centurion-method-181 (_type_ vector) int 181) + (centurion-method-182 (_type_ vector) symbol 182) + ) + ) + +;; definition for method 3 of type centurion +(defmethod inspect centurion ((obj centurion)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tlos: #~%" (-> obj los)) + (format #t "~2Ttarget-pos: #~%" (-> obj target-pos)) + (format #t "~2Tcan-shoot?: ~A~%" (-> obj can-shoot?)) + (format #t "~2Tincoming-attack-id: ~D~%" (-> obj incoming-attack-id)) + (format #t "~2Tcan-take-damage?: ~A~%" (-> obj can-take-damage?)) + (format #t "~2Tfirst-shoot?: ~A~%" (-> obj first-shoot?)) + (format #t "~2Tshoot-dir: #~%" (-> obj shoot-dir)) + (format #t "~2Ttar-pos: #~%" (-> obj tar-pos)) + (format #t "~2Tjoint: ~A~%" (-> obj joint)) + (format #t "~2Tjoint-enable: ~A~%" (-> obj joint-enable)) + (format #t "~2Tvictory-sound: ~D~%" (-> obj victory-sound)) + (format #t "~2Tshield-shot: ~D~%" (-> obj shield-shot)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-centurion centurion centurion-lod0-jg centurion-idle-ja + ((centurion-lod0-mg (meters 20)) (centurion-lod1-mg (meters 999999))) + :bounds (static-spherem 0 2.25 -0.7 6.5) + :shadow centurion-shadow-mg + ) + +;; definition of type centurion-anim-info +(deftype centurion-anim-info (structure) + ((anim-index int32 :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + +;; definition for method 3 of type centurion-anim-info +(defmethod inspect centurion-anim-info ((obj centurion-anim-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'centurion-anim-info) + (format #t "~1Tanim-index: ~D~%" (-> obj anim-index)) + (label cfg-4) + obj + ) + +;; definition of type centurion-global-info +(deftype centurion-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (yellow-hit-anim int32 1 :offset-assert 8) + (blue-hit-anim int32 3 :offset-assert 12) + ) + :pack-me + :method-count-assert 9 + :size-assert #x18 + :flag-assert #x900000018 + ) + +;; definition for method 3 of type centurion-global-info +(defmethod inspect centurion-global-info ((obj centurion-global-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tprev-yellow-hit: ~D~%" (-> obj prev-yellow-hit)) + (format #t "~1Tprev-blue-hit: ~D~%" (-> obj prev-blue-hit)) + (format #t "~1Tyellow-hit-anim[1] @ #x~X~%" (-> obj yellow-hit-anim)) + (format #t "~1Tblue-hit-anim[3] @ #x~X~%" (-> obj blue-hit-anim)) + (label cfg-4) + obj + ) + +;; definition for symbol *centurion-global-info*, type centurion-global-info +(define *centurion-global-info* (new 'static 'centurion-global-info + :yellow-hit-anim (new 'static 'array int32 1 21) + :blue-hit-anim (new 'static 'array int32 3 18 20 19) + ) + ) + +;; definition for symbol *centurion-nav-enemy-info*, type nav-enemy-info +(define *centurion-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 #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010601 #x0 #x0 #x0) + :idle-anim 6 + :notice-anim 8 + :hostile-anim 13 + :hit-anim 16 + :knocked-anim 21 + :knocked-land-anim 22 + :die-anim 34 + :die-falling-anim 23 + :victory-anim 4 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 8 + :look-at-joint 8 + :bullseye-joint 5 + :sound-hit (static-sound-name "centurion-hit") + :sound-die (static-sound-name "centurion-die") + :notice-distance (meters 100) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 100) + :default-hit-points 3 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :friction 0.1 + :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-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 32768.0 + :knocked-soft-vxz-hi 65536.0 + :knocked-soft-vy-lo 32768.0 + :knocked-soft-vy-hi 49152.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 16384.0 + :knocked-yellow-vxz-hi 32768.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 20480.0 + :knocked-blue-vy-hi 40960.0 + :shadow-size (meters 1) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 8 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 1843.2 :z 1146.88 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 9 + :turn-anim -1 + :run-anim -1 + :taunt-anim -1 + :run-travel-speed (meters 6) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 2) + :walk-travel-speed (meters 1.8) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 16) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 100) + :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! (-> *centurion-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 74 of type centurion +(defmethod enemy-method-74 centurion ((obj centurion) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (with-pp + (case arg2 + (('jump) + #f + ) + (('touch) + (cond + ((and (-> obj next-state) (= (-> obj next-state name) 'attack)) + (let ((s4-1 (-> arg3 param 0))) + (let ((s3-1 arg0)) + (if (type? s3-1 process-focusable) + (empty) + ) + ) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer pp)) + (set! (-> a1-2 num-params) 2) + (set! (-> a1-2 message) 'attack-or-shove) + (set! (-> a1-2 param 0) s4-1) + (let ((v1-10 (new 'static 'attack-info :mask (attack-info-mask mode shove-back shove-up id)))) + (let* ((a0-6 *game-info*) + (a2-2 (+ (-> a0-6 attack-id) 1)) + ) + (set! (-> a0-6 attack-id) a2-2) + (set! (-> v1-10 id) a2-2) + ) + (set! (-> v1-10 shove-back) (* 2.0 (-> obj enemy-info-override attack-shove-back))) + (set! (-> v1-10 shove-up) (* 2.0 (-> obj enemy-info-override attack-shove-up))) + (set! (-> v1-10 mode) 'deadly) + (set! (-> a1-2 param 1) (the-as uint v1-10)) + ) + (send-event-function arg0 a1-2) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + (('attack) + (let ((v1-12 (the-as object (-> arg3 param 1)))) + (cond + ((!= (-> (the-as attack-info v1-12) id) (-> obj incoming-attack-id)) + (set! (-> obj incoming-attack-id) (-> (the-as attack-info v1-12) id)) + (cond + ((or (-> obj can-take-damage?) + (logtest? (penetrate dark-skin dark-punch dark-bomb) (-> (the-as attack-info v1-12) penetrate-using)) + ) + (cond + ((and (-> obj next-state) (= (-> obj next-state name) 'fire)) + (centurion-method-180 obj) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + (else + (+! (-> obj shield-shot) 1) + (if (= (-> obj shield-shot) 4) + (talker-spawn-func (-> *talker-speech* 58) *entity-pool* (target-pos 0) (the-as region #f)) + ) + (set! (-> *part-id-table* 2102 init-specs 13 initial-valuef) 255.0) + (set! (-> obj state-time) (-> pp clock frame-counter)) + 'back + ) + ) + ) + (else + #f + ) + ) + ) + ) + (('victory) + (if (and (not (and (-> obj next-state) (= (-> obj next-state name) 'victory))) + (and (> (-> obj hit-points) 0) + (zero? (-> obj fated-time)) + (zero? (logand (-> obj focus-status) (focus-status grabbed))) + ) + ) + (go (method-of-object obj victory)) + ) + ) + (('notify) + (let ((v1-47 (handle->process (-> obj focus handle)))) + (when (and (= (-> arg3 param 0) 'attack) + (= (-> arg3 param 1) v1-47) + (-> obj next-state) + (let ((v1-52 (-> obj next-state name))) + (or (= v1-52 'hostile) (= v1-52 'fire)) + ) + ) + (let ((a1-13 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-13 from) (process->ppointer arg0)) + (set! (-> a1-13 num-params) (the-as int arg1)) + (set! (-> a1-13 message) 'victory) + (set! (-> a1-13 param 0) (-> arg3 param 0)) + (set! (-> a1-13 param 1) (-> arg3 param 1)) + (set! (-> a1-13 param 2) (-> arg3 param 2)) + (set! (-> a1-13 param 3) (-> arg3 param 3)) + (set! (-> a1-13 param 4) (-> arg3 param 4)) + (set! (-> a1-13 param 5) (-> arg3 param 5)) + (send-event-function obj a1-13) + ) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +;; definition for method 181 of type centurion +;; INFO: Used lq/sq +(defmethod centurion-method-181 centurion ((obj centurion) (arg0 vector)) + (local-vars (sv-224 vector) (sv-240 vector) (sv-256 vector)) + (with-pp + (if (not (-> obj joint-enable)) + (return (the-as int #f)) + ) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> arg0 quad)) + (let* ((v0-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 4))) + (s1-0 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s5-0 v0-1) 1.0)) + (s3-0 (new 'stack-no-clear 'vector)) + ) + (new 'stack-no-clear 'vector) + (let ((s5-1 (new 'stack-no-clear 'quaternion))) + (vector-z-quaternion! + (new 'stack-no-clear 'vector) + (quaternion*! (new 'stack-no-clear 'quaternion) (-> obj joint quat) (-> obj root-override2 quat)) + ) + (let ((s4-1 (new 'stack-no-clear 'vector))) + (vector-z-quaternion! s3-0 (-> obj root-override2 quat)) + (let ((f30-0 (deg-diff (vector-y-angle s3-0) (vector-y-angle s1-0)))) + 0.0 + (new 'stack-no-clear 'vector) + (new 'stack-no-clear 'vector) + (let ((s2-2 (new 'stack-no-clear 'vector))) + (let ((s0-1 vector-rotate-around-y!)) + (set! sv-224 s4-1) + (set! sv-240 s1-0) + (let ((a2-1 (- (vector-y-angle s1-0)))) + (s0-1 sv-224 sv-240 a2-1) + ) + ) + (let ((s1-1 vector-rotate-around-y!) + (s0-2 s2-2) + ) + (set! sv-256 s3-0) + (let ((a2-2 (- (vector-y-angle s3-0)))) + (s1-1 s0-2 sv-256 a2-2) + ) + ) + (let ((f0-9 (deg-diff (atan (-> s4-1 y) (-> s4-1 z)) (atan (-> s2-2 y) (-> s2-2 z))))) + (set-vector! s4-1 f0-9 f30-0 0.0 1.0) + ) + ) + ) + (quaternion-zxy! s5-1 s4-1) + ) + (quaternion-pseudo-seek (-> obj joint quat) (-> obj joint quat) s5-1 (-> pp clock seconds-per-frame)) + ) + ) + ) + (vector-z-quaternion! + (-> obj shoot-dir) + (quaternion*! (new 'stack-no-clear 'quaternion) (-> obj joint quat) (-> obj root-override2 quat)) + ) + 0 + ) + ) + +;; failed to figure out what this is: +(defstate victory (centurion) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy victory) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self root-override2 root-prim specific 0) (+ (-> self root-override2 root-prim specific 1) -1)) + (set! (-> self can-take-damage?) #t) + (centurion-shield-little) + (set! (-> self victory-sound) (new 'static 'sound-id)) + 0 + (none) + ) + :exit (behavior () + (if (nonzero? (-> self victory-sound)) + (sound-stop (-> self victory-sound)) + ) + (let ((t9-1 (-> (method-of-type nav-enemy victory) exit))) + (if t9-1 + (t9-1) + ) + ) + (set! (-> self root-override2 root-prim specific 0) (-> self root-override2 root-prim specific 1)) + (set! (-> self can-take-damage?) #f) + (centurion-shield-big) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override victory-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override victory-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (if (and (zero? (-> self victory-sound)) (>= (ja-frame-num 0) 4.0)) + (set! (-> self victory-sound) (sound-play "cent-celebrate")) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (set! (-> self victory-sound) (new 'static 'sound-id)) + 0 + (none) + ) + ) + +;; definition for method 67 of type centurion +;; WARN: Return type mismatch object vs none. +(defmethod go-stare centurion ((obj centurion)) + (if (not (and (-> obj next-state) (= (-> obj next-state name) 'hostile))) + (go (method-of-object obj hostile)) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate active (centurion) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! centurion-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-idle-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (the-as (function none :behavior centurion) nav-enemy-simple-post) + ) + +;; definition for method 180 of type centurion +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod centurion-method-180 centurion ((obj centurion)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (when (-> obj can-shoot?) + (let ((s5-0 (new 'stack-no-clear 'projectile-init-by-other-params))) + (let* ((a1-0 (-> obj node-list data 29)) + (s3-0 (vector<-cspace! (new 'stack-no-clear 'vector) a1-0)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (cond + ((-> obj first-shoot?) + (let ((s0-0 (handle->process (-> obj focus handle))) + (s2-0 (new 'stack-no-clear 'vector)) + ) + (when s0-0 + (set! (-> s2-0 quad) (-> (get-trans (the-as process-focusable s0-0) 3) quad)) + (let ((s1-2 (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) s2-0))) + (let* ((f0-0 (vector-length s1-2)) + (f0-1 (* 0.0000030517579 f0-0)) + (a0-7 s2-0) + ) + (let ((v1-17 s2-0)) + (let ((a1-4 (-> (the-as process-focusable s0-0) root-override transv))) + (let ((a2-0 f0-1)) + (.mov vf7 a2-0) + ) + (.lvf vf5 (&-> a1-4 quad)) + ) + (.lvf vf4 (&-> v1-17 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-7 quad) vf6) + ) + (set! (-> s1-2 y) 0.0) + (vector-rotate90-around-y! s1-2 s1-2) + (vector-normalize! s1-2 12288.0) + (vector-! s4-0 s2-0 s3-0) + (vector+! s4-0 s4-0 s1-2) + ) + ) + ) + ) + (else + (vector-! s4-0 (-> obj target-pos) s3-0) + ) + ) + (vector-normalize! s4-0 327680.0) + (set! (-> s5-0 ent) (-> obj entity)) + (set! (-> s5-0 charge) 1.0) + (set! (-> s5-0 options) (projectile-options)) + (set! (-> s5-0 pos quad) (-> s3-0 quad)) + (set! (-> s5-0 vel quad) (-> s4-0 quad)) + ) + (set! (-> s5-0 notify-handle) (process->handle obj)) + (set! (-> s5-0 owner-handle) (the-as handle #f)) + (set! (-> s5-0 ignore-handle) (process->handle obj)) + (let* ((v1-32 *game-info*) + (a0-26 (+ (-> v1-32 attack-id) 1)) + ) + (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)) + (spawn-projectile centurion-shot s5-0 obj *default-dead-pool*) + ) + (set! (-> obj can-shoot?) #f) + ) + 0 + (none) + ) + ) + +;; failed to figure out what this is: +(defstate fire (centurion) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior centurion) enemy-event-handler) + :enter (behavior () + (set! (-> self can-shoot?) (the-as basic #t)) + (if (and (-> self first-shoot?) (logtest? (-> self draw status) (draw-control-status on-screen))) + (set! (-> self first-shoot?) #f) + ) + (centurion-shield-little) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-8 *game-info*) + (v0-1 (+ (-> v1-8 attack-id) 1)) + ) + (set! (-> v1-8 attack-id) v0-1) + (set! (-> self attack-id) v0-1) + ) + (none) + ) + :exit (behavior () + (set! (-> self first-shoot?) #f) + (set! (-> self can-take-damage?) #f) + (set! (-> self root-override2 root-prim specific 0) (-> self root-override2 root-prim specific 1)) + (centurion-shield-big) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (let ((f30-0 1.0)) + (when (logtest? (-> self fact-info-override enemy-options) (enemy-option user0)) + (set! f30-0 0.75) + (let ((a0-1 (handle->process (-> self focus handle)))) + (if a0-1 + (set! (-> self target-pos quad) (-> (get-trans (the-as process-focusable a0-1) 3) quad)) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! centurion-shoot-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-shoot-start-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((gp-2 (handle->process (-> self focus handle)))) + (when gp-2 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable gp-2) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + (if (< (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable gp-2) 0)) + 24576.0 + ) + (go-virtual attack) + ) + ) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (set! (-> self root-override2 root-prim specific 0) (+ (-> self root-override2 root-prim specific 1) -1)) + (set! (-> self can-take-damage?) #t) + (when (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user0))) + (let ((a0-20 (handle->process (-> self focus handle)))) + (if a0-20 + (set! (-> self target-pos quad) (-> (get-trans (the-as process-focusable a0-20) 3) quad)) + ) + ) + ) + (centurion-method-180 self) + (ja-no-eval :group! centurion-shoot-loop-ja :num! (seek! 2.0) :frame-num 0.0) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! 2.0)) + ) + (set! (-> self can-shoot?) (the-as basic #t)) + (when (handle->process (-> self focus handle)) + ) + (centurion-method-180 self) + (ja-no-eval :group! centurion-shoot-loop-ja :num! (seek! 2.0) :frame-num 0.0) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! 2.0)) + ) + (set! (-> self can-shoot?) (the-as basic #t)) + (when (handle->process (-> self focus handle)) + ) + (centurion-method-180 self) + (ja-no-eval :group! centurion-shoot-loop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-shoot-loop-ja) frames num-frames) -1)) 0.4) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.4)) + ) + (set! (-> self can-take-damage?) #f) + (set! (-> self root-override2 root-prim specific 0) (-> self root-override2 root-prim specific 1)) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! centurion-shoot-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-shoot-end-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior centurion) enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate attack (centurion) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior centurion) enemy-event-handler) + :enter (behavior () + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3 prim-core action) + (collide-action solid deadly) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3 local-sphere w) + 10240.0 + ) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-7 *game-info*) + (v0-0 (+ (-> v1-7 attack-id) 1)) + ) + (set! (-> v1-7 attack-id) v0-0) + (set! (-> self attack-id) v0-0) + ) + (none) + ) + :exit (behavior () + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3 prim-core action) + (collide-action solid) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3 local-sphere w) 5120.0) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! centurion-hit-away-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim centurion-hit-away-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior centurion) enemy-simple-post) + ) + +;; definition for method 132 of type centurion +(defmethod enemy-method-132 centurion ((obj centurion)) + (talker-speech-class-method-10 (-> *talker-speech* 58)) + ((the-as (function enemy none) (find-parent-method centurion 132)) obj) + (none) + ) + +;; definition for method 55 of type centurion +;; INFO: Used lq/sq +(defmethod enemy-method-55 centurion ((obj centurion)) + (with-pp + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((f30-0 (* 4.0 (-> pp clock seconds-per-frame)))) + (set! (-> *part-id-table* 2104 init-specs 2 initial-valuef) + (lerp + (-> *part-id-table* 2104 init-specs 2 initial-valuef) + (the float *centurion-shield-glow-spt-scale-x*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2104 init-specs 4 initial-valuef) + (lerp + (-> *part-id-table* 2104 init-specs 4 initial-valuef) + (the float *centurion-shield-glow-spt-scale-y*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2103 init-specs 5 initial-valuef) + (lerp + (-> *part-id-table* 2103 init-specs 5 initial-valuef) + (the float *centurion-shield-center-spt-scale-x*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2103 init-specs 9 initial-valuef) + (lerp + (-> *part-id-table* 2103 init-specs 9 initial-valuef) + (the float *centurion-shield-center-spt-scale-y*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2102 init-specs 5 initial-valuef) + (lerp (-> *part-id-table* 2102 init-specs 5 initial-valuef) (the float *centurion-shield-spt-scale-x*) f30-0) + ) + (set! (-> *part-id-table* 2102 init-specs 9 initial-valuef) + (lerp (-> *part-id-table* 2102 init-specs 9 initial-valuef) (the float *centurion-shield-spt-scale-y*) f30-0) + ) + (set! (-> *part-id-table* 2101 init-specs 5 initial-valuef) + (lerp + (-> *part-id-table* 2101 init-specs 5 initial-valuef) + (the float *centurion-shield-2-spt-scale-x*) + f30-0 + ) + ) + (set! (-> *part-id-table* 2101 init-specs 9 initial-valuef) + (lerp + (-> *part-id-table* 2101 init-specs 9 initial-valuef) + (the float *centurion-shield-2-spt-scale-y*) + f30-0 + ) + ) + (cond + ((logtest? (-> obj fact-info-override enemy-options) (enemy-option user0)) + (set! (-> *part-id-table* 2101 init-specs 10 initial-valuef) 0.0) + (set! (-> *part-id-table* 2101 init-specs 10 random-rangef) 0.0) + (set! (-> *part-id-table* 2102 init-specs 10 initial-valuef) 0.0) + (set! (-> *part-id-table* 2102 init-specs 10 random-rangef) 0.0) + (set! (-> *part-id-table* 2104 init-specs 5 initial-valuef) 0.0) + (set! (-> *part-id-table* 2104 init-specs 5 random-rangef) 0.0) + ) + (else + (set! (-> *part-id-table* 2101 init-specs 10 initial-valuef) 128.0) + (set! (-> *part-id-table* 2101 init-specs 10 random-rangef) 128.0) + (set! (-> *part-id-table* 2102 init-specs 10 initial-valuef) 128.0) + (set! (-> *part-id-table* 2102 init-specs 10 random-rangef) 128.0) + (set! (-> *part-id-table* 2104 init-specs 5 initial-valuef) 64.0) + (set! (-> *part-id-table* 2104 init-specs 5 random-rangef) 64.0) + ) + ) + (set! (-> *part-id-table* 2102 init-specs 13 initial-valuef) + (lerp (-> *part-id-table* 2102 init-specs 13 initial-valuef) 10.0 f30-0) + ) + ) + (let ((a0-11 (handle->process (-> obj focus handle)))) + (if a0-11 + (centurion-method-181 obj (get-trans (the-as process-focusable a0-11) 3)) + ) + ) + (logior! (-> obj skel status) (joint-control-status sync-math)) + (los-control-method-9 (-> obj los) (the-as process-focusable #f) (the-as vector #f) 2048.0) + (let ((t9-12 (method-of-type nav-enemy enemy-method-55))) + (t9-12 obj) + ) + (when (not (logtest? (-> obj draw status) (draw-control-status no-draw))) + (let ((s5-1 (new 'stack-no-clear 'matrix))) + (let* ((a2-10 (-> obj node-list data 12 bone transform)) + (v1-131 (-> a2-10 quad 0)) + (a0-18 (-> a2-10 quad 1)) + (a1-13 (-> a2-10 quad 2)) + (a2-11 (-> a2-10 trans quad)) + ) + (set! (-> s5-1 quad 0) v1-131) + (set! (-> s5-1 quad 1) a0-18) + (set! (-> s5-1 quad 2) a1-13) + (set! (-> s5-1 trans quad) a2-11) + ) + (let ((s4-1 (new 'stack-no-clear 'matrix))) + (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + (vector-negate-in-place! (the-as vector (-> s5-1 vector))) + ) + (matrix-rotate-y! s4-1 (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + 2548.6223 + -2548.6223 + ) + ) + (matrix*! s5-1 s4-1 s5-1) + (matrix-rotate-z! s4-1 (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + 691.76886 + -691.76886 + ) + ) + (matrix*! s5-1 s4-1 s5-1) + ) + (let ((a1-20 (-> s5-1 trans))) + (let ((v1-143 (-> s5-1 trans))) + (let ((a0-25 (-> s5-1 vector))) + (let ((a2-18 (the-as float (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + -997237719 + #x43a3d70a + ) + ) + ) + ) + (.mov vf7 a2-18) + ) + (.lvf vf5 (&-> a0-25 0 quad)) + ) + (.lvf vf4 (&-> v1-143 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a1-20 quad) vf6) + ) + (spawn-with-matrix (-> obj part) s5-1) + ) + ) + (none) + ) + ) + ) + +;; definition for method 142 of type centurion +;; WARN: Return type mismatch int vs none. +(defmethod nav-enemy-method-142 centurion ((obj centurion) (arg0 nav-control)) + 0 + (none) + ) + +;; definition for method 182 of type centurion +;; INFO: Used lq/sq +(defmethod centurion-method-182 centurion ((obj centurion) (arg0 vector)) + (local-vars (sv-96 int) (sv-112 int)) + (when (nonzero? (-> obj path)) + (let ((s5-0 (-> obj path)) + (s4-0 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s0-0 quad) (-> arg0 quad)) + (set! sv-96 0) + (let ((gp-0 0)) + (set! (-> s0-0 y) 0.0) + (set! sv-112 0) + (while (< sv-112 4) + (get-point-in-path! s5-0 s3-0 (the float sv-112) 'interp) + (get-point-in-path! s5-0 s2-0 (the float (+ sv-112 1)) 'interp) + (vector-! s1-0 s0-0 s3-0) + (vector-! s4-0 s2-0 s3-0) + (set! (-> s4-0 y) 0.0) + (vector-rotate90-around-y! s4-0 s4-0) + (cond + ((>= (vector-dot s1-0 s4-0) 0.0) + (+! gp-0 1) + ) + (else + (set! sv-96 (+ sv-96 1)) + sv-96 + ) + ) + (set! sv-112 (+ sv-112 1)) + ) + (if (or (= sv-96 4) (= gp-0 4)) + (return #t) + ) + ) + ) + ) + #f + ) + +;; failed to figure out what this is: +(defstate hostile (centurion) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (nav-enemy-method-165 self) + (set! (-> self joint-enable) #t) + (set! (-> self can-shoot?) (the-as basic #t)) + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) exit))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :trans (behavior () + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((s5-0 (handle->process (-> self focus handle))) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (when s5-0 + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable s5-0) 0) quad)) + (let ((a0-4 gp-0)) + (let ((v1-11 gp-0)) + (let ((a1-3 (-> (the-as process-focusable s5-0) root-override transv))) + (let ((a2-1 0.1)) + (.mov vf7 a2-1) + ) + (.lvf vf5 (&-> a1-3 quad)) + ) + (.lvf vf4 (&-> v1-11 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-4 quad) vf6) + ) + (let ((f30-0 (vector-vector-xz-distance gp-0 (-> self root-override2 trans)))) + (cond + ((< f30-0 24576.0) + (go-virtual attack) + ) + (else + (when (-> self can-shoot?) + (if (and (enemy-method-107 self) + (>= (- (-> self clock frame-counter) (-> self state-time)) (the int (+ 60.0 (* 0.0036621094 f30-0)))) + (check-los? (-> self los) 0) + ) + (go-virtual fire) + ) + ) + (if (skip-check-los? (-> self los) 0) + (set! (-> self state-time) (-> self clock frame-counter)) + ) + ) + ) + ) + ) + ) + (none) + ) + ) + :code (behavior () + (get-rand-float-range self 0.9 1.1) + -1 + 0.0 + 1.0 + 0 + (until #f + (until #f + (let ((s5-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (let ((f30-0 24576.0)) + (until #f + (set-vector! s5-0 (get-rand-float-range self -1.0 1.0) 0.0 (get-rand-float-range self -1.0 1.0) 1.0) + (vector-normalize! s5-0 f30-0) + (vector+! gp-0 (-> self root-override2 trans) s5-0) + (if (centurion-method-182 self gp-0) + (goto cfg-9) + ) + (set! f30-0 (+ -1024.0 f30-0)) + (if (< f30-0 0.0) + (goto cfg-9) + ) + ) + ) + #f + (label cfg-9) + (set! (-> self tar-pos quad) (-> gp-0 quad)) + ) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (let ((a0-9 (handle->process (-> self focus handle)))) + (if a0-9 + (set! (-> gp-1 quad) (-> (get-trans (the-as process-focusable a0-9) 0) quad)) + (vector+! gp-1 (-> self root-override2 trans) *z-vector*) + ) + ) + (let* ((a0-15 (vector-! (new 'stack-no-clear 'vector) gp-1 (-> self root-override2 trans))) + (gp-3 (vector-! (new 'stack-no-clear 'vector) (-> self tar-pos) (-> self root-override2 trans))) + (f28-0 (deg-diff (vector-y-angle a0-15) (vector-y-angle gp-3))) + (f30-1 0.0) + ) + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((< f28-0 -24576.0) + (ja :group! centurion-walk-forward-ja) + (set! f30-1 -1.0) + ) + ((< f28-0 -8192.0) + (ja :group! centurion-side-stepR-ja) + (set! f30-1 -1.0) + ) + ((< f28-0 8192.0) + (ja :group! centurion-walk-forward-ja) + (set! f30-1 1.0) + ) + ((< f28-0 24576.0) + (ja :group! centurion-side-stepR-ja) + (set! f30-1 1.0) + ) + ((< f28-0 40960.0) + (ja :group! centurion-walk-forward-ja) + (set! f30-1 -1.0) + ) + ) + (let ((a0-34 (-> self nav state)) + (v1-73 (-> self tar-pos)) + ) + (logclear! (-> a0-34 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-34 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-34 target-post quad) (-> v1-73 quad)) + ) + 0 + (let ((f28-1 (if (< f30-1 0.0) + 20.0 + 0.0 + ) + ) + ) + (dotimes (gp-4 2) + (until #f + (ja :num-func num-func-identity :frame-num f28-1) + (suspend) + (+! f28-1 (* f30-1 (* (ja-speed 0) (-> self clock time-adjust-ratio)))) + (when (< 20.0 f28-1) + (set! f28-1 (+ -20.0 f28-1)) + (goto cfg-38) + ) + (when (< f28-1 0.0) + (set! f28-1 (+ 20.0 f28-1)) + (goto cfg-38) + ) + ) + #f + (label cfg-38) + ) + ) + ) + ) + (+ (-> self clock frame-counter) (seconds 3)) + ) + #f + ) + #f + (none) + ) + :post (the-as (function none :behavior centurion) nav-enemy-travel-post) + ) + +;; definition for method 77 of type centurion +(defmethod enemy-method-77 centurion ((obj centurion) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 5))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 5)) 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 5)) num-func-seek!) + ) + #t + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 (seconds 0.1)) + (let* ((a2-1 (ash 1 (-> *centurion-global-info* prev-yellow-hit))) + (v1-18 (enemy-method-120 obj 1 a2-1)) + (a1-8 (-> obj draw art-group data (-> *centurion-global-info* yellow-hit-anim v1-18))) + ) + (set! (-> *centurion-global-info* prev-yellow-hit) v1-18) + (let ((a0-15 (-> obj skel root-channel 0))) + (set! (-> a0-15 frame-group) (the-as art-joint-anim a1-8)) + (set! (-> a0-15 param 0) (the float (+ (-> (the-as art-joint-anim a1-8) frames num-frames) -1))) + (set! (-> a0-15 param 1) (-> arg0 0)) + (set! (-> a0-15 frame-num) 0.0) + (joint-control-channel-group! a0-15 (the-as art-joint-anim a1-8) num-func-seek!) + ) + ) + ) + (((knocked-type knocked-type-6)) + (let* ((a2-3 (ash 1 (-> *centurion-global-info* prev-blue-hit))) + (v1-27 (enemy-method-120 obj 3 a2-3)) + (a1-13 (-> obj draw art-group data (-> *centurion-global-info* blue-hit-anim v1-27))) + ) + (set! (-> *centurion-global-info* prev-blue-hit) v1-27) + (let ((a0-27 (-> obj skel root-channel 0))) + (set! (-> a0-27 frame-group) (the-as art-joint-anim a1-13)) + (set! (-> a0-27 param 0) (the float (+ (-> (the-as art-joint-anim a1-13) frames num-frames) -1))) + (set! (-> a0-27 param 1) 1.0) + (set! (-> a0-27 frame-num) 0.0) + (joint-control-channel-group! a0-27 (the-as art-joint-anim a1-13) num-func-seek!) + ) + ) + ) + (else + (let ((s4-0 (if (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (-> obj draw art-group data 21) + (-> obj draw art-group data 21) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-30 (-> obj skel root-channel 0))) + (set! (-> a0-30 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-30 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-30 param 1) (-> arg0 0)) + (set! (-> a0-30 frame-num) 0.0) + (joint-control-channel-group! a0-30 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + #t + ) + ) + ) + +;; definition for method 78 of type centurion +(defmethod enemy-method-78 centurion ((obj centurion) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 33))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 33)) 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 33)) num-func-seek!) + ) + #t + ) + (else + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((s4-0 (-> obj draw art-group data 8))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> arg0 0)) + (joint-control-channel-group! a0-5 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + #t + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-7 (-> obj skel root-channel 0))) + (set! (-> a0-7 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> a0-7 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> a0-7 param 1) (-> arg0 0)) + (joint-control-channel-group! a0-7 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + #t + ) + ) + #t + ) + ) + ) + +;; definition for method 60 of type centurion +(defmethod coin-flip? centurion ((obj centurion)) + "@returns The result of a 50/50 RNG roll" + #f + ) + +;; definition for method 63 of type centurion +;; WARN: Return type mismatch none vs symbol. +(defmethod enemy-method-63 centurion ((obj centurion) (arg0 process-focusable) (arg1 symbol)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-63))) + (the-as symbol (if (t9-0 obj arg0 arg1) + (set-dst-proc! (-> obj los) (-> obj focus handle)) + ) + ) + ) + ) + +;; definition for method 114 of type centurion +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 centurion ((obj centurion)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate dark-skin dark-punch dark-bomb)) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 7) 0))) + (set! (-> s5-0 total-prims) (the-as uint 8)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid semi-solid deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 11550.72 0.0 35840.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-13 local-sphere) 0.0 6144.0 0.0 6144.0) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 12288.0 0.0 6144.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-17 local-sphere) 0.0 18432.0 0.0 6144.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 2)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot)) + (set! (-> v1-19 prim-core action) (collide-action solid)) + (set! (-> v1-19 transform-index) 12) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 12288.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-21 prim-core action) (collide-action deadly)) + (set! (-> v1-21 transform-index) 6) + (set-vector! (-> v1-21 local-sphere) 0.0 0.0 0.0 5120.0) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-23 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-23 prim-core collide-with) (collide-spec jak bot)) + (set! (-> v1-23 prim-core action) (collide-action deadly)) + (set! (-> v1-23 transform-index) 29) + (set-vector! (-> v1-23 local-sphere) 0.0 0.0 0.0 3891.2) + ) + (let ((v1-25 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 1)))) + (set! (-> v1-25 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-25 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-25 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-25 local-sphere) 0.0 12800.0 0.0 12800.0) + ) + (set! (-> s5-0 nav-radius) 2457.6) + (let ((v1-27 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-27 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-27 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 centurion +;; WARN: Return type mismatch process-focusable vs centurion. +(defmethod relocate centurion ((obj centurion) (arg0 int)) + (if (nonzero? (-> obj joint)) + (&+! (-> obj joint) arg0) + ) + (the-as + centurion + ((the-as (function process-focusable int process-focusable) (find-parent-method centurion 7)) obj arg0) + ) + ) + +;; definition for method 115 of type centurion +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 centurion ((obj centurion)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-centurion" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *centurion-nav-enemy-info*) + (set! (-> obj shield-shot) (the-as uint 0)) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 474) obj)) + (let ((v1-11 (-> obj neck))) + (set! (-> v1-11 up) (the-as uint 1)) + (set! (-> v1-11 nose) (the-as uint 2)) + (set! (-> v1-11 ear) (the-as uint 3)) + (set-vector! (-> v1-11 twist-max) 10922.667 12743.111 0.0 1.0) + (set! (-> v1-11 ignore-angle) 18204.445) + ) + (new-source! (-> obj los) obj (seconds 0.2) (collide-spec backgnd obstacle)) + (set! (-> obj can-take-damage?) #f) + (let ((v1-15 (-> obj nav))) + (set! (-> v1-15 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 327680.0) + (set! (-> obj joint-enable) #f) + (set! (-> obj joint) (new 'process 'joint-mod (joint-mod-mode joint-set*) obj 4)) + (add-connection *part-engine* obj 8 obj 318 (new 'static 'vector :x 942.08 :y -163.84 :z 1392.64 :w 163840.0)) + (add-connection + *part-engine* + obj + 8 + obj + 318 + (new 'static 'vector :x -942.08 :y -163.84 :z 1392.64 :w 163840.0) + ) + (if (logtest? (-> obj fact-info-override enemy-options) (enemy-option user0)) + (set! (-> obj hit-points) 1) + ) + (logclear! (-> obj nav flags) (nav-control-flag update-heading-from-facing)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag43)))) + (let ((s5-1 (-> obj nav state)) + (v1-36 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (set! (-> s5-1 heading quad) (-> v1-36 quad)) + ) + 0 + (set! (-> obj first-shoot?) #t) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/metalhead_brown/metalmonk_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/metalhead_brown/metalmonk_REF.gc new file mode 100644 index 0000000000..463bdd864e --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/metalhead_brown/metalmonk_REF.gc @@ -0,0 +1,1275 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defskelgroup skel-metalmonk metalmonk metalmonk-lod0-jg -1 + ((metalmonk-lod0-mg (meters 20)) (metalmonk-lod1-mg (meters 40)) (metalmonk-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5) + :shadow metalmonk-shadow-mg + :origin-joint-index 14 + ) + +;; definition of type metalmonk-anim-info +(deftype metalmonk-anim-info (structure) + ((anim-index int32 :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + +;; definition for method 3 of type metalmonk-anim-info +(defmethod inspect metalmonk-anim-info ((obj metalmonk-anim-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'metalmonk-anim-info) + (format #t "~1Tanim-index: ~D~%" (-> obj anim-index)) + (label cfg-4) + obj + ) + +;; definition of type metalmonk-global-info +(deftype metalmonk-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (idle-anim int32 3 :offset-assert 8) + (patrol-anim int32 2 :offset-assert 20) + (notice-anim int32 2 :offset-assert 28) + (charge-anim int32 2 :offset-assert 36) + (attack-anim int32 2 :offset-assert 44) + (knocked-anim int32 2 :offset-assert 52) + (celebrate-anim int32 2 :offset-assert 60) + (yellow-hit-anim int32 4 :offset-assert 68) + (blue-hit-anim int32 3 :offset-assert 84) + ) + :pack-me + :method-count-assert 9 + :size-assert #x60 + :flag-assert #x900000060 + ) + +;; definition for method 3 of type metalmonk-global-info +(defmethod inspect metalmonk-global-info ((obj metalmonk-global-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tprev-yellow-hit: ~D~%" (-> obj prev-yellow-hit)) + (format #t "~1Tprev-blue-hit: ~D~%" (-> obj prev-blue-hit)) + (format #t "~1Tidle-anim[3] @ #x~X~%" (-> obj idle-anim)) + (format #t "~1Tpatrol-anim[2] @ #x~X~%" (-> obj patrol-anim)) + (format #t "~1Tnotice-anim[2] @ #x~X~%" (-> obj notice-anim)) + (format #t "~1Tcharge-anim[2] @ #x~X~%" (-> obj charge-anim)) + (format #t "~1Tattack-anim[2] @ #x~X~%" (-> obj attack-anim)) + (format #t "~1Tknocked-anim[2] @ #x~X~%" (-> obj knocked-anim)) + (format #t "~1Tcelebrate-anim[2] @ #x~X~%" (-> obj celebrate-anim)) + (format #t "~1Tyellow-hit-anim[4] @ #x~X~%" (-> obj yellow-hit-anim)) + (format #t "~1Tblue-hit-anim[3] @ #x~X~%" (-> obj blue-hit-anim)) + (label cfg-4) + obj + ) + +;; definition of type metalmonk +(deftype metalmonk (nav-enemy) + ((new-facing vector :inline :offset 624) + (old-facing vector :inline :offset 640) + (high-time time-frame :offset 656) + (intro-path path-control :offset-assert 664) + ) + :heap-base #x220 + :method-count-assert 183 + :size-assert #x29c + :flag-assert #xb70220029c + (:methods + (attack () _type_ :state 178) + (metalmonk-method-179 (_type_ vector) none 179) + (metalmonk-method-180 (_type_ symbol) none 180) + (metalmonk-method-181 (_type_ float float) none 181) + (metalmonk-method-182 (_type_ float float) none 182) + ) + ) + +;; definition for method 3 of type metalmonk +(defmethod inspect metalmonk ((obj metalmonk)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tfocus-pos: #~%" (-> obj focus-pos)) + (format #t "~2Tnew-facing: #~%" (-> obj new-facing)) + (format #t "~2Told-facing: #~%" (-> obj old-facing)) + (format #t "~2Thigh-time: ~D~%" (-> obj high-time)) + (format #t "~2Tintro-path: ~A~%" (-> obj intro-path)) + (label cfg-4) + obj + ) + +;; definition for symbol *metalmonk-global-info*, type metalmonk-global-info +(define *metalmonk-global-info* (new 'static 'metalmonk-global-info + :idle-anim (new 'static 'array int32 3 5 6 7) + :patrol-anim (new 'static 'array int32 2 8 9) + :notice-anim (new 'static 'array int32 2 10 11) + :charge-anim (new 'static 'array int32 2 12 13) + :attack-anim (new 'static 'array int32 2 14 15) + :knocked-anim (new 'static 'array int32 2 16 18) + :celebrate-anim (new 'static 'array int32 2 22 23) + :yellow-hit-anim (new 'static 'array int32 4 28 29 30 31) + :blue-hit-anim (new 'static 'array int32 3 24 25 26) + ) + ) + +;; definition for symbol *metalmonk-nav-enemy-info*, type nav-enemy-info +(define *metalmonk-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #t + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010501 #x0 #x0 #x0) + :idle-anim 5 + :notice-anim 10 + :hostile-anim 12 + :hit-anim -1 + :knocked-anim 16 + :knocked-land-anim 17 + :die-anim 32 + :die-falling-anim 33 + :victory-anim 22 + :jump-wind-up-anim 12 + :jump-in-air-anim 12 + :jump-land-anim 12 + :neck-joint 7 + :look-at-joint 7 + :bullseye-joint 4 + :sound-hit (static-sound-name "metalmonk-hit") + :sound-die (static-sound-name "metalmonk-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 40) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :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-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 7 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #f + :use-circling #t + :use-pacing #t + :walk-anim 8 + :turn-anim -1 + :run-anim 12 + :taunt-anim 22 + :run-travel-speed (meters 7) + :run-acceleration (meters 7) + :run-turning-acceleration (meters 20) + :walk-travel-speed (meters 2) + :walk-acceleration (meters 3) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 1) + :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! (-> *metalmonk-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 179 of type metalmonk +;; INFO: Used lq/sq +;; WARN: Return type mismatch vector vs none. +(defmethod metalmonk-method-179 metalmonk ((obj metalmonk) (arg0 vector)) + (set! (-> arg0 quad) + (-> (quaternion->matrix (new 'stack-no-clear 'matrix) (-> obj root-override2 quat)) vector 2 quad) + ) + (none) + ) + +;; definition for method 181 of type metalmonk +;; WARN: Return type mismatch int vs none. +(defmethod metalmonk-method-181 metalmonk ((obj metalmonk) (arg0 float) (arg1 float)) + (with-pp + (let ((f28-0 (vector-dot (-> obj new-facing) (-> obj old-facing))) + (f30-1 (/ (ja-frame-num 0) (the float (ja-num-frames 0)))) + ) + (when (and (< f28-0 (cos (* 182.04445 arg0))) (let ((v1-7 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (not (and v1-7 (= v1-7 (-> obj draw art-group data 13)))) + ) + ) + (ja-channel-push! 1 (seconds 0.16)) + (let ((v1-13 (-> obj skel root-channel 0))) + (set! (-> v1-13 frame-group) (the-as art-joint-anim (-> obj draw art-group data 13))) + ) + (let ((s4-1 (-> obj skel root-channel 0))) + (set! (-> s4-1 num-func) num-func-identity) + (set! (-> s4-1 frame-num) (* f30-1 (the float (ja-num-frames 0)))) + ) + (set! (-> obj high-time) (-> pp clock frame-counter)) + ) + (let ((v1-22 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (or (not (and v1-22 (or (= v1-22 (-> obj draw art-group data 12)) (= v1-22 (-> obj draw art-group data 13))))) + (let ((v1-28 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (and (and v1-28 (= v1-28 (-> obj draw art-group data 13))) + (< (ja-frame-num 0) 3.0) + (and (< (cos (* 182.04445 arg1)) f28-0) (>= (- (-> pp clock frame-counter) (-> obj high-time)) (seconds 1))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.16)) + (let ((v1-41 (-> obj skel root-channel 0))) + (set! (-> v1-41 frame-group) (the-as art-joint-anim (-> obj draw art-group data 12))) + ) + (let ((gp-1 (-> obj skel root-channel 0))) + (set! (-> gp-1 num-func) num-func-identity) + (set! (-> gp-1 frame-num) (* f30-1 (the float (ja-num-frames 0)))) + ) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 182 of type metalmonk +;; WARN: Return type mismatch int vs none. +(defmethod metalmonk-method-182 metalmonk ((obj metalmonk) (arg0 float) (arg1 float)) + (with-pp + (let ((f28-0 (vector-dot (-> obj new-facing) (-> obj old-facing))) + (f30-1 (/ (ja-frame-num 0) (the float (ja-num-frames 0)))) + ) + (when (and (< f28-0 (cos (* 182.04445 arg0))) (let ((v1-7 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (not (and v1-7 (= v1-7 (-> obj draw art-group data 9)))) + ) + ) + (ja-channel-push! 1 (seconds 0.16)) + (let ((v1-13 (-> obj skel root-channel 0))) + (set! (-> v1-13 frame-group) (the-as art-joint-anim (-> obj draw art-group data 9))) + ) + (let ((s4-1 (-> obj skel root-channel 0))) + (set! (-> s4-1 num-func) num-func-identity) + (set! (-> s4-1 frame-num) (* f30-1 (the float (ja-num-frames 0)))) + ) + (set! (-> obj high-time) (-> pp clock frame-counter)) + ) + (let ((v1-22 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (or (not (and v1-22 (or (= v1-22 (-> obj draw art-group data 8)) (= v1-22 (-> obj draw art-group data 9))))) + (let ((v1-28 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (and (and v1-28 (= v1-28 (-> obj draw art-group data 9))) + (and (< (cos (* 182.04445 arg1)) f28-0) (>= (- (-> pp clock frame-counter) (-> obj high-time)) (seconds 1))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.5)) + (let ((v1-39 (-> obj skel root-channel 0))) + (set! (-> v1-39 frame-group) (the-as art-joint-anim (-> obj draw art-group data 8))) + ) + (let ((gp-1 (-> obj skel root-channel 0))) + (set! (-> gp-1 num-func) num-func-identity) + (set! (-> gp-1 frame-num) (* f30-1 (the float (ja-num-frames 0)))) + ) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 55 of type metalmonk +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-55 metalmonk ((obj metalmonk)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-55))) + (t9-0 obj) + ) + (set! (-> obj old-facing quad) (-> obj new-facing quad)) + (metalmonk-method-179 obj (-> obj new-facing)) + 0 + (none) + ) + +;; definition for method 74 of type metalmonk +(defmethod enemy-method-74 metalmonk ((obj metalmonk) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (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)) + (let ((s5-1 (-> obj incoming knocked-type))) + (cond + ((and (= s5-1 (knocked-type knocked-type-4)) + (not (and (-> obj next-state) (let ((v1-33 (-> obj next-state name))) + (or (= v1-33 'knocked) (= v1-33 'jump) (= v1-33 'jump-land)) + ) + ) + ) + (zero? (get-rand-int obj 3)) + (let ((f0-0 (vector-vector-distance-squared (-> obj root-override2 trans) (target-pos 0))) + (f1-0 32768.0) + ) + (>= f0-0 (* f1-0 f1-0)) + ) + ) + (enemy-method-73 obj) + ) + ((or (= s5-1 (knocked-type knocked-type-4)) (= s5-1 (knocked-type knocked-type-6))) + (set! (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + (go (method-of-object obj knocked)) + ) + (else + (go (method-of-object obj knocked)) + ) + ) + ) + ) + (else + (go (method-of-object obj knocked)) + ) + ) + #t + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +;; definition for method 104 of type metalmonk +;; INFO: Used lq/sq +(defmethod enemy-method-104 metalmonk ((obj metalmonk) (arg0 process) (arg1 uint) (arg2 uint)) + (let* ((s3-0 arg0) + (a0-2 (if (type? s3-0 process-focusable) + s3-0 + ) + ) + (s3-1 (new 'stack-no-clear 'vector)) + ) + (let ((s1-0 (new 'stack-no-clear 'vector))) + (vector-! s3-1 (get-trans (the-as process-focusable a0-2) 0) (-> obj root-override2 trans)) + (set! (-> s3-1 y) 0.0) + (vector-normalize! s3-1 1.0) + (set-vector! s1-0 0.0 1.0 0.0 1.0) + (vector-cross! s1-0 s1-0 (-> obj old-facing)) + (vector-normalize! s1-0 1.0) + (let ((f0-6 (vector-dot s1-0 s3-1))) + (cond + ((< 0.5 (fabs f0-6)) + ) + ((< f0-6 0.0) + (vector--float*! s3-1 s3-1 s1-0 0.5) + ) + (else + (vector+float*! s3-1 s3-1 s1-0 0.5) + ) + ) + ) + ) + (vector-normalize! s3-1 (* 1.5 (-> obj enemy-info-override attack-shove-back))) + (set! (-> s3-1 y) (-> obj enemy-info-override attack-shove-up)) + (let ((a1-10 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-10 from) (process->ppointer self)) + (set! (-> a1-10 num-params) 2) + (set! (-> a1-10 message) 'attack) + (set! (-> a1-10 param 0) arg1) + (let ((v1-17 (new 'static 'attack-info :mask (attack-info-mask vector mode angle id)))) + (set! (-> v1-17 id) arg2) + (set! (-> v1-17 angle) 'front) + (set! (-> v1-17 vector quad) (-> s3-1 quad)) + (set! (-> v1-17 mode) (-> obj enemy-info-override attack-mode)) + (set! (-> a1-10 param 1) (the-as uint v1-17)) + ) + (when (send-event-function arg0 a1-10) + (enemy-method-105 obj arg0) + #t + ) + ) + ) + ) + +;; definition for method 84 of type metalmonk +(defmethod enemy-method-84 metalmonk ((obj metalmonk) (arg0 enemy-jump-info)) + (let* ((f0-0 (vector-vector-xz-distance (-> arg0 start-pos) (-> arg0 dest-pos))) + (f1-1 + (fmax (-> obj enemy-info-override jump-height-min) (* (-> obj enemy-info-override jump-height-factor) f0-0)) + ) + (f0-3 (fmax (-> arg0 start-pos y) (-> arg0 dest-pos y))) + (f0-4 (- (fmax (+ (fmin (-> arg0 start-pos y) (-> arg0 dest-pos y)) f1-1) (+ 10240.0 f0-3)) f0-3)) + ) + (setup-from-to-height! (-> arg0 traj) (-> arg0 start-pos) (-> arg0 dest-pos) f0-4 -4.551111) + ) + (none) + ) + +;; definition for method 89 of type metalmonk +(defmethod enemy-method-89 metalmonk ((obj metalmonk) (arg0 enemy-jump-info)) + #f + ) + +;; definition for method 87 of type metalmonk +(defmethod enemy-method-87 metalmonk ((obj metalmonk) (arg0 enemy-jump-info)) + (let ((s5-0 (-> obj draw art-group data (-> obj enemy-info-override run-anim))) + (v1-6 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (not (and v1-6 (= v1-6 s5-0))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim s5-0)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim s5-0) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> arg0 anim-speed)) + (set! (-> a0-5 frame-num) 0.0) + (joint-control-channel-group! a0-5 (the-as art-joint-anim s5-0) num-func-seek!) + ) + ) + ) + #t + ) + +;; definition for method 88 of type metalmonk +(defmethod enemy-method-88 metalmonk ((obj metalmonk) (arg0 enemy-jump-info)) + #f + ) + +;; definition for method 90 of type metalmonk +(defmethod enemy-method-90 metalmonk ((obj metalmonk) (arg0 int) (arg1 enemy-jump-info)) + (case arg0 + ((3) + (let ((a0-1 (-> obj skel root-channel 0))) + (set! (-> a0-1 param 0) 1.0) + (joint-control-channel-group-eval! a0-1 (the-as art-joint-anim #f) num-func-loop!) + ) + #f + ) + (else + ((method-of-type nav-enemy enemy-method-90) obj arg0 arg1) + ) + ) + ) + +;; failed to figure out what this is: +(defstate notice (metalmonk) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 (-> self nav))) + (set! (-> v1-4 max-rotation-rate) (* 2.0 (-> self enemy-info-override maximum-rotation-rate))) + ) + 0 + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 turning-acceleration) (* 2.0 (-> self enemy-info-override run-turning-acceleration))) + ) + 0 + (none) + ) + :exit (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 (-> self nav))) + (set! (-> v1-4 max-rotation-rate) (-> self enemy-info-override maximum-rotation-rate)) + ) + 0 + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 turning-acceleration) (-> self enemy-info-override run-turning-acceleration)) + ) + 0 + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (ja :group! (-> self draw art-group data (-> *metalmonk-global-info* notice-anim (get-rand-int self 2)))) + (ja-no-eval :group! (ja-group) + :num! (seek! (the float (+ (-> (ja-group) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((a1-4 (-> self nav state))) + (set! (-> gp-0 quad) (-> a1-4 travel quad)) + ) + (seek-toward-heading-vec! (-> self root-override2) gp-0 131072.0 (seconds 0.01)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (metalmonk) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + (and gp-0 + (or (and (< (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + 20480.0 + ) + (let ((v1-19 (ja-group))) + (and (and v1-19 (= v1-19 metalmonk-charge0-ja)) (< (ja-frame-num 0) 3.0)) + ) + ) + (and (< (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + 16384.0 + ) + (let ((v1-29 (ja-group))) + (and v1-29 (= v1-29 metalmonk-charge1-ja)) + ) + (< (ja-frame-num 0) 8.0) + ) + ) + ) + ) + (go-virtual attack) + ) + ) + (none) + ) + :code (behavior () + (talker-spawn-func (-> *talker-speech* 95) *entity-pool* (target-pos 0) (the-as region #f)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (suspend) + (until #f + (metalmonk-method-181 self 1.2 0.1) + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate active (metalmonk) + :virtual #t + :code (behavior () + (let ((v1-2 (ja-group))) + (when (or (and v1-2 (or (= v1-2 metalmonk-charge0-ja) (= v1-2 metalmonk-charge1-ja))) + (let ((v1-8 (ja-group))) + (and v1-8 (or (= v1-8 metalmonk-patrol0-ja) (= v1-8 metalmonk-patrol1-ja))) + ) + ) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + ) + ) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (let ((gp-0 (-> self draw art-group data (-> (&-> *metalmonk-global-info* patrol-anim (get-rand-int self 2)) 0))) + (s5-0 (get-rand-int-range self 1 8)) + ) + (let ((v1-34 (ja-group))) + (if (not (and v1-34 (= v1-34 gp-0))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (dotimes (s4-0 s5-0) + (ja-no-eval :group! gp-0 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + (when (zero? (get-rand-int self 2)) + (let ((v1-58 self)) + (set! (-> v1-58 enemy-flags) (the-as enemy-flag (logclear (-> v1-58 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-58 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (ja-channel-push! 1 (seconds 0.3)) + (let ((gp-1 0)) + (until (not (enemy-method-123 self 0.4)) + (let* ((v1-62 (enemy-method-120 self 3 gp-1)) + (a1-16 (-> self draw art-group data (-> *metalmonk-global-info* idle-anim v1-62))) + ) + (set! gp-1 (ash 1 v1-62)) + (ja-no-eval :group! a1-16 + :num! (seek! (the float (+ (-> (the-as art-joint-anim a1-16) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + ) + (ja-no-eval :group! (ja-group) + :num! (seek! (the float (+ (-> (ja-group) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + (let ((v1-102 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-102 enemy-flags))) + (set! (-> v1-102 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-102 enemy-flags)))) + ) + (set! (-> v1-102 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-102 enemy-flags)))) + (set! (-> v1-102 nav callback-info) (-> v1-102 enemy-info-override callback-info)) + ) + 0 + ) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (metalmonk) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior metalmonk) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (metalmonk-method-180 self #t) + (nav-enemy-method-169 self 6144.0 #f) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) (+ 8192.0 (-> self enemy-info-override run-travel-speed))) + ) + 0 + (let ((v1-8 (-> self nav))) + (set! (-> v1-8 turning-acceleration) (* 4.0 (-> self enemy-info-override run-turning-acceleration))) + ) + 0 + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-15 *game-info*) + (v0-3 (+ (-> v1-15 attack-id) 1)) + ) + (set! (-> v1-15 attack-id) v0-3) + (set! (-> self attack-id) v0-3) + ) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (metalmonk-method-180 self #f) + (nav-enemy-method-168 self) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) (-> self enemy-info-override run-travel-speed)) + ) + 0 + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (enemy-method-49 self) + (none) + ) + :code (behavior () + (let ((gp-0 #f)) + (let* ((v1-2 (ja-group)) + (s5-0 (if (and v1-2 (= v1-2 metalmonk-charge0-ja)) + (-> self draw art-group data (-> *metalmonk-global-info* attack-anim 0)) + (-> self draw art-group data (-> *metalmonk-global-info* attack-anim 1)) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! s5-0 + :num! (seek! (the float (+ (-> (the-as art-joint-anim s5-0) frames num-frames) -1))) + :frame-num 0.0 + ) + ) + (until (ja-done? 0) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (set! gp-0 #t) + ) + (suspend) + (ja :num! (seek!)) + ) + (if gp-0 + (go-virtual victory) + (go-hostile self) + ) + ) + (none) + ) + :post (the-as (function none :behavior metalmonk) nav-enemy-chase-post) + ) + +;; failed to figure out what this is: +(defstate victory (metalmonk) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy victory) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy victory) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (handle->process (-> self focus handle)))) + (if (and a0-1 (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.05)) + (let ((f0-0 (vector-vector-xz-distance-squared + (get-trans (the-as process-focusable a0-1) 0) + (-> self root-override2 trans) + ) + ) + (f1-0 14336.0) + ) + (< f0-0 (* f1-0 f1-0)) + ) + ) + ) + (enemy-method-72 self) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (ja :group! (-> self draw art-group data (-> *metalmonk-global-info* celebrate-anim (get-rand-int self 2)))) + (ja :num-func num-func-identity :frame-num 0.0) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (ja-no-eval :group! (ja-group) + :num! (seek! (the float (+ (-> (ja-group) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate circling (metalmonk) + :virtual #t + :code (behavior () + (nav-enemy-method-166 self) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (suspend) + (until #f + (metalmonk-method-181 self 1.6 1.5) + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate pacing (metalmonk) + :virtual #t + :code (behavior () + (let ((v1-2 (ja-group))) + (when (and v1-2 (or (= v1-2 metalmonk-charge0-ja) (= v1-2 metalmonk-charge1-ja))) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) (-> self enemy-info-override run-travel-speed)) + ) + 0 + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + ) + ) + (nav-enemy-method-165 self) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (-> self draw art-group data (-> *metalmonk-global-info* patrol-anim (get-rand-int self 2))) + (until #f + (metalmonk-method-182 self 1.2 0.5) + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate ambush (metalmonk) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy ambush) enter))) + (if t9-0 + (t9-0) + ) + ) + (when (not (-> self intro-path)) + (format 0 "ERROR: ~A has no intro path, skipping ambush~%" (-> self name)) + (go-virtual notice) + ) + (get-point-at-percent-along-path! (-> self intro-path) (-> self root-override2 trans) 0.0 'interp) + (none) + ) + :code (behavior () + (until #f + (let ((gp-0 (new 'stack-no-clear 'vector))) + (get-point-at-percent-along-path! (-> self intro-path) gp-0 1.0 'interp) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag vulnerable)))) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (let ((v1-4 (process->ppointer self))) + (set! (-> a1-1 from) v1-4) + ) + (set! (-> a1-1 num-params) 2) + (set! (-> a1-1 message) 'jump) + (set! (-> a1-1 param 0) (the-as uint 2)) + (set! (-> a1-1 param 1) (the-as uint gp-0)) + (send-event-function self a1-1) + ) + ) + (suspend) + ) + #f + (none) + ) + ) + +;; definition for method 77 of type metalmonk +(defmethod enemy-method-77 metalmonk ((obj metalmonk) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 0) + (let* ((a2-0 (ash 1 (-> *metalmonk-global-info* prev-yellow-hit))) + (v1-3 (enemy-method-120 obj 4 a2-0)) + (a1-6 (-> obj draw art-group data (-> *metalmonk-global-info* yellow-hit-anim v1-3))) + ) + (set! (-> *metalmonk-global-info* prev-yellow-hit) v1-3) + (let ((a0-13 (-> obj skel root-channel 0))) + (set! (-> a0-13 frame-group) (the-as art-joint-anim a1-6)) + (set! (-> a0-13 param 0) (the float (+ (-> (the-as art-joint-anim a1-6) frames num-frames) -1))) + (set! (-> a0-13 param 1) (-> arg0 0)) + (set! (-> a0-13 frame-num) 0.0) + (joint-control-channel-group! a0-13 (the-as art-joint-anim a1-6) num-func-seek!) + ) + ) + ) + (((knocked-type knocked-type-6)) + (let* ((a2-2 (ash 1 (-> *metalmonk-global-info* prev-blue-hit))) + (v1-12 (enemy-method-120 obj 3 a2-2)) + (s5-1 (-> obj draw art-group data (-> *metalmonk-global-info* blue-hit-anim v1-12))) + ) + (set! (-> *metalmonk-global-info* prev-blue-hit) v1-12) + (let ((v1-15 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-15 (= v1-15 (-> obj draw art-group data 27))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + (let ((a0-31 (-> obj skel root-channel 0))) + (set! (-> a0-31 frame-group) (the-as art-joint-anim s5-1)) + (set! (-> a0-31 param 0) (the float (+ (-> (the-as art-joint-anim s5-1) frames num-frames) -1))) + (set! (-> a0-31 param 1) 1.0) + (set! (-> a0-31 frame-num) 0.0) + (joint-control-channel-group! a0-31 (the-as art-joint-anim s5-1) num-func-seek!) + ) + ) + ) + (else + (let ((s4-1 (if (< (vector-dot + (the-as vector (metalmonk-method-179 obj (new 'stack-no-clear 'vector))) + (-> obj root-override2 transv) + ) + 0.0 + ) + (-> obj draw art-group data (-> *metalmonk-global-info* knocked-anim (get-rand-int obj 2))) + (-> obj draw art-group data 20) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-38 (-> obj skel root-channel 0))) + (set! (-> a0-38 frame-group) (the-as art-joint-anim s4-1)) + (set! (-> a0-38 param 0) (the float (+ (-> (the-as art-joint-anim s4-1) frames num-frames) -1))) + (set! (-> a0-38 param 1) (-> arg0 0)) + (set! (-> a0-38 frame-num) 0.0) + (joint-control-channel-group! a0-38 (the-as art-joint-anim s4-1) num-func-seek!) + ) + ) + ) + ) + #t + ) + +;; definition for method 78 of type metalmonk +(defmethod enemy-method-78 metalmonk ((obj metalmonk) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((s4-0 (-> obj draw art-group data 27))) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-3 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) 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 s4-0) num-func-seek!) + ) + ) + #t + ) + ) + ((!= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) + (let* ((v1-14 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + (s4-1 (cond + ((and v1-14 (= v1-14 (-> obj draw art-group data 16))) + (-> obj draw art-group data 17) + ) + (else + (let ((v1-21 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-21 (= v1-21 (-> obj draw art-group data 18))) + (-> obj draw art-group data 19) + (-> obj draw art-group data 21) + ) + ) + ) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-14 (-> obj skel root-channel 0))) + (set! (-> a0-14 frame-group) (the-as art-joint-anim s4-1)) + (set! (-> a0-14 param 0) (the float (+ (-> (the-as art-joint-anim s4-1) frames num-frames) -1))) + (set! (-> a0-14 param 1) (-> arg0 0)) + (set! (-> a0-14 frame-num) 0.0) + (joint-control-channel-group! a0-14 (the-as art-joint-anim s4-1) num-func-seek!) + ) + ) + #t + ) + ) + ) + +;; definition for method 180 of type metalmonk +;; WARN: Return type mismatch int vs none. +(defmethod metalmonk-method-180 metalmonk ((obj metalmonk) (arg0 symbol)) + (let ((v1-1 (-> obj root-override2 root-prim))) + (dotimes (a0-1 1) + (let ((a2-1 (-> (the-as collide-shape-prim-group v1-1) child a0-1))) + (if arg0 + (set! (-> a2-1 prim-core action) (collide-action solid deadly)) + (set! (-> a2-1 prim-core action) (collide-action solid)) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 114 of type metalmonk +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 metalmonk ((obj metalmonk)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 9) 0))) + (set! (-> s5-0 total-prims) (the-as uint 10)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 8192.0 0.0 16384.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid deadly)) + (set! (-> v1-13 transform-index) 7) + (set-vector! (-> v1-13 local-sphere) 0.0 0.0 0.0 2662.4) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid)) + (set! (-> v1-15 transform-index) 38) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid)) + (set! (-> v1-17 transform-index) 41) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec backgnd crate obstacle hit-by-others-list)) + (set! (-> v1-19 prim-core action) (collide-action solid)) + (set-vector! (-> v1-19 local-sphere) 0.0 6144.0 0.0 6144.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-21 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-21 local-sphere) 0.0 5120.0 0.0 5120.0) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-23 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-23 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-23 prim-core action) (collide-action solid)) + (set! (-> v1-23 transform-index) 4) + (set-vector! (-> v1-23 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-25 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-25 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-25 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-25 prim-core action) (collide-action solid)) + (set! (-> v1-25 transform-index) 10) + (set-vector! (-> v1-25 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (let ((v1-27 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-27 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-27 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-27 prim-core action) (collide-action solid)) + (set! (-> v1-27 transform-index) 13) + (set-vector! (-> v1-27 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (let ((v1-29 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-29 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-29 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-29 prim-core action) (collide-action solid)) + (set! (-> v1-29 transform-index) 22) + (set-vector! (-> v1-29 local-sphere) 0.0 0.0 0.0 2662.4) + ) + (set! (-> s5-0 nav-radius) 8192.0) + (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 60 of type metalmonk +(defmethod coin-flip? metalmonk ((obj metalmonk)) + "@returns The result of a 50/50 RNG roll" + #f + ) + +;; definition for method 7 of type metalmonk +;; WARN: Return type mismatch process-focusable vs metalmonk. +(defmethod relocate metalmonk ((obj metalmonk) (arg0 int)) + (if (nonzero? (-> obj intro-path)) + (&+! (-> obj intro-path) arg0) + ) + (the-as + metalmonk + ((the-as (function process-focusable int process-focusable) (find-parent-method metalmonk 7)) obj arg0) + ) + ) + +;; definition for method 115 of type metalmonk +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 metalmonk ((obj metalmonk)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-metalmonk" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *metalmonk-nav-enemy-info*) + (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-vector! (-> v1-8 twist-max) 10922.667 12743.111 0.0 1.0) + (set! (-> v1-8 ignore-angle) 18204.445) + ) + (let ((v1-10 (-> obj nav))) + (set! (-> v1-10 speed-scale) 1.0) + ) + 0 + (logior! (-> obj nav flags) (nav-control-flag momentum-ignore-heading)) + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (set! (-> obj intro-path) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (metalmonk-method-180 obj #f) + (set! (-> obj high-time) 0) + (add-connection + *part-engine* + obj + 7 + obj + 4986 + (new 'static 'vector :x 1064.96 :y -450.56 :z 1146.88 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 7 + obj + 4987 + (new 'static 'vector :x -1064.96 :y -450.56 :z 1146.88 :w 163840.0) + ) + (add-connection *part-engine* obj 7 obj 4988 (new 'static 'vector :y 1556.48 :z 368.64 :w 163840.0)) + 0 + (none) + ) 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 new file mode 100644 index 0000000000..fad6a7ec0b --- /dev/null +++ b/test/decompiler/reference/jak2/levels/common/enemy/metalhead_slinger/grenadier_REF.gc @@ -0,0 +1,1385 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defpartgroup group-grenadier-drip + :id 1150 + :duration (seconds 0.5) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 2) + :parts ((sp-item 4985 :fade-after (meters 140) :falloff-to (meters 140))) + ) + +;; failed to figure out what this is: +(defpart 1309 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #x3e8)) + (sp-rnd-flt spt-num 1.0 1.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.6) (meters 0.2) 1.0) + (sp-rnd-flt spt-scale-y (meters 0.4) (meters 0.1) 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-rnd-flt spt-scalevel-x (meters -0.0026666666) (meters -0.0026666666) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.73333335) + (sp-flt spt-fade-g -3.4) + (sp-flt spt-fade-b -0.73333335) + (sp-rnd-flt spt-accel-y -1.3653333 -4.096 1.0) + (sp-int spt-timer 300) + (sp-cpuinfo-flags sp-cpuinfo-flag-0 sp-cpuinfo-flag-2 sp-cpuinfo-flag-14) + (sp-int spt-next-time 75) + (sp-launcher-by-id spt-next-launcher 640) + (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) + (sp-rnd-flt spt-conerot-radius (meters 0) (meters 0.35) 1.0) + ) + ) + +;; failed to figure out what this is: +(defskelgroup skel-grenadier grenadier grenadier-lod0-jg -1 + ((grenadier-lod0-mg (meters 20)) (grenadier-lod1-mg (meters 40)) (grenadier-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5) + :shadow grenadier-shadow-mg + :origin-joint-index 4 + ) + +;; definition of type bank-info +(deftype bank-info (structure) + ((circle sphere :inline :offset-assert 0) + (tangent-pos vector :inline :offset-assert 16) + (final-pos vector :inline :offset-assert 32) + (final-dir vector :inline :offset-assert 48) + ) + :method-count-assert 9 + :size-assert #x40 + :flag-assert #x900000040 + ) + +;; definition for method 3 of type bank-info +(defmethod inspect bank-info ((obj bank-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'bank-info) + (format #t "~1Tcircle: #~%" (-> obj circle)) + (format #t "~1Ttangent-pos: #~%" (-> obj tangent-pos)) + (format #t "~1Tfinal-pos: #~%" (-> obj final-pos)) + (format #t "~1Tfinal-dir: #~%" (-> obj final-dir)) + (label cfg-4) + obj + ) + +;; definition of type grenadier +(deftype grenadier (nav-enemy) + ((shot-trajectory trajectory :inline :offset-assert 608) + (hostile-path path-control :offset-assert 648) + (bank bank-info :inline :offset-assert 656) + (joint joint-mod-blend-world :offset-assert 720) + (heading symbol :offset-assert 724) + (move-pos vector :inline :offset-assert 736) + (move-angle float :offset-assert 752) + (status-flags uint64 :offset-assert 760) + (suppress-knockaside-timer time-frame :offset-assert 768) + ) + :heap-base #x290 + :method-count-assert 184 + :size-assert #x308 + :flag-assert #xb802900308 + (:methods + (attack () _type_ :state 178) + (backup () _type_ :state 179) + (spin-kick () _type_ :state 180) + (grenadier-method-181 (_type_) none 181) + (grenadier-method-182 (_type_ vector) none 182) + (grenadier-method-183 (_type_) none 183) + ) + ) + +;; definition for method 3 of type grenadier +(defmethod inspect grenadier ((obj grenadier)) + (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 "~2Thostile-path: ~A~%" (-> obj hostile-path)) + (format #t "~2Tbank: #~%" (-> obj bank)) + (format #t "~2Tjoint: ~A~%" (-> obj joint)) + (format #t "~2Theading: ~A~%" (-> obj heading)) + (format #t "~2Tmove-pos: #~%" (-> obj move-pos)) + (format #t "~2Tmove-angle: ~f~%" (-> obj move-angle)) + (format #t "~2Tstatus-flags: ~D~%" (-> obj status-flags)) + (format #t "~2Tsuppress-knockaside-timer: ~D~%" (-> obj suppress-knockaside-timer)) + (label cfg-4) + obj + ) + +;; definition for symbol *grenadier-nav-enemy-info*, type nav-enemy-info +(define *grenadier-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #t + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 20 + #x270002 + #x6040501 + #x270002 + #x1010701 + #x1010601 + #x270002 + #x6040501 + #x1010801 + #x1010701 + #x1010601 + #x270002 + #x8040501 + #x270002 + #x1010801 + #x270002 + #x1010601 + #x0 + #x0 + #x0 + #x0 + ) + :idle-anim 5 + :notice-anim 11 + :hostile-anim 13 + :hit-anim 23 + :knocked-anim 31 + :knocked-land-anim 32 + :die-anim 33 + :die-falling-anim 34 + :victory-anim 22 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 24 + :look-at-joint 24 + :bullseye-joint 18 + :sound-hit (static-sound-name "grenadier-hit") + :sound-die (static-sound-name "grenadier-die") + :notice-distance (meters 50) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 12.5) + :default-hit-points 14 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :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-seek-ry-clamp 0.18204445 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 24 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 1802.24 :z 286.72 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 9 + :turn-anim -1 + :run-anim 13 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 50) + :walk-travel-speed (meters 2) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 50) + :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! (-> *grenadier-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 74 of type grenadier +(defmethod enemy-method-74 grenadier ((obj grenadier) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (with-pp + (case arg2 + (('hit-knocked) + (when (= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) + (if (and (< (- (-> pp clock frame-counter) (-> obj suppress-knockaside-timer)) (seconds 0.6)) + (and (-> obj next-state) (= (-> obj next-state name) 'attack)) + (nonzero? (-> obj hit-points)) + ) + (return #t) + ) + (logior! (-> obj status-flags) 1) + (set! (-> obj suppress-knockaside-timer) (-> pp clock frame-counter)) + ) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (('notify) + (cond + ((and (= (-> arg3 param 0) 'attack) (= (-> arg3 param 1) *target*)) + (let ((v1-23 (new 'stack-no-clear 'event-message-block))) + (set! (-> v1-23 from) (process->ppointer arg0)) + (set! (-> v1-23 num-params) (the-as int arg1)) + (set! (-> v1-23 message) 'victory) + (set! (-> v1-23 param 0) (-> arg3 param 0)) + (set! (-> v1-23 param 1) (-> arg3 param 1)) + (set! (-> v1-23 param 2) (-> arg3 param 2)) + (set! (-> v1-23 param 3) (-> arg3 param 3)) + (set! (-> v1-23 param 4) (-> arg3 param 4)) + (set! (-> v1-23 param 5) (-> arg3 param 5)) + (send-event-function obj v1-23) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +;; definition for function pos-rotate-y<-vector+vector +(defun pos-rotate-y<-vector+vector ((arg0 vector) (arg1 vector)) + (let ((f0-0 (rotate-y<-vector+vector arg0 arg1))) + (if (< f0-0 0.0) + (+ 65536.0 f0-0) + f0-0 + ) + ) + ) + +;; definition for method 182 of type grenadier +;; INFO: Used lq/sq +;; WARN: Return type mismatch vector vs none. +(defmethod grenadier-method-182 grenadier ((obj grenadier) (arg0 vector)) + (cloest-point-on-mesh (-> obj nav) arg0 arg0 (the-as nav-poly #f)) + (set! (-> obj bank final-pos quad) (-> arg0 quad)) + (set! (-> obj bank tangent-pos quad) (-> arg0 quad)) + (set! (-> obj move-pos quad) (-> obj bank tangent-pos quad)) + (none) + ) + +;; definition for method 181 of type grenadier +;; WARN: Return type mismatch int vs none. +(defmethod grenadier-method-181 grenadier ((obj grenadier)) + (let ((s5-0 (handle->process (-> obj focus handle)))) + (when s5-0 + (cond + ((-> obj hostile-path) + (let* ((s4-0 (-> obj hostile-path)) + (f30-0 (get-path-percentage-at-furthest-point s4-0 (get-trans (the-as process-focusable s5-0) 0))) + (s3-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> obj heading) (not (-> obj heading))) + (let* ((f0-0 (rand-vu-float-range 0.2 0.45)) + (f0-1 (if (-> obj heading) + (+ f30-0 f0-0) + (- f30-0 f0-0) + ) + ) + ) + (if (< f0-1 0.0) + (set! f0-1 (+ 1.0 f0-1)) + ) + (if (< 1.0 f0-1) + (set! f0-1 (+ -1.0 f0-1)) + ) + (get-point-at-percent-along-path! s4-0 s3-1 f0-1 'interp) + ) + (grenadier-method-182 obj s3-1) + ) + ) + (else + (let* ((s4-1 (-> obj root-override2)) + (a0-10 (get-trans (the-as process-focusable s5-0) 0)) + (v1-27 (vector-! (new 'stack-no-clear 'vector) a0-10 (-> s4-1 trans))) + ) + (vector-length v1-27) + (let ((s3-2 (new 'stack-no-clear 'vector)) + (s2-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> obj heading) (not (-> obj heading))) + (if (-> obj heading) + (set-vector! s3-2 (-> v1-27 z) (-> v1-27 y) (- (-> v1-27 x)) 1.0) + (set-vector! s3-2 (- (-> v1-27 z)) (-> v1-27 y) (-> v1-27 x) 1.0) + ) + (vector-normalize! s3-2 (* 4096.0 (rand-vu-float-range 14.0 18.0))) + (grenadier-method-182 obj (vector+! s2-1 (-> s4-1 trans) s3-2)) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate active (grenadier) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let* ((f30-0 (get-rand-float-range self 0.9 1.1)) + (a0-2 '((grenadier-patrol-ja) (grenadier-patrol1-ja))) + (gp-0 ((method-of-type (rtype-of a0-2) length) a0-2)) + (s5-0 (new 'static 'array int64 2 9 10)) + (s4-0 (-> (the-as (pointer int32) (+ (* (get-rand-int self gp-0) 8) (the-as int s5-0))))) + ) + (until #f + (ja-no-eval :group! (-> self draw art-group data s4-0) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data s4-0)) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (when (enemy-method-123 self 0.2) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.6)) + (let ((v1-38 self)) + (set! (-> v1-38 enemy-flags) (the-as enemy-flag (logclear (-> v1-38 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-38 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (until (not (enemy-method-123 self 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((v1-100 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-100 enemy-flags))) + (set! (-> v1-100 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-100 enemy-flags)))) + ) + (set! (-> v1-100 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-100 enemy-flags)))) + (set! (-> v1-100 nav callback-info) (-> v1-100 enemy-info-override callback-info)) + ) + 0 + (ja-no-eval :num! (loop!)) + (set! s4-0 (-> (the-as (pointer int32) (+ (* (get-rand-int self gp-0) 8) (the-as int s5-0))))) + (ja-channel-push! 1 (seconds 0.6)) + (ja-no-eval :group! (-> self draw art-group data s4-0) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data s4-0)) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate notice (grenadier) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (vector-reset! (-> self root-override2 transv)) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (grenadier) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (grenadier-method-181 self) + (enemy-method-109 self 2) + (set! (-> self status-flags) (logand -2 (-> self status-flags))) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (handle->process (-> self focus handle)))) + (when a0-1 + (let* ((s5-0 (get-trans (the-as process-focusable a0-1) 0)) + (gp-0 (-> self root-override2 trans)) + (f30-0 (vector-vector-distance gp-0 s5-0)) + ) + (cond + ((and (< f30-0 12288.0) (enemy-method-107 self)) + (go-virtual spin-kick) + ) + ((< f30-0 40960.0) + (let ((s3-1 (vector-! (new 'stack-no-clear 'vector) gp-0 s5-0)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s4-0 quad) (-> self root-override2 trans quad)) + (new 'stack-no-clear 'vector) + (vector-normalize! s3-1 49152.0) + (cloest-point-on-mesh (-> self nav) s4-0 (vector+! s4-0 s5-0 s3-1) (the-as nav-poly #f)) + (when (< 32768.0 (vector-vector-distance gp-0 s4-0)) + (set! (-> self move-pos quad) (-> s4-0 quad)) + (let ((a0-11 (-> self nav state)) + (v1-32 (-> self move-pos)) + ) + (logclear! (-> a0-11 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-11 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-11 target-post quad) (-> v1-32 quad)) + ) + 0 + (go-virtual backup) + ) + ) + ) + ) + ) + ) + ) + (when (or (>= (- (-> self clock frame-counter) (-> self state-time)) (rand-vu-int-range (seconds 3) (seconds 9))) + (>= 8192.0 (vector-vector-xz-distance (-> self root-override2 trans) (-> self bank final-pos))) + ) + (if (and (handle->process (-> self focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> self focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + (go-virtual attack) + (go-stare self) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let* ((a0-1 '((grenadier-run-ja) (grenadier-run1-ja))) + (a1-3 ((method-of-type (rtype-of a0-1) length) a0-1)) + (gp-0 (new 'static 'array int64 2 13 14)) + (gp-1 (-> self + draw + art-group + data + (-> (the-as (pointer int32) (+ (* (get-rand-int self a1-3) 8) (the-as int gp-0)))) + ) + ) + (f30-0 (get-rand-float-range self 0.9 1.1)) + ) + (until #f + (ja-no-eval :group! gp-1 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-1) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((gp-0 (-> self bank))) + (if (< (vector-vector-xz-distance (-> self root-override2 trans) (-> gp-0 tangent-pos)) 9830.4) + (set! (-> self move-pos quad) (-> gp-0 final-pos quad)) + ) + ) + (let ((a0-3 (-> self nav state)) + (v1-5 (-> self move-pos)) + ) + (logclear! (-> a0-3 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-3 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-3 target-post quad) (-> v1-5 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate backup (grenadier) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior grenadier) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-2 enemy-flags))) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-2 enemy-flags)))) + ) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-2 enemy-flags)))) + (set! (-> v1-2 nav callback-info) (-> v1-2 enemy-info-override callback-info)) + ) + 0 + (none) + ) + :trans (behavior () + (let ((f0-0 (vector-vector-xz-distance (-> self root-override2 trans) (-> self move-pos)))) + (if (or (>= 12288.0 f0-0) (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 6))) + (go-hostile self) + ) + ) + (none) + ) + :code (behavior () + (until #f + (ja-no-eval :group! grenadier-run-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-run-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 (-> self move-pos)) + ) + (logclear! (-> a0-0 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-0 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-0 target-post quad) (-> v1-1 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate spin-kick (grenadier) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior grenadier) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (a0-7 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-7) + (set! (-> self attack-id) a0-7) + ) + (let ((v1-13 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-13 prim-core action) (collide-action deadly)) + (set! (-> v1-13 local-sphere w) 7372.8) + ) + (none) + ) + :exit (behavior () + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-3 prim-core action) (collide-action)) + (set! (-> v1-3 local-sphere w) 4096.0) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.135)) + (ja-no-eval :group! grenadier-spin-kick-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-spin-kick-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + (-> self nav max-rotation-rate) + (seconds 0.02) + ) + ) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +;; definition for method 77 of type grenadier +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for method 78 of type grenadier +(defmethod enemy-method-78 grenadier ((obj grenadier) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((s4-0 (-> obj draw art-group data 30))) + (ja-channel-push! 1 (seconds 0.067)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-3 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) 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 s4-0) num-func-seek!) + ) + ) + ) + #t + ) + ((or (= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) (zero? (-> obj incoming knocked-type))) + #f + ) + ((> (-> obj hit-points) 0) + (ja-channel-push! 1 (seconds 0.067)) + (let ((a1-4 (-> obj draw art-group data (-> obj enemy-info-override knocked-land-anim))) + (a0-9 (-> obj skel root-channel 0)) + ) + (set! (-> a0-9 frame-group) (the-as art-joint-anim a1-4)) + (set! (-> a0-9 param 0) (the float (+ (-> (the-as art-joint-anim a1-4) frames num-frames) -1))) + (set! (-> a0-9 param 1) (-> arg0 0)) + (set! (-> a0-9 frame-num) 0.0) + (joint-control-channel-group! a0-9 (the-as art-joint-anim a1-4) num-func-seek!) + ) + #t + ) + (else + (ja-channel-push! 1 (seconds 0.067)) + (let ((a0-11 (-> obj skel root-channel 0))) + (set! (-> a0-11 frame-group) (the-as art-joint-anim (-> obj draw art-group data 33))) + (set! (-> a0-11 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 33)) frames num-frames) -1)) + ) + (set! (-> a0-11 param 1) (-> arg0 0)) + (set! (-> a0-11 frame-num) 0.0) + (joint-control-channel-group! a0-11 (the-as art-joint-anim (-> obj draw art-group data 33)) num-func-seek!) + ) + #t + ) + ) + ) + +;; failed to figure out what this is: +(defstate attack (grenadier) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('event-attack) + (let ((s4-0 (handle->process (-> self focus handle)))) + (when s4-0 + (let ((gp-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data 34)))) + (let ((s5-1 (vector-! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable s4-0) 0) gp-0))) + (let ((s4-1 (new 'stack-no-clear 'vector))) + (let ((f0-0 (vector-length s5-1))) + 0.0 + (let ((f0-1 (fmin 245760.0 f0-0))) + (vector-normalize! s5-1 f0-1) + ) + ) + (vector+! s4-1 gp-0 s5-1) + (let ((f0-2 122880.0)) + (setup-from-to-xz-vel! (-> self shot-trajectory) gp-0 s4-1 f0-2 -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-9 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> a1-9 ent) (-> self entity)) + (set! (-> a1-9 charge) 1.0) + (set! (-> a1-9 options) (projectile-options)) + (set! (-> a1-9 pos quad) (-> gp-0 quad)) + (set! (-> a1-9 vel quad) (-> self shot-trajectory initial-velocity quad)) + (set! (-> a1-9 notify-handle) (process->handle self)) + (set! (-> a1-9 owner-handle) (the-as handle #f)) + (set! (-> a1-9 ignore-handle) (process->handle self)) + (let* ((v1-27 *game-info*) + (a0-27 (+ (-> v1-27 attack-id) 1)) + ) + (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)) + (spawn-projectile metalhead-grenade-shot a1-9 self *default-dead-pool*) + ) + ) + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (let ((v1-1 (-> self nav state)) + (a0-1 (-> self root-override2 trans)) + ) + (logclear! (-> v1-1 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-1 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-1 target-post quad) (-> a0-1 quad)) + ) + 0 + (let ((v1-4 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-4 enemy-flags))) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-4 enemy-flags)))) + ) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-4 enemy-flags)))) + (set! (-> v1-4 nav callback-info) (-> v1-4 enemy-info-override callback-info)) + ) + 0 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-7 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-11 *game-info*) + (a0-19 (+ (-> v1-11 attack-id) 1)) + ) + (set! (-> v1-11 attack-id) a0-19) + (set! (-> self attack-id) a0-19) + ) + (enemy-method-109 self 1) + (none) + ) + :exit (behavior () + (if (logtest? (enemy-flag enemy-flag43) (-> self enemy-flags)) + (logior! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + (logclear! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + ) + (set! (-> self status-flags) (logand -3 (-> self status-flags))) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (let ((f28-0 (vector-length (-> self root-override2 transv)))) + (ja-channel-push! 1 (seconds 0.2)) + (when (< 4096.0 f28-0) + (let* ((v1-8 (vector-float*! (new 'stack-no-clear 'vector) (-> self root-override2 transv) 0.3)) + (a2-2 (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) v1-8)) + ) + (set! (-> self move-pos quad) (-> self root-override2 trans quad)) + (cloest-point-on-mesh (-> self nav) (-> self move-pos) a2-2 (the-as nav-poly #f)) + ) + (let ((a0-10 (-> self nav state)) + (v1-13 (-> self move-pos)) + ) + (logclear! (-> a0-10 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-10 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-10 target-post quad) (-> v1-13 quad)) + ) + 0 + (logclear! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + (logior! (-> self status-flags) 2) + (ja-no-eval :group! grenadier-run-to-throw-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-run-to-throw-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (ja-channel-push! 1 (seconds 0.067)) + (set! (-> self status-flags) (logand -3 (-> self status-flags))) + (if (logtest? (enemy-flag enemy-flag43) (-> self enemy-flags)) + (logior! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + (logclear! (-> self nav flags) (nav-control-flag update-heading-from-facing)) + ) + ) + ) + (let ((v1-52 self)) + (set! (-> v1-52 enemy-flags) (the-as enemy-flag (logclear (-> v1-52 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-52 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (cond + ((logtest? (-> self status-flags) 1) + (ja-channel-push! 1 (seconds 0.135)) + (ja-no-eval :group! grenadier-throw-quick-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-throw-quick-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (set! (-> self status-flags) (logand -2 (-> self status-flags))) + ) + (else + (when (not (enemy-method-96 self 1820.4445 #t)) + (let ((v1-84 self)) + (set! (-> v1-84 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-84 enemy-flags)))) + ) + 0 + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! grenadier-throw-turn-in-place-ja) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 910.2222 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-100 self)) + (set! (-> v1-100 enemy-flags) + (the-as enemy-flag (logclear (-> v1-100 enemy-flags) (enemy-flag enemy-flag37))) + ) + ) + 0 + ) + (let ((v1-102 self)) + (set! (-> v1-102 enemy-flags) + (the-as enemy-flag (logclear (-> v1-102 enemy-flags) (enemy-flag enemy-flag37))) + ) + ) + 0 + (ja-channel-push! 1 (seconds 0.067)) + (let ((a0-50 (handle->process (-> self focus handle)))) + (when a0-50 + (let ((f0-14 (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable a0-50) 0))) + ) + (cond + ((< 102400.0 f0-14) + (ja-no-eval :group! grenadier-throw-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-throw-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (else + (ja-no-eval :group! grenadier-throw1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-throw1-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + (-> self nav max-rotation-rate) + (seconds 0.02) + ) + ) + ) + ) + ) + (nav-enemy-travel-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hit (grenadier) + :virtual #t + :code (behavior () + (local-vars (v1-10 int) (v1-44 enemy-flag) (v1-52 enemy-flag)) + (let ((gp-0 (enemy-method-50 self (new 'stack-no-clear 'vector)))) + 0 + (add-debug-vector + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + gp-0 + (meters 6) + (new 'static 'rgba :r #x80 :g #x80 :b #x80 :a #x80) + ) + (add-debug-quaternion + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (-> self root-override2 quat) + ) + (let ((f0-0 (quaternion-vector-y-angle (-> self root-override2 quat) gp-0))) + (cond + ((and (< -8192.0 f0-0) (>= 8192.0 f0-0)) + (set! v1-10 26) + ) + ((and (< 8192.0 f0-0) (>= 24576.0 f0-0)) + (set! v1-10 24) + ) + ((and (< -24576.0 f0-0) (>= -8192.0 f0-0)) + (set! v1-10 25) + ) + (else + (set! v1-10 23) + ) + ) + ) + ) + (let ((gp-1 (-> self draw art-group data v1-10))) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! gp-1 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-1) frames num-frames) -1))) + :frame-num 0.0 + ) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (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-43 (-> self enemy-flags))) + (if (logtest? v1-43 (enemy-flag checking-water)) + (set! v1-44 (logior v1-43 (enemy-flag enable-on-active))) + (set! v1-44 (logclear v1-43 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-44) + (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-51 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-51) + (set! v1-52 (logior (enemy-flag check-water-backup) v1-51)) + (set! v1-52 (logclear v1-51 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-52) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (cond + ((= (-> self focus aware) (enemy-aware enemy-aware-3)) + (if (and (handle->process (-> self focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> self focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + (go-virtual attack) + ) + (go-hostile self) + ) + (else + (go-stare self) + ) + ) + (none) + ) + ) + +;; definition for method 70 of type grenadier +(defmethod go-hostile grenadier ((obj grenadier)) + (if (and (and (-> obj next-state) (= (-> obj next-state name) 'knocked)) + (and (logtest? (-> obj status-flags) 1) + (handle->process (-> obj focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> obj focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + ) + (go (method-of-object obj attack)) + ) + ((method-of-type nav-enemy go-hostile) obj) + (none) + ) + +;; failed to figure out what this is: +(defstate victory (grenadier) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (cond + ((zero? (rand-vu-int-range 0 1)) + (ja-no-eval :group! grenadier-victory-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-victory-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (else + (ja-no-eval :group! grenadier-notice-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim grenadier-notice-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +;; definition for method 142 of type grenadier +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod nav-enemy-method-142 grenadier ((obj grenadier) (arg0 nav-control)) + (local-vars (a0-4 int) (a0-6 int)) + (b! (logtest? (-> obj status-flags) 2) cfg-6 :delay (empty-form)) + (let ((v1-3 (new 'stack-no-clear 'vector)) + (a2-0 (new 'stack-no-clear 'vector)) + ) + (vector-reset! a2-0) + (set! (-> a2-0 y) 1.0) + (let ((t0-0 (-> arg0 state))) + (set! (-> v1-3 quad) (-> t0-0 heading quad)) + ) + (let* ((a1-3 (-> *perf-stats* data 33)) + (a3-3 (-> a1-3 ctrl)) + ) + (+! (-> a1-3 count) 1) + (b! (zero? a3-3) cfg-3 :delay (nop!)) + (.mtc0 Perf 0) + (.sync.l) + (.sync.p) + (.mtpc pcr0 0) + (.mtpc pcr1 0) + (.sync.l) + (.sync.p) + (.mtc0 Perf a3-3) + ) + (.sync.l) + (.sync.p) + (label cfg-3) + 0 + (forward-up-nopitch->quaternion (-> obj root-override2 quat) v1-3 a2-0) + ) + (let ((v1-5 (-> *perf-stats* data 33))) + (b! (zero? (-> v1-5 ctrl)) cfg-5 :delay (nop!)) + (.mtc0 Perf 0) + (.sync.l) + (.sync.p) + (.mfpc a0-4 pcr0) + (+! (-> v1-5 accum0) a0-4) + (.mfpc a0-6 pcr1) + (+! (-> v1-5 accum1) a0-6) + ) + (label cfg-5) + 0 + (label cfg-6) + 0 + (none) + ) + +;; definition for method 55 of type grenadier +(defmethod enemy-method-55 grenadier ((obj grenadier)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-55))) + (t9-0 obj) + ) + (let ((a1-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 34)))) + (spawn (-> obj part) a1-1) + ) + (none) + ) + +;; definition for method 114 of type grenadier +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 grenadier ((obj grenadier)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 6) 0))) + (set! (-> s5-0 total-prims) (the-as uint 7)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 12288.0 0.0 22528.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-13 local-sphere) 0.0 6553.6 0.0 6553.6) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action)) + (set! (-> v1-15 transform-index) 31) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 prim-core action) (collide-action deadly)) + (set! (-> v1-17 transform-index) 34) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 prim-core action) (collide-action deadly)) + (set! (-> v1-19 transform-index) 23) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-21 prim-core action) (collide-action deadly)) + (set! (-> v1-21 transform-index) 16) + (set-vector! (-> v1-21 local-sphere) 0.0 0.0 0.0 4096.0) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-23 prim-core collide-with) (collide-spec backgnd obstacle hit-by-others-list)) + (set! (-> v1-23 prim-core action) (collide-action solid)) + (set-vector! (-> v1-23 local-sphere) 0.0 12288.0 0.0 12288.0) + ) + (set! (-> s5-0 nav-radius) 8192.0) + (let ((v1-25 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-25 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-25 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 grenadier +;; WARN: Return type mismatch process-focusable vs grenadier. +(defmethod relocate grenadier ((obj grenadier) (arg0 int)) + (if (nonzero? (-> obj joint)) + (&+! (-> obj joint) arg0) + ) + (when (-> obj hostile-path) + (if (nonzero? (-> obj hostile-path)) + (&+! (-> obj hostile-path) arg0) + ) + ) + (the-as + grenadier + ((the-as (function process-focusable int process-focusable) (find-parent-method grenadier 7)) obj arg0) + ) + ) + +;; definition for method 115 of type grenadier +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 grenadier ((obj grenadier)) + "@abstract" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-grenadier" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *grenadier-nav-enemy-info*) + (let ((v1-5 (-> obj neck))) + (when v1-5 + (set! (-> v1-5 up) (the-as uint 1)) + (set! (-> v1-5 nose) (the-as uint 2)) + (set! (-> v1-5 ear) (the-as uint 0)) + (set-vector! (-> v1-5 twist-max) 11832.889 11832.889 0.0 1.0) + (set! (-> v1-5 ignore-angle) 30947.555) + ) + ) + (let ((v1-6 (-> obj nav))) + (set! (-> v1-6 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (set! (-> obj heading) (if (rand-vu-percent? 0.5) + #t + #f + ) + ) + (set! (-> obj move-angle) 5461.3335) + (set! (-> obj status-flags) (the-as uint 0)) + (set! (-> obj suppress-knockaside-timer) 0) + (set-vector! (-> obj root-override2 scale) 1.5 1.5 1.5 1.0) + (set! (-> obj joint) (new 'process 'joint-mod-blend-world obj 17 #f 0.0)) + (logior! (-> obj joint blend-flags) (joint-mod-blend-flags rotation)) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 1150) obj)) + (set! (-> obj hostile-path) (new 'process 'path-control obj 'hostile 0.0 (-> obj entity) #t)) + (if (zero? (-> obj hostile-path)) + (set! (-> obj hostile-path) #f) + ) + (if (-> obj hostile-path) + (logior! (-> obj hostile-path flags) (path-control-flag display draw-line draw-point draw-text)) + ) + (add-connection *part-engine* obj 24 obj 318 (new 'static 'vector :x 532.48 :y -81.92 :z 1515.52 :w 163840.0)) + (add-connection + *part-engine* + obj + 24 + obj + 318 + (new 'static 'vector :x -532.48 :y -81.92 :z 1515.52 :w 163840.0) + ) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/common/grunt_REF.gc b/test/decompiler/reference/jak2/levels/common/grunt_REF.gc index f276d8fafe..8a5cd10db4 100644 --- a/test/decompiler/reference/jak2/levels/common/grunt_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/grunt_REF.gc @@ -389,7 +389,6 @@ ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) ) ) - (none) ) ;; definition for method 66 of type grunt diff --git a/test/decompiler/reference/jak2/levels/drill_platform/ginsu_REF.gc b/test/decompiler/reference/jak2/levels/drill_platform/ginsu_REF.gc new file mode 100644 index 0000000000..3a567c2b69 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/drill_platform/ginsu_REF.gc @@ -0,0 +1,1174 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defpartgroup group-ginsu-sparks + :id 475 + :bounds (static-bspherem 0 0 0 8) + :parts ((sp-item 2105) (sp-item 2106 :fade-after (meters 90))) + ) + +;; failed to figure out what this is: +(defpart 2105 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x92 :page #xc)) + (sp-rnd-flt spt-num 2.0 3.0 1.0) + (sp-flt spt-scale-x (meters 2.5)) + (sp-int spt-rot-x 4) + (sp-flt spt-scale-y (meters 0.033)) + (sp-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 255.0) + (sp-flt spt-a 128.0) + (sp-flt spt-omega 4.096) + (sp-rnd-flt spt-vel-y (meters 0.06666667) (meters 0.06666667) 1.0) + (sp-rnd-flt spt-fade-g -0.85 -1.7 1.0) + (sp-flt spt-fade-b -8.0) + (sp-rnd-flt spt-fade-a -0.21333334 -0.21333334 1.0) + (sp-rnd-flt spt-accel-y -6.826667 -2.7306666 1.0) + (sp-flt spt-friction 0.93) + (sp-int-plain-rnd spt-timer 30 59 1) + (sp-cpuinfo-flags sp-cpuinfo-flag-3) + (sp-func spt-func 'sparticle-motion-blur) + (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 2106 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-x (meters 0.5) (meters 0.5) 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.5) 1.0) + (sp-flt spt-rot-x 409.6) + (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-omega 370688.0) + (sp-flt spt-fade-a -4.8) + (sp-int spt-timer 20) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow) + (sp-flt spt-userdata 409.6) + ) + ) + +;; failed to figure out what this is: +(defpartgroup group-ginsu-blade + :id 476 + :duration (seconds 0.017) + :flags (use-local-clock) + :bounds (static-bspherem 0 0 0 4) + :parts ((sp-item 2107 :flags (is-3d bit6 bit7)) + (sp-item 2108 :fade-after (meters 60) :flags (bit7) :period 300 :length 5) + (sp-item 2108 :fade-after (meters 60) :flags (bit7) :period 895 :length 5) + (sp-item 2108 :fade-after (meters 60) :flags (bit7) :period 1490 :length 5) + ) + ) + +;; failed to figure out what this is: +(defpart 2107 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xa05)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 0.09)) + (sp-rnd-flt spt-scale-x (meters 3) (meters 0.5) 1.0) + (sp-flt spt-rot-x 0.0) + (sp-flt spt-rot-y (degrees 0.0)) + (sp-flt spt-rot-z (degrees 0.0)) + (sp-copy-from-other spt-scale-y -4) + (sp-rnd-flt spt-r 64.0 128.0 1.0) + (sp-copy-from-other spt-g -1) + (sp-copy-from-other spt-b -1) + (sp-rnd-int spt-a 1115684864 2 64.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-12) + (sp-flt spt-rotate-y (degrees 0.0)) + ) + ) + +;; failed to figure out what this is: +(defpart 2108 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xbb :page #xc)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-x (meters 0.5) (meters 0.5) 1.0) + (sp-rnd-flt spt-scale-x (meters 1) (meters 0.5) 1.0) + (sp-flt spt-rot-x 204.8) + (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 64.0) + (sp-flt spt-omega 247808.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-12 glow) + (sp-flt spt-userdata 409.6) + (sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 3600.0) 1.0) + ) + ) + +;; failed to figure out what this is: +(defskelgroup skel-ginsu ginsu ginsu-lod0-jg ginsu-idle-ja + ((ginsu-lod0-mg (meters 20)) (ginsu-lod1-mg (meters 40)) (ginsu-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 2.5) + :shadow ginsu-shadow-mg + :origin-joint-index 8 + ) + +;; definition of type ginsu-anim-info +(deftype ginsu-anim-info (structure) + ((anim-index int32 :offset-assert 0) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + +;; definition for method 3 of type ginsu-anim-info +(defmethod inspect ginsu-anim-info ((obj ginsu-anim-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'ginsu-anim-info) + (format #t "~1Tanim-index: ~D~%" (-> obj anim-index)) + (label cfg-4) + obj + ) + +;; definition of type ginsu-global-info +(deftype ginsu-global-info (basic) + ((prev-blue-hit int8 :offset-assert 4) + (blue-hit-anim int32 3 :offset-assert 8) + ) + :method-count-assert 9 + :size-assert #x14 + :flag-assert #x900000014 + ) + +;; definition for method 3 of type ginsu-global-info +(defmethod inspect ginsu-global-info ((obj ginsu-global-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tprev-blue-hit: ~D~%" (-> obj prev-blue-hit)) + (format #t "~1Tblue-hit-anim[3] @ #x~X~%" (-> obj blue-hit-anim)) + (label cfg-4) + obj + ) + +;; definition of type ginsu +(deftype ginsu (nav-enemy) + ((blade-jm joint-mod :offset-assert 604) + (blade-speed cam-float-seeker :inline :offset-assert 608) + (blade-angle float :offset-assert 632) + (desired-distance float :offset-assert 636) + (spiral-time time-frame :offset-assert 640) + (blade-part part-spawner :offset-assert 648) + (ambush-path path-control :offset-assert 652) + (path-pos float :offset-assert 656) + (ambush-started symbol :offset-assert 660) + (blade-sound uint32 :offset-assert 664) + (blade-sound-playing symbol :offset-assert 668) + (grind-sound uint32 :offset-assert 672) + (grind-sound-playing symbol :offset-assert 676) + (grind-timer time-frame :offset-assert 680) + ) + :heap-base #x230 + :method-count-assert 184 + :size-assert #x2b0 + :flag-assert #xb8023002b0 + (:methods + (anticipate-attack () _type_ :state 178) + (attack () _type_ :state 179) + (ginsu-method-180 (_type_) none 180) + (ginsu-method-181 (_type_ vector) vector 181) + (ginsu-method-182 (_type_) none 182) + (ginsu-method-183 (_type_ symbol) none 183) + ) + ) + +;; definition for method 3 of type ginsu +(defmethod inspect ginsu ((obj ginsu)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tblade-jm: ~A~%" (-> obj blade-jm)) + (format #t "~2Tblade-speed: #~%" (-> obj blade-speed)) + (format #t "~2Tblade-angle: ~f~%" (-> obj blade-angle)) + (format #t "~2Tdesired-distance: ~f~%" (-> obj desired-distance)) + (format #t "~2Tspiral-time: ~D~%" (-> obj spiral-time)) + (format #t "~2Tblade-part: ~A~%" (-> obj blade-part)) + (format #t "~2Tambush-path: ~A~%" (-> obj ambush-path)) + (format #t "~2Tpath-pos: ~f~%" (-> obj path-pos)) + (format #t "~2Tambush-started: ~A~%" (-> obj ambush-started)) + (format #t "~2Tblade-sound: ~D~%" (-> obj blade-sound)) + (format #t "~2Tblade-sound-playing: ~A~%" (-> obj blade-sound-playing)) + (format #t "~2Tgrind-sound: ~D~%" (-> obj grind-sound)) + (format #t "~2Tgrind-sound-playing: ~A~%" (-> obj grind-sound-playing)) + (format #t "~2Tgrind-timer: ~D~%" (-> obj grind-timer)) + (label cfg-4) + obj + ) + +;; definition for symbol *ginsu-global-info*, type ginsu-global-info +(define *ginsu-global-info* + (new 'static 'ginsu-global-info :blue-hit-anim (new 'static 'array int32 3 5 5 5)) + ) + +;; definition for symbol *ginsu-nav-enemy-info*, type nav-enemy-info +(define *ginsu-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010501 #x0 #x0 #x0) + :idle-anim 5 + :notice-anim 10 + :hostile-anim 5 + :hit-anim 5 + :knocked-anim 11 + :knocked-land-anim 12 + :die-anim 11 + :die-falling-anim 5 + :victory-anim 5 + :jump-wind-up-anim 5 + :jump-in-air-anim 5 + :jump-land-anim 5 + :neck-joint 7 + :look-at-joint 7 + :bullseye-joint 4 + :sound-die (static-sound-name "ginsu-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 40) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot enemy hit-by-others-list player-list) + :penetrate-knocked #x11fffdffa + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 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-seek-ry-clamp 4551.1113 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 7 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #t + :use-pacing #t + :walk-anim 5 + :turn-anim 5 + :run-anim 5 + :taunt-anim -1 + :run-travel-speed (meters 16) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 100) + :walk-travel-speed (meters 16) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 1.5) + :frustration-distance (meters 8) + :frustration-time (seconds 4) + :blocked-time (seconds 0.3) + :circle-dist-lo 20480.0 + :circle-dist-hi 61440.0 + :nav-mesh #f + ) + ) + +;; failed to figure out what this is: +(set! (-> *ginsu-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 180 of type ginsu +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod ginsu-method-180 ginsu ((obj ginsu)) + (let ((v1-2 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (when (not (and v1-2 (or (= v1-2 (-> obj draw art-group data 11)) (= v1-2 (-> obj draw art-group data 12))))) + (update! (-> obj blade-speed) 0.0) + (let ((f0-1 (+ (-> obj blade-angle) (* 970903.75 (-> obj blade-speed value))))) + (set! (-> obj blade-angle) (- f0-1 (* (the float (the int (/ f0-1 65536.0))) 65536.0))) + ) + (quaternion-axis-angle! (-> obj blade-jm quat) 0.0 1.0 0.0 (-> obj blade-angle)) + (let ((s5-0 (new 'stack-no-clear 'matrix))) + (let* ((a2-1 (-> obj node-list data 8 bone transform)) + (v1-14 (-> a2-1 quad 0)) + (a0-10 (-> a2-1 quad 1)) + (a1-3 (-> a2-1 quad 2)) + (a2-2 (-> a2-1 trans quad)) + ) + (set! (-> s5-0 quad 0) v1-14) + (set! (-> s5-0 quad 1) a0-10) + (set! (-> s5-0 quad 2) a1-3) + (set! (-> s5-0 trans quad) a2-2) + ) + (when (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + (vector-negate! (the-as vector (-> s5-0 vector)) (the-as vector (-> s5-0 vector))) + (set! (-> s5-0 vector 0 w) 0.0) + ) + ) + (run-logic? (-> obj blade-part)) + ) + ) + 0 + (none) + ) + +;; definition for method 181 of type ginsu +(defmethod ginsu-method-181 ginsu ((obj ginsu) (arg0 vector)) + (vector-reset! arg0) + (let ((a0-2 (handle->process (-> obj focus handle)))) + (if a0-2 + (vector-! arg0 (get-trans (the-as process-focusable a0-2) 0) (-> obj root-override2 trans)) + ) + ) + arg0 + ) + +;; definition for method 55 of type ginsu +;; WARN: Return type mismatch symbol vs none. +(defmethod enemy-method-55 ginsu ((obj ginsu)) + (with-pp + (ginsu-method-180 obj) + (let ((t9-1 (method-of-type nav-enemy enemy-method-55))) + (t9-1 obj) + ) + (cond + ((not (and (-> obj next-state) (let ((v1-6 (-> obj next-state name))) + (or (= v1-6 'idle) + (= v1-6 'active) + (= v1-6 'dormant) + (= v1-6 'ambush) + (= v1-6 'knocked) + (= v1-6 'idle) + (= v1-6 'dormant) + (= v1-6 'die) + (= v1-6 'die-falling) + ) + ) + ) + ) + (sound-play "ginsu-loop" :id (the-as sound-id (-> obj blade-sound)) :position (-> obj root-override2 trans)) + (set! (-> obj blade-sound-playing) #t) + ) + ((-> obj blade-sound-playing) + (sound-stop (the-as sound-id (-> obj blade-sound))) + (set! (-> obj blade-sound-playing) #f) + ) + ) + (cond + ((and (not (and (-> obj next-state) (let ((v1-17 (-> obj next-state name))) + (or (= v1-17 'idle) + (= v1-17 'active) + (= v1-17 'dormant) + (= v1-17 'ambush) + (= v1-17 'knocked) + (= v1-17 'idle) + (= v1-17 'dormant) + (= v1-17 'die) + (= v1-17 'die-falling) + ) + ) + ) + ) + (< (- (-> pp clock frame-counter) (-> obj grind-timer)) 0) + ) + (sound-play "ginsu-grind" :id (the-as sound-id (-> obj grind-sound)) :position (-> obj root-override2 trans)) + (set! (-> obj grind-sound-playing) #t) + ) + ((-> obj grind-sound-playing) + (sound-stop (the-as sound-id (-> obj grind-sound))) + (set! (-> obj grind-sound-playing) #f) + ) + ) + (none) + ) + ) + +;; definition for method 182 of type ginsu +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod ginsu-method-182 ginsu ((obj ginsu)) + (local-vars (s5-1 art-element)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'matrix)) + ) + (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + (let* ((v1-8 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + (f30-0 (if (and v1-8 (= v1-8 (-> obj draw art-group data 7))) + (cos 9102.223) + (cos 7281.778) + ) + ) + ) + (let ((a1-0 (-> obj nav state))) + (set! (-> s5-0 quad) (-> a1-0 velocity quad)) + ) + (quaternion->matrix s4-0 (-> obj root-override2 quat)) + (let ((f0-1 (vector-dot s5-0 (the-as vector (-> s4-0 vector))))) + (if (logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + (set! f0-1 (- f0-1)) + ) + (cond + ((< (- f30-0) f0-1) + (set! s5-1 (-> obj draw art-group data 9)) + ) + ((< f0-1 f30-0) + (set! s5-1 (-> obj draw art-group data 8)) + ) + (else + (set! s5-1 (-> obj draw art-group data 7)) + ) + ) + ) + ) + ) + (let ((v1-33 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (cond + ((and v1-33 (= v1-33 s5-1)) + (let ((a0-11 (-> obj skel root-channel 0))) + (set! (-> a0-11 param 0) 1.0) + (joint-control-channel-group-eval! a0-11 (the-as art-joint-anim #f) num-func-loop!) + ) + ) + (else + (let ((f30-2 (/ (ja-frame-num 0) (the float (ja-num-frames 0))))) + (ja-channel-push! 1 (seconds 0.5)) + (set! (-> obj skel root-channel 0 frame-group) (the-as art-joint-anim s5-1)) + (let ((gp-1 (-> obj skel root-channel 0))) + (set! (-> gp-1 num-func) num-func-identity) + (set! (-> gp-1 frame-num) (* f30-2 (the float (ja-num-frames 0)))) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 142 of type ginsu +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod nav-enemy-method-142 ginsu ((obj ginsu) (arg0 nav-control)) + (with-pp + (let ((s3-0 (new 'stack-no-clear 'vector))) + (let ((a0-2 (handle->process (-> obj focus handle)))) + (cond + (a0-2 + (vector-! s3-0 (get-trans (the-as process-focusable a0-2) 0) (-> obj root-override2 trans)) + ) + (else + (let ((a0-7 (-> arg0 state))) + (set! (-> s3-0 quad) (-> a0-7 heading quad)) + ) + ) + ) + ) + (set! (-> s3-0 y) 0.0) + (vector-normalize! s3-0 1.0) + (let ((s5-3 (new 'stack-no-clear 'quaternion)) + (s4-0 (-> obj root-override2 quat)) + ) + (quaternion-set! s5-3 0.0 (sqrtf (* 0.5 (- 1.0 (-> s3-0 z)))) 0.0 (sqrtf (* 0.5 (+ 1.0 (-> s3-0 z))))) + (if (< (-> s3-0 x) 0.0) + (set! (-> s5-3 y) (- (-> s5-3 y))) + ) + (quaternion-pseudo-seek + s4-0 + s4-0 + s5-3 + (* (fmax 0.5 (* 0.00024414062 (-> obj nav state speed))) (-> pp clock seconds-per-frame)) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 74 of type ginsu +;; WARN: disable def twice: 11. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. +(defmethod enemy-method-74 ginsu ((obj ginsu) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (local-vars (v0-1 object)) + (with-pp + (case arg2 + (('touched) + (let ((s5-0 arg0)) + (when (if (type? s5-0 ginsu) + s5-0 + ) + (let ((s5-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 8)))) + (let ((a0-5 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 8)))) + (vector+! s5-1 s5-1 a0-5) + ) + (vector-float*! s5-1 s5-1 0.5) + (spawn (-> obj part) s5-1) + ) + (set! v0-1 (+ (-> pp clock frame-counter) (seconds 0.125))) + (set! (-> obj grind-timer) (the-as time-frame v0-1)) + v0-1 + ) + ) + ) + (('touch 'bonk 'attack) + (cond + ((or (!= arg0 *target*) (logtest? (focus-status dark) (-> *target* focus-status))) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (else + (let ((v1-15 (new 'stack-no-clear 'event-message-block))) + (set! (-> v1-15 from) (process->ppointer pp)) + (set! (-> v1-15 num-params) 2) + (set! (-> v1-15 message) 'attack) + (set! (-> v1-15 param 0) (the-as uint #f)) + (let ((a2-2 (new 'static 'attack-info :mask (attack-info-mask id)))) + (let* ((a0-19 *game-info*) + (a3-2 (+ (-> a0-19 attack-id) 1)) + ) + (set! (-> a0-19 attack-id) a3-2) + (set! (-> a2-2 id) a3-2) + ) + (set! (-> v1-15 param 1) (the-as uint a2-2)) + ) + (send-event-function arg0 v1-15) + ) + #f + ) + ) + ) + (('trigger) + (set! v0-1 #t) + (set! (-> obj ambush-started) (the-as symbol v0-1)) + v0-1 + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +;; failed to figure out what this is: +(defstate circling (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy circling) enter))) + (if t9-0 + (t9-0) + ) + ) + (if (< 0.5 (rand-vu)) + (set! (-> self enemy-flags) (the-as enemy-flag (logxor (shl 256 32) (the-as int (-> self enemy-flags))))) + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy circling) trans))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-method-182 self) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + ) + +;; failed to figure out what this is: +(defstate hostile (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (if (< 0.5 (rand-vu)) + (set! (-> self enemy-flags) (the-as enemy-flag (logxor (shl 256 32) (the-as int (-> self enemy-flags))))) + ) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag enemy-flag41)))) + (set! (-> self starting-time) (the-as uint (-> self clock frame-counter))) + (set! (-> self spiral-time) (-> self clock frame-counter)) + (set! (-> self desired-distance) (vector-length (ginsu-method-181 self (new 'stack-no-clear 'vector)))) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (if (and (< (vector-length (ginsu-method-181 self (new 'stack-no-clear 'vector))) 16384.0) + (logtest? (-> self draw status) (draw-control-status on-screen)) + ) + (go-virtual anticipate-attack) + ) + (if (nav-enemy-method-163 self) + (go-stare2 self) + ) + (if (logtest? (enemy-flag enemy-flag41) (-> self enemy-flags)) + (set! (-> self enemy-flags) (the-as enemy-flag (logxor (shl 256 32) (the-as int (-> self enemy-flags))))) + ) + (ginsu-method-182 self) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + :post (behavior () + (let ((s5-0 (ginsu-method-181 self (new 'stack-no-clear 'vector))) + (gp-0 (new-stack-vector0)) + ) + 0.0 + 0.0 + (set! (-> s5-0 y) 0.0) + (let* ((f0-3 (vector-normalize-ret-len! s5-0 1.0)) + (f1-1 (- 1.0 (* 0.0016666667 (the float (- (-> self clock frame-counter) (-> self spiral-time)))))) + (f2-3 (fmax 12288.0 (* 102400.0 f1-1))) + (f0-4 (- f0-3 (fmin (fmax 12288.0 (* 122880.0 f1-1)) (fmax f2-3 (-> self desired-distance))))) + (f30-0 (fmin 8192.0 (fmax -8192.0 f0-4))) + ) + (set! (-> gp-0 x) (- (-> s5-0 z))) + (set! (-> gp-0 z) (-> s5-0 x)) + (if (logtest? (enemy-flag enemy-flag40) (-> self enemy-flags)) + (vector-negate! gp-0 gp-0) + ) + (vector+float*! gp-0 (-> self root-override2 trans) gp-0 20480.0) + (vector+float*! gp-0 gp-0 s5-0 f30-0) + ) + (cloest-point-on-mesh (-> self nav) gp-0 gp-0 (the-as nav-poly #f)) + (if (< (vector-vector-xz-distance gp-0 (-> self root-override2 trans)) 409.6) + (set! (-> self enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag41) (-> self enemy-flags)))) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag enemy-flag41)))) + ) + (let ((v1-32 (-> self nav state))) + (logclear! (-> v1-32 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-32 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-32 target-post quad) (-> gp-0 quad)) + ) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate anticipate-attack (ginsu) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior ginsu) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let ((v1-4 (-> self nav))) + (set! (-> v1-4 target-speed) 8192.0) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! ginsu-idle-ja :num! min) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (if (not (and (handle->process (-> self focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> self focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + ) + (go-virtual circling) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (go-virtual circling) + ) + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.75)) + (go-virtual attack) + ) + (ja :num! (loop!)) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + :post (behavior () + (let ((gp-0 (ginsu-method-181 self (new 'stack-no-clear 'vector)))) + (set! (-> gp-0 y) 0.0) + (vector-normalize! gp-0 -819.2) + (vector+! gp-0 gp-0 (-> self root-override2 trans)) + (cloest-point-on-mesh (-> self nav) gp-0 gp-0 (the-as nav-poly #f)) + (if (< (vector-vector-xz-distance gp-0 (-> self root-override2 trans)) 409.6) + (set! (-> self enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag41) (-> self enemy-flags)))) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag enemy-flag41)))) + ) + (let ((v1-12 (-> self nav state))) + (logclear! (-> v1-12 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-12 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-12 target-post quad) (-> gp-0 quad)) + ) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (ginsu) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior ginsu) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (ginsu-method-183 self #t) + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (a0-5 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-5) + (set! (-> self attack-id) a0-5) + ) + (let ((v1-10 (-> self nav))) + (set! (-> v1-10 target-speed) 49152.0) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (ja :group! ginsu-attack-ja :num! min) + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (ginsu-method-183 self #f) + (none) + ) + :trans (behavior () + (enemy-method-49 self) + (if (not (and (handle->process (-> self focus handle)) + (zero? (logand (-> (the-as process-focusable (handle->process (-> self focus handle))) focus-status) + (focus-status disable dead ignore grabbed) + ) + ) + ) + ) + (go-virtual circling) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (go-virtual circling) + ) + (ja :num! (seek!)) + (if (ja-done? 0) + (go-virtual circling) + ) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + :post (the-as (function none :behavior ginsu) nav-enemy-chase-post) + ) + +;; failed to figure out what this is: +(defstate ambush (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type enemy ambush) enter))) + (if t9-0 + (t9-0) + ) + ) + (logclear! (-> self mask) (process-mask actor-pause)) + (logior! (-> self enemy-flags) (enemy-flag use-notice-distance)) + (ja-channel-set! 0) + (set! (-> self root-override2 scale x) 0.01) + (set! (-> self root-override2 scale y) 0.01) + (set! (-> self root-override2 scale z) 0.01) + (none) + ) + :exit (behavior () + (logior! (-> self mask) (process-mask actor-pause)) + (logior! (-> self enemy-flags) (enemy-flag notice)) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type enemy ambush) trans))) + (if t9-0 + (t9-0) + ) + ) + (when (-> self ambush-started) + (when (zero? (-> self skel active-channels)) + (ja-channel-push! 1 0) + (ja :group! ginsu-idle-ja :num! min) + ) + (vector-seek! (-> self root-override2 scale) (new 'static 'vector :x 1.0 :y 1.0 :z 1.0) 0.02) + (+! (-> self path-pos) (/ 2048.0 (total-distance (-> self ambush-path)))) + (let ((f30-1 (-> self path-pos))) + (when (>= f30-1 1.0) + (set! (-> self path-pos) 1.0) + (go-hostile self) + ) + (get-point-at-percent-along-path! (-> self ambush-path) (-> self root-override2 trans) f30-1 'interp) + ) + (ja :num! (loop!)) + ) + (none) + ) + :code (the-as (function none :behavior ginsu) sleep-code) + :post (the-as (function none :behavior ginsu) enemy-simple-post) + ) + +;; definition for function ginsu-sounds-off +;; WARN: Return type mismatch int vs none. +(defbehavior ginsu-sounds-off ginsu () + (if (-> self blade-sound-playing) + (sound-stop (the-as sound-id (-> self blade-sound))) + ) + (when (-> self grind-sound-playing) + (sound-stop (the-as sound-id (-> self grind-sound))) + (set! (-> self grind-sound-playing) #f) + (set! (-> self grind-timer) 0) + 0 + ) + (none) + ) + +;; failed to figure out what this is: +(defstate idle (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy idle) enter))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-sounds-off) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate dormant (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy dormant) enter))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-sounds-off) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate die (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy die) enter))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-sounds-off) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate die-falling (ginsu) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy die-falling) enter))) + (if t9-0 + (t9-0) + ) + ) + (ginsu-sounds-off) + (none) + ) + ) + +;; definition for method 70 of type ginsu +(defmethod go-hostile ginsu ((obj ginsu)) + (cond + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + (nav-enemy-method-163 obj) + ) + (go-stare2 obj) + ) + (else + (let* ((v1-8 (/ (the-as int (rand-uint31-gen *random-generator*)) 256)) + (v1-9 (the-as number (logior (the-as int #x3f800000) v1-8))) + ) + (if (and (< (+ -1.0 (the-as float v1-9)) 0.1) (logtest? (-> obj draw status) (draw-control-status on-screen))) + (go (method-of-object obj anticipate-attack)) + (go (method-of-object obj hostile)) + ) + ) + ) + ) + (none) + ) + +;; definition for method 116 of type ginsu +;; WARN: Return type mismatch object vs none. +(defmethod go-idle ginsu ((obj ginsu)) + (if (not (logtest? (-> obj ambush-path flags) (path-control-flag not-found))) + (go (method-of-object obj ambush)) + (go (method-of-object obj idle)) + ) + (none) + ) + +;; definition for method 10 of type ginsu +(defmethod deactivate ginsu ((obj ginsu)) + (if (nonzero? (-> obj blade-part)) + ((the-as (function none :behavior part-spawner) (method-of-object (-> obj blade-part) active))) + ) + (if (-> obj blade-sound-playing) + (sound-stop (the-as sound-id (-> obj blade-sound))) + ) + (if (-> obj grind-sound-playing) + (sound-stop (the-as sound-id (-> obj grind-sound))) + ) + ((method-of-type nav-enemy deactivate) obj) + (none) + ) + +;; definition for method 7 of type ginsu +;; WARN: Return type mismatch nav-enemy vs ginsu. +(defmethod relocate ginsu ((obj ginsu) (arg0 int)) + (if (nonzero? (-> obj blade-jm)) + (&+! (-> obj blade-jm) arg0) + ) + (if (nonzero? (-> obj blade-part)) + (&+! (-> obj blade-part) arg0) + ) + (if (nonzero? (-> obj ambush-path)) + (&+! (-> obj ambush-path) arg0) + ) + (the-as ginsu ((method-of-type nav-enemy relocate) obj arg0)) + ) + +;; definition for method 183 of type ginsu +;; WARN: Return type mismatch int vs none. +(defmethod ginsu-method-183 ginsu ((obj ginsu) (arg0 symbol)) + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> obj root-override2 root-prim)) child 1))) + (cond + (arg0 + (set! (-> v1-3 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-3 prim-core collide-with) (collide-spec jak bot)) + ) + (else + (set! (-> v1-3 prim-core collide-as) (collide-spec)) + (set! (-> v1-3 prim-core collide-with) (collide-spec)) + 0 + ) + ) + ) + (none) + ) + +;; definition for method 46 of type ginsu +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-46 ginsu ((obj ginsu) (arg0 int)) + "@abstract" + (case arg0 + ((1) + (let ((v1-2 (-> obj root-override2 root-prim))) + (logior! (-> v1-2 prim-core action) (collide-action solid)) + (let ((v1-4 (-> (the-as collide-shape-prim-group v1-2) child 0))) + (logior! (-> v1-4 prim-core action) (collide-action solid)) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 114 of type ginsu +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 ginsu ((obj ginsu)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate enemy obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action deadly no-standon)) + (set! (-> s4-0 transform-index) 8) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 9216.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-14 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-14 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-14 prim-core collide-with) + (collide-spec backgnd jak bot crate enemy obstacle hit-by-others-list player-list) + ) + (set! (-> v1-14 prim-core action) (collide-action no-standon)) + (set! (-> v1-14 transform-index) 8) + (set-vector! (-> v1-14 local-sphere) 0.0 0.0 0.0 4915.2) + ) + (let ((v1-16 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-16 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-16 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-16 prim-core action) (collide-action deadly)) + (set! (-> v1-16 transform-index) 7) + (set-vector! (-> v1-16 local-sphere) 0.0 0.0 0.0 2662.4) + ) + (set! (-> s5-0 nav-radius) 4505.6) + (let ((v1-18 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-18 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-18 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> s5-0 event-self) 'touched) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 115 of type ginsu +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 ginsu ((obj ginsu)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-ginsu" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *ginsu-nav-enemy-info*) + (logclear! (-> obj nav flags) (nav-control-flag update-heading-from-facing)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag43)))) + (logclear! (-> obj nav flags) (nav-control-flag limit-rotation-rate)) + (let ((v1-14 (-> obj neck))) + (set! (-> v1-14 up) (the-as uint 1)) + (set! (-> v1-14 nose) (the-as uint 2)) + (set! (-> v1-14 ear) (the-as uint 0)) + (set-vector! (-> v1-14 twist-max) 10922.667 7281.778 0.0 1.0) + (set! (-> v1-14 ignore-angle) 18204.445) + ) + (let ((v1-16 (-> obj nav))) + (set! (-> v1-16 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (ginsu-method-183 obj #f) + (set! (-> obj blade-jm) (new 'process 'joint-mod (joint-mod-mode joint-set*) obj 8)) + (init (-> obj blade-speed) 1.0 0.01 0.1 0.9) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 475) obj)) + (set! (-> obj blade-part) (the-as part-spawner (create-launch-control (-> *part-group-id-table* 476) obj))) + (set! (-> obj ambush-path) (new 'process 'curve-control obj 'intro -1000000000.0)) + (set! (-> obj ambush-started) #f) + (set! (-> obj path-pos) 0.0) + (if (not (logtest? (-> obj ambush-path flags) (path-control-flag not-found))) + (logior! (-> obj ambush-path flags) (path-control-flag display draw-line draw-point draw-text)) + ) + (set! (-> obj blade-sound) (the-as uint (new-sound-id))) + (set! (-> obj blade-sound-playing) #f) + (set! (-> obj grind-sound) (the-as uint (new-sound-id))) + (set! (-> obj grind-sound-playing) #f) + (set! (-> obj grind-timer) 0) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/forest/pegasus_REF.gc b/test/decompiler/reference/jak2/levels/forest/pegasus_REF.gc index a0f1b141f1..afdc1b9f9e 100644 --- a/test/decompiler/reference/jak2/levels/forest/pegasus_REF.gc +++ b/test/decompiler/reference/jak2/levels/forest/pegasus_REF.gc @@ -243,39 +243,48 @@ ) ;; definition for method 74 of type pegasus +;; WARN: Return type mismatch none vs object. (defmethod enemy-method-74 pegasus ((obj pegasus) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) (with-pp - (case arg2 - (('track) - ) - (('hit 'hit-knocked) - (cond - ((zero? (-> obj hit-points)) - (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) - (enemy-method-73 obj) - ) - (else - (set! (-> obj targetted-timer) (the-as uint (-> pp clock frame-counter))) + (let ((v1-0 arg2)) + (the-as + object + (cond + ((= v1-0 'track) + #f ) - ) - ) - (else - ((method-of-type enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ((or (= v1-0 'hit) (= v1-0 'hit-knocked)) + (cond + ((zero? (-> obj hit-points)) + (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) + (the-as object (enemy-method-73 obj)) + ) + (else + (let ((v0-0 (the-as object (-> pp clock frame-counter)))) + (set! (-> obj targetted-timer) (the-as uint v0-0)) + v0-0 + ) + ) + ) + ) + (else + ((method-of-type enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) ) ) - (none) ) ) diff --git a/test/decompiler/reference/jak2/levels/forest/predator-graph_REF.gc b/test/decompiler/reference/jak2/levels/forest/predator-graph_REF.gc new file mode 100644 index 0000000000..c7011123be --- /dev/null +++ b/test/decompiler/reference/jak2/levels/forest/predator-graph_REF.gc @@ -0,0 +1,2155 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol *predator-graph*, type predator-graph +(define *predator-graph* (new 'static 'predator-graph + :node-count #x4b + :edge-count #x182 + :node (new 'static 'inline-array predator-node 75 + (new 'static 'predator-node + :position (new 'static 'vector :x -2324131.5 :y 43518.77 :z 2557435.5) + :nav-mesh-id #x3b5c + :edge-count 3 + :radius 63208.242 + :points #xfff00003 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2182716.5 :y 15286.682 :z 2585234.8) + :nav-mesh-id #x3b5c + :edge-index 3 + :edge-count 4 + :radius 23640.064 + :points #x7ffff800 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2254212.8 :y 21254.145 :z 2728910.5) + :nav-mesh-id #x3b5c + :edge-index 7 + :edge-count 6 + :radius 40380.008 + :points #xfffc0fff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2331462.8 :y 9492.07 :z 2707181.2) + :nav-mesh-id #x3b5c + :edge-index 13 + :edge-count 7 + :radius 26837.402 + :points #x3fffffc + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2442096.2 :y 18383.668 :z 2625167.0) + :nav-mesh-id #x3b5c + :edge-index 20 + :edge-count 6 + :radius 29555.916 + :points #xfff00003 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2388848.2 :y 8798.208 :z 2776899.2) + :nav-mesh-id #x3b5c + :edge-index 26 + :edge-count 7 + :radius 35981.312 + :points #xc000ffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2512056.0 :y 25574.605 :z 2693631.5) + :nav-mesh-id #x3b5c + :edge-index 33 + :edge-count 8 + :radius 30316.135 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2454588.5 :y 20201.062 :z 2793463.5) + :nav-mesh-id #x3b5c + :edge-index 41 + :edge-count 6 + :radius 35779.38 + :points #x1fffff0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2557562.5 :y 20720.025 :z 2751488.0) + :nav-mesh-id #x3b5c + :edge-index 47 + :edge-count 7 + :radius 42917.887 + :points #xe000f7ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2631003.2 :y 18656.46 :z 2618973.5) + :nav-mesh-id #x3b5c + :edge-index 54 + :edge-count 8 + :radius 22494.412 + :points #xfc00ffcf + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2589634.2 :y 31613.748 :z 2559033.0) + :nav-mesh-id #x3b5c + :edge-index 62 + :edge-count 7 + :radius 28829.287 + :points #x3ffffe00 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2794598.0 :y 9517.875 :z 2616995.5) + :nav-mesh-id #x3b5c + :edge-index 69 + :edge-count 5 + :radius 34660.35 + :points #xe00007ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2847641.2 :y 13558.989 :z 2618473.8) + :nav-mesh-id #x3b5c + :edge-index 74 + :edge-count 4 + :radius 33491.355 + :points #xff00 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2858864.2 :y 18482.791 :z 2529550.0) + :nav-mesh-id #x3b5c + :edge-index 78 + :edge-count 5 + :radius 25489.408 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2763878.0 :y 29285.58 :z 2518937.2) + :nav-mesh-id #x3b5c + :edge-index 83 + :edge-count 6 + :radius 26371.686 + :points #xfffeff03 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2720050.5 :y 53839.46 :z 2404113.5) + :nav-mesh-id #x3b5c + :edge-index 89 + :edge-count 5 + :radius 22623.438 + :points #x7ffc0000 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2950287.0 :y 40124.824 :z 2539035.8) + :nav-mesh-id #x3b5c + :edge-index 94 + :edge-count 3 + :radius 31542.066 + :points #xfc00007f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2228284.5 :y 45842.434 :z 2831855.2) + :nav-mesh-id #x3b5c + :edge-index 97 + :edge-count 4 + :radius 38095.668 + :points #xfffffffe + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2161553.0 :y 69435.39 :z 2873138.5) + :nav-mesh-id #x3b5c + :edge-index #x65 + :edge-count 6 + :radius 62775.297 + :points #x7e0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2279034.5 :y 21656.781 :z 2882637.5) + :nav-mesh-id #x3b5c + :edge-index #x6b + :edge-count 7 + :radius 38604.8 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2479328.8 :y 12887.654 :z 2902150.2) + :nav-mesh-id #x3b5c + :edge-index #x72 + :edge-count 4 + :radius 42556.21 + :points #xfffe00ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2699611.2 :y 40017.92 :z 2932710.5) + :nav-mesh-id #x3b5c + :edge-index #x76 + :edge-count 4 + :radius 44344.523 + :points #xe001ffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2768301.8 :y 39130.316 :z 2901376.5) + :nav-mesh-id #x3b5c + :edge-index #x7a + :edge-count 3 + :radius 37495.195 + :points #xf001ffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2622648.0 :y 19407.668 :z 2821271.2) + :nav-mesh-id #x3b5c + :edge-index #x7d + :edge-count 6 + :radius 30383.309 + :points #x3fffe00 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2713251.5 :y 18592.562 :z 2784042.5) + :nav-mesh-id #x3b5c + :edge-index #x83 + :edge-count 7 + :radius 50465.996 + :points #xfffe1fff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2657464.0 :y 15094.579 :z 2704649.5) + :nav-mesh-id #x3b5c + :edge-index #x8a + :edge-count 7 + :radius 22964.225 + :points #x1fffc000 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2803568.2 :y 39347.406 :z 2708127.0) + :nav-mesh-id #x3b5c + :edge-index #x91 + :edge-count 4 + :radius 21984.05 + :points #x7fff0000 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2871152.2 :y 56349.492 :z 2772692.2) + :nav-mesh-id #x3b5c + :edge-index #x95 + :edge-count 5 + :radius 29560.014 + :points #x1fffe0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2991492.8 :y 58539.21 :z 2727558.2) + :nav-mesh-id #x3b5c + :edge-index #x9a + :edge-count 3 + :radius 35547.137 + :points #xfe00000f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2981948.5 :y 91303.52 :z 2899549.5) + :nav-mesh-id #x3b5c + :edge-index #x9d + :edge-count 4 + :radius 18809.65 + :points #x1ffff00 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2969292.5 :y 119921.87 :z 3123490.5) + :nav-mesh-id #x3b5c + :edge-index #xa1 + :edge-count 6 + :radius 23033.037 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2873487.0 :y 121214.98 :z 2924236.5) + :nav-mesh-id #x3b5c + :edge-index #xa7 + :edge-count 3 + :radius 41010.79 + :points #xfffe0001 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2760723.8 :y 139063.7 :z 2981489.8) + :nav-mesh-id #x3b5c + :edge-index #xaa + :edge-count 4 + :radius 43944.344 + :points #x7fff800 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2697318.0 :y 119486.055 :z 3070746.2) + :nav-mesh-id #x3b5c + :edge-index #xae + :edge-count 4 + :radius 40016.69 + :points #xfefff80 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2596433.0 :y 74880.2 :z 3145862.2) + :nav-mesh-id #x3b5c + :edge-index #xb2 + :edge-count 4 + :radius 40059.29 + :points #xffc0fff1 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2413096.2 :y 59520.613 :z 2999434.8) + :nav-mesh-id #x3b5c + :edge-index #xb6 + :edge-count 4 + :radius 24111.924 + :points #xffff8003 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3035156.0 :y 149131.67 :z 3272085.0) + :nav-mesh-id #x3e15 + :edge-index #xba + :edge-count 5 + :radius 15153.972 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3078204.5 :y 153213.75 :z 3387985.0) + :nav-mesh-id #x3e15 + :edge-index #xbf + :edge-count 6 + :radius 26331.137 + :points #xfff00fff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3057683.8 :y 154890.66 :z 3550129.2) + :nav-mesh-id #x3e15 + :edge-index #xc5 + :edge-count 7 + :radius 34960.18 + :points #xc0000007 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3056742.0 :y 154547.0 :z 3632541.0) + :nav-mesh-id #x3e15 + :edge-index #xcc + :edge-count 4 + :radius 35908.812 + :points #xc3c00007 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3031633.0 :y 161428.69 :z 3733810.5) + :nav-mesh-id #x3e15 + :edge-index #xd0 + :edge-count 7 + :radius 36187.75 + :points #xfc07fe0f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2952376.0 :y 164512.16 :z 3637804.8) + :nav-mesh-id #x3e15 + :edge-index #xd7 + :edge-count 7 + :radius 30886.297 + :points #xfffffe0f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2792181.2 :y 166134.17 :z 3464453.8) + :nav-mesh-id #x3e15 + :edge-index #xde + :edge-count 9 + :radius 30282.547 + :points #xffc0ffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2729881.2 :y 151591.33 :z 3431243.2) + :nav-mesh-id #x3e15 + :edge-index #xe7 + :edge-count 5 + :radius 29344.154 + :points #xfffe03ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2905312.8 :y 193297.61 :z 3324849.2) + :nav-mesh-id #x3e15 + :edge-index #xec + :edge-count 5 + :radius 23481.959 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2269572.8 :y 92133.375 :z 3864874.5) + :nav-mesh-id #x3e15 + :edge-index #xf1 + :edge-count 2 + :radius 33567.54 + :points #x3fffe0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2566287.0 :y 148446.83 :z 3850812.5) + :nav-mesh-id #x3e15 + :edge-index #xf3 + :edge-count 7 + :radius 31936.102 + :points #xf00ffff7 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2757160.2 :y 192492.34 :z 3811433.8) + :nav-mesh-id #x3e15 + :edge-index #xfa + :edge-count 5 + :radius 13925.171 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2827776.0 :y 196078.39 :z 3741732.5) + :nav-mesh-id #x3e15 + :edge-index #xff + :edge-count 7 + :radius 51901.234 + :points #xc70001ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2829782.8 :y 198469.62 :z 3631889.5) + :nav-mesh-id #x3e15 + :edge-index #x106 + :edge-count 5 + :radius 51584.613 + :points #xff800003 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2764369.0 :y 188372.98 :z 3560890.0) + :nav-mesh-id #x3e15 + :edge-index #x10b + :edge-count 4 + :radius 16382.771 + :points #xff0fffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2704690.5 :y 164491.67 :z 3619626.5) + :nav-mesh-id #x3e15 + :edge-index #x10f + :edge-count 7 + :radius 25772.852 + :points #xffe0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2603192.0 :y 191066.52 :z 3706015.0) + :nav-mesh-id #x3e15 + :edge-index #x116 + :edge-count 5 + :radius 33278.77 + :points #xffc007ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -3066326.8 :y 194444.5 :z 3690315.2) + :nav-mesh-id #x3e15 + :edge-index #x11b + :edge-count 2 + :radius 23621.633 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2997022.0 :y 181973.4 :z 3941461.5) + :nav-mesh-id #x3e15 + :edge-index #x11d + :edge-count 5 + :radius 33880.473 + :points #x80007fff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1662652.0 :y 24240.947 :z 3668233.5) + :nav-mesh-id #x4b36 + :edge-index #x122 + :edge-count 3 + :radius 24385.535 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1835364.0 :y 43812.043 :z 3684552.0) + :nav-mesh-id #x4b36 + :edge-index #x125 + :edge-count 6 + :radius 44497.715 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1775226.5 :y 38207.08 :z 3775393.5) + :nav-mesh-id #x4b36 + :edge-index #x12b + :edge-count 5 + :radius 23533.979 + :points #x1fffc0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1925938.8 :y 54054.91 :z 3839045.2) + :nav-mesh-id #x4b36 + :edge-index #x130 + :edge-count 4 + :radius 11815.731 + :points #x7ffc + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2100784.8 :y 71170.46 :z 3843383.0) + :nav-mesh-id #x4b36 + :edge-index #x134 + :edge-count 4 + :radius 22117.172 + :points #x3fffe + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2248683.0 :y 32537.805 :z 3708075.5) + :nav-mesh-id #x4b36 + :edge-index #x138 + :edge-count 6 + :radius 46956.543 + :points #xfffff00f + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2245119.5 :y 32537.805 :z 3660771.0) + :nav-mesh-id #x4b36 + :edge-index #x13e + :edge-count 5 + :radius 48967.68 + :points #xf01fffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2113043.8 :y 32865.895 :z 3614215.2) + :nav-mesh-id #x4b36 + :edge-index #x143 + :edge-count 4 + :radius 35588.914 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2115600.0 :y 27176.96 :z 3690397.0) + :nav-mesh-id #x4b36 + :edge-index #x147 + :edge-count 4 + :radius 48089.496 + :points #xffffffef + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1954619.0 :y 65282.867 :z 3695386.2) + :nav-mesh-id #x4b36 + :edge-index #x14b + :edge-count 6 + :radius 64820.02 + :points #xff0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1830649.5 :y 77674.086 :z 3570786.0) + :nav-mesh-id #x4b36 + :edge-index #x151 + :edge-count 8 + :radius 38815.336 + :points #xc00007ff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1684487.8 :y 55552.0 :z 3592335.0) + :nav-mesh-id #x4b36 + :edge-index #x159 + :edge-count 4 + :radius 39208.96 + :points #xfffc0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1636478.6 :y 71381.4 :z 3525598.5) + :nav-mesh-id #x4b36 + :edge-index #x15d + :edge-count 4 + :radius 35352.168 + :points #xfffe0 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1776230.0 :y 62159.668 :z 3410837.0) + :nav-mesh-id #x4b36 + :edge-index #x161 + :edge-count 3 + :radius 45858.816 + :points #xfffe0001 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -1927675.5 :y 29462.938 :z 3431783.8) + :nav-mesh-id #x4b36 + :edge-index #x164 + :edge-count 5 + :radius 31855.002 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2596597.2 :y 22821.273 :z 3954433.8) + :nav-mesh-id #x4b36 + :edge-index #x169 + :edge-count 4 + :radius 18589.287 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2381762.2 :y 20472.627 :z 3796311.8) + :nav-mesh-id #x4b36 + :edge-index #x16d + :edge-count 6 + :radius 47302.246 + :points #xfff60 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2471218.5 :y 21400.371 :z 3501641.0) + :nav-mesh-id #x4b36 + :edge-index #x173 + :edge-count 5 + :points #xffffffff + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2314833.0 :y 100966.81 :z 3467267.8) + :nav-mesh-id #x3e15 + :edge-index #x178 + :edge-count 5 + :radius 42546.38 + :points #x1ff8000 + ) + (new 'static 'predator-node + :position (new 'static 'vector :x -2541382.8 :y 147264.72 :z 3530809.0) + :nav-mesh-id #x3e15 + :edge-index #x17d + :edge-count 5 + :radius 27781.53 + :points #xcffff81f + ) + ) + :edge (new 'static 'inline-array predator-edge 1544 + (new 'static 'predator-edge :dest-node-id #x1) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x11) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x11) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x14) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xc) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x10) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xc) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x10) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xc) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xb) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xe) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xa) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x10) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xd) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xc) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #xf) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x11) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x23) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x22) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x14) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x23) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x11) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x5) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x15) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x7) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x16) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x14) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x15) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x16) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x15) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x14) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x16) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x15) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x17) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x8) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x9) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x6) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x19) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x18) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x20) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x21) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x20) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x21) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x22) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x20) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x22) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x23) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x21) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x23) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x20) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x22) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x13) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x12) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x21) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x1e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x27) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x27) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x35) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x27) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x27) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x32) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x32) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x24) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x26) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x25) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x32) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x29) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x32) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x31) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x36) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x35) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x30) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x28) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x37) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x42) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x37) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x42) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x46) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3f) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x42) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x37) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x43) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x44) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x43) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x39) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x38) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x42) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x44) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x43) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x45) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x44) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x43) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x41) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x40) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x46) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x46) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3c) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x48) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x4a) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x3d) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x47) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x46) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x49) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2b) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x33) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x34) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge :dest-node-id #x2e) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + (new 'static 'predator-edge) + ) + ) + ) diff --git a/test/decompiler/reference/jak2/levels/forest/predator-h_REF.gc b/test/decompiler/reference/jak2/levels/forest/predator-h_REF.gc index f6a12c90a0..029a29c41d 100644 --- a/test/decompiler/reference/jak2/levels/forest/predator-h_REF.gc +++ b/test/decompiler/reference/jak2/levels/forest/predator-h_REF.gc @@ -54,6 +54,7 @@ ((dest-node-id uint16 :offset-assert 0) (flags predator-edge-flag :offset-assert 2) ) + :pack-me :method-count-assert 9 :size-assert #x4 :flag-assert #x900000004 @@ -76,10 +77,10 @@ ;; definition of type predator-graph (deftype predator-graph (structure) - ((node-count uint16 :offset-assert 0) - (edge-count uint16 :offset-assert 2) - (node uint32 :offset-assert 4) - (edge uint32 :offset-assert 8) + ((node-count uint16 :offset-assert 0) + (edge-count uint16 :offset-assert 2) + (node (inline-array predator-node) :offset-assert 4) + (edge (inline-array predator-edge) :offset-assert 8) ) :method-count-assert 9 :size-assert #xc @@ -103,7 +104,3 @@ ;; failed to figure out what this is: 0 - - - - diff --git a/test/decompiler/reference/jak2/levels/forest/predator_REF.gc b/test/decompiler/reference/jak2/levels/forest/predator_REF.gc new file mode 100644 index 0000000000..84e7e24f22 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/forest/predator_REF.gc @@ -0,0 +1,1844 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for method 15 of type hud-predator +;; WARN: Return type mismatch int vs none. +(defmethod draw hud-predator ((obj hud-predator)) + (set-hud-piece-position! (-> obj sprites 1) (the int (+ 480.0 (* 130.0 (-> obj offset)))) 205) + (set-as-offset-from! (the-as hud-sprite (-> obj sprites)) (the-as vector4w (-> obj sprites 1)) -44 0) + (format (clear (-> obj strings 0 text)) "~D" (-> obj values 0 current)) + (set-as-offset-from! (the-as hud-sprite (-> obj strings 0 pos)) (the-as vector4w (-> obj sprites 1)) -45 45) + ((method-of-type hud draw) obj) + 0 + (none) + ) + +;; definition for method 16 of type hud-predator +;; WARN: Return type mismatch int vs none. +(defmethod update-values hud-predator ((obj hud-predator)) + (set! (-> obj values 0 target) (the int (-> *game-info* counter))) + ((method-of-type hud update-values) obj) + 0 + (none) + ) + +;; definition for method 17 of type hud-predator +;; WARN: Return type mismatch int vs none. +(defmethod init-callback hud-predator ((obj hud-predator)) + (set! (-> obj level) (level-get *level* 'forest)) + (set! (-> obj gui-id) + (add-process *gui-control* obj (gui-channel hud-middle-right) (gui-action hidden) (-> obj name) 81920.0 0) + ) + (logior! (-> obj flags) (hud-flags show)) + (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x2 :page #xb1d))) + (set! (-> obj sprites 0 flags) (the-as uint 4)) + (set! (-> obj sprites 0 scale-x) 0.6) + (set! (-> obj sprites 0 scale-y) 0.6) + (set! (-> obj sprites 1 tex) (lookup-texture-by-id (new 'static 'texture-id :page #xb1d))) + (set! (-> obj sprites 1 flags) (the-as uint 4)) + (set! (-> obj sprites 1 scale-x) 0.6) + (set! (-> obj sprites 1 scale-y) 0.6) + (alloc-string-if-needed obj 0) + (set! (-> obj strings 0 scale) 0.6) + (set! (-> obj strings 0 flags) (font-flags kerning middle large)) + 0 + (none) + ) + +;; definition for method 15 of type hud-pegasus +;; WARN: Return type mismatch int vs none. +(defmethod draw hud-pegasus ((obj hud-pegasus)) + (set-hud-piece-position! + (the-as hud-sprite (-> obj sprites)) + (the int (+ 472.0 (* 130.0 (-> obj offset)))) + 190 + ) + (set! (-> obj sprites 0 flags) (the-as uint 4)) + (format (clear (-> obj strings 0 text)) "~D" (-> obj values 0 current)) + (set-as-offset-from! (the-as hud-sprite (-> obj strings 0 pos)) (the-as vector4w (-> obj sprites)) -26 35) + ((method-of-type hud draw) obj) + 0 + (none) + ) + +;; definition for method 16 of type hud-pegasus +;; WARN: Return type mismatch int vs none. +(defmethod update-values hud-pegasus ((obj hud-pegasus)) + (set! (-> obj values 0 target) (the int (-> *game-info* counter))) + ((method-of-type hud update-values) obj) + 0 + (none) + ) + +;; definition for method 17 of type hud-pegasus +;; WARN: Return type mismatch int vs none. +(defmethod init-callback hud-pegasus ((obj hud-pegasus)) + (set! (-> obj level) (level-get *level* 'forest)) + (set! (-> obj gui-id) + (add-process *gui-control* obj (gui-channel hud-middle-right) (gui-action hidden) (-> obj name) 81920.0 0) + ) + (logior! (-> obj flags) (hud-flags show)) + (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x1 :page #xb1d))) + (set! (-> obj sprites 0 scale-x) 0.8) + (set! (-> obj sprites 0 scale-y) 0.8) + (set! (-> obj sprites 0 flags) (the-as uint 4)) + (alloc-string-if-needed obj 0) + (set! (-> obj strings 0 scale) 0.6) + (set! (-> obj strings 0 flags) (font-flags kerning middle large)) + 0 + (none) + ) + +;; definition for function point-in-line-region? +;; INFO: Used lq/sq +(defun point-in-line-region? ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 float)) + (let* ((v1-1 (vector-normalize! (vector-! (new-stack-vector0) arg2 arg1) 1.0)) + (s5-1 (vector-! (new-stack-vector0) arg0 arg1)) + (f30-0 (vector-dot v1-1 s5-1)) + (s2-2 (vector-float*! (new-stack-vector0) v1-1 f30-0)) + ) + (if (or (< f30-0 0.0) + (< (vector-vector-distance arg1 arg2) f30-0) + (< arg3 (vector-length (vector-! (new-stack-vector0) s5-1 s2-2))) + ) + (return #f) + ) + ) + #t + ) + +;; definition of type predator-shot +(deftype predator-shot (metalhead-shot) + () + :heap-base #x170 + :method-count-assert 40 + :size-assert #x1f0 + :flag-assert #x28017001f0 + ) + +;; definition for method 3 of type predator-shot +(defmethod inspect predator-shot ((obj predator-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 predator-shot +(defmethod play-impact-sound predator-shot ((obj predator-shot) (arg0 projectile-options)) + (case arg0 + (((projectile-options lose-altitude)) + (sound-play "pred-shot-hit") + ) + (((projectile-options lose-altitude proj-options-2)) + (let ((f0-0 (doppler-pitch-shift (-> obj root-override trans) (-> obj root-override transv))) + (a0-7 (static-sound-spec "pred-shot-loop" :volume 0.0 :mask (pitch reg0))) + ) + (set! (-> a0-7 volume) 1024) + (set! (-> a0-7 pitch-mod) (the int (* 1524.0 f0-0))) + (sound-play-by-spec a0-7 (-> obj sound-id) (-> obj root-override trans)) + ) + ) + ) + ) + +;; definition for method 30 of type predator-shot +;; WARN: Return type mismatch int vs none. +(defmethod init-collision! predator-shot ((obj predator-shot)) + "Init the [[projectile]]'s [[collide-shape]]" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) + (the-as (function control-info collide-query vector vector collide-status) cshape-reaction-just-move) + ) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrate-using) (penetrate jak-yellow-shot)) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec projectile)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate civilian enemy obstacle vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid)) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 2457.6) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec projectile)) + (set! (-> v1-13 prim-core collide-with) + (collide-spec backgnd jak bot crate civilian enemy obstacle vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> v1-13 prim-core action) (collide-action solid deadly)) + (set-vector! (-> v1-13 local-sphere) 0.0 0.0 0.0 819.2) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec projectile)) + (set! (-> v1-15 prim-core collide-with) + (collide-spec jak bot crate civilian enemy vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> v1-15 prim-core action) (collide-action deadly)) + (set-vector! (-> v1-15 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-18 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-18 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-18 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 1)) + (set! (-> s5-0 event-self) 'touched) + (set! (-> obj root-override) s5-0) + ) + (set! (-> obj root-override pat-ignore-mask) + (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noproj #x1 :noendlessfall #x1) + ) + (none) + ) + +;; definition for method 31 of type predator-shot +;; INFO: Used lq/sq +(defmethod init-proj-settings! predator-shot ((obj predator-shot)) + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc + :virtual" + (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) + (set! (-> obj attack-mode) 'predator-shot) + (set! (-> obj max-speed) 532480.0) + (set! (-> obj move) metalhead-shot-move) + (set! (-> obj update-velocity) projectile-update-velocity-space-wars) + (set! (-> obj timeout) (seconds 0.767)) + (set! (-> obj sound-id) (new-sound-id)) + (set-gravity-length (-> obj root-override dynam) 573440.0) + (none) + ) + +;; failed to figure out what this is: +(defskelgroup skel-predator predator predator-lod0-jg predator-idle-ja + ((predator-lod0-mg (meters 20)) (predator-lod1-mg (meters 40)) (predator-lod2-mg (meters 999999))) + :bounds (static-spherem 0 1 0 4) + ) + +;; definition of type predator +(deftype predator (nav-enemy) + ((los los-control :inline :offset-assert 608) + (want-stop symbol :offset-assert 756) + (target-pos vector :inline :offset-assert 768) + (curr-node int32 :offset-assert 784) + (hide-pos vector :inline :offset-assert 800) + (next-change uint64 :offset-assert 816) + (shoot-angle float :offset-assert 824) + (miss-amount float :offset-assert 828) + (ambient-sound-id sound-id :offset-assert 832) + (shock-effect-time time-frame :offset-assert 840) + (shock-effect-end uint64 :offset-assert 848) + (fade float :offset-assert 856) + (dest-fade float :offset-assert 860) + ) + :heap-base #x2e0 + :method-count-assert 189 + :size-assert #x360 + :flag-assert #xbd02e00360 + (:methods + (close-attack () _type_ :state 178) + (fire () _type_ :state 179) + (hide () _type_ :state 180) + (hidden () _type_ :state 181) + (set-dangerous! (_type_ symbol) symbol 182) + (predator-method-183 (_type_) none 183) + (predator-method-184 (_type_ int float) none 184) + (predator-method-185 (_type_) none 185) + (predator-method-186 (_type_) none 186) + (predator-method-187 (_type_) symbol 187) + (predator-method-188 (_type_ vector vector vector) none 188) + ) + ) + +;; definition for method 3 of type predator +(defmethod inspect predator ((obj predator)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tlos: #~%" (-> obj los)) + (format #t "~2Twant-stop: ~A~%" (-> obj want-stop)) + (format #t "~2Ttarget-pos: #~%" (-> obj target-pos)) + (format #t "~2Tcurr-node: ~D~%" (-> obj curr-node)) + (format #t "~2Thide-pos: #~%" (-> obj hide-pos)) + (format #t "~2Tnext-change: ~D~%" (-> obj next-change)) + (format #t "~2Tshoot-angle: ~f~%" (-> obj shoot-angle)) + (format #t "~2Tmiss-amount: ~f~%" (-> obj miss-amount)) + (format #t "~2Tambient-sound-id: ~D~%" (-> obj ambient-sound-id)) + (format #t "~2Tshock-effect-time: ~D~%" (-> obj shock-effect-time)) + (format #t "~2Tshock-effect-end: ~D~%" (-> obj shock-effect-end)) + (format #t "~2Tfade: ~f~%" (-> obj fade)) + (format #t "~2Tdest-fade: ~f~%" (-> obj dest-fade)) + (label cfg-4) + obj + ) + +;; definition for symbol *predator-nav-enemy-info*, type nav-enemy-info +(define *predator-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #f + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010501 #x0 #x0 #x0) + :idle-anim 5 + :notice-anim 5 + :hostile-anim 7 + :hit-anim 5 + :knocked-anim 12 + :knocked-land-anim 13 + :die-anim 11 + :die-falling-anim 11 + :victory-anim 5 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 7 + :look-at-joint 8 + :bullseye-joint 6 + :sound-hit (static-sound-name "predator-hit") + :sound-die (static-sound-name "predator-die") + :notice-distance (meters 150) + :notice-distance-delta (meters 150) + :proximity-notice-distance (meters 4) + :default-hit-points 5 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :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-seek-ry-clamp 2730.6667 + :knocked-soft-vxz-lo 81920.0 + :knocked-soft-vxz-hi 81920.0 + :knocked-soft-vy-lo 69632.0 + :knocked-soft-vy-hi 69632.0 + :knocked-medium-vxz-lo 81920.0 + :knocked-medium-vxz-hi 81920.0 + :knocked-medium-vy-lo 69632.0 + :knocked-medium-vy-hi 69632.0 + :knocked-hard-vxz-lo 81920.0 + :knocked-hard-vxz-hi 81920.0 + :knocked-hard-vy-lo 69632.0 + :knocked-hard-vy-hi 69632.0 + :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 53248.0 + :knocked-yellow-vy-lo 40960.0 + :knocked-yellow-vy-hi 53248.0 + :knocked-red-vxz-lo 102400.0 + :knocked-red-vxz-hi 102400.0 + :knocked-red-vy-lo 81920.0 + :knocked-red-vy-hi 81920.0 + :knocked-blue-vxz-lo 32768.0 + :knocked-blue-vxz-hi 65536.0 + :knocked-blue-vy-lo 32768.0 + :knocked-blue-vy-hi 49152.0 + :shadow-size (meters 1) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 6 + :gem-offset (new 'static 'sphere :y -2252.8 :z -2170.88 :r 163840.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 6 + :turn-anim -1 + :run-anim 7 + :taunt-anim -1 + :run-travel-speed (meters 8) + :run-acceleration (meters 6) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 4) + :walk-acceleration (meters 3) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 40) + :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! (-> *predator-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 74 of type predator +(defmethod enemy-method-74 predator ((obj predator) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (with-pp + (case arg2 + (('attack) + (set! (-> obj shock-effect-end) (the-as uint (+ (-> pp clock frame-counter) (seconds 1)))) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (('death-end) + (when (nonzero? (-> obj ambient-sound-id)) + (sound-stop (-> obj ambient-sound-id)) + (set! (-> obj ambient-sound-id) (new 'static 'sound-id)) + 0 + ) + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +;; definition for method 77 of type predator +(defmethod enemy-method-77 predator ((obj predator) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 18))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 18)) 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 18)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data 14))) + (set! (-> a0-5 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 14)) 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 (-> obj draw art-group data 14)) num-func-seek!) + ) + ) + ) + #t + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let ((v1-32 (get-rand-int obj 2))) + (cond + ((zero? v1-32) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim (-> obj draw art-group data 21))) + (set! (-> a0-10 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 21)) frames num-frames) -1)) + ) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim (-> obj draw art-group data 21)) num-func-seek!) + ) + ) + ((= v1-32 1) + (let ((a0-12 (-> obj skel root-channel 0))) + (set! (-> a0-12 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> a0-12 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> a0-12 param 1) (-> arg0 0)) + (set! (-> a0-12 frame-num) 0.0) + (joint-control-channel-group! a0-12 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + ) + ) + ) + ) + (((knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-15 (-> obj skel root-channel 0))) + (set! (-> a0-15 frame-group) (the-as art-joint-anim (-> obj draw art-group data 18))) + (set! (-> a0-15 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 18)) frames num-frames) -1)) + ) + (set! (-> a0-15 param 1) (-> arg0 0)) + (set! (-> a0-15 frame-num) 0.0) + (joint-control-channel-group! a0-15 (the-as art-joint-anim (-> obj draw art-group data 18)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-17 (-> obj skel root-channel 0))) + (set! (-> a0-17 frame-group) (the-as art-joint-anim (-> obj draw art-group data 12))) + (set! (-> a0-17 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 12)) 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 (-> obj draw art-group data 12)) num-func-seek!) + ) + ) + ) + #t + ) + ) + ) + +;; definition for method 78 of type predator +(defmethod enemy-method-78 predator ((obj predator) (arg0 (pointer float))) + (cond + ((zero? (-> obj hit-points)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 20))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 20)) 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 20)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-5 (-> obj skel root-channel 0))) + (set! (-> a0-5 frame-group) (the-as art-joint-anim (-> obj draw art-group data 15))) + (set! (-> a0-5 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 15)) 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 (-> obj draw art-group data 15)) num-func-seek!) + ) + ) + ) + #t + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-8 (-> obj skel root-channel 0))) + (set! (-> a0-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 23))) + (set! (-> a0-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 23)) frames num-frames) -1)) + ) + (set! (-> a0-8 param 1) (-> arg0 0)) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim (-> obj draw art-group data 23)) num-func-seek!) + ) + ) + (((knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-11 (-> obj skel root-channel 0))) + (set! (-> a0-11 frame-group) (the-as art-joint-anim (-> obj draw art-group data 19))) + (set! (-> a0-11 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 19)) frames num-frames) -1)) + ) + (set! (-> a0-11 param 1) (-> arg0 0)) + (set! (-> a0-11 frame-num) 0.0) + (joint-control-channel-group! a0-11 (the-as art-joint-anim (-> obj draw art-group data 19)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-13 (-> obj skel root-channel 0))) + (set! (-> a0-13 frame-group) (the-as art-joint-anim (-> obj draw art-group data 13))) + (set! (-> a0-13 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 13)) frames num-frames) -1)) + ) + (set! (-> a0-13 param 1) (-> arg0 0)) + (set! (-> a0-13 frame-num) 0.0) + (joint-control-channel-group! a0-13 (the-as art-joint-anim (-> obj draw art-group data 13)) num-func-seek!) + ) + ) + ) + #t + ) + ) + ) + +;; definition for method 188 of type predator +;; INFO: Used lq/sq +;; WARN: Return type mismatch symbol vs none. +(defmethod predator-method-188 predator ((obj predator) (arg0 vector) (arg1 vector) (arg2 vector)) + (let ((s5-0 (new 'stack-no-clear 'collide-query))) + (let ((f0-0 1228.8) + (f30-0 6144.0) + ) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (vector-! (-> s5-0 move-dist) arg1 arg0) + (let ((v1-4 s5-0)) + (set! (-> v1-4 radius) f0-0) + (set! (-> v1-4 collide-with) (collide-spec backgnd)) + (set! (-> v1-4 ignore-process0) obj) + (set! (-> v1-4 ignore-process1) (handle->process (-> obj focus handle))) + (set! (-> v1-4 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-4 action-mask) (collide-action solid)) + ) + (let ((f0-1 (fill-and-probe-using-line-sphere *collide-cache* s5-0))) + (cond + ((>= f0-1 0.0) + (vector-float*! (-> s5-0 move-dist) (-> s5-0 move-dist) f0-1) + (cond + ((< (vector-dot + (-> s5-0 best-other-tri normal) + (vector-! (new 'stack-no-clear 'vector) arg2 (the-as vector (-> s5-0 best-other-tri))) + ) + 0.0 + ) + ) + (else + ) + ) + ) + (else + (vector-! (-> s5-0 move-dist) arg1 arg0) + ) + ) + ) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (let ((v1-14 s5-0)) + (set! (-> v1-14 radius) f30-0) + (set! (-> v1-14 collide-with) (collide-spec enemy hit-by-player-list hit-by-others-list)) + (set! (-> v1-14 ignore-process0) obj) + (set! (-> v1-14 ignore-process1) (handle->process (-> obj focus handle))) + (set! (-> v1-14 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-14 action-mask) (collide-action solid)) + ) + ) + (cond + ((< (fill-and-probe-using-line-sphere *collide-cache* s5-0) 0.0) + #t + ) + (else + (let ((s4-1 (-> s5-0 best-other-tri collide-ptr))) + (when (and (if (type? s4-1 collide-shape-prim) + s4-1 + ) + (< (vector-dot + (-> s5-0 best-other-tri normal) + (vector-! (new 'stack-no-clear 'vector) arg2 (the-as vector (-> s5-0 best-other-tri))) + ) + 0.0 + ) + ) + ) + ) + ) + ) + ) + (none) + ) + +;; definition for method 184 of type predator +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod predator-method-184 predator ((obj predator) (arg0 int) (arg1 float)) + (local-vars (sv-224 vector) (sv-240 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((a1-1 (-> obj node-list data arg0)) + (s5-0 (new 'stack-no-clear 'projectile-init-by-other-params)) + ) + (set! (-> s5-0 ent) (-> obj entity)) + (set! (-> s5-0 charge) 1.0) + (set! (-> s5-0 options) (projectile-options)) + (set! (-> s5-0 notify-handle) (process->handle obj)) + (set! (-> s5-0 owner-handle) (the-as handle #f)) + (set! (-> s5-0 ignore-handle) (process->handle obj)) + (let* ((v1-10 *game-info*) + (a0-11 (+ (-> v1-10 attack-id) 1)) + ) + (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)) + (vector<-cspace! (-> s5-0 pos) a1-1) + (let ((s2-0 (handle->process (-> obj focus handle))) + (s3-0 (new 'stack-no-clear 'vector)) + ) + (when s2-0 + (seek! + (-> obj miss-amount) + (* 0.5 (vector-length (-> (the-as process-focusable s2-0) root-override transv))) + 4096.0 + ) + (set! (-> s3-0 quad) (-> (get-trans (the-as process-focusable s2-0) 3) quad)) + (set! sv-224 (new 'stack-no-clear 'vector)) + (let ((v1-24 (-> s5-0 pos)) + (a0-18 s3-0) + ) + (.lvf vf4 (&-> v1-24 quad)) + (.lvf vf5 (&-> a0-18 quad)) + ) + (.mov.vf vf6 vf0 :mask #b1000) + (.sub.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> sv-224 quad) vf6) + (let* ((f0-5 (vector-length sv-224)) + (f0-6 (* 0.0000018780048 f0-5)) + ) + (set! sv-240 (new 'stack-no-clear 'vector)) + (let ((s0-0 (new 'stack-no-clear 'vector)) + (s1-1 (new 'stack-no-clear 'vector)) + ) + (let ((a0-19 s3-0)) + (let ((v1-30 s3-0)) + (let ((a1-6 (-> (the-as process-focusable s2-0) root-override transv))) + (let ((a2-2 f0-6)) + (.mov vf7 a2-2) + ) + (.lvf vf5 (&-> a1-6 quad)) + ) + (.lvf vf4 (&-> v1-30 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-19 quad) vf6) + ) + (vector-normalize! sv-224 1.0) + (vector-flatten! sv-240 *up-vector* sv-224) + (vector-normalize! sv-240 1.0) + (vector-cross! s0-0 sv-224 sv-240) + (vector-normalize! s0-0 1.0) + (let ((a2-5 (quaternion-vector-angle! (new 'stack-no-clear 'quaternion) sv-224 (-> obj shoot-angle)))) + (vector-orient-by-quat! sv-240 sv-240 a2-5) + ) + (let* ((t9-9 quaternion-vector-angle!) + (a0-27 (new 'stack-no-clear 'quaternion)) + (a2-6 (-> obj shoot-angle)) + (a2-7 (t9-9 a0-27 sv-224 a2-6)) + ) + (vector-orient-by-quat! s0-0 s0-0 a2-7) + ) + (let ((a0-29 s1-1)) + (let ((v1-32 s3-0)) + (let ((a1-17 (-> obj miss-amount))) + (.mov vf7 a1-17) + ) + (.lvf vf5 (&-> sv-240 quad)) + (.lvf vf4 (&-> v1-32 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-29 quad) vf6) + ) + (let ((v1-33 s3-0)) + (let ((a0-30 (* arg1 (-> obj miss-amount)))) + (.mov vf7 a0-30) + ) + (.lvf vf5 (&-> s0-0 quad)) + (.lvf vf4 (&-> s1-1 quad)) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> v1-33 quad) vf6) + ) + ) + ) + (vector-! (-> s5-0 vel) s3-0 (-> s5-0 pos)) + (vector-normalize! (-> s5-0 vel) 409600.0) + (vector-normalize! (-> s5-0 vel) 532480.0) + (spawn-projectile predator-shot s5-0 obj *default-dead-pool*) + ) + ) + ) + 0 + (none) + ) + ) + +;; failed to figure out what this is: +(set! (-> *lightning-spec-id-table* 18) (new 'static 'lightning-spec + :name "lightning-predator-shock-skel" + :flags (lightning-spec-flags lsf0) + :rand-func #x2 + :start-color (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80) + :end-color (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80) + :fade-to-color (new 'static 'rgba :r #xbf :b #x8f :a #x5) + :fade-start-factor 0.2 + :fade-time 120.0 + :texture (new 'static 'texture-id :index #x83 :page #xc) + :reduction 0.8 + :num-points 32 + :box-size 2048.0 + :merge-factor 0.8 + :merge-count 2 + :radius 2048.0 + :duration 30.0 + :sound (static-sound-spec "predator-zap") + ) + ) + +;; definition for method 183 of type predator +;; WARN: Return type mismatch int vs none. +(defmethod predator-method-183 predator ((obj predator)) + (with-pp + (cond + ((< (-> obj hit-points) 2) + (when (!= (-> obj dest-fade) 128.0) + (sound-play "pred-uncloak") + (stop! (-> obj sound)) + (set! (-> obj sound) (the-as ambient-sound 0)) + 0 + ) + (set! (-> obj dest-fade) 128.0) + ) + (else + (set! (-> obj dest-fade) 0.0) + ) + ) + (seek! (-> obj fade) (-> obj dest-fade) (* 60.0 (-> pp clock seconds-per-frame))) + (set! (-> obj draw force-fade) (the-as uint (the int (-> obj fade)))) + (cond + ((zero? (-> obj draw force-fade)) + (setup-masks (-> obj draw) 8 0) + (setup-masks (-> obj draw) 0 4) + (logclear! (-> obj draw status) (draw-control-status force-fade warp-cross-fade)) + ) + ((= (-> obj draw force-fade) 128) + (setup-masks (-> obj draw) 0 8) + (setup-masks (-> obj draw) 4 0) + (logclear! (-> obj draw status) (draw-control-status force-fade warp-cross-fade)) + ) + (else + (setup-masks (-> obj draw) 8 0) + (setup-masks (-> obj draw) 4 0) + (logior! (-> obj draw status) (draw-control-status force-fade warp-cross-fade)) + ) + ) + (if (< 245760.0 (vector-vector-distance (-> obj root-override2 trans) (camera-pos))) + (setup-masks (-> obj draw) 0 8) + ) + (when (< (-> pp clock frame-counter) (the-as time-frame (-> obj shock-effect-end))) + (when (>= (- (-> pp clock frame-counter) (-> obj shock-effect-time)) (seconds 0.04)) + (set! (-> obj shock-effect-time) (-> pp clock frame-counter)) + (process-drawable-shock-skel-effect + obj + (-> *lightning-spec-id-table* 18) + lightning-probe-callback + (-> *part-id-table* 166) + 2048.0 + -1 + -1 + ) + ) + ) + 0 + (none) + ) + ) + +;; failed to figure out what this is: +(defstate active (predator) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! predator-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-idle-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (the-as (function none :behavior predator) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate notice (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (go-virtual hostile) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate idle (predator) + :virtual #t + :post (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy idle) post))) + (if t9-0 + ((the-as (function none) t9-0)) + ) + ) + (predator-method-183 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate fire (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-2 *game-info*) + (v0-0 (+ (-> v1-2 attack-id) 1)) + ) + (set! (-> v1-2 attack-id) v0-0) + (set! (-> self attack-id) v0-0) + ) + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (if (not (handle->process (-> self focus handle))) + (go-virtual active) + ) + (none) + ) + :code (behavior () + (until #f + 1.0 + (let ((gp-0 0)) + (set! (-> self shoot-angle) (* 182.04445 (rand-vu-float-range -45.0 45.0))) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! predator-shoot-guns0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-shoot-guns0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and (< 9.0 (ja-frame-num 0)) (zero? gp-0)) + (set! gp-0 1) + (predator-method-184 self 12 1.0) + ) + (when (and (< 11.0 (ja-frame-num 0)) (= gp-0 1)) + (set! gp-0 2) + (predator-method-184 self 16 -1.0) + ) + (let ((s5-0 (handle->process (-> self focus handle)))) + (when s5-0 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable s5-0) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + (if (< (vector-vector-distance (-> self root-override2 trans) (get-trans (the-as process-focusable s5-0) 0)) + 24576.0 + ) + (go-virtual close-attack) + ) + ) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (b! #t cfg-26 :delay (nop!)) + ) + (the-as none #f) + (label cfg-26) + (go-virtual hide) + (none) + ) + :post (the-as (function none :behavior predator) enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate close-attack (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (set-dangerous! self #t) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-6 *game-info*) + (a0-3 (+ (-> v1-6 attack-id) 1)) + ) + (set! (-> v1-6 attack-id) a0-3) + (set! (-> self attack-id) a0-3) + ) + (let ((v1-7 (-> self nav))) + (set! (-> v1-7 target-speed) 0.0) + ) + 0 + (none) + ) + :exit (behavior () + (set-dangerous! self #f) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! predator-close-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-close-attack-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((v1-25 (-> self nav state))) + (set! (-> v1-25 speed) 0.0) + ) + 0 + (ja-no-eval :group! predator-close-attack-recover-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-close-attack-recover-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (if (zero? (get-rand-int self 3)) + (sound-play "pred-talk") + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior predator) nav-enemy-chase-post) + ) + +;; failed to figure out what this is: +(defstate hidden (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (set! (-> self next-change) + (the-as uint (+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 2.0 5.0))))) + ) + (none) + ) + :trans (behavior () + (predator-method-186 self) + (let ((a0-1 (-> self nav state)) + (v1-3 (-> self hide-pos)) + ) + (logclear! (-> a0-1 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-1 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-1 target-post quad) (-> v1-3 quad)) + ) + 0 + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-virtual active) + ) + (when gp-0 + (if (< (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + 49152.0 + ) + (go-virtual hostile) + ) + ) + ) + (if (< (the-as time-frame (-> self next-change)) (-> self clock frame-counter)) + (go-virtual hide) + ) + (none) + ) + :code (behavior () + (until #f + (ja-channel-push! 1 (seconds 0.2)) + (until (logtest? (-> self nav state flags) (nav-state-flag at-target)) + (ja-no-eval :group! predator-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-run0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (ja-channel-push! 1 (seconds 0.2)) + (until (not (logtest? (-> self nav state flags) (nav-state-flag at-target))) + (ja-no-eval :group! predator-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-idle-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hide (predator) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior predator) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (nav-enemy-method-166 self) + (let ((v1-4 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-4 enemy-flags))) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-4 enemy-flags)))) + ) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-4 enemy-flags)))) + (set! (-> v1-4 nav callback-info) (-> v1-4 enemy-info-override callback-info)) + ) + 0 + (predator-method-187 self) + (set! (-> self next-change) (the-as uint 0)) + 0 + (none) + ) + :trans (behavior () + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-virtual active) + ) + (when gp-0 + (if (< (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + 65536.0 + ) + (go-virtual hostile) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (check-los? (-> self los) 0) + (zero? (logand (-> self draw status) (draw-control-status on-screen))) + ) + (go-virtual fire) + ) + ) + ) + (predator-method-186 self) + (let ((a0-12 (-> self nav state)) + (v1-30 (-> self hide-pos)) + ) + (logclear! (-> a0-12 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-12 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-12 target-post quad) (-> v1-30 quad)) + ) + 0 + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (logtest? (-> self nav state flags) (nav-state-flag at-target)) + ) + (go-virtual hidden) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! predator-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-run0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (predator) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self want-stop) #f) + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self next-change) + (the-as uint (+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 4.0 8.0))))) + ) + (if (zero? (get-rand-int self 3)) + (sound-play "pred-talk") + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 5)) + (go-virtual hide) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-virtual active) + ) + (when (enemy-method-107 self) + (when (and gp-0 + (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + ) + (let ((f0-0 + (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + ) + ) + (cond + ((< f0-0 16384.0) + (go-virtual close-attack) + ) + ((< 57344.0 f0-0) + (go-virtual hide) + ) + ) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! predator-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-run0-ja) frames num-frames) -1))) + :frame-num 6.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (until #f + (ja-no-eval :group! predator-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim predator-run0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + ) + +;; definition for method 186 of type predator +;; INFO: Used lq/sq +;; WARN: Return type mismatch symbol vs none. +(defmethod predator-method-186 predator ((obj predator)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((f30-0 0.0) + (s5-0 -1) + (s4-0 (-> *predator-graph* node (-> obj curr-node))) + ) + (dotimes (s3-0 32) + (when (logtest? (the-as int (-> s4-0 points)) (ash 1 s3-0)) + (let ((s1-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + ) + (vector-rotate-around-y! s1-0 *x-vector* (* 182.04445 (* 11.25 (the float s3-0)))) + (let ((a0-6 s2-0)) + (let ((v1-7 (-> s4-0 position))) + (let ((a1-3 (-> s4-0 radius))) + (.mov vf7 a1-3) + ) + (.lvf vf5 (&-> s1-0 quad)) + (.lvf vf4 (&-> v1-7 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-6 quad) vf6) + ) + (let ((f0-3 (vector-vector-distance (target-pos 0) s2-0))) + (when (or (= s5-0 -1) (< f30-0 f0-3)) + (set! s5-0 s3-0) + (set! f30-0 f0-3) + (set! (-> obj hide-pos quad) (-> s2-0 quad)) + ) + ) + ) + ) + ) + ) + (none) + ) + ) + +;; definition for method 185 of type predator +(defmethod predator-method-185 predator ((obj predator)) + (let ((f30-0 0.0) + (s5-0 -1) + ) + -1 + (dotimes (s4-0 (the-as int (-> *predator-graph* node-count))) + (let* ((s3-0 (-> *predator-graph* node s4-0)) + (f0-0 (vector-vector-distance (-> s3-0 position) (-> obj root-override2 trans))) + ) + (when (and (not (logtest? (-> s3-0 flags) (predator-node-flag taken))) (or (= s5-0 -1) (< f0-0 f30-0))) + (set! f30-0 f0-0) + (set! s5-0 s4-0) + ) + ) + ) + (set! (-> obj curr-node) s5-0) + (logior! (-> *predator-graph* node s5-0 flags) (predator-node-flag taken)) + ) + (predator-method-186 obj) + (none) + ) + +;; definition for method 187 of type predator +(defmethod predator-method-187 predator ((obj predator)) + (let* ((s5-0 (-> *predator-graph* node (-> obj curr-node))) + (s4-0 (rand-vu-int-count (-> s5-0 edge-count))) + ) + (dotimes (s3-0 (-> s5-0 edge-count)) + (let* ((s2-0 + (-> (the-as (pointer uint16) (+ (* (+ (-> s5-0 edge-index) (mod (+ s3-0 s4-0) (-> s5-0 edge-count))) 16) + (the-as int (-> *predator-graph* edge)) + ) + ) + ) + ) + (s1-0 (-> *predator-graph* node s2-0)) + ) + (when (and (not (point-in-line-region? (target-pos 0) (-> s5-0 position) (-> s1-0 position) 61440.0)) + (zero? (logand (-> s1-0 flags) (predator-node-flag taken))) + ) + (logior! (-> s1-0 flags) (predator-node-flag taken)) + (logclear! (-> s5-0 flags) (predator-node-flag taken)) + (set! (-> obj curr-node) (the-as int s2-0)) + (return #t) + ) + ) + ) + ) + #f + ) + +;; definition for method 55 of type predator +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-55 predator ((obj predator)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-55))) + (t9-0 obj) + ) + (predator-method-183 obj) + (los-control-method-9 (-> obj los) (the-as process-focusable #f) (the-as vector #f) 2048.0) + (when (nonzero? (-> obj sound)) + (update-trans! (-> obj sound) (-> obj root-override2 trans)) + (update! (-> obj sound)) + ) + (none) + ) + +;; definition for method 182 of type predator +(defmethod set-dangerous! predator ((obj predator) (arg0 symbol)) + (let ((v1-1 (-> obj root-override2 root-prim))) + (dotimes (a0-1 (the-as int (-> v1-1 specific 0))) + (let ((a2-1 (-> (the-as collide-shape-prim-group v1-1) child a0-1))) + (if arg0 + (logior! (-> a2-1 prim-core action) (collide-action deadly)) + (logclear! (-> a2-1 prim-core action) (collide-action deadly)) + ) + ) + ) + ) + #f + ) + +;; definition for method 114 of type predator +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 predator ((obj predator)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 5) 0))) + (set! (-> s5-0 total-prims) (the-as uint 6)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 11264.0 0.0 17203.2) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 5120.0 0.0 5120.0) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 transform-index) 16) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 transform-index) 12) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-19 local-sphere) 0.0 9216.0 0.0 5120.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-with) (collide-spec backgnd obstacle hit-by-others-list)) + (set! (-> v1-21 prim-core action) (collide-action solid)) + (set-vector! (-> v1-21 local-sphere) 0.0 12288.0 0.0 12288.0) + ) + (set! (-> s5-0 nav-radius) 6144.0) + (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 predator +;; WARN: Return type mismatch process-focusable vs predator. +(defmethod relocate predator ((obj predator) (arg0 int)) + (the-as + predator + ((the-as (function process-focusable int process-focusable) (find-parent-method predator 7)) obj arg0) + ) + ) + +;; definition for method 167 of type predator +;; WARN: Return type mismatch int vs none. +(defmethod nav-enemy-method-167 predator ((obj predator)) + (let ((v1-0 (-> obj nav))) + (set! (-> v1-0 target-speed) 0.0) + ) + 0 + (let ((v1-2 (-> obj nav))) + (set! (-> v1-2 acceleration) (-> obj enemy-info-override walk-acceleration)) + ) + 0 + 0 + (none) + ) + +;; definition for method 12 of type predator +(defmethod run-logic? predator ((obj predator)) + #t + ) + +;; definition for method 63 of type predator +;; WARN: Return type mismatch none vs symbol. +(defmethod enemy-method-63 predator ((obj predator) (arg0 process-focusable) (arg1 symbol)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-63))) + (the-as symbol (if (t9-0 obj arg0 arg1) + (set-dst-proc! (-> obj los) (-> obj focus handle)) + ) + ) + ) + ) + +;; definition for method 11 of type predator +;; WARN: Return type mismatch entity-perm-status vs none. +(defmethod init-from-entity! predator ((obj predator) (arg0 entity-actor)) + (process-entity-status! obj (entity-perm-status dead) #t) + (none) + ) + +;; definition for method 113 of type predator +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-113 predator ((obj predator) (arg0 nav-enemy-info)) + (set! (-> arg0 nav-mesh) *default-nav-mesh*) + (let ((t9-0 (method-of-type nav-enemy enemy-method-113))) + (t9-0 obj arg0) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + 0 + (none) + ) + +;; definition for method 115 of type predator +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 predator ((obj predator)) + "@abstract" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-predator" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *predator-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 327680.0) + (add-connection *part-engine* obj 8 obj 318 (new 'static 'vector :x 1228.8 :y 450.56 :z 983.04 :w 614400.0)) + (add-connection *part-engine* obj 8 obj 318 (new 'static 'vector :x -1228.8 :y 450.56 :z 983.04 :w 614400.0)) + (new-source! (-> obj los) obj (seconds 0.2) (collide-spec backgnd enemy obstacle)) + (setup-masks (-> obj draw) 8 0) + (setup-masks (-> obj draw) 4 0) + (logior! (-> obj draw status) (draw-control-status force-fade warp-cross-fade)) + (set! (-> obj draw force-fade) (the-as uint 0)) + (set! (-> obj fade) 0.0) + (set! (-> obj dest-fade) 0.0) + (set! (-> obj curr-node) -1) + (set! (-> obj next-change) (the-as uint 0)) + (set! (-> obj miss-amount) 16384.0) + (set! (-> obj ambient-sound-id) (new 'static 'sound-id)) + (predator-method-185 obj) + (set! (-> obj sound) (new + 'process + 'ambient-sound + (static-sound-spec "pred-hum" :fo-min 2 :fo-max 30) + (-> obj root-override2 trans) + ) + ) + (set! (-> obj enemy-flags) (logior (enemy-flag trackable-backup enable-on-hostile) (-> obj enemy-flags))) + (minimap-method-12 *minimap* obj (the-as uint 16) (the-as int #f) (the-as vector #t) 0) + 0 + (none) + ) + +;; definition of type predator-manager +(deftype predator-manager (process) + ((predator-count uint32 :offset-assert 128) + (predator-h handle 32 :offset-assert 136) + (hud-counter handle :offset-assert 392) + (actor-group (pointer actor-group) :offset-assert 400) + (actor-group-count int32 :offset-assert 404) + ) + :heap-base #x120 + :method-count-assert 17 + :size-assert #x198 + :flag-assert #x1101200198 + (:methods + (idle () _type_ :state 14) + (closed () _type_ :state 15) + (predator-manager-method-16 (_type_) none 16) + ) + ) + +;; definition for method 3 of type predator-manager +(defmethod inspect predator-manager ((obj predator-manager)) + (when (not obj) + (set! obj obj) + (goto cfg-7) + ) + (let ((t9-0 (method-of-type process inspect))) + (t9-0 obj) + ) + (format #t "~2Tpredator-count: ~D~%" (-> obj predator-count)) + (format #t "~2Tpredator-h[32] @ #x~X~%" (-> obj predator-h)) + (format #t "~2Thud-counter: ~D~%" (-> obj hud-counter)) + (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)) + (label cfg-7) + obj + ) + +;; definition for symbol *predator-manager*, type predator-manager +(define *predator-manager* (the-as predator-manager #f)) + +;; definition for method 7 of type predator-manager +;; WARN: Return type mismatch process vs predator-manager. +(defmethod relocate predator-manager ((obj predator-manager) (arg0 int)) + (set! *predator-manager* obj) + (if *predator-manager* + (set! *predator-manager* (&+ *predator-manager* arg0)) + ) + (the-as predator-manager ((method-of-type process relocate) obj arg0)) + ) + +;; definition for method 16 of type predator-manager +;; WARN: Return type mismatch int vs none. +(defmethod predator-manager-method-16 predator-manager ((obj predator-manager)) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate idle (predator-manager) + :virtual #t + :enter (behavior () + (set! (-> self hud-counter) (ppointer->handle (process-spawn hud-predator :init hud-init-by-other :to self))) + (none) + ) + :exit (behavior () + (when (-> self hud-counter) + (send-event (handle->process (-> self hud-counter)) 'hide-and-die) + (set! (-> self hud-counter) (the-as handle #f)) + ) + (none) + ) + :trans (behavior () + (predator-manager-method-16 self) + (let ((gp-0 0)) + (dotimes (v1-2 (the-as int (-> self predator-count))) + (if (handle->process (-> self predator-h v1-2)) + (+! gp-0 1) + ) + ) + (dotimes (s5-0 (length (-> self actor-group 0))) + (if (not (logtest? (-> self actor-group 0 data s5-0 actor extra perm status) (entity-perm-status dead))) + (+! gp-0 1) + ) + ) + (set! (-> *game-info* counter) (the float gp-0)) + (when (zero? gp-0) + (task-node-close! (game-task-node forest-hunt-resolution)) + (when (-> self hud-counter) + (send-event (handle->process (-> self hud-counter)) 'hide-and-die) + (set! (-> self hud-counter) (the-as handle #f)) + (talker-spawn-func (-> *talker-speech* 89) *entity-pool* (target-pos 0) (the-as region #f)) + ) + ) + ) + (none) + ) + :code (the-as (function none :behavior predator-manager) sleep-code) + ) + +;; failed to figure out what this is: +(defstate closed (predator-manager) + :virtual #t + :code (the-as (function none :behavior predator-manager) sleep-code) + ) + +;; definition for method 11 of type predator-manager +;; INFO: Used lq/sq +;; WARN: Return type mismatch object vs none. +;; WARN: new jak 2 until loop case, check carefully +(defmethod init-from-entity! predator-manager ((obj predator-manager) (arg0 entity-actor)) + (local-vars (sv-16 res-tag)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (cond + ((task-node-closed? (game-task-node forest-hunt-resolution)) + (go (method-of-object obj closed)) + ) + (else + (dotimes (v1-2 (the-as int (-> *predator-graph* node-count))) + (let ((a0-4 (-> *predator-graph* node v1-2))) + (logior! (-> a0-4 flags) (predator-node-flag spawnable)) + (logclear! (-> a0-4 flags) (predator-node-flag taken)) + ) + ) + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-6 (res-lump-data (-> obj entity) 'actor-groups pointer :tag-ptr (& sv-16)))) + (cond + ((and v1-6 (nonzero? (-> sv-16 elt-count))) + (set! (-> obj actor-group) (the-as (pointer actor-group) v1-6)) + (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) + (go process-drawable-art-error "actor-group predator-manager") + ) + ) + ) + (dotimes (s5-0 (length (-> obj actor-group 0))) + (let ((t0-1 (-> obj actor-group 0 data s5-0 actor))) + (if t0-1 + (minimap-method-12 *minimap* obj (the-as uint 16) (the-as int #f) (the-as vector t0-1) 0) + ) + ) + ) + (dotimes (s5-1 (the-as int (-> *predator-graph* node-count))) + (let ((s4-0 (-> *predator-graph* node s5-1))) + (when (logtest? (-> s4-0 flags) (predator-node-flag spawnable)) + (dotimes (s3-0 (the-as int (-> *predator-graph* node-count))) + (let ((s2-0 (-> *predator-graph* node s3-0))) + (when (and (!= s5-1 s3-0) (logtest? (-> s2-0 flags) (predator-node-flag spawnable))) + (if (< (vector-vector-distance (-> s4-0 position) (-> s2-0 position)) 180224.0) + (logclear! (-> s2-0 flags) (predator-node-flag spawnable)) + ) + ) + ) + ) + ) + ) + ) + (let ((s5-2 0)) + (dotimes (s4-1 (the-as int (-> *predator-graph* node-count))) + (let ((s3-1 (-> *predator-graph* node s4-1))) + (when (logtest? (-> s3-1 flags) (predator-node-flag spawnable)) + (let ((s2-1 (new 'stack-no-clear 'transformq))) + (new 'stack-no-clear 'vector) + (let ((s0-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + ) + (let ((v1-52 0)) + (until #f + (when (logtest? (-> s3-1 points) (ash 1 v1-52)) + (vector-rotate-around-y! s0-0 *x-vector* (* 182.04445 (* 11.25 (the float v1-52)))) + (let ((a0-29 s1-0)) + (let ((v1-53 (-> s3-1 position))) + (let ((a1-17 (-> s3-1 radius))) + (.mov vf7 a1-17) + ) + (.lvf vf5 (&-> s0-0 quad)) + (.lvf vf4 (&-> v1-53 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a0-29 quad) vf6) + ) + (goto cfg-40) + ) + (+! v1-52 1) + ) + ) + #f + (label cfg-40) + (set! (-> s2-1 trans quad) (-> s1-0 quad)) + ) + (quaternion-copy! (-> s2-1 quat) *unity-quaternion*) + (set! (-> s2-1 scale x) (the-as float (-> obj actor-group 1 data s5-2 actor))) + (set! (-> s2-1 scale y) (the-as float #f)) + (set! (-> s2-1 scale z) (the-as float #f)) + (let* ((s1-2 (ppointer->process (process-spawn predator :init enemy-init-by-other obj s2-1 :to obj))) + (s2-2 (if (type? s1-2 process-focusable) + s1-2 + ) + ) + (s3-2 (entity-nav-mesh-by-aid (the-as actor-id (-> s3-1 nav-mesh-id)))) + (v1-66 (if (type? s3-2 entity-nav-mesh) + s3-2 + ) + ) + ) + (set! (-> obj predator-h (-> obj predator-count)) (process->handle (the-as process s2-2))) + (+! (-> obj predator-count) 1) + (when v1-66 + (change-to (-> v1-66 nav-mesh) (the-as process-drawable s2-2)) + (let ((v1-70 (-> (the-as process-drawable s2-2) nav state))) + (set! (-> v1-70 current-poly) (the-as nav-poly #f)) + ) + 0 + ) + ) + ) + (+! s5-2 1) + ) + ) + ) + ) + (go (method-of-object obj idle)) + ) + ) + (none) + ) + ) diff --git a/test/decompiler/reference/jak2/levels/mars_tomb/monster-frog_REF.gc b/test/decompiler/reference/jak2/levels/mars_tomb/monster-frog_REF.gc new file mode 100644 index 0000000000..1507f75608 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/mars_tomb/monster-frog_REF.gc @@ -0,0 +1,1060 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defskelgroup skel-monster-frog monster-frog monster-frog-lod0-jg monster-frog-idle0-ja + ((monster-frog-lod0-mg (meters 20)) (monster-frog-lod1-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5) + :shadow monster-frog-shadow-mg + :origin-joint-index 12 + ) + +;; definition of type monster-frog +(deftype monster-frog (nav-enemy) + () + :heap-base #x1e0 + :method-count-assert 181 + :size-assert #x25c + :flag-assert #xb501e0025c + (:methods + (attack (vector) _type_ :state 178) + (attack-recover () _type_ :state 179) + (turn () _type_ :state 180) + ) + ) + +;; definition for method 3 of type monster-frog +(defmethod inspect monster-frog ((obj monster-frog)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition for symbol *monster-frog-nav-enemy-info*, type nav-enemy-info +(define *monster-frog-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #f + :use-victory #f + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 8 #x1e0002 #x3020401 #x1e0002 #x2010501 #x0 #x0 #x0 #x0) + :idle-anim 4 + :notice-anim 8 + :hostile-anim 18 + :hit-anim 30 + :knocked-anim 30 + :knocked-land-anim 31 + :die-anim 4 + :die-falling-anim 4 + :victory-anim -1 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :sound-hit (static-sound-name "monster-frog-hi") + :sound-die (static-sound-name "monster-frog-di") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 40) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #x11fffdffa + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :recover-gnd-collide-with (collide-spec backgnd crate obstacle hit-by-others-list pusher) + :jump-height-min (meters 2.87) + :jump-height-factor 0.1 + :knocked-seek-ry-clamp 4551.1113 + :knocked-soft-vxz-lo 75776.0 + :knocked-soft-vxz-hi 75776.0 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 81920.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 79872.0 + :knocked-hard-vxz-hi 79872.0 + :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 75776.0 + :knocked-yellow-vxz-hi 75776.0 + :knocked-yellow-vy-lo 81920.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 73728.0 + :knocked-red-vxz-hi 73728.0 + :knocked-red-vy-lo 96256.0 + :knocked-red-vy-hi 96256.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint -1 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #t + :use-pacing #t + :walk-anim 16 + :turn-anim 16 + :run-anim 18 + :taunt-anim -1 + :run-travel-speed (meters 18) + :run-acceleration (meters 10) + :run-turning-acceleration (meters 80) + :walk-travel-speed (meters 11.44) + :walk-acceleration (meters 5) + :walk-turning-acceleration (meters 20) + :maximum-rotation-rate (degrees 360.0) + :notice-nav-radius (meters 1.5) + :frustration-distance (meters 8) + :frustration-time (seconds 4) + :blocked-time (seconds 0.3) + :circle-dist-lo 20480.0 + :circle-dist-hi 61440.0 + :nav-mesh #f + ) + ) + +;; failed to figure out what this is: +(set! (-> *monster-frog-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for function monster-frog-hop-slow-code +;; WARN: new jak 2 until loop case, check carefully +(defbehavior monster-frog-hop-slow-code monster-frog () + (until #f + (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 + (dotimes (gp-0 (get-rand-int-range self 2 3)) + (cond + ((zero? (get-rand-int self 4)) + (let ((v1-7 (ja-group))) + (if (not (and v1-7 (= v1-7 monster-frog-idle0-ja))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (ja-no-eval :group! monster-frog-idle0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-idle0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (let ((v1-38 (ja-group))) + (if (not (and v1-38 (= v1-38 monster-frog-idle1-ja))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (ja-no-eval :group! monster-frog-idle1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-idle1-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + ) + (let ((v1-71 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-71 enemy-flags))) + (set! (-> v1-71 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-71 enemy-flags)))) + ) + (set! (-> v1-71 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-71 enemy-flags)))) + (set! (-> v1-71 nav callback-info) (-> v1-71 enemy-info-override callback-info)) + ) + 0 + (ja-channel-push! 1 (seconds 0.035)) + (let ((v1-74 self)) + (set! (-> v1-74 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-74 enemy-flags)))) + ) + 0 + (nav-enemy-method-165 self) + (let ((v1-78 (-> self nav))) + (set! (-> v1-78 target-speed) (* 1.4 (-> self enemy-info-override walk-travel-speed))) + ) + 0 + (let ((v1-80 self)) + (set! (-> v1-80 enemy-flags) (the-as enemy-flag (logclear (-> v1-80 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (ja-no-eval :group! monster-frog-hop-slow-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-start-ja) frames num-frames) -1)) 1.4) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 1.4)) + ) + (nav-enemy-method-167 self) + (ja-no-eval :group! monster-frog-hop-slow-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-end-ja) frames num-frames) -1)) 1.4) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 1.4)) + ) + ) + #f + ) + +;; definition for function monster-frog-hop-fast-code +;; WARN: new jak 2 until loop case, check carefully +(defbehavior monster-frog-hop-fast-code monster-frog () + (until #f + (nav-enemy-method-166 self) + (ja-no-eval :group! monster-frog-hop-slow-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-start-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (nav-enemy-method-167 self) + (ja-no-eval :group! monster-frog-hop-slow-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-end-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + ) + +;; failed to figure out what this is: +(defstate ambush (monster-frog) + :virtual #t + :enter (behavior () + (when (logtest? (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (logclear! (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (let ((gp-0 (-> self on-notice))) + (if gp-0 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (-> self root-override2 trans)) + (the-as pair gp-0) + ) + ) + ) + ) + (let ((v1-12 (-> self root-override2 root-prim))) + (set! (-> v1-12 prim-core collide-as) (collide-spec)) + (set! (-> v1-12 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (none) + ) + :code (behavior () + (enemy-method-129 self) + (let ((a0-2 (handle->process (-> self focus handle)))) + (when a0-2 + (let* ((gp-0 (-> self root-override2)) + (s3-0 + (vector-normalize! + (vector-! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable a0-2) 0) (-> gp-0 trans)) + 1.0 + ) + ) + (f0-0 (deg-diff (quaternion-y-angle (-> gp-0 quat)) (vector-y-angle s3-0))) + ) + (quaternion-rotate-y! (-> gp-0 quat) (-> gp-0 quat) f0-0) + ) + ) + ) + (logclear! (-> self draw status) (draw-control-status no-draw)) + (ja-no-eval :group! monster-frog-popup0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-popup0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((v1-37 (-> self root-override2 root-prim))) + (set! (-> v1-37 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-37 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior monster-frog) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate notice (monster-frog) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (new 'stack-no-clear 'vector) + (ja-no-eval :group! monster-frog-notice0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-notice0-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (ja-no-eval :group! monster-frog-notice0-jump-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-notice0-jump-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((a0-7 (handle->process (-> self focus handle)))) + (if a0-7 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-7) 0) + (* 98304.0 f30-0) + (seconds 0.02) + ) + ) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (ja-no-eval :group! monster-frog-notice0-land-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-notice0-land-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate active (monster-frog) + :virtual #t + :code (behavior () + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (nav-enemy-method-165 self) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! monster-frog-hop-slow-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-start-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (nav-enemy-method-167 self) + (ja-no-eval :group! monster-frog-hop-slow-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-slow-end-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (when (enemy-method-123 self 0.2) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.6)) + (let ((v1-57 self)) + (set! (-> v1-57 enemy-flags) (the-as enemy-flag (logclear (-> v1-57 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-57 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (until (not (enemy-method-123 self 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override idle-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((v1-121 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-121 enemy-flags))) + (set! (-> v1-121 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-121 enemy-flags)))) + ) + (set! (-> v1-121 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-121 enemy-flags)))) + (set! (-> v1-121 nav callback-info) (-> v1-121 enemy-info-override callback-info)) + ) + 0 + (nav-enemy-method-165 self) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.6)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override walk-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override walk-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate pacing (monster-frog) + :virtual #t + :code (the-as (function none :behavior monster-frog) monster-frog-hop-slow-code) + ) + +;; failed to figure out what this is: +(defstate circling (monster-frog) + :virtual #t + :code (the-as (function none :behavior monster-frog) monster-frog-hop-slow-code) + ) + +;; failed to figure out what this is: +(defstate stare (monster-frog) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy stare) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (monster-frog) + :virtual #t + :enter (behavior () + (logclear! (-> self enemy-flags) (enemy-flag chase-startup)) + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-6 self)) + (set! (-> v1-6 enemy-flags) (the-as enemy-flag (logclear (-> v1-6 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :trans (behavior () + (nav-enemy-method-160 self) + (if (and (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) (-> self enemy-info-override use-victory)) + (go-virtual victory) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + (if (nav-enemy-method-163 self) + (go-stare2 self) + ) + (let ((gp-0 (-> self focus aware))) + (cond + ((>= 1 (the-as int gp-0)) + (if (-> self enemy-info-override use-stop-chase) + (go-virtual stop-chase) + (go-virtual active) + ) + ) + ((or (>= 2 (the-as int gp-0)) (not (enemy-method-107 self))) + (go-stare self) + ) + ((= gp-0 (enemy-aware enemy-aware-4)) + (go-flee self) + ) + ) + ) + (when (and (-> self enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> self enemy-flags))) + (if (-> self enemy-info-override use-stop-chase) + (go-virtual stop-chase) + (go-stare self) + ) + ) + ) + (none) + ) + :code (behavior () + (until #f + (let* ((gp-0 (handle->process (-> self focus handle))) + (a0-4 (if (type? gp-0 process-focusable) + gp-0 + ) + ) + ) + (cond + (a0-4 + (let* ((s5-0 (get-trans (the-as process-focusable a0-4) 0)) + (a1-4 (vector-! (new 'stack-no-clear 'vector) s5-0 (-> self root-override2 trans))) + (f30-0 (vector-length a1-4)) + (gp-1 (-> self enemy-info-override)) + ) + (let ((a1-5 (vector-normalize-copy! (new 'stack-no-clear 'vector) a1-4 1.0))) + (if (not (enemy-method-94 self a1-5 6371.5557)) + (go-virtual turn) + ) + ) + (if (< f30-0 32768.0) + (go-virtual attack s5-0) + ) + (let* ((f28-0 (fmax 0.0 (fmin 1.0 (* 0.000034877234 (+ -32768.0 f30-0))))) + (f26-0 (lerp 0.5 1.0 f28-0)) + (f30-1 (lerp 0.0 1.0 f28-0)) + (f28-1 (lerp 1.4 1.0 f28-0)) + ) + (let ((v1-21 (-> self nav))) + (set! (-> v1-21 target-speed) (/ (* f26-0 (-> gp-1 run-travel-speed)) f28-1)) + ) + 0 + (let ((v1-23 (-> self nav))) + (set! (-> v1-23 acceleration) (-> gp-1 run-acceleration)) + ) + 0 + (let ((v1-25 (-> self nav))) + (set! (-> v1-25 turning-acceleration) (-> gp-1 run-turning-acceleration)) + ) + 0 + (ja-channel-push! 2 (seconds 0.01)) + (ja-no-eval :group! monster-frog-hop-small-start-ja + :num! (seek! + (the float (+ (-> (the-as art-joint-anim monster-frog-hop-small-start-ja) frames num-frames) -1)) + f28-1 + ) + :frame-num 0.0 + ) + (let ((a0-15 (-> self skel root-channel 1))) + (set! (-> a0-15 frame-interp 1) f30-1) + (set! (-> a0-15 frame-interp 0) f30-1) + (set! (-> a0-15 frame-group) (the-as art-joint-anim monster-frog-hop-slow-start-ja)) + (set! (-> a0-15 param 0) 0.0) + (set! (-> a0-15 frame-num) 0.0) + (joint-control-channel-group! a0-15 (the-as art-joint-anim monster-frog-hop-slow-start-ja) num-func-chan) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f28-1)) + (let ((a0-17 (-> self skel root-channel 1))) + (set! (-> a0-17 frame-interp 1) f30-1) + (set! (-> a0-17 frame-interp 0) f30-1) + (set! (-> a0-17 param 0) 0.0) + (joint-control-channel-group-eval! a0-17 (the-as art-joint-anim #f) num-func-chan) + ) + ) + (nav-enemy-method-167 self) + (ja-no-eval :group! monster-frog-hop-small-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-hop-small-end-ja) frames num-frames) -1)) f28-1) + :frame-num 0.0 + ) + (let ((a0-21 (-> self skel root-channel 1))) + (set! (-> a0-21 frame-interp 1) f30-1) + (set! (-> a0-21 frame-interp 0) f30-1) + (set! (-> a0-21 frame-group) (the-as art-joint-anim monster-frog-hop-slow-end-ja)) + (set! (-> a0-21 param 0) 0.0) + (set! (-> a0-21 frame-num) 0.0) + (joint-control-channel-group! a0-21 (the-as art-joint-anim monster-frog-hop-slow-end-ja) num-func-chan) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f28-1)) + (let ((a0-23 (-> self skel root-channel 1))) + (set! (-> a0-23 frame-interp 1) f30-1) + (set! (-> a0-23 frame-interp 0) f30-1) + (set! (-> a0-23 param 0) 0.0) + (joint-control-channel-group-eval! a0-23 (the-as art-joint-anim #f) num-func-chan) + ) + ) + ) + ) + ) + (else + (suspend) + 0 + ) + ) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate turn (monster-frog) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior monster-frog) enemy-event-handler) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((v1-0 self)) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-0 enemy-flags)))) + ) + 0 + (ja-no-eval :group! monster-frog-rotate-left-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-rotate-left-start-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((v1-26 self)) + (set! (-> v1-26 enemy-flags) (the-as enemy-flag (logclear (-> v1-26 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (ja-no-eval :group! monster-frog-rotate-left-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-rotate-left-end-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (enemy-method-72 self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + 81920.0 + (seconds 0.02) + ) + ) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (monster-frog) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior monster-frog) enemy-event-handler) + :enter (behavior ((arg0 vector)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-2 enemy-flags))) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-2 enemy-flags)))) + ) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-2 enemy-flags)))) + (set! (-> v1-2 nav callback-info) (-> v1-2 enemy-info-override callback-info)) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (a1-15 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a1-15) + (set! (-> self attack-id) a1-15) + ) + (let* ((gp-0 (-> self root-override2 trans)) + (s5-1 (vector-! (new 'stack-no-clear 'vector) arg0 gp-0)) + ) + (let ((f0-0 (vector-length s5-1))) + (vector-normalize! s5-1 (fmin f0-0 (-> self enemy-info-override run-travel-speed))) + ) + (let ((a0-3 (-> self nav state)) + (v1-17 (vector+! (new 'stack-no-clear 'vector) gp-0 s5-1)) + ) + (logclear! (-> a0-3 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-3 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-3 target-post quad) (-> v1-17 quad)) + ) + ) + 0 + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior ((arg0 vector)) + (ja-channel-push! 1 (seconds 0.04)) + (nav-enemy-method-166 self) + (ja-no-eval :group! monster-frog-attack0-start-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-attack0-start-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (nav-enemy-method-167 self) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (go-virtual attack-recover) + (none) + ) + :post (the-as (function none :behavior monster-frog) nav-enemy-travel-post) + ) + +;; failed to figure out what this is: +(defstate attack-recover (monster-frog) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior monster-frog) enemy-event-handler) + :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 + (none) + ) + :code (behavior () + (ja-no-eval :group! monster-frog-attack0-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-attack0-end-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (cond + ((zero? (get-rand-int self 4)) + (let ((v1-28 (ja-group))) + (if (not (and v1-28 (= v1-28 monster-frog-idle0-ja))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (ja-no-eval :group! monster-frog-idle0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-idle0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (let ((v1-59 (ja-group))) + (if (not (and v1-59 (= v1-59 monster-frog-idle1-ja))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (ja-no-eval :group! monster-frog-idle1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim monster-frog-idle1-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + (enemy-method-72 self) + (none) + ) + :post (the-as (function none :behavior monster-frog) nav-enemy-simple-post) + ) + +;; definition for method 77 of type monster-frog +(defmethod enemy-method-77 monster-frog ((obj monster-frog) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 0) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 26))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 26)) 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 26)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 0) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> a0-6 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> a0-6 param 1) (-> arg0 0)) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! a0-6 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + #t + ) + (else + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + (ja-channel-push! 1 0) + (let ((a0-8 (-> obj skel root-channel 0))) + (set! (-> a0-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 30))) + (set! (-> a0-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 30)) frames num-frames) -1)) + ) + (set! (-> a0-8 param 1) (-> arg0 0)) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim (-> obj draw art-group data 30)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 0) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim (-> obj draw art-group data 32))) + (set! (-> a0-10 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 32)) frames num-frames) -1)) + ) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim (-> obj draw art-group data 32)) num-func-seek!) + ) + ) + ) + #t + ) + ) + ) + +;; definition for method 78 of type monster-frog +(defmethod enemy-method-78 monster-frog ((obj monster-frog) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 27))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 27)) 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 27)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) (the-as art-joint-anim (-> obj draw art-group data 23))) + (set! (-> a0-6 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 23)) frames num-frames) -1)) + ) + (set! (-> a0-6 param 1) (-> arg0 0)) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! a0-6 (the-as art-joint-anim (-> obj draw art-group data 23)) num-func-seek!) + ) + #t + ) + (else + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-0)) + (ja-channel-push! 1 0) + (let ((a0-8 (-> obj skel root-channel 0))) + (set! (-> a0-8 frame-group) (the-as art-joint-anim (-> obj draw art-group data 31))) + (set! (-> a0-8 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 31)) frames num-frames) -1)) + ) + (set! (-> a0-8 param 1) (-> arg0 0)) + (set! (-> a0-8 frame-num) 0.0) + (joint-control-channel-group! a0-8 (the-as art-joint-anim (-> obj draw art-group data 31)) num-func-seek!) + ) + ) + (else + (ja-channel-push! 1 0) + (let ((a0-10 (-> obj skel root-channel 0))) + (set! (-> a0-10 frame-group) (the-as art-joint-anim (-> obj draw art-group data 33))) + (set! (-> a0-10 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 33)) frames num-frames) -1)) + ) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim (-> obj draw art-group data 33)) num-func-seek!) + ) + ) + ) + #t + ) + ) + ) + +;; definition for method 55 of type monster-frog +(defmethod enemy-method-55 monster-frog ((obj monster-frog)) + (water-control-method-10 (-> obj water)) + ((method-of-type nav-enemy enemy-method-55) obj) + (none) + ) + +;; definition for method 114 of type monster-frog +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 monster-frog ((obj monster-frog)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 4096.0 0.0 8192.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-13 prim-core action) (collide-action solid deadly no-standon)) + (set-vector! (-> v1-13 local-sphere) 0.0 4096.0 1638.4 3276.8) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action deadly)) + (set! (-> v1-15 transform-index) 5) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 2048.0 2662.4) + ) + (set! (-> s5-0 nav-radius) 4915.2) + (let ((v1-17 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-17 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-17 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 115 of type monster-frog +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 monster-frog ((obj monster-frog)) + "@abstract" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-monster-frog" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *monster-frog-nav-enemy-info*) + (set! (-> obj water) (new 'process 'water-control obj 5 0.0 8192.0 2048.0)) + (set! (-> obj water flags) + (water-flags active use-water-anim touch-water part-splash part-drip part-rings part-water find-water) + ) + (set! (-> obj water height) (res-lump-float (-> obj entity) 'water-height)) + (set! (-> obj water ripple-size) 12288.0) + (set! (-> obj water wake-size) 6144.0) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/ruins/rapid-gunner_REF.gc b/test/decompiler/reference/jak2/levels/ruins/rapid-gunner_REF.gc new file mode 100644 index 0000000000..0b3f7f21da --- /dev/null +++ b/test/decompiler/reference/jak2/levels/ruins/rapid-gunner_REF.gc @@ -0,0 +1,1585 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type rapid-gunner +(deftype rapid-gunner (nav-enemy) + ((los los-control :inline :offset-assert 608) + (joint joint-mod :offset-assert 756) + (joint-blend float :offset-assert 760) + (joint-enable symbol :offset-assert 764) + (shot-timer uint64 :offset-assert 768) + (predict-timer uint64 :offset-assert 776) + (target-prev-pos vector :inline :offset-assert 784) + (target-next-pos vector :inline :offset-assert 800) + (focus-dir vector :inline :offset-assert 816) + (y-diff float :offset-assert 832) + (shots-fired uint32 :offset-assert 836) + (spin-up-angle float :offset-assert 840) + (spin-up-timer time-frame :offset-assert 848) + (shoot-anim-index int32 :offset-assert 856) + (status-flags uint64 :offset-assert 864) + (start-pos vector :inline :offset-assert 880) + (dest-pos vector :inline :offset-assert 896) + (hop-dir vector :inline :offset-assert 912) + (roam-radius float :offset-assert 928) + ) + :heap-base #x330 + :method-count-assert 187 + :size-assert #x3a4 + :flag-assert #xbb033003a4 + (:methods + (attack () _type_ :state 178) + (spin-attack () _type_ :state 179) + (hop () _type_ :state 180) + (hop-turn () _type_ :state 181) + (cool-down () _type_ :state 182) + (reload () _type_ :state 183) + (rapid-gunner-method-184 (_type_ float) symbol 184) + (rapid-gunner-method-185 (_type_ vector float) none 185) + (rapid-gunner-method-186 (_type_ int float int int) none 186) + ) + ) + +;; definition for method 3 of type rapid-gunner +(defmethod inspect rapid-gunner ((obj rapid-gunner)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tlos: #~%" (-> obj los)) + (format #t "~2Tjoint: ~A~%" (-> obj joint)) + (format #t "~2Tjoint-blend: ~f~%" (-> obj joint-blend)) + (format #t "~2Tjoint-enable: ~A~%" (-> obj joint-enable)) + (format #t "~2Tshot-timer: ~D~%" (-> obj shot-timer)) + (format #t "~2Tpredict-timer: ~D~%" (-> obj predict-timer)) + (format #t "~2Ttarget-prev-pos: #~%" (-> obj target-prev-pos)) + (format #t "~2Ttarget-next-pos: #~%" (-> obj target-next-pos)) + (format #t "~2Tfocus-dir: #~%" (-> obj focus-dir)) + (format #t "~2Ty-diff: ~f~%" (-> obj y-diff)) + (format #t "~2Tshots-fired: ~D~%" (-> obj shots-fired)) + (format #t "~2Tspin-up-angle: ~f~%" (-> obj spin-up-angle)) + (format #t "~2Tspin-up-timer: ~D~%" (-> obj spin-up-timer)) + (format #t "~2Tshoot-anim-index: ~D~%" (-> obj shoot-anim-index)) + (format #t "~2Tstatus-flags: ~D~%" (-> obj status-flags)) + (format #t "~2Tstart-pos: #~%" (-> obj start-pos)) + (format #t "~2Tdest-pos: #~%" (-> obj dest-pos)) + (format #t "~2Thop-dir: #~%" (-> obj hop-dir)) + (format #t "~2Troam-radius: ~f~%" (-> obj roam-radius)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-rapid-gunner rapid-gunner rapid-gunner-lod0-jg rapid-gunner-idle-ja + ((rapid-gunner-lod0-mg (meters 20)) (rapid-gunner-lod1-mg (meters 40)) (rapid-gunner-lod2-mg (meters 999999))) + :bounds (static-spherem 0 1.5 0 7) + :shadow rapid-gunner-shadow-mg + ) + +;; definition for symbol *rapid-gunner-nav-enemy-info*, type nav-enemy-info +(define *rapid-gunner-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 #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 4 #x1010501 #x0 #x0 #x0) + :idle-anim 5 + :notice-anim 6 + :hostile-anim -1 + :hit-anim 20 + :knocked-anim 23 + :knocked-land-anim 30 + :die-anim 28 + :die-falling-anim 29 + :victory-anim -1 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 7 + :look-at-joint 8 + :bullseye-joint 6 + :sound-hit (static-sound-name "rapid-gunne-hit") + :sound-die (static-sound-name "rapid-gunne-die") + :notice-distance (meters 100) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 25) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked #xffffffffffffffff + :movement-gravity (meters -100) + :friction 0.6 + :attack-shove-back (meters 6) + :attack-shove-up (meters 3) + :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-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 32768.0 + :knocked-soft-vxz-hi 57344.0 + :knocked-soft-vy-lo 32768.0 + :knocked-soft-vy-hi 65536.0 + :knocked-medium-vxz-lo 40960.0 + :knocked-medium-vxz-hi 65536.0 + :knocked-medium-vy-lo 53248.0 + :knocked-medium-vy-hi 86016.0 + :knocked-hard-vxz-lo 57344.0 + :knocked-hard-vxz-hi 81920.0 + :knocked-hard-vy-lo 61440.0 + :knocked-hard-vy-hi 90112.0 + :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 65536.0 + :knocked-red-vy-lo 24576.0 + :knocked-red-vy-hi 57344.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 6 + :gem-seg #x2 + :gem-offset (new 'static 'sphere :y -2252.8 :z -2170.88 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim -1 + :turn-anim 7 + :run-anim -1 + :taunt-anim -1 + :run-travel-speed (meters 4) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 5) + :walk-travel-speed (meters 2) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 60.0) + :notice-nav-radius (meters 100) + :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! (-> *rapid-gunner-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 74 of type rapid-gunner +(defmethod enemy-method-74 rapid-gunner ((obj rapid-gunner) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('hit '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) + (go (method-of-object obj knocked)) + ) + (('notify) + (if (= (-> arg3 param 0) 'attack) + (sound-play "rgun-shot-hit") + ) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +;; definition for method 77 of type rapid-gunner +;; WARN: Return type mismatch object vs symbol. +;; WARN: Using new Jak 2 rtype-of +;; WARN: Using new Jak 2 rtype-of +(defmethod enemy-method-77 rapid-gunner ((obj rapid-gunner) (arg0 (pointer float))) + (let ((v1-0 (-> obj incoming knocked-type))) + (the-as + symbol + (cond + ((or (= v1-0 (knocked-type knocked-type-4)) (= v1-0 (knocked-type knocked-type-0))) + (cond + ((zero? (-> obj hit-points)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj enemy-info-override knocked-anim))) + ) + (set! (-> a0-3 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj enemy-info-override knocked-anim))) + 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 (-> obj enemy-info-override knocked-anim))) + num-func-seek! + ) + ) + ) + (else + (let* ((a0-4 '((rapid-gunner-hit-ja) (rapid-gunner-hit-left-ja) (rapid-gunner-hit-right-ja))) + (a1-11 ((method-of-type (rtype-of a0-4) length) a0-4)) + (s4-0 (new 'static 'array int64 3 20 21 22)) + (s3-0 (new 'static 'array int32 4 0 0 0 0)) + (a2-1 (ash 1 (-> s3-0 0))) + (v1-27 (enemy-method-120 obj a1-11 a2-1)) + (s4-1 (-> obj draw art-group data (-> (the-as (pointer int32) (+ (* v1-27 8) (the-as int s4-0)))))) + ) + (set! (-> s3-0 0) v1-27) + (let ((v1-30 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-30 (= v1-30 (-> obj draw art-group data 27))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + (let ((a0-19 (-> obj skel root-channel 0))) + (set! (-> a0-19 frame-group) (the-as art-joint-anim s4-1)) + (set! (-> a0-19 param 0) (the float (+ (-> (the-as art-joint-anim s4-1) frames num-frames) -1))) + (set! (-> a0-19 param 1) (-> arg0 0)) + (set! (-> a0-19 frame-num) 0.0) + (joint-control-channel-group! a0-19 (the-as art-joint-anim s4-1) num-func-seek!) + ) + ) + ) + ) + #t + ) + ((= v1-0 (knocked-type knocked-type-5)) + (ja-channel-push! 1 (seconds 0.067)) + (let ((a0-22 (-> obj skel root-channel 0))) + (set! (-> a0-22 frame-group) (the-as art-joint-anim (-> obj draw art-group data 20))) + (set! (-> a0-22 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 20)) frames num-frames) -1)) + ) + (set! (-> a0-22 param 1) (-> arg0 0)) + (set! (-> a0-22 frame-num) 0.0) + (joint-control-channel-group! a0-22 (the-as art-joint-anim (-> obj draw art-group data 20)) num-func-seek!) + ) + ) + ((= v1-0 (knocked-type knocked-type-6)) + (let* ((a0-24 '((rapid-gunner-blue-hit0-ja) (rapid-gunner-blue-hit1-ja) (rapid-gunner-blue-hit2-ja))) + (a1-21 ((method-of-type (rtype-of a0-24) length) a0-24)) + (s5-1 (new 'static 'array int64 3 24 25 26)) + (s4-2 (new 'static 'array int32 4 0 0 0 0)) + (a2-4 (ash 1 (-> s4-2 0))) + (v1-59 (enemy-method-120 obj a1-21 a2-4)) + (s5-2 (-> obj draw art-group data (-> (the-as (pointer int32) (+ (* v1-59 8) (the-as int s5-1)))))) + ) + (set! (-> s4-2 0) v1-59) + (let ((v1-62 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-62 (= v1-62 (-> obj draw art-group data 27))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + (let ((a0-39 (-> obj skel root-channel 0))) + (set! (-> a0-39 frame-group) (the-as art-joint-anim s5-2)) + (set! (-> a0-39 param 0) (the float (+ (-> (the-as art-joint-anim s5-2) frames num-frames) -1))) + (set! (-> a0-39 param 1) 1.0) + (set! (-> a0-39 frame-num) 0.0) + (joint-control-channel-group! a0-39 (the-as art-joint-anim s5-2) num-func-seek!) + ) + ) + #t + ) + (else + (ja-channel-push! 1 (seconds 0.067)) + (let ((a1-28 (-> obj draw art-group data (-> obj enemy-info-override knocked-anim))) + (a0-43 (-> obj skel root-channel 0)) + ) + (set! (-> a0-43 frame-group) (the-as art-joint-anim a1-28)) + (set! (-> a0-43 param 0) (the float (+ (-> (the-as art-joint-anim a1-28) frames num-frames) -1))) + (set! (-> a0-43 param 1) (-> arg0 0)) + (set! (-> a0-43 frame-num) 0.0) + (joint-control-channel-group! a0-43 (the-as art-joint-anim a1-28) num-func-seek!) + ) + #t + ) + ) + ) + ) + ) + +;; definition for method 52 of type rapid-gunner +(defmethod enemy-method-52 rapid-gunner ((obj rapid-gunner) (arg0 vector)) + (cond + ((> (-> obj hit-points) 0) + (-> obj enemy-info-override) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (vector-reset! arg0) + ) + (else + ((method-of-type nav-enemy enemy-method-52) obj arg0) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-52) obj arg0) + ) + ) + (none) + ) + +;; definition for method 78 of type rapid-gunner +(defmethod enemy-method-78 rapid-gunner ((obj rapid-gunner) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-3 (-> obj skel root-channel 0))) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> obj draw art-group data 27))) + (set! (-> a0-3 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 27)) 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 27)) num-func-seek!) + ) + #t + ) + ) + (((knocked-type knocked-type-4) (knocked-type knocked-type-0)) + #t + ) + (((knocked-type knocked-type-5)) + (when (zero? (-> obj hit-points)) + (ja-channel-push! 1 (seconds 0.067)) + (let ((a1-5 (-> obj draw art-group data (-> obj enemy-info-override die-anim))) + (a0-10 (-> obj skel root-channel 0)) + ) + (set! (-> a0-10 frame-group) (the-as art-joint-anim a1-5)) + (set! (-> a0-10 param 0) (the float (+ (-> (the-as art-joint-anim a1-5) frames num-frames) -1))) + (set! (-> a0-10 param 1) (-> arg0 0)) + (set! (-> a0-10 frame-num) 0.0) + (joint-control-channel-group! a0-10 (the-as art-joint-anim a1-5) num-func-seek!) + ) + #t + ) + ) + (else + (let ((a1-6 (-> obj draw art-group data (-> obj enemy-info-override knocked-land-anim))) + (a0-13 (-> obj skel root-channel 0)) + ) + (set! (-> a0-13 frame-group) (the-as art-joint-anim a1-6)) + (set! (-> a0-13 param 0) (the float (+ (-> (the-as art-joint-anim a1-6) frames num-frames) -1))) + (set! (-> a0-13 param 1) (-> arg0 0)) + (set! (-> a0-13 frame-num) 0.0) + (joint-control-channel-group! a0-13 (the-as art-joint-anim a1-6) num-func-seek!) + ) + #t + ) + ) + ) + +;; definition for method 98 of type rapid-gunner +(defmethod enemy-method-98 rapid-gunner ((obj rapid-gunner) (arg0 process-focusable) (arg1 vector)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-98))) + (and (t9-0 obj arg0 arg1) + (or (not (logtest? (-> obj fact-info-override enemy-options) (enemy-option user8))) + (and (not (logtest? (-> arg0 focus-status) (focus-status in-air))) + (>= 4096.0 (fabs (- (-> (get-trans arg0 0) y) (-> obj root-override2 trans y)))) + ) + ) + ) + ) + ) + +;; definition for method 185 of type rapid-gunner +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +;; WARN: Function (method 185 rapid-gunner) has a return type of none, but the expression builder found a return statement. +(defmethod rapid-gunner-method-185 rapid-gunner ((obj rapid-gunner) (arg0 vector) (arg1 float)) + (if (not (-> obj joint-enable)) + (return #f) + ) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> arg0 quad)) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (set! (-> s4-0 quad) (-> obj root-override2 root-prim prim-core world-sphere quad)) + (let ((s3-1 (vector-! (new 'stack-no-clear 'vector) s5-0 s4-0))) + (set! (-> s4-0 w) 1.0) + (when (< (vector-vector-distance s5-0 s4-0) 29491.2) + (vector-normalize! s3-1 29491.2) + (vector+! s5-0 s4-0 s3-1) + ) + ) + ) + (let* ((v1-16 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 18))) + (s4-1 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s5-0 v1-16) 1.0)) + (s3-2 + (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> obj node-list data 4 bone transform vector 2) 1.0) + ) + (s5-1 (new 'stack-no-clear 'quaternion)) + ) + (let* ((s1-0 (forward-up-nopitch->quaternion (new 'stack-no-clear 'quaternion) s4-1 *up-vector*)) + (s2-0 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) s4-1 s1-0)) + (f0-2 (vector-x-angle s2-0)) + ) + (when (< 2730.6667 (fabs f0-2)) + (let ((f30-0 (fmax -2730.6667 (fmin 2730.6667 f0-2)))) + (set! (-> s2-0 y) 0.0) + (vector-normalize! s2-0 1.0) + (vector-rotate-x! s2-0 s2-0 (- f30-0)) + ) + (vector-orient-by-quat! s4-1 s2-0 s1-0) + ) + ) + (quaternion-from-two-vectors-max-angle-partial! s5-1 s3-2 s4-1 16384.0 (-> obj joint-blend)) + (quaternion-slerp! (-> obj joint quat) (-> obj joint quat) s5-1 0.1) + ) + ) + 0 + (none) + ) + +;; definition for function vector-average-copy! +(defun vector-average-copy! ((arg0 vector) (arg1 vector) (arg2 float)) + (let ((f0-1 (- 1.0 arg2))) + (set! (-> arg0 x) (+ (* f0-1 (-> arg0 x)) (* arg2 (-> arg1 x)))) + (set! (-> arg0 y) (+ (* f0-1 (-> arg0 y)) (* arg2 (-> arg1 y)))) + (set! (-> arg0 z) (+ (* f0-1 (-> arg0 z)) (* arg2 (-> arg1 z)))) + ) + (set! (-> arg0 w) 1.0) + arg0 + ) + +;; definition for symbol *aim-pos*, type vector +(define *aim-pos* (new 'static 'vector)) + +;; definition for function rapid-gunner-common-post +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defbehavior rapid-gunner-common-post rapid-gunner () + (let ((a0-1 (handle->process (-> self focus handle)))) + (cond + (a0-1 + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> (get-trans (the-as process-focusable a0-1) 0) quad)) + (let ((s5-1 (vector-! (new 'stack-no-clear 'vector) gp-0 (-> self target-prev-pos)))) + (let* ((a1-3 (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data 18))) + (f0-0 (vector-vector-distance gp-0 a1-3)) + ) + (vector-normalize! s5-1 (* 0.00028170072 f0-0 (vector-length s5-1))) + ) + (set! (-> s5-1 y) 0.0) + (vector-average-copy! (-> self focus-dir) s5-1 0.08) + ) + (vector+! (-> self target-next-pos) (-> self focus-dir) gp-0) + (set! (-> self target-prev-pos quad) (-> gp-0 quad)) + ) + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + ) + (else + (set! (-> self target-next-pos quad) (-> self target-prev-pos quad)) + (vector-reset! (-> self focus-dir)) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 55 of type rapid-gunner +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-55 rapid-gunner ((obj rapid-gunner)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-55))) + (t9-0 obj) + ) + (los-control-method-9 (-> obj los) (the-as process-focusable #f) (the-as vector #f) 2048.0) + 0 + (none) + ) + +;; definition for method 96 of type rapid-gunner +(defmethod enemy-method-96 rapid-gunner ((obj rapid-gunner) (arg0 float) (arg1 symbol)) + (enemy-method-95 obj (-> obj target-next-pos) arg0) + ) + +;; definition for method 184 of type rapid-gunner +(defmethod rapid-gunner-method-184 rapid-gunner ((obj rapid-gunner) (arg0 float)) + (let* ((s4-0 (-> obj node-list data 18)) + (v1-1 (vector<-cspace! (new 'stack-no-clear 'vector) s4-0)) + (s5-1 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) (-> obj target-next-pos) v1-1) 1.0)) + (s4-1 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s4-0 bone transform vector 2) 1.0)) + ) + (set! (-> s4-1 y) 0.0) + (vector-xz-normalize! s4-1 1.0) + (set! (-> s5-1 y) 0.0) + (vector-xz-normalize! s5-1 1.0) + (>= (vector-dot s4-1 s5-1) (cos arg0)) + ) + ) + +;; definition for method 67 of type rapid-gunner +;; WARN: Return type mismatch object vs none. +(defmethod go-stare rapid-gunner ((obj rapid-gunner)) + (go (method-of-object obj hostile)) + (none) + ) + +;; failed to figure out what this is: +(defstate notice (rapid-gunner) + :virtual #t + :enter (behavior () + (logior! (-> self enemy-flags) (enemy-flag use-notice-distance)) + (enemy-method-109 self 1) + (when (logtest? (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (logclear! (-> self enemy-flags) (enemy-flag auto-reset-penetrate)) + (let ((gp-0 (-> self on-notice))) + (if gp-0 + (eval! + (new 'stack 'script-context (the-as basic (process->ppointer self)) self (-> self root-override2 trans)) + (the-as pair gp-0) + ) + ) + ) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag chase-startup)) + (go-virtual hostile) + ) + (logior! (-> self enemy-flags) (enemy-flag chase-startup)) + (let ((v1-23 self)) + (set! (-> v1-23 enemy-flags) (the-as enemy-flag (logclear (-> v1-23 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-23 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-26 self)) + (set! (-> v1-26 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-26 enemy-flags)))) + ) + 0 + (let ((v1-28 (-> self nav))) + (set! (-> v1-28 target-speed) 0.0) + ) + 0 + (let* ((gp-1 (handle->process (-> self focus handle))) + (a0-14 (if (type? gp-1 process-focusable) + gp-1 + ) + ) + ) + (when a0-14 + (let ((v1-34 (get-trans (the-as process-focusable a0-14) 3))) + (set! (-> self target-next-pos quad) (-> v1-34 quad)) + (set! (-> self target-prev-pos quad) (-> v1-34 quad)) + ) + (vector-reset! (-> self focus-dir)) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override notice-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override notice-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (enemy-method-72 self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + (* 196608.0 (-> self clock frames-per-second)) + (seconds 0.2) + ) + ) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self predict-timer) (the-as uint (+ (-> self clock frame-counter) 1))) + (set! (-> self shot-timer) (the-as uint (-> self clock frame-counter))) + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-7 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-10 self)) + (set! (-> v1-10 enemy-flags) (the-as enemy-flag (logclear (-> v1-10 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self joint-enable) #t) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-15 *game-info*) + (a0-6 (+ (-> v1-15 attack-id) 1)) + ) + (set! (-> v1-15 attack-id) a0-6) + (set! (-> self attack-id) a0-6) + ) + (when (logtest? (-> self status-flags) 2) + (set! (-> self spin-up-timer) (+ (-> self clock frame-counter) (seconds 2))) + (set! (-> self status-flags) (logand -3 (-> self status-flags))) + ) + (if (zero? (rand-vu-int-range 0 3)) + (set! (-> self shoot-anim-index) 15) + (set! (-> self shoot-anim-index) 14) + ) + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (seek! (-> self joint-blend) 0.95 (-> self clock seconds-per-frame)) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-virtual hostile) + ) + (let ((s5-0 (get-trans (the-as process-focusable gp-0) 0)) + (f0-3 (vector-vector-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans))) + ) + (cond + ((and (< f0-3 20480.0) + (and (< (fabs (- (-> s5-0 y) (-> self root-override2 trans y))) 6144.0) + gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (go-virtual spin-attack) + ) + ((< 430080.0 f0-3) + (go-hostile self) + ) + ((skip-check-los? (-> self los) 90) + (vector-normalize-copy! (-> self hop-dir) (-> self focus-dir) -1.0) + (go-virtual hop) + ) + ((not (enemy-method-96 self 16384.0 #t)) + (go-virtual hop-turn) + ) + ((>= (-> self shots-fired) (the-as uint 12)) + (when (skip-check-los? (-> self los) 0) + (vector-normalize-copy! (-> self hop-dir) (-> self focus-dir) -1.0) + (go-virtual hop) + ) + (go-virtual reload) + ) + ((>= (- (-> self clock frame-counter) (the-as int (-> self shot-timer))) (seconds 0.25)) + (when (rapid-gunner-method-184 self 2184.5334) + (let* ((a1-11 (-> self node-list data 18)) + (f30-0 (fmax 0.0 (the float (- (-> self spin-up-timer) (-> self clock frame-counter))))) + (s5-1 (vector<-cspace! (new 'stack-no-clear 'vector) a1-11)) + (s4-2 + (vector+! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable gp-0) 0) (-> self focus-dir)) + ) + ) + (+! (-> s4-2 y) (lerp 2457.6 819.2 (* 0.000048828126 (vector-length (-> self focus-dir))))) + (let* ((gp-2 (vector-! (new 'stack-no-clear 'vector) s4-2 s5-1)) + (f28-1 (vector-length gp-2)) + ) + (vector-normalize! gp-2 1.0) + (vector-rotate-x! gp-2 gp-2 (* 0.9102223 f30-0)) + (vector+float*! s4-2 s5-1 gp-2 f28-1) + ) + (sound-play "rgun-shot-fire" :position s5-1) + (spawn-metalhead-projectile (the-as metalhead-shot self) s5-1 s4-2 532480.0) + ) + (+! (-> self shots-fired) 1) + ) + (set! (-> self shot-timer) (the-as uint (-> self clock frame-counter))) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (until #f + (when (not (enemy-method-96 self 2730.6667 #t)) + (let ((v1-3 self)) + (set! (-> v1-3 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-3 enemy-flags)))) + ) + 0 + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! rapid-gunner-shoot-track-ja) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 910.2222 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-19 self)) + (set! (-> v1-19 enemy-flags) (the-as enemy-flag (logclear (-> v1-19 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (let ((v1-23 (ja-group))) + (if (not (and v1-23 (or (= v1-23 rapid-gunner-shoot-ja) (= v1-23 rapid-gunner-shoot1-ja)))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (ja-no-eval :group! (-> self draw art-group data (-> self shoot-anim-index)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self shoot-anim-index))) frames num-frames) -1) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (rapid-gunner-method-185 self (-> self target-next-pos) 4.0) + (let ((a0-2 (handle->process (-> self focus handle)))) + (if (and a0-2 (let ((a1-2 self)) + (logtest? (enemy-flag enemy-flag37) (-> a1-2 enemy-flags)) + ) + ) + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-2) 3) + (* 0.5 (-> self nav max-rotation-rate)) + (seconds 0.5) + ) + ) + ) + (rapid-gunner-common-post) + (nav-enemy-simple-post) + (none) + ) + ) + +;; definition for method 186 of type rapid-gunner +;; WARN: Return type mismatch art-element vs none. +(defmethod rapid-gunner-method-186 rapid-gunner ((obj rapid-gunner) (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 ((a1-2 (-> obj skel root-channel arg0))) + (let ((f0-2 (fabs arg1))) + (set! (-> a1-2 frame-interp 1) f0-2) + (set! (-> a1-2 frame-interp 0) f0-2) + ) + (set! (-> a1-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data v1-1))) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate hop (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + (let ((v1-2 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-2 enemy-flags))) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-2 enemy-flags)))) + ) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-2 enemy-flags)))) + (set! (-> v1-2 nav callback-info) (-> v1-2 enemy-info-override callback-info)) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (v0-0 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) v0-0) + (set! (-> self attack-id) v0-0) + ) + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (set! (-> self shots-fired) (the-as uint (min 12 (the-as int (+ (-> self shots-fired) 2))))) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (let ((s5-0 (-> self root-override2 trans))) + (let ((a2-0 (new 'stack-no-clear 'vector))) + (let ((v1-3 s5-0)) + (let ((a0-2 (-> self hop-dir))) + (let ((a1-1 8192.0)) + (.mov vf7 a1-1) + ) + (.lvf vf5 (&-> a0-2 quad)) + ) + (.lvf vf4 (&-> v1-3 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> a2-0 quad) vf6) + (set! (-> self dest-pos quad) (-> s5-0 quad)) + (cloest-point-on-mesh (-> self nav) (-> self dest-pos) a2-0 (the-as nav-poly #f)) + ) + (if (< (vector-vector-distance s5-0 (-> self dest-pos)) 6144.0) + (go-hostile self) + ) + (let ((a0-8 (-> self nav state)) + (v1-12 (-> 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-12 quad)) + ) + 0 + (vector-! gp-0 (-> self dest-pos) s5-0) + ) + (set! (-> gp-0 y) 0.0) + (vector-normalize! gp-0 1.0) + (let ((a0-13 (-> self nav state)) + (v1-17 gp-0) + ) + (set! (-> a0-13 heading quad) (-> v1-17 quad)) + ) + 0 + (ja-channel-push! 2 (seconds 0.1)) + (ja-no-eval :group! rapid-gunner-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rapid-gunner-idle-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (let ((a0-17 (-> self skel root-channel 1))) + (let ((f0-7 0.0)) + (set! (-> a0-17 frame-interp 1) f0-7) + (set! (-> a0-17 frame-interp 0) f0-7) + ) + (set! (-> a0-17 frame-group) (the-as art-joint-anim rapid-gunner-idle-ja)) + (set! (-> a0-17 param 0) + (the float (+ (-> (the-as art-joint-anim rapid-gunner-idle-ja) frames num-frames) -1)) + ) + (set! (-> a0-17 param 1) 1.0) + (set! (-> a0-17 frame-num) 0.0) + (joint-control-channel-group! a0-17 (the-as art-joint-anim rapid-gunner-idle-ja) num-func-seek!) + ) + (until (ja-done? 0) + (let ((s5-1 (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) gp-0 (-> self root-override2 quat)))) + (rapid-gunner-method-186 self 0 (-> s5-1 x) 10 11) + (rapid-gunner-method-186 self 1 (-> s5-1 z) 8 9) + ) + (suspend) + (ja :num! (seek!)) + (ja :chan 1 :num! (chan 0)) + ) + ) + (let ((v1-67 self)) + (set! (-> v1-67 enemy-flags) (the-as enemy-flag (logclear (-> v1-67 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-67 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (go-hostile self) + (none) + ) + ) + :post (behavior () + (rapid-gunner-common-post) + (nav-enemy-travel-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hop-turn (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (v0-0 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) v0-0) + (set! (-> self attack-id) v0-0) + ) + (none) + ) + :exit (behavior () + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (seek! (-> self joint-blend) 0.0 (-> self clock seconds-per-frame)) + (when (enemy-method-96 self 6371.5557 #t) + (rapid-gunner-method-185 self (-> self target-next-pos) 24.0) + (when (skip-check-los? (-> self los) 30) + (vector-normalize-copy! (-> self hop-dir) (-> self focus-dir) -1.0) + (go-virtual hop) + ) + (go-hostile self) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! rapid-gunner-turn-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rapid-gunner-turn-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (rapid-gunner-method-185 self (-> self target-next-pos) 4.0) + (let ((a0-2 (handle->process (-> self focus handle)))) + (if (and a0-2 (let ((a1-2 self)) + (logtest? (enemy-flag enemy-flag37) (-> a1-2 enemy-flags)) + ) + ) + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-2) 3) + (* 4.0 (-> self nav max-rotation-rate)) + (seconds 0.5) + ) + ) + ) + (rapid-gunner-common-post) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate cool-down (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self shots-fired) (the-as uint 0)) + 0 + (none) + ) + :trans (behavior () + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (go-hostile self) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! rapid-gunner-aim-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rapid-gunner-aim-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (rapid-gunner-common-post) + (nav-enemy-face-focus-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate reload (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + (set! (-> self shots-fired) (the-as uint 0)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! rapid-gunner-reload-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rapid-gunner-reload-ja) frames num-frames) -1)) 0.5) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.5)) + ) + (when (skip-check-los? (-> self los) 30) + (vector-normalize-copy! (-> self hop-dir) (-> self focus-dir) -1.0) + (go-virtual hop) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (rapid-gunner-common-post) + (nav-enemy-face-focus-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (rapid-gunner) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self predict-timer) (the-as uint (-> self clock frame-counter))) + (cond + ((handle->process (-> self focus handle)) + (if (check-los? (-> self los) 0) + (set! (-> self status-flags) (logand -3 (-> self status-flags))) + (logior! (-> self status-flags) 2) + ) + ) + (else + (logior! (-> self status-flags) 2) + ) + ) + (let ((v1-18 self)) + (set! (-> v1-18 enemy-flags) (the-as enemy-flag (logclear (-> v1-18 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-18 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (none) + ) + :trans (behavior () + (if (and (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) (-> self enemy-info-override use-victory)) + (go-virtual victory) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (when gp-0 + (let* ((s5-0 (get-trans (the-as process-focusable gp-0) 0)) + (f30-0 (vector-vector-distance s5-0 (-> self root-override2 trans))) + ) + (if (and (< f30-0 20480.0) + (and (< (fabs (- (-> s5-0 y) (-> self root-override2 trans y))) 6144.0) + gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (go-virtual spin-attack) + ) + (when (and (< f30-0 409600.0) (check-los? (-> self los) 0)) + (if (>= (-> self shots-fired) (the-as uint 12)) + (go-virtual reload) + ) + (go-virtual attack) + ) + ) + ) + ) + (when (skip-check-los? (-> self los) 1500) + (let ((a1-6 (vector-! (new 'stack-no-clear 'vector) (-> self start-pos) (-> self root-override2 trans)))) + (when (< 4096.0 (vector-length a1-6)) + (vector-normalize-copy! (-> self hop-dir) a1-6 1.0) + (go-virtual hop) + ) + ) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.1)) + (if (>= 1 (the-as int (-> self focus aware))) + (go-virtual active) + ) + ) + (none) + ) + :code (behavior () + (when (not (enemy-method-96 self 2730.6667 #t)) + (let ((v1-3 self)) + (set! (-> v1-3 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-3 enemy-flags)))) + ) + 0 + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! rapid-gunner-shoot-track-ja) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 910.2222 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-19 self)) + (set! (-> v1-19 enemy-flags) (the-as enemy-flag (logclear (-> v1-19 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (let ((v1-23 (ja-group))) + (when (not (and v1-23 (= v1-23 rapid-gunner-aim-ja))) + (let ((v1-29 (ja-group))) + (if (and v1-29 (= v1-29 rapid-gunner-shoot-track-ja)) + (ja-channel-push! 1 (seconds 0.067)) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + ) + ) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (ja-no-eval :group! rapid-gunner-aim-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rapid-gunner-aim-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (rapid-gunner-method-185 self (-> self target-next-pos) 3.6) + (rapid-gunner-common-post) + (nav-enemy-face-focus-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate spin-attack (rapid-gunner) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rapid-gunner) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-2 self)) + (set! (-> v1-2 enemy-flags) (the-as enemy-flag (logclear (-> v1-2 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-2 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-9 *game-info*) + (a0-7 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-7) + (set! (-> self attack-id) a0-7) + ) + (let ((v1-13 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-13 prim-core action) (collide-action deadly)) + (set! (-> v1-13 local-sphere w) 7372.8) + ) + (none) + ) + :exit (behavior () + (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-9 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1))) + (set! (-> v1-9 prim-core action) (collide-action)) + (set! (-> v1-9 local-sphere w) 4096.0) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.135)) + (ja-no-eval :group! rapid-gunner-spin-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rapid-gunner-spin-attack-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag37) (-> a0-0 enemy-flags)) + (let ((a0-4 (handle->process (-> self focus handle)))) + (if a0-4 + (seek-to-point-toward-point! + (-> self root-override2) + (get-trans (the-as process-focusable a0-4) 0) + (-> self nav max-rotation-rate) + (seconds 0.02) + ) + ) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate active (rapid-gunner) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-4 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (none) + ) + :code (behavior () + (let ((v1-2 (ja-group))) + (when (not (and v1-2 (= v1-2 (-> self draw art-group data (-> self enemy-info-override idle-anim))))) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override idle-anim)) + :num! (loop!) + :frame-num 0.0 + ) + ) + ) + (until #f + (suspend) + (ja :num! (loop!)) + ) + #f + (none) + ) + :post (the-as (function none :behavior rapid-gunner) nav-enemy-simple-post) + ) + +;; definition for method 142 of type rapid-gunner +;; WARN: Return type mismatch int vs none. +(defmethod nav-enemy-method-142 rapid-gunner ((obj rapid-gunner) (arg0 nav-control)) + 0 + (none) + ) + +;; definition for method 63 of type rapid-gunner +;; WARN: Return type mismatch none vs symbol. +(defmethod enemy-method-63 rapid-gunner ((obj rapid-gunner) (arg0 process-focusable) (arg1 symbol)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-63))) + (the-as symbol (if (t9-0 obj arg0 arg1) + (set-dst-proc! (-> obj los) (-> obj focus handle)) + ) + ) + ) + ) + +;; definition for method 114 of type rapid-gunner +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 rapid-gunner ((obj rapid-gunner)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 5) 0))) + (set! (-> s5-0 total-prims) (the-as uint 6)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 11264.0 0.0 17203.2) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 5120.0 0.0 5120.0) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-15 prim-core action) (collide-action deadly)) + (set! (-> v1-15 transform-index) 18) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 -2048.0 3072.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-17 local-sphere) 0.0 9216.0 0.0 5120.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 prim-core action) (collide-action no-standon)) + (set! (-> v1-19 transform-index) 7) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 3072.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-with) (collide-spec backgnd obstacle hit-by-others-list)) + (set! (-> v1-21 prim-core action) (collide-action solid)) + (set-vector! (-> v1-21 local-sphere) 0.0 12288.0 0.0 12288.0) + ) + (set! (-> s5-0 nav-radius) 8192.0) + (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 rapid-gunner +;; WARN: Return type mismatch process-focusable vs rapid-gunner. +(defmethod relocate rapid-gunner ((obj rapid-gunner) (arg0 int)) + (if (nonzero? (-> obj joint)) + (&+! (-> obj joint) arg0) + ) + (the-as + rapid-gunner + ((the-as (function process-focusable int process-focusable) (find-parent-method rapid-gunner 7)) obj arg0) + ) + ) + +;; definition for method 115 of type rapid-gunner +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 rapid-gunner ((obj rapid-gunner)) + "@abstract" + (local-vars (sv-48 int)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-rapid-gunner" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (enemy-method-113 obj *rapid-gunner-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)) + (new-source! (-> obj los) obj (seconds 0.2) (collide-spec backgnd obstacle)) + (set! (-> obj joint) (new 'process 'joint-mod (joint-mod-mode joint-set*-world) obj 5)) + (set-vector! (-> obj root-override2 scale) 1.2 1.2 1.2 1.0) + (let ((a0-13 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (v1-14 (new 'stack-no-clear 'vector)) + ) + (let ((a1-7 (-> obj root-override2 trans))) + (let ((a2-5 409600.0)) + (.mov vf7 a2-5) + ) + (.lvf vf5 (&-> a0-13 quad)) + (.lvf vf4 (&-> a1-7 quad)) + ) + (.add.x.vf vf6 vf0 vf0 :mask #b1000) + (.mul.x.vf acc vf5 vf7 :mask #b111) + (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) + (.svf (&-> v1-14 quad) vf6) + (set! (-> obj target-next-pos quad) (-> v1-14 quad)) + (set! (-> obj target-prev-pos quad) (-> v1-14 quad)) + ) + (set! (-> obj shots-fired) (the-as uint 0)) + (set! (-> obj spin-up-timer) 0) + (set! (-> obj status-flags) (logand -2 (-> obj status-flags))) + (logior! (-> obj status-flags) 2) + (let ((f30-0 3640.889)) + (set! sv-48 0) + (let ((v1-22 (res-lump-data (-> obj entity) 'spinup-angle pointer :tag-ptr (the-as (pointer res-tag) (& sv-48))))) + (if v1-22 + (set! f30-0 (-> (the-as (pointer float) v1-22))) + ) + ) + (set! (-> obj spin-up-angle) f30-0) + ) + (vector-reset! (-> obj focus-dir)) + (set! (-> obj shoot-anim-index) -1) + (let ((v1-26 (-> obj nav))) + (set! (-> v1-26 speed-scale) 1.0) + ) + 0 + (logclear! (-> obj nav flags) (nav-control-flag update-heading-from-facing)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag43)))) + (set! (-> obj start-pos quad) (-> obj root-override2 trans quad)) + (set! (-> obj roam-radius) 16384.0) + (add-connection *part-engine* obj 8 obj 1310 (new 'static 'vector :x 1146.88 :y 450.56 :z 901.12 :w 163840.0)) + (add-connection + *part-engine* + obj + 8 + obj + 1311 + (new 'static 'vector :x -1146.88 :y 450.56 :z 901.12 :w 163840.0) + ) + (add-connection *part-engine* obj 18 obj 1312 (new 'static 'vector :w 163840.0)) + 0 + (none) + ) + ) + +;; definition of type shield-gunner +(deftype shield-gunner (rapid-gunner) + () + :heap-base #x330 + :method-count-assert 187 + :size-assert #x3a4 + :flag-assert #xbb033003a4 + ) + +;; definition for method 3 of type shield-gunner +(defmethod inspect shield-gunner ((obj shield-gunner)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type rapid-gunner inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +0 diff --git a/test/decompiler/reference/jak2/levels/temple/rhino-wall_REF.gc b/test/decompiler/reference/jak2/levels/temple/rhino-wall_REF.gc new file mode 100644 index 0000000000..b5f6820ac7 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/temple/rhino-wall_REF.gc @@ -0,0 +1,288 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type rhino-wall +(deftype rhino-wall (process-focusable) + ((anim spool-anim :offset-assert 204) + (art-name string :offset-assert 208) + (id int8 :offset-assert 212) + ) + :heap-base #x60 + :method-count-assert 31 + :size-assert #xd5 + :flag-assert #x1f006000d5 + (:methods + (unbroken () _type_ :state 27) + (hit () _type_ :state 28) + (broken () _type_ :state 29) + (rhino-wall-method-30 (_type_) none 30) + ) + ) + +;; definition for method 3 of type rhino-wall +(defmethod inspect rhino-wall ((obj rhino-wall)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type process-focusable inspect))) + (t9-0 obj) + ) + (format #t "~2Tanim: ~A~%" (-> obj anim)) + (format #t "~2Tart-name: ~A~%" (-> obj art-name)) + (format #t "~2Tid: ~D~%" (-> obj id)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-rhino-wall-1 rhino-wall rhino-wall-1-lod0-jg rhino-wall-1-idle-ja + ((rhino-wall-1-lod0-mg (meters 999999))) + :bounds (static-spherem 0.3 9 -3 11) + ) + +;; failed to figure out what this is: +(defskelgroup skel-rhino-wall-2 rhino-wall rhino-wall-2-lod0-jg rhino-wall-2-idle-ja + ((rhino-wall-2-lod0-mg (meters 999999))) + :bounds (static-spherem 0.3 13.5 0 14.5) + ) + +;; definition for method 30 of type rhino-wall +;; WARN: Return type mismatch vector vs none. +(defmethod rhino-wall-method-30 rhino-wall ((obj rhino-wall)) + (let ((v1-1 (-> obj root-override root-prim))) + (countdown (a1-0 (-> v1-1 specific 0)) + (let ((a2-1 (-> (the-as collide-shape-prim-group v1-1) child a1-0))) + (cond + ((zero? a1-0) + (set! (-> a2-1 prim-core collide-as) (collide-spec)) + 0 + ) + (else + (set! (-> a2-1 prim-core collide-as) (collide-spec obstacle)) + ) + ) + ) + ) + (case (-> obj id) + ((1) + (set! (-> obj draw origin-joint-index) (the-as uint 2)) + (set-vector! (-> obj draw bounds) 0.0 0.0 81920.0 131072.0) + (set! (-> v1-1 transform-index) 2) + (set-vector! (-> v1-1 local-sphere) 0.0 0.0 81920.0 122880.0) + ) + ((2) + (set! (-> obj draw origin-joint-index) (the-as uint 2)) + (set-vector! (-> obj draw bounds) 0.0 0.0 81920.0 131072.0) + (set! (-> v1-1 transform-index) 2) + (set-vector! (-> v1-1 local-sphere) 0.0 0.0 81920.0 122880.0) + ) + ) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate unbroken (rhino-wall) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('trigger) + (go-virtual hit) + ) + ) + ) + :code (behavior () + (add-process *gui-control* self (gui-channel art-load) (gui-action queue) (-> self anim name) -99.0 0) + (transform-post) + (suspend) + (transform-post) + (sleep-code) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hit (rhino-wall) + :virtual #t + :post (the-as (function none :behavior rhino-wall) transform-post) + ) + +;; failed to figure out what this is: +(defstate broken (rhino-wall) + :virtual #t + ) + +;; definition for method 11 of type rhino-wall +;; WARN: Return type mismatch object vs none. +(defmethod init-from-entity! rhino-wall ((obj rhino-wall) (arg0 entity-actor)) + (stack-size-set! (-> obj main-thread) 512) + (set! (-> obj mask) (logior (process-mask collectable) (-> obj mask))) + (let ((s3-0 (res-lump-struct (-> obj entity) 'art-name structure)) + (s4-0 (art-group-get-by-name *level* "skel-rhino-wall-1" (the-as (pointer uint32) #f))) + ) + (set! (-> obj art-name) (the-as string s3-0)) + (cond + ((string= (the-as string s3-0) "rhino-wall-1") + (set! (-> obj id) 1) + (let ((s4-1 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s4-1 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-1 reaction) cshape-reaction-default) + (set! (-> s4-1 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s4-1 penetrated-by) (penetrate)) + (let ((s3-1 (new 'process 'collide-shape-prim-group s4-1 (the-as uint 9) 0))) + (set! (-> s4-1 total-prims) (the-as uint 10)) + (set! (-> s3-1 prim-core collide-as) (collide-spec obstacle)) + (set! (-> s3-1 prim-core action) (collide-action solid)) + (set! (-> s3-1 transform-index) 3) + (set-vector! (-> s3-1 local-sphere) 14336.0 -8192.0 0.0 40960.0) + (set! (-> s4-1 root-prim) s3-1) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 1) (the-as uint 0)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec obstacle)) + (set! (-> v1-19 prim-core action) (collide-action solid)) + (set! (-> v1-19 transform-index) 3) + (set-vector! (-> v1-19 local-sphere) 14336.0 -8192.0 0.0 40960.0) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 8) (the-as uint 0)))) + (set! (-> v1-21 prim-core action) (collide-action solid)) + (set! (-> v1-21 transform-index) 43) + (set-vector! (-> v1-21 local-sphere) 0.0 0.0 0.0 32768.0) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 2) (the-as uint 0)))) + (set! (-> v1-23 prim-core action) (collide-action solid)) + (set! (-> v1-23 transform-index) 7) + (set-vector! (-> v1-23 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-25 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 5) (the-as uint 0)))) + (set! (-> v1-25 prim-core action) (collide-action solid)) + (set! (-> v1-25 transform-index) 12) + (set-vector! (-> v1-25 local-sphere) 8192.0 0.0 0.0 12288.0) + ) + (let ((v1-27 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 6) (the-as uint 0)))) + (set! (-> v1-27 prim-core action) (collide-action solid)) + (set! (-> v1-27 transform-index) 16) + (set-vector! (-> v1-27 local-sphere) 0.0 0.0 0.0 10240.0) + ) + (let ((v1-29 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 0) (the-as uint 0)))) + (set! (-> v1-29 prim-core action) (collide-action solid)) + (set! (-> v1-29 transform-index) 3) + (set-vector! (-> v1-29 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-31 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 4) (the-as uint 0)))) + (set! (-> v1-31 prim-core action) (collide-action solid)) + (set! (-> v1-31 transform-index) 9) + (set-vector! (-> v1-31 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-33 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 7) (the-as uint 0)))) + (set! (-> v1-33 prim-core action) (collide-action solid)) + (set! (-> v1-33 transform-index) 28) + (set-vector! (-> v1-33 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-35 (new 'process 'collide-shape-prim-mesh s4-1 (the-as uint 3) (the-as uint 0)))) + (set! (-> v1-35 prim-core action) (collide-action solid)) + (set! (-> v1-35 transform-index) 8) + (set-vector! (-> v1-35 local-sphere) 0.0 0.0 0.0 16384.0) + ) + (set! (-> s4-1 nav-radius) (* 0.75 (-> s4-1 root-prim local-sphere w))) + (let ((v1-38 (-> s4-1 root-prim))) + (set! (-> s4-1 backup-collide-as) (-> v1-38 prim-core collide-as)) + (set! (-> s4-1 backup-collide-with) (-> v1-38 prim-core collide-with)) + ) + (set! (-> obj root-override) s4-1) + ) + (set! s4-0 (art-group-get-by-name *level* "skel-rhino-wall-1" (the-as (pointer uint32) #f))) + (set! (-> obj anim) + (new 'static 'spool-anim :name "rhino-wall-1" :anim-name "1-break" :parts 2 :command-list '()) + ) + ) + ((string= (the-as string s3-0) "rhino-wall-2") + (set! (-> obj id) 2) + (let ((s4-2 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s4-2 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-2 reaction) cshape-reaction-default) + (set! (-> s4-2 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s4-2 penetrated-by) (penetrate)) + (let ((s3-2 (new 'process 'collide-shape-prim-group s4-2 (the-as uint 9) 0))) + (set! (-> s4-2 total-prims) (the-as uint 10)) + (set! (-> s3-2 prim-core collide-as) (collide-spec obstacle)) + (set! (-> s3-2 prim-core action) (collide-action solid)) + (set! (-> s3-2 transform-index) 3) + (set-vector! (-> s3-2 local-sphere) -8192.0 -4096.0 0.0 40960.0) + (set! (-> s4-2 root-prim) s3-2) + ) + (let ((v1-55 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 0) (the-as uint 0)))) + (set! (-> v1-55 prim-core collide-as) (collide-spec obstacle)) + (set! (-> v1-55 prim-core action) (collide-action solid)) + (set! (-> v1-55 transform-index) 3) + (set-vector! (-> v1-55 local-sphere) -8192.0 -4096.0 0.0 40960.0) + ) + (let ((v1-57 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 1) (the-as uint 0)))) + (set! (-> v1-57 prim-core action) (collide-action solid)) + (set! (-> v1-57 transform-index) 4) + (set-vector! (-> v1-57 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-59 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 2) (the-as uint 0)))) + (set! (-> v1-59 prim-core action) (collide-action solid)) + (set! (-> v1-59 transform-index) 7) + (set-vector! (-> v1-59 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-61 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 3) (the-as uint 0)))) + (set! (-> v1-61 prim-core action) (collide-action solid)) + (set! (-> v1-61 transform-index) 15) + (set-vector! (-> v1-61 local-sphere) 0.0 0.0 0.0 12288.0) + ) + (let ((v1-63 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 4) (the-as uint 0)))) + (set! (-> v1-63 prim-core action) (collide-action solid)) + (set! (-> v1-63 transform-index) 16) + (set-vector! (-> v1-63 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-65 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 5) (the-as uint 0)))) + (set! (-> v1-65 prim-core action) (collide-action solid)) + (set! (-> v1-65 transform-index) 26) + (set-vector! (-> v1-65 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-67 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 6) (the-as uint 0)))) + (set! (-> v1-67 prim-core action) (collide-action solid)) + (set! (-> v1-67 transform-index) 27) + (set-vector! (-> v1-67 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-69 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 7) (the-as uint 0)))) + (set! (-> v1-69 prim-core action) (collide-action solid)) + (set! (-> v1-69 transform-index) 28) + (set-vector! (-> v1-69 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-71 (new 'process 'collide-shape-prim-mesh s4-2 (the-as uint 9) (the-as uint 0)))) + (set! (-> v1-71 prim-core action) (collide-action solid)) + (set! (-> v1-71 transform-index) 58) + (set-vector! (-> v1-71 local-sphere) 0.0 12288.0 0.0 32768.0) + ) + (set! (-> s4-2 nav-radius) (* 0.75 (-> s4-2 root-prim local-sphere w))) + (let ((v1-74 (-> s4-2 root-prim))) + (set! (-> s4-2 backup-collide-as) (-> v1-74 prim-core collide-as)) + (set! (-> s4-2 backup-collide-with) (-> v1-74 prim-core collide-with)) + ) + (set! (-> obj root-override) s4-2) + ) + (set! s4-0 (art-group-get-by-name *level* "skel-rhino-wall-2" (the-as (pointer uint32) #f))) + (set! (-> obj anim) + (new 'static 'spool-anim :name "rhino-wall-2" :anim-name "2-break" :parts 1 :command-list '()) + ) + ) + (else + (go process-drawable-art-error (the-as string s3-0)) + ) + ) + (process-drawable-from-entity! obj arg0) + (initialize-skeleton obj (the-as skeleton-group s4-0) (the-as pair 0)) + ) + (if (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status subtask-complete))) + (go (method-of-object obj broken)) + (go (method-of-object obj unbroken)) + ) + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/temple/rhino_REF.gc b/test/decompiler/reference/jak2/levels/temple/rhino_REF.gc new file mode 100644 index 0000000000..eb2d1a225f --- /dev/null +++ b/test/decompiler/reference/jak2/levels/temple/rhino_REF.gc @@ -0,0 +1,2056 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defpartgroup group-rhino-slide-poof-pmt + :id 350 + :duration (seconds 0.035) + :linger-duration (seconds 1.5) + :bounds (static-bspherem 0 0 0 2) + :parts ((sp-item 1488)) + ) + +;; failed to figure out what this is: +(defpart 1488 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 6.0 6.0 1.0) + (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 64.0 1.0) + (sp-rnd-flt spt-g 70.0 32.0 1.0) + (sp-rnd-flt spt-b 40.0 20.0 1.0) + (sp-rnd-flt spt-a 16.0 16.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.0033333334) 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-rnd-flt spt-fade-a -0.07111111 -0.07111111 1.0) + (sp-flt spt-accel-y -0.27306667) + (sp-flt spt-friction 0.94) + (sp-int spt-timer 450) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14) + (sp-rnd-flt spt-conerot-x (degrees 60.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-rhino-slide-poof-grs + :id 351 + :duration (seconds 0.035) + :linger-duration (seconds 1.5) + :bounds (static-bspherem 0 0 0 2) + :parts ((sp-item 1489) (sp-item 1490)) + ) + +;; failed to figure out what this is: +(defpart 1489 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc)) + (sp-rnd-flt spt-num 6.0 6.0 1.0) + (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 96.0 32.0 1.0) + (sp-rnd-flt spt-g 128.0 32.0 1.0) + (sp-rnd-flt spt-b 0.0 64.0 1.0) + (sp-rnd-flt spt-a 16.0 16.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.0033333334) 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-rnd-flt spt-fade-a -0.07111111 -0.07111111 1.0) + (sp-flt spt-accel-y -0.27306667) + (sp-flt spt-friction 0.94) + (sp-int spt-timer 450) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14) + (sp-rnd-flt spt-conerot-x (degrees 60.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: +(defpart 1490 + :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x2f :page #xc)) + (sp-rnd-flt spt-num 0.0 8.0 1.0) + (sp-rnd-flt spt-x (meters -0.4) (meters 0.8) 1.0) + (sp-rnd-flt spt-y (meters -0.1) (meters 0.4) 1.0) + (sp-rnd-flt spt-z (meters -0.4) (meters 0.8) 1.0) + (sp-rnd-flt spt-scale-x (meters 0.15) (meters 0.35) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-scale-y (meters 0.15)) + (sp-rnd-flt spt-r 128.0 2.0 64.0) + (sp-rnd-int spt-g 1132396544 0 1.0) + (sp-rnd-flt spt-a 128.0 64.0 1.0) + (sp-rnd-flt spt-vel-y (meters 0.015) (meters 0.01) 1.0) + (sp-rnd-flt spt-rotvel-z (degrees -2.4) (degrees 4.8) 1.0) + (sp-flt spt-fade-a -0.42666668) + (sp-rnd-flt spt-accel-y -4.096 2.048 1.0) + (sp-int spt-timer 300) + (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12 sp-cpuinfo-flag-14) + (sp-rnd-flt spt-conerot-x (degrees 30.0) (degrees 50.000004) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-radius (meters 0.5)) + ) + ) + +;; failed to figure out what this is: +(defskelgroup skel-rhino rhino rhino-lod0-jg -1 + ((rhino-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 1 7) + :shadow rhino-shadow-mg + :origin-joint-index 16 + ) + +;; definition of type rhino +(deftype rhino (nav-enemy) + ((wall rhino-wall :offset-assert 604) + (path-intro path-control :offset-assert 608) + (charge-aware uint64 :offset-assert 616) + (anim-skid-left int32 :offset-assert 624) + (anim-skid-right int32 :offset-assert 628) + (anim-victory-hit int32 :offset-assert 632) + (circle-backward? symbol :offset-assert 636) + (skid-speed float :offset 672) + (angle float :offset-assert 676) + (angle-speed float :offset-assert 680) + (dest vector :inline :offset-assert 688) + (charge-straight symbol :offset-assert 704) + (in-stop-run symbol :offset-assert 708) + (smush-target smush-control :offset-assert 712) + (num-hit-flinch int32 :offset-assert 716) + (frame-die-smush float :offset-assert 720) + (quat quaternion :inline :offset-assert 736) + (can-hit? symbol :offset-assert 752) + (interest int32 :offset-assert 756) + (victory-count uint32 :offset-assert 760) + (stomach-touched-once? symbol :offset-assert 764) + ) + :heap-base #x280 + :method-count-assert 183 + :size-assert #x300 + :flag-assert #xb702800300 + (:methods + (attack () _type_ :state 178) + (stop-run () _type_ :state 179) + (run-away () _type_ :state 180) + (charge () _type_ :state 181) + (rhino-method-182 (_type_ process event-message-block) symbol 182) + ) + ) + +;; definition for method 3 of type rhino +;; ERROR: failed type prop at 48: Could not figure out load: (set! a2 (l.wu (+ gp 636))) +(defmethod inspect rhino ((a0-0 rhino)) + (local-vars + (v0-0 nav-enemy) + (v0-1 object) + (v0-2 object) + (v0-3 object) + (v0-4 object) + (v0-5 object) + (v0-6 object) + (v0-7 object) + (v0-8 none) + (v0-9 none) + (v0-10 none) + (v0-11 none) + (v0-12 none) + (v0-13 none) + (v0-14 none) + (v0-15 none) + (v0-16 none) + (v0-17 none) + (v0-18 none) + (v0-19 none) + (v0-20 none) + (v0-21 none) + (v0-22 none) + (v0-23 none) + (v0-24 rhino) + (v1-2 type) + (a0-1 rhino) + (a0-2 symbol) + (a0-3 symbol) + (a0-4 symbol) + (a0-5 symbol) + (a0-6 symbol) + (a0-7 symbol) + (a0-8 symbol) + (a0-9 symbol) + (a0-10 none) + (a0-11 none) + (a0-12 none) + (a0-13 none) + (a0-14 none) + (a0-15 none) + (a0-16 none) + (a0-17 none) + (a0-18 none) + (a0-19 none) + (a0-20 none) + (a0-21 none) + (a0-22 none) + (a0-23 none) + (a0-24 none) + (a1-0 string) + (a1-1 string) + (a1-2 string) + (a1-3 string) + (a1-4 string) + (a1-5 string) + (a1-6 string) + (a1-7 string) + (a1-8 none) + (a1-9 none) + (a1-10 none) + (a1-11 none) + (a1-12 none) + (a1-13 none) + (a1-14 none) + (a1-15 none) + (a1-16 none) + (a1-17 none) + (a1-18 none) + (a1-19 none) + (a1-20 none) + (a1-21 none) + (a1-22 none) + (a2-0 rhino-wall) + (a2-1 path-control) + (a2-2 uint) + (a2-3 int) + (a2-4 int) + (a2-5 int) + (a2-6 degrees) + (a2-7 none) + (a2-8 none) + (a2-12 none) + (a2-13 none) + (a2-14 none) + (a2-15 none) + (a2-16 none) + (a2-18 none) + (a2-19 none) + (a2-20 none) + (a2-21 none) + (a2-22 none) + (t9-0 (function nav-enemy nav-enemy)) + (t9-1 (function _varargs_ object)) + (t9-2 (function _varargs_ object)) + (t9-3 (function _varargs_ object)) + (t9-4 (function _varargs_ object)) + (t9-5 (function _varargs_ object)) + (t9-6 (function _varargs_ object)) + (t9-7 (function _varargs_ object)) + (t9-8 (function _varargs_ object)) + (t9-9 none) + (t9-10 none) + (t9-11 none) + (t9-12 none) + (t9-13 none) + (t9-14 none) + (t9-15 none) + (t9-16 none) + (t9-17 none) + (t9-18 none) + (t9-19 none) + (t9-20 none) + (t9-21 none) + (t9-22 none) + (t9-23 none) + (f0-0 degrees) + (f0-1 none) + (f0-2 none) + (f0-3 none) + (f0-4 none) + ) + (if (begin (not a0-0)) + (begin (set! a0-0 a0-0) (goto cfg-4)) + ) + (set! v1-2 nav-enemy) + (set! t9-0 (method-of-type v1-2 inspect)) + (set! a0-1 a0-0) + (call! a0-1) + (set! t9-1 format) + (set! a0-2 #t) + (set! a1-0 L303) + (set! a2-0 (-> a0-0 wall)) + (call! a0-2 a1-0 a2-0) + (set! t9-2 format) + (set! a0-3 #t) + (set! a1-1 L302) + (set! a2-1 (-> a0-0 path-intro)) + (call! a0-3 a1-1 a2-1) + (set! t9-3 format) + (set! a0-4 #t) + (set! a1-2 L301) + (set! a2-2 (-> a0-0 charge-aware)) + (call! a0-4 a1-2 a2-2) + (set! t9-4 format) + (set! a0-5 #t) + (set! a1-3 L300) + (set! a2-3 (-> a0-0 anim-skid-left)) + (call! a0-5 a1-3 a2-3) + (set! t9-5 format) + (set! a0-6 #t) + (set! a1-4 L299) + (set! a2-4 (-> a0-0 anim-skid-right)) + (call! a0-6 a1-4 a2-4) + (set! t9-6 format) + (set! a0-7 #t) + (set! a1-5 L298) + (set! a2-5 (-> a0-0 anim-victory-hit)) + (call! a0-7 a1-5 a2-5) + (set! t9-7 format) + (set! a0-8 #t) + (set! a1-6 L297) + (set! f0-0 (-> a0-0 desired-angle)) + (set! a2-6 (fpr->gpr f0-0)) + (call! a0-8 a1-6 a2-6) + (set! t9-8 format) + (set! a0-9 #t) + (set! a1-7 L296) + (set! a2-7 (the-as none (l.wu (+ a0-0 636)))) + (call!) + (set! t9-9 (the-as none format)) + (set! a0-10 (the-as none #t)) + (set! a1-8 (the-as none L295)) + (set! a2-8 (the-as none (-> a0-0 focus-pos))) + (call!) + (set! t9-10 (the-as none format)) + (set! a0-11 (the-as none #t)) + (set! a1-9 (the-as none L294)) + (set! f0-1 (the-as none (-> a0-0 skid-speed))) + (set! a2-9 (the-as none (fpr->gpr f0-1))) + (call!) + (set! t9-11 (the-as none format)) + (set! a0-12 (the-as none #t)) + (set! a1-10 (the-as none L293)) + (set! f0-2 (the-as none (-> a0-0 angle))) + (set! a2-10 (the-as none (fpr->gpr f0-2))) + (call!) + (set! t9-12 (the-as none format)) + (set! a0-13 (the-as none #t)) + (set! a1-11 (the-as none L292)) + (set! f0-3 (the-as none (-> a0-0 angle-speed))) + (set! a2-11 (the-as none (fpr->gpr f0-3))) + (call!) + (set! t9-13 (the-as none format)) + (set! a0-14 (the-as none #t)) + (set! a1-12 (the-as none L291)) + (set! a2-12 (the-as none (-> a0-0 dest))) + (call!) + (set! t9-14 (the-as none format)) + (set! a0-15 (the-as none #t)) + (set! a1-13 (the-as none L290)) + (set! a2-13 (the-as none (-> a0-0 charge-straight))) + (call!) + (set! t9-15 (the-as none format)) + (set! a0-16 (the-as none #t)) + (set! a1-14 (the-as none L289)) + (set! a2-14 (the-as none (-> a0-0 in-stop-run))) + (call!) + (set! t9-16 (the-as none format)) + (set! a0-17 (the-as none #t)) + (set! a1-15 (the-as none L288)) + (set! a2-15 (the-as none (-> a0-0 smush-target))) + (call!) + (set! t9-17 (the-as none format)) + (set! a0-18 (the-as none #t)) + (set! a1-16 (the-as none L287)) + (set! a2-16 (the-as none (-> a0-0 num-hit-flinch))) + (call!) + (set! t9-18 (the-as none format)) + (set! a0-19 (the-as none #t)) + (set! a1-17 (the-as none L286)) + (set! f0-4 (the-as none (-> a0-0 frame-die-smush))) + (set! a2-17 (the-as none (fpr->gpr f0-4))) + (call!) + (set! t9-19 (the-as none format)) + (set! a0-20 (the-as none #t)) + (set! a1-18 (the-as none L285)) + (set! a2-18 (the-as none (-> a0-0 quat))) + (call!) + (set! t9-20 (the-as none format)) + (set! a0-21 (the-as none #t)) + (set! a1-19 (the-as none L284)) + (set! a2-19 (the-as none (-> a0-0 can-hit?))) + (call!) + (set! t9-21 (the-as none format)) + (set! a0-22 (the-as none #t)) + (set! a1-20 (the-as none L283)) + (set! a2-20 (the-as none (-> a0-0 interest))) + (call!) + (set! t9-22 (the-as none format)) + (set! a0-23 (the-as none #t)) + (set! a1-21 (the-as none L282)) + (set! a2-21 (the-as none (-> a0-0 victory-count))) + (call!) + (set! t9-23 (the-as none format)) + (set! a0-24 (the-as none #t)) + (set! a1-22 (the-as none L281)) + (set! a2-22 (the-as none (-> a0-0 stomach-touched-once?))) + (call!) + (label cfg-4) + (set! v0-24 a0-0) + (ret-value v0-24) + ) + +;; definition for symbol *rhino-nav-enemy-info*, type nav-enemy-info +(define *rhino-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #f + :use-victory #t + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array uint32 8 #x1e0002 #x4010301 #x1e0002 #x4010401 #x0 #x0 #x0 #x0) + :idle-anim 3 + :notice-anim 7 + :hostile-anim 10 + :hit-anim 23 + :knocked-anim -1 + :knocked-land-anim -1 + :die-anim 14 + :die-falling-anim 14 + :victory-anim 11 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint 5 + :look-at-joint 6 + :bullseye-joint 4 + :sound-hit (static-sound-name "rhino-hit") + :sound-die (static-sound-name "rhino-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 2) + :default-hit-points 35 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-flinch #xfffffffff5dfffff + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 4) + :attack-shove-up (meters 4) + :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-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 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint 6 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 2170.88 :z 1761.28 :r 163840.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 6 + :turn-anim -1 + :run-anim 10 + :taunt-anim -1 + :run-travel-speed (meters 14) + :run-acceleration (meters 40) + :run-turning-acceleration (meters 26) + :walk-travel-speed (meters 1) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 180.0) + :notice-nav-radius (meters 4) + :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! (-> *rhino-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 182 of type rhino +(defmethod rhino-method-182 rhino ((obj rhino) (arg0 process) (arg1 event-message-block)) + (let* ((gp-0 (-> arg1 param 0)) + (s5-0 arg0) + (s2-0 (if (type? s5-0 process-drawable) + s5-0 + ) + ) + ) + (cond + ((and (-> obj can-hit?) gp-0 ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry gp-0) + (-> obj root-override2) + (the-as uint 1) + ) + ) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (gp-1 (new 'stack-no-clear 'vector)) + (s5-1 (new 'stack-no-clear 'vector)) + ) + (vector-z-quaternion! s4-0 (-> obj root-override2 quat)) + (vector-x-quaternion! gp-1 (-> obj root-override2 quat)) + (vector-! s5-1 (-> (the-as process-drawable s2-0) root trans) (-> obj root-override2 trans)) + (if (and (< 0.0 (vector-dot s5-1 s4-0)) (< (fabs (vector-dot s5-1 gp-1)) 10240.0)) + #t + #f + ) + ) + ) + (else + #f + ) + ) + ) + ) + +;; definition for method 58 of type rhino +(defmethod enemy-method-58 rhino ((obj rhino) (arg0 process) (arg1 event-message-block)) + (let ((t9-0 (method-of-type nav-enemy enemy-method-58))) + (t9-0 obj arg0 arg1) + ) + (if (rhino-method-182 obj arg0 arg1) + 'hit + 'hit-flinch + ) + ) + +;; definition for method 74 of type rhino +;; INFO: Used lq/sq +;; WARN: Return type mismatch none vs object. +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 10] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 30] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 151] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 216] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 272] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 318] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 323] +(defmethod enemy-method-74 rhino ((obj rhino) (arg0 process) (arg1 object) (arg2 symbol) (arg3 event-message-block)) + (local-vars + (sv-96 int) + (sv-112 symbol) + (sv-128 symbol) + (sv-144 symbol) + (sv-160 vector) + (sv-176 matrix) + (sv-192 int) + (sv-208 symbol) + (sv-224 symbol) + (sv-240 symbol) + (sv-256 vector) + (sv-272 matrix) + ) + (let ((v1-0 arg2)) + (the-as + object + (cond + ((= v1-0 'charge) + (if (-> obj wall) + (go (method-of-object obj charge)) + ) + ) + ((= v1-0 'hit) + (cond + ((zero? (-> obj hit-points)) + (set! (-> *rhino-nav-enemy-info* die-anim) 15) + (set! (-> obj frame-die-smush) 11.0) + (enemy-method-73 obj) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ((= v1-0 'hit-flinch) + (cond + ((zero? (-> obj hit-points)) + (set! (-> *rhino-nav-enemy-info* die-anim) 14) + (set! (-> obj frame-die-smush) 16.0) + (enemy-method-73 obj) + ) + (else + (let* ((s5-0 arg0) + (s2-0 (if (type? s5-0 process-drawable) + s5-0 + ) + ) + (s3-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s5-1 (new 'stack-no-clear 'vector)) + ) + (vector-z-quaternion! s3-0 (-> obj root-override2 quat)) + (vector-x-quaternion! s4-0 (-> obj root-override2 quat)) + (vector-! s5-1 (-> (the-as process-focusable s2-0) root-override trans) (-> obj root-override2 trans)) + (set! (-> s5-1 y) 0.0) + (vector-normalize! s5-1 1.0) + (let* ((f30-0 (vector-dot s3-0 s5-1)) + (f28-0 (vector-dot s4-0 s5-1)) + (a0-16 (cond + ((>= f30-0 (cos 8192.0)) + (-> obj draw art-group data 16) + ) + ((>= (cos 24576.0) f30-0) + (-> obj draw art-group data 19) + ) + ((>= f28-0 (cos 8192.0)) + (-> obj draw art-group data 17) + ) + ((>= (cos 24576.0) f28-0) + (-> obj draw art-group data 18) + ) + (else + (-> obj draw art-group data 16) + ) + ) + ) + (v0-9 (ja-channel-float! (the-as art-joint-anim a0-16) 0.0 0.0 0.0)) + ) + (when v0-9 + (set! (-> obj skel interp-select 0) (the-as int (the-as uint #x1c9002228))) + (set! (-> obj skel interp-select 1) 0) + (set! (-> v0-9 param 0) 1.0) + (set! (-> v0-9 param 1) 1.0) + (set! (-> v0-9 param 2) 3.0) + (set! (-> v0-9 num-func) num-func-interp1-play!) + ) + ) + ) + (+! (-> obj num-hit-flinch) 1) + 'back + ) + ) + ) + ((= v1-0 'event-slide-poof) + (let ((s5-2 (-> arg3 param 1))) + (cond + ((= (-> obj root-override2 ground-pat material) (pat-material grass)) + (let ((s4-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s4-1 + (let ((t9-14 (method-of-type part-tracker activate))) + (t9-14 (the-as part-tracker s4-1) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((s3-1 run-function-in-process) + (s2-1 s4-1) + (s1-0 part-tracker-init) + (s0-0 (-> *part-group-id-table* 351)) + ) + (set! sv-96 0) + (set! sv-112 (the-as symbol #f)) + (set! sv-128 (the-as symbol #f)) + (set! sv-144 (the-as symbol #f)) + (set! sv-176 *launch-matrix*) + (set! sv-160 (-> sv-176 trans)) + (let ((v1-52 (-> (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data s5-2)) quad))) + (set! (-> sv-160 quad) v1-52) + ) + ((the-as (function object object object object object object object object none) s3-1) + s2-1 + s1-0 + s0-0 + sv-96 + sv-112 + sv-128 + sv-144 + sv-176 + ) + ) + (-> s4-1 ppointer) + ) + ) + ) + (else + (let ((s4-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when s4-2 + (let ((t9-18 (method-of-type part-tracker activate))) + (t9-18 (the-as part-tracker s4-2) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((s3-2 run-function-in-process) + (s2-2 s4-2) + (s1-1 part-tracker-init) + (s0-1 (-> *part-group-id-table* 350)) + ) + (set! sv-192 0) + (set! sv-208 (the-as symbol #f)) + (set! sv-224 (the-as symbol #f)) + (set! sv-240 (the-as symbol #f)) + (set! sv-272 *launch-matrix*) + (set! sv-256 (-> sv-272 trans)) + (let ((v1-64 (-> (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data s5-2)) quad))) + (set! (-> sv-256 quad) v1-64) + ) + ((the-as (function object object object object object object object object none) s3-2) + s2-2 + s1-1 + s0-1 + sv-192 + sv-208 + sv-224 + sv-240 + sv-272 + ) + ) + (-> s4-2 ppointer) + ) + ) + ) + ) + ) + ) + ((= v1-0 'interesting) + (+! (-> obj interest) 1) + (let ((v1-67 (process->ppointer obj))) + (set-setting! 'handle-of-interest v1-67 0 (-> v1-67 0 pid)) + ) + ) + ((= v1-0 'uninteresting) + (+! (-> obj interest) -1) + (when (<= (-> obj interest) 0) + (set! (-> obj interest) 0) + (remove-setting! 'handle-of-interest) + ) + ) + ((= v1-0 'death-end) + (let ((v1-74 (-> obj root-override2 root-prim))) + (set! (-> v1-74 prim-core collide-as) (collide-spec)) + (set! (-> v1-74 prim-core collide-with) (collide-spec)) + ) + 0 + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + (else + ((method-of-type nav-enemy enemy-method-74) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + ) + +;; failed to figure out what this is: +(defstate idle (rhino) + :virtual #t + :enter (behavior () + (remove-setting! 'sound-mode) + (remove-setting! 'sound-excitement) + (set! (-> self interest) 0) + (let ((t9-2 (-> (method-of-type nav-enemy idle) enter))) + (if t9-2 + (t9-2) + ) + ) + (logclear! (-> self enemy-flags) (enemy-flag enable-on-active)) + (none) + ) + :exit (behavior () + (local-vars (v0-1 enemy-flag)) + (let ((t9-0 (-> (method-of-type nav-enemy idle) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 (-> self enemy-flags))) + (if (logtest? v1-4 (enemy-flag checking-water)) + (set! v0-1 (logior v1-4 (enemy-flag enable-on-active))) + (set! v0-1 (logclear v1-4 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v0-1) + (none) + ) + :trans (behavior () + (cond + ((-> self wall) + (debug-draw (-> self path-intro)) + (when (and (>= (the-as int (-> self focus aware)) (the-as int (-> self charge-aware))) + *target* + (and (>= 122880.0 (vector-vector-distance (-> self root-override2 trans) (-> *target* control trans))) + (zero? (logand (focus-status teleporting) (-> *target* focus-status))) + ) + ) + (process-entity-status! self (entity-perm-status subtask-complete) #t) + (go-virtual charge) + ) + ) + (else + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self state-timeout))) + (> (the-as int (-> self focus aware)) 0) + ) + (go-virtual active) + ) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate die (rhino) + :virtual #t + :enter (behavior () + (remove-setting! 'sound-mode) + (enemy-method-132 self) + (set! (-> self hit-points) 0) + 0 + (none) + ) + :code (behavior () + (set! (-> self smush-target) (the-as smush-control #t)) + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2)) + (gp-0 #t) + ) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override die-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override die-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and gp-0 (>= (ja-frame-num 0) (-> self frame-die-smush))) + (activate! *camera-smush-control* 819.2 37 600 1.0 0.1 (-> self clock)) + (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 204 (seconds 0.5)) + (set! gp-0 #f) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (send-event self 'death-end) + (while (-> self child) + (suspend) + ) + (cleanup-for-death self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hit (rhino) + :virtual #t + :code (behavior () + (local-vars (v1-67 enemy-flag) (v1-75 enemy-flag)) + (ja-channel-push! 1 (seconds 0.2)) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override hit-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override hit-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (let ((gp-0 #t)) + (ja-no-eval :group! rhino-victory-hit2-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-victory-hit2-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and gp-0 (>= (ja-frame-num 0) 5.0)) + (activate! *camera-smush-control* 819.2 37 600 1.0 0.1 (-> self clock)) + (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 204 (seconds 0.5)) + (set! gp-0 #f) + ) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.075)) + (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-66 (-> self enemy-flags))) + (if (logtest? v1-66 (enemy-flag checking-water)) + (set! v1-67 (logior v1-66 (enemy-flag enable-on-active))) + (set! v1-67 (logclear v1-66 (enemy-flag enable-on-active))) + ) + ) + (set! (-> self enemy-flags) v1-67) + (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-74 (-> self enemy-flags))) + (if (logtest? (enemy-flag no-initial-move-to-ground) v1-74) + (set! v1-75 (logior (enemy-flag check-water-backup) v1-74)) + (set! v1-75 (logclear v1-74 (enemy-flag check-water-backup))) + ) + ) + (set! (-> self enemy-flags) v1-75) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (logclear! (-> self focus-status) (focus-status hit)) + (go-hostile self) + (none) + ) + ) + +;; definition for method 56 of type rhino +(defmethod enemy-method-56 rhino ((obj rhino) (arg0 process) (arg1 event-message-block)) + (-> arg1 param 1) + (let ((f30-0 (the float (penetrate-using->damage (the-as penetrate (-> obj incoming penetrate-using)))))) + (cond + ((rhino-method-182 obj arg0 arg1) + (set! (-> obj stomach-touched-once?) #t) + (the int (* 4.0 f30-0)) + ) + ((logtest? #xc0000 (-> obj incoming penetrate-using)) + (if (and (logtest? #x40000 (-> obj incoming penetrate-using)) + (logtest? #x80000 (-> obj incoming penetrate-using)) + ) + #x420c0000 + (the int (* 1.8 f30-0)) + ) + ) + ((logtest? #x20000 (-> obj incoming penetrate-using)) + (the int (* 2.0 f30-0)) + ) + (else + (the int (* 0.5 f30-0)) + ) + ) + ) + ) + +;; definition for method 75 of type rhino +;; WARN: Return type mismatch symbol vs none. +(defmethod enemy-method-75 rhino ((obj rhino) (arg0 process) (arg1 touching-shapes-entry)) + (let* ((s5-0 (-> arg1 handle1)) + (s3-0 arg0) + (v1-0 (if (type? s3-0 process-focusable) + s3-0 + ) + ) + ) + (when (and s5-0 v1-0) + (cond + ((and (logtest? (-> obj focus-status) (focus-status dangerous)) + ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s5-0) + (-> obj root-override2) + (collide-action deadly) + (collide-action) + ) + ) + (let ((a3-2 (if ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s5-0) + (-> obj root-override2) + (collide-action persistent-attack) + (collide-action) + ) + (-> obj persistent-attack-id) + (-> obj attack-id) + ) + ) + ) + (enemy-method-104 obj arg0 (the-as uint s5-0) a3-2) + ) + ) + (((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s5-0) + (-> obj root-override2) + (collide-action no-standon) + (collide-action) + ) + (send-shoves (-> obj root-override2) arg0 (the-as touching-shapes-entry s5-0) 0.7 6144.0 16384.0) + ) + ) + ) + ) + (none) + ) + +;; definition for method 104 of type rhino +;; INFO: Used lq/sq +(defmethod enemy-method-104 rhino ((obj rhino) (arg0 process) (arg1 uint) (arg2 uint)) + (if (and (-> obj next-state) (= (-> obj next-state name) 'victory)) + 'attack-or-shove + 'attack + ) + (let* ((s2-0 (if (-> obj smush-target) + 'smush + (-> obj enemy-info-override attack-mode) + ) + ) + (s1-0 arg0) + (a0-3 (if (type? s1-0 process-focusable) + s1-0 + ) + ) + (s1-1 (new 'stack-no-clear 'vector)) + ) + (vector-! s1-1 (get-trans (the-as process-focusable a0-3) 0) (-> obj root-override2 trans)) + (set! (-> s1-1 y) 0.0) + (vector-normalize! s1-1 1.0) + (vector+float*! s1-1 s1-1 (-> obj root-override2 transv) 0.5) + (set! (-> s1-1 y) 20480.0) + (let ((a1-6 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-6 from) (process->ppointer self)) + (set! (-> a1-6 num-params) 2) + (set! (-> a1-6 message) 'attack) + (set! (-> a1-6 param 0) arg1) + (let ((v1-16 (new 'static 'attack-info :mask (attack-info-mask vector mode angle id)))) + (set! (-> v1-16 id) arg2) + (set! (-> v1-16 angle) 'front) + (set! (-> v1-16 vector quad) (-> s1-1 quad)) + (set! (-> v1-16 mode) s2-0) + (set! (-> a1-6 param 1) (the-as uint v1-16)) + ) + (when (send-event-function arg0 a1-6) + (enemy-method-105 obj arg0) + #t + ) + ) + ) + ) + +;; failed to figure out what this is: +(defstate active (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate notice (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy notice) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate victory (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy victory) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-as) + (collide-spec) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-with) + (collide-spec) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core action) + (collide-action deadly) + ) + (set! (-> self can-hit?) #t) + (let ((v1-13 (-> self nav state))) + (set! (-> v1-13 speed) 0.0) + ) + 0 + (+! (-> self victory-count) 1) + (if (and (= (-> self victory-count) 3) (not (-> self stomach-touched-once?))) + (talker-spawn-func (-> *talker-speech* 59) *entity-pool* (target-pos 0) (the-as region #f)) + ) + (none) + ) + :exit (behavior () + (set! (-> self can-hit?) #f) + (set! (-> self smush-target) #f) + (let ((t9-0 (-> (method-of-type nav-enemy victory) exit))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-as) + (collide-spec) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-with) + (collide-spec) + ) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (ja-no-eval :group! rhino-victory-begin-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-victory-begin-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-as) + (collide-spec enemy) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core collide-with) + (collide-spec jak bot player-list) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core action) + (collide-action solid no-standon) + ) + (until #f + (ja-no-eval :group! rhino-victory-loop-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-victory-loop-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (cond + (gp-0 + (if (or (< 10240.0 + (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + ) + (and gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (goto cfg-25) + ) + ) + (else + (goto cfg-25) + ) + ) + ) + ) + #f + (label cfg-25) + (set! (-> self can-hit?) #f) + (set! (-> self smush-target) (the-as smush-control #t)) + (let* ((v1-68 *game-info*) + (a0-24 (+ (-> v1-68 attack-id) 1)) + ) + (set! (-> v1-68 attack-id) a0-24) + (set! (-> self attack-id) a0-24) + ) + (set! (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 1 prim-core action) + (collide-action deadly) + ) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-72 *game-info*) + (a0-29 (+ (-> v1-72 attack-id) 1)) + ) + (set! (-> v1-72 attack-id) a0-29) + (set! (-> self attack-id) a0-29) + ) + (let ((gp-1 #t)) + (ja-no-eval :group! rhino-victory-end-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-victory-end-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and gp-1 (>= (ja-frame-num 0) 12.0)) + (activate! *camera-smush-control* 819.2 37 600 1.0 0.1 (-> self clock)) + (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 204 (seconds 0.5)) + (set! gp-1 #f) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (let ((a0-37 (handle->process (-> self focus handle)))) + (cond + (a0-37 + (cond + ((< 22528.0 + (vector-vector-xz-distance (get-trans (the-as process-focusable a0-37) 0) (-> self root-override2 trans)) + ) + (ja-channel-push! 1 (seconds 0.075)) + (enemy-method-72 self) + ) + (else + (go-virtual run-away) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.075)) + (enemy-method-72 self) + ) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate run-away (rhino) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rhino) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (nav-enemy-method-166 self) + (let ((v1-4 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-4 enemy-flags))) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-4 enemy-flags)))) + ) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-4 enemy-flags)))) + (set! (-> v1-4 nav callback-info) (-> v1-4 enemy-info-override callback-info)) + ) + 0 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-7 enemy-flags)))) + ) + 0 + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (let ((s5-0 (-> self path curve num-cverts))) + (if (<= s5-0 0) + (go process-drawable-art-error "no path") + ) + 0 + (let ((f30-0 0.0) + (s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (dotimes (s3-0 s5-0) + (get-point-in-path! (-> self path) s4-0 (the float s3-0) 'interp) + (let ((f0-2 (vector-vector-xz-distance s4-0 (-> self root-override2 trans)))) + (when (< f30-0 f0-2) + (set! f30-0 f0-2) + (set! (-> gp-0 quad) (-> s4-0 quad)) + ) + ) + ) + (let ((v1-25 (-> self nav state))) + (logclear! (-> v1-25 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-25 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-25 target-post quad) (-> gp-0 quad)) + ) + ) + ) + 0 + (none) + ) + :trans (behavior () + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1.5)) + (go-virtual active) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.05)) + (until #f + (ja-no-eval :group! rhino-charge-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-charge-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (suspend) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-travel-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (rhino) + :virtual #t + :enter (behavior () + (set-setting! 'sound-mode #f 0 1) + (set-setting! 'sound-excitement 'abs 0 0) + (let ((t9-2 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-2 + (t9-2) + ) + ) + (set! (-> self charge-straight) #f) + (nav-enemy-method-166 self) + (set! (-> self state-time) (-> self clock frame-counter)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((s3-0 (handle->process (-> self focus handle)))) + (when s3-0 + (let ((s2-0 (get-trans (the-as process-focusable s3-0) 0)) + (s5-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + 0.0 + 0.0 + (vector-z-quaternion! s5-0 (-> self root-override2 quat)) + (vector-! s1-0 s2-0 (-> self root-override2 trans)) + (let ((f28-0 (vector-dot s1-0 s5-0))) + (vector-normalize! s1-0 1.0) + (let ((f30-0 (vector-dot s1-0 s5-0))) + (vector-! gp-0 s2-0 (-> self root-override2 trans)) + (vector-normalize! gp-0 (+ 16384.0 (vector-length gp-0))) + (vector+! s4-0 (-> self root-override2 trans) gp-0) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + (if (and (< (vector-vector-xz-distance (get-trans (the-as process-focusable s3-0) 0) (-> self root-override2 trans)) + 40960.0 + ) + (< 0.9 f30-0) + ) + (set! (-> self charge-straight) #t) + ) + ) + (cond + ((-> self charge-straight) + (cond + ((>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self reaction-time))) + (if (< (vector-vector-xz-distance (get-trans (the-as process-focusable s3-0) 0) (-> self root-override2 trans)) + 20480.0 + ) + (go-virtual attack) + ) + (when (and (< f30-0 0.7) (>= 9.0 (ja-frame-num 0))) + (set! (-> self charge-straight) #f) + (go-virtual stop-run) + ) + ) + (else + (set! (-> self dest quad) (-> s4-0 quad)) + ) + ) + ) + ((and (< f28-0 8192.0) + (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 2)) (>= 9.0 (ja-frame-num 0))) + ) + (go-virtual stop-run) + ) + (else + (set! (-> self dest quad) (-> s4-0 quad)) + ) + ) + ) + ) + (vector-float*! gp-0 s5-0 40960.0) + (let* ((s5-1 (-> self nav)) + (v1-67 s5-1) + (a0-31 (-> self root-override2 trans)) + (a1-12 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-12 point) a0-31 (-> v1-67 state mesh bounds)) + (set! (-> a1-12 y-threshold) (-> v1-67 nearest-y-threshold)) + (set! (-> a1-12 ignore) (the-as uint 2)) + (let ((s3-1 (find-poly-containing-point-local (-> v1-67 state mesh) a1-12)) + (s4-2 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (when s3-1 + (clamp-vector-to-mesh-no-gaps s5-1 (-> self root-override2 trans) s3-1 gp-0 s4-2) + (when (-> s4-2 found-boundary) + (if (and (< (vector-length gp-0) 32768.0) (and (-> self charge-straight) (>= 9.0 (ja-frame-num 0)))) + (go-virtual stop-run) + ) + ) + ) + ) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! (-> self draw art-group data (-> self enemy-info-override hostile-anim))) + (ja :num-func num-func-identity :frame-num 0.0) + (let ((f30-0 (get-rand-float-range self 0.9 1.1))) + (until #f + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 (-> self dest)) + ) + (logclear! (-> a0-0 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-0 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-0 target-post quad) (-> v1-1 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (rhino) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rhino) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-4 *game-info*) + (a0-2 (+ (-> v1-4 attack-id) 1)) + ) + (set! (-> v1-4 attack-id) a0-2) + (set! (-> self attack-id) a0-2) + ) + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (nav-enemy-method-166 self) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (new 'stack-no-clear 'vector) + (vector-z-quaternion! gp-0 (-> self root-override2 quat)) + (vector-float*! gp-0 gp-0 40960.0) + (vector+! (-> self dest) (-> self root-override2 trans) gp-0) + ) + (let ((a0-10 (-> self nav state)) + (v1-17 (-> self dest)) + ) + (logclear! (-> a0-10 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-10 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-10 target-post quad) (-> v1-17 quad)) + ) + 0 + (none) + ) + :exit (behavior () + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (enemy-method-49 self) + (none) + ) + :code (behavior () + (let ((gp-0 #f)) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! rhino-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-attack-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (if (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (set! gp-0 #t) + ) + (suspend) + (ja :num! (seek!)) + ) + (if gp-0 + (go-virtual victory) + (go-hostile self) + ) + ) + (none) + ) + :post (the-as (function none :behavior rhino) nav-enemy-travel-post) + ) + +;; definition for method 142 of type rhino +;; WARN: Return type mismatch int vs none. +(defmethod nav-enemy-method-142 rhino ((obj rhino) (arg0 nav-control)) + (if (-> obj in-stop-run) + (quaternion*! + (-> obj root-override2 quat) + (-> obj quat) + (quaternion-axis-angle! (new 'stack-no-clear 'quaternion) 0.0 1.0 0.0 (* 182.04445 (* 180.0 (-> obj angle)))) + ) + ((method-of-type nav-enemy nav-enemy-method-142) obj arg0) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate stop-run (rhino) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rhino) enemy-event-handler) + :enter (behavior () + (let ((gp-0 (new 'stack-no-clear 'vector))) + (new 'stack-no-clear 'vector) + (vector-z-quaternion! gp-0 (-> self root-override2 quat)) + (vector-float*! gp-0 gp-0 40960.0) + (vector+! (-> self dest) (-> self root-override2 trans) gp-0) + (let* ((s5-0 (-> self nav)) + (v1-6 s5-0) + (a0-5 (-> self root-override2 trans)) + (a1-3 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-3 point) a0-5 (-> v1-6 state mesh bounds)) + (set! (-> a1-3 y-threshold) (-> v1-6 nearest-y-threshold)) + (set! (-> a1-3 ignore) (the-as uint 2)) + (let ((s3-0 (find-poly-containing-point-local (-> v1-6 state mesh) a1-3)) + (s4-0 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (when s3-0 + (clamp-vector-to-mesh-no-gaps s5-0 (-> self root-override2 trans) s3-0 gp-0 s4-0) + (if (-> s4-0 found-boundary) + (vector+! (-> self dest) (-> self root-override2 trans) gp-0) + ) + ) + ) + ) + ) + (let ((a0-12 (-> self nav state)) + (v1-18 (-> self dest)) + ) + (logclear! (-> a0-12 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-12 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-12 target-post quad) (-> v1-18 quad)) + ) + 0 + (set! (-> self skid-speed) 57344.0) + (set! (-> self in-stop-run) #t) + (quaternion-copy! (-> self quat) (-> self root-override2 quat)) + (set! (-> self angle) 0.0) + (set! (-> self angle-speed) 0.0) + (set! (-> self num-hit-flinch) 0) + 0 + (none) + ) + :exit (behavior () + (let ((v1-1 (-> self nav state))) + (set! (-> v1-1 speed) 0.0) + ) + 0 + (let ((v1-3 (-> self nav))) + (set! (-> v1-3 target-speed) (-> self enemy-info-override walk-travel-speed)) + ) + 0 + (set! (-> self in-stop-run) #f) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! rhino-skid-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-skid-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (set! (-> self skid-speed) (fmax 0.0 (- (-> self skid-speed) (* 32768.0 (-> self clock seconds-per-frame))))) + (suspend) + (ja :num! (seek!)) + ) + (let ((a0-5 (handle->process (-> self focus handle))) + (v1-30 0) + ) + (when a0-5 + (let ((s5-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + 0.0 + (vector-! s5-0 (get-trans (the-as process-focusable a0-5) 0) (-> self root-override2 trans)) + (vector-normalize! s5-0 1.0) + (vector-x-quaternion! gp-0 (-> self root-override2 quat)) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (set! (-> self angle-speed) (* 0.5 (- 1.0 (vector-dot s5-0 s4-0)))) + (set! v1-30 (cond + ((< (vector-dot s5-0 gp-0) 0.0) + (set! v1-30 (-> self anim-skid-right)) + (set! (-> self angle-speed) (- (-> self angle-speed))) + v1-30 + ) + (else + (-> self anim-skid-left) + ) + ) + ) + ) + ) + (ja-no-eval :group! (-> self draw art-group data v1-30) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data v1-30)) frames num-frames) -1))) + :frame-num 0.0 + ) + ) + (until (ja-done? 0) + (set! (-> self skid-speed) (fmax 0.0 (- (-> self skid-speed) (* 32768.0 (-> self clock seconds-per-frame))))) + (let ((v1-45 (-> self nav))) + (set! (-> v1-45 target-speed) (-> self skid-speed)) + ) + 0 + (if (and (>= (ja-frame-num 0) 0.0) (>= 15.0 (ja-frame-num 0))) + (+! (-> self angle) (* (-> self angle-speed) (-> self clock seconds-per-frame))) + ) + (let ((a0-20 (-> self nav state)) + (v1-54 (-> self dest)) + ) + (logclear! (-> a0-20 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-20 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-20 target-post quad) (-> v1-54 quad)) + ) + 0 + (suspend) + (ja :num! (seek!)) + ) + (if (zero? (-> self num-hit-flinch)) + (go-virtual victory) + (go-virtual hostile) + ) + (none) + ) + :post (the-as (function none :behavior rhino) nav-enemy-travel-post) + ) + +;; failed to figure out what this is: +(defstate charge (rhino) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior rhino) enemy-event-handler) + :enter (behavior () + (set-setting! 'sound-mode #f 0 1) + (set-setting! 'sound-excitement 'abs 0 0) + (set! (-> self state-time) (-> self clock frame-counter)) + (nav-enemy-method-166 self) + (let ((v1-8 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-8 enemy-flags))) + (set! (-> v1-8 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-8 enemy-flags)))) + ) + (set! (-> v1-8 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-8 enemy-flags)))) + (set! (-> v1-8 nav callback-info) (-> v1-8 enemy-info-override callback-info)) + ) + 0 + (let ((v1-11 self)) + (set! (-> v1-11 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-11 enemy-flags)))) + ) + 0 + (let* ((gp-0 (get-point-in-path! (-> self path-intro) (new 'stack-no-clear 'vector) 0.0 'exact)) + (v1-15 (get-point-in-path! (-> self path-intro) (new 'stack-no-clear 'vector) 1.0 'exact)) + (s5-1 (vector-! (new 'stack-no-clear 'vector) v1-15 gp-0)) + ) + (set! (-> s5-1 y) 0.0) + (vector-xz-normalize! s5-1 163840.0) + (vector+! (-> self dest) gp-0 s5-1) + ) + (none) + ) + :exit (behavior () + (set! (-> self wall) #f) + (none) + ) + :code (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) 'trigger) + (let ((t9-0 send-event-function) + (v1-2 (-> self wall)) + ) + (t9-0 + (if v1-2 + (-> v1-2 child 3) + ) + a1-0 + ) + ) + ) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! rhino-attack-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-attack-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (ja-channel-push! 1 (seconds 0.05)) + (ja-no-eval :group! rhino-charge-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-charge-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (ja-no-eval :group! rhino-charge-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim rhino-charge-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual victory) + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 (-> self dest)) + ) + (logclear! (-> a0-0 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-0 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-0 target-post quad) (-> v1-1 quad)) + ) + 0 + (nav-enemy-travel-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate stare (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy stare) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-4 self)) + (set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + ) + +;; failed to figure out what this is: +(defstate circling (rhino) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy circling) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self nav state))) + (set! (-> v1-5 speed) 0.0) + ) + 0 + (none) + ) + :code (behavior () + (let ((v1-2 (ja-group))) + (when (and v1-2 (= v1-2 (-> self draw art-group data (-> self enemy-info-override walk-anim)))) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + ) + ) + (until #f + (let ((v1-15 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-15 enemy-flags))) + (set! (-> v1-15 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-15 enemy-flags)))) + ) + (set! (-> v1-15 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-15 enemy-flags)))) + (set! (-> v1-15 nav callback-info) (-> v1-15 enemy-info-override callback-info)) + ) + 0 + (let ((v1-18 self)) + (set! (-> v1-18 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-18 enemy-flags)))) + ) + 0 + (let ((v1-20 (-> self nav))) + (set! (-> v1-20 target-speed) 4096.0) + ) + 0 + (let ((v1-22 (-> self nav))) + (set! (-> v1-22 acceleration) (-> self enemy-info-override run-acceleration)) + ) + 0 + (let ((v1-24 (-> self nav))) + (set! (-> v1-24 turning-acceleration) (-> self enemy-info-override run-turning-acceleration)) + ) + 0 + (let ((gp-0 (-> self draw art-group data (-> self enemy-info-override walk-anim)))) + (let ((v1-32 (ja-group))) + (if (not (and v1-32 (= v1-32 gp-0))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (let ((s5-0 (get-rand-int self 8)) + (f30-0 (get-rand-float-range self 0.9 1.1)) + ) + (while (nonzero? s5-0) + (+! s5-0 -1) + (ja-no-eval :group! gp-0 + :num! (seek! (the float (+ (-> (the-as art-joint-anim gp-0) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + ) + (when (< 20480.0 (vector-vector-xz-distance (-> self focus-pos) (-> self root-override2 trans))) + (let ((v1-59 self)) + (set! (-> v1-59 enemy-flags) (the-as enemy-flag (logclear (-> v1-59 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-59 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-62 self)) + (set! (-> v1-62 enemy-flags) (the-as enemy-flag (logclear (-> v1-62 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (vector-reset! (-> self root-override2 transv)) + (let ((v1-68 (ja-group))) + (if (not (and v1-68 (= v1-68 (-> self draw art-group data (-> self enemy-info-override victory-anim))))) + (ja-channel-push! 1 (seconds 0.1)) + ) + ) + (let ((f30-2 (get-rand-float-range self 0.9 1.1))) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override victory-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override victory-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-2 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-2)) + ) + ) + ) + ) + #f + (none) + ) + ) + +;; definition for method 114 of type rhino +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-114 rhino ((obj rhino)) + "@abstract" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate)) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 6) 0))) + (set! (-> s5-0 total-prims) (the-as uint 7)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid semi-solid deadly no-standon)) + (set! (-> s4-0 transform-index) 4) + (set-vector! (-> s4-0 local-sphere) 0.0 -2048.0 0.0 27648.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak bot crate hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-13 transform-index) 4) + (set-vector! (-> v1-13 local-sphere) 0.0 0.0 0.0 8192.0) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 1)))) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-15 transform-index) 4) + (set-vector! (-> v1-15 local-sphere) 0.0 0.0 2048.0 10240.0) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-17 prim-core collide-with) (collide-spec backgnd jak bot crate hit-by-others-list player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-17 transform-index) 16) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 6144.0) + ) + (let ((v1-19 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 2)))) + (set! (-> v1-19 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-19 prim-core action) (collide-action semi-solid deadly)) + (set! (-> v1-19 transform-index) 6) + (set-vector! (-> v1-19 local-sphere) 0.0 -2048.0 0.0 7372.8) + ) + (let ((v1-21 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-21 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-21 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-21 prim-core action) (collide-action deadly persistent-attack)) + (set! (-> v1-21 transform-index) 4) + (set-vector! (-> v1-21 local-sphere) 0.0 0.0 -3072.0 4915.2) + ) + (let ((v1-23 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-23 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-23 prim-core collide-with) (collide-spec jak bot player-list)) + (set! (-> v1-23 prim-core action) (collide-action deadly persistent-attack)) + (set! (-> v1-23 transform-index) 21) + (set-vector! (-> v1-23 local-sphere) 0.0 2252.8 0.0 3276.8) + ) + (set! (-> s5-0 nav-radius) 3686.4) + (let ((v1-25 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-25 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-25 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 rhino +;; WARN: Return type mismatch process-focusable vs rhino. +(defmethod relocate rhino ((obj rhino) (arg0 int)) + (if (nonzero? (-> obj path-intro)) + (&+! (-> obj path-intro) arg0) + ) + (the-as + rhino + ((the-as (function process-focusable int process-focusable) (find-parent-method rhino 7)) obj arg0) + ) + ) + +;; definition for method 115 of type rhino +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-115 rhino ((obj rhino)) + "@abstract" + (stack-size-set! (-> obj main-thread) 256) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-rhino" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj skel generate-frame-function) create-interpolated2-joint-animation-frame) + (enemy-method-113 obj *rhino-nav-enemy-info*) + (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-vector! (-> v1-8 twist-max) 10922.667 12743.111 0.0 1.0) + (set! (-> v1-8 ignore-angle) 18204.445) + ) + (set! (-> obj wall) #f) + (set! (-> obj wall) (the-as rhino-wall (entity-actor-lookup (-> obj entity) 'alt-actor 0))) + (when (-> obj wall) + (set! (-> obj path-intro) (new 'process 'path-control obj 'intro 0.0 (-> obj entity) #f)) + (if (-> obj path-intro) + (logior! (-> obj path-intro flags) (path-control-flag display draw-line draw-point draw-text)) + ) + (when (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status subtask-complete))) + (format #t "~S : sub task done~%" (-> obj name)) + (get-point-in-path! (-> obj path-intro) (-> obj root-override2 trans) 1.0 'exact) + (set! (-> obj wall) #f) + ) + ) + (set! (-> obj charge-aware) (the-as uint 1)) + (if (>= (res-lump-value (-> obj entity) 'extra-id int :default (the-as uint128 -1) :time -1000000000.0) 0) + (set! (-> obj charge-aware) (the-as uint 2)) + ) + (set! (-> obj charge-straight) #f) + (set! (-> obj in-stop-run) #f) + (set! (-> obj smush-target) #f) + (set! (-> obj num-hit-flinch) 0) + (set! (-> obj can-hit?) #f) + (set! (-> obj anim-skid-left) 21) + (set! (-> obj anim-skid-right) 22) + (set! (-> obj anim-victory-hit) 23) + (set! (-> obj interest) 0) + (set! (-> obj victory-count) (the-as uint 0)) + (set! (-> obj stomach-touched-once?) #f) + (add-connection + *part-engine* + obj + 6 + obj + 318 + (new 'static 'vector :x 1433.6 :y -1105.92 :z 1925.12 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 6 + obj + 318 + (new 'static 'vector :x -1433.6 :y -1105.92 :z 1925.12 :w 163840.0) + ) + (let ((v1-38 (-> obj nav))) + (set! (-> v1-38 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (logior! (-> obj nav flags) (nav-control-flag momentum-ignore-heading)) + (logior! (-> obj focus-status) (focus-status dangerous)) + (logior! (-> obj enemy-flags) (enemy-flag check-water)) + 0 + (none) + ) diff --git a/test/offline/config/jak2/config.jsonc b/test/offline/config/jak2/config.jsonc index 2daede312e..192ad8878a 100644 --- a/test/offline/config/jak2/config.jsonc +++ b/test/offline/config/jak2/config.jsonc @@ -264,12 +264,17 @@ "(method 43 nav-mesh)", "(method 34 nav-mesh)", "(method 18 nav-control)", - "(method 10 idle-control)" // re-assigns `self` + "(method 10 idle-control)", // re-assigns `self` + + "(method 3 rhino)" ], "skip_compile_states": { "(idle process-taskable)": ["event"], "(impact gun-dark-shot)": ["code"], - "(target-gun-stance target)": ["code"] + "(target-gun-stance target)": ["code"], + "(hostile hopper)": ["trans"], // adds b! but the corresponding label is missing + "(broken rhino-wall)": ["code"], // missing cast to art-joint-anim + "(hit rhino-wall)": ["code"] // missing cast to art-joint-anim } }