From 4ee402984f356187c7dde04d07fde251c589e6ee Mon Sep 17 00:00:00 2001 From: Hat Kid <6624576+Hat-Kid@users.noreply.github.com> Date: Wed, 8 Feb 2023 01:56:06 +0100 Subject: [PATCH] decomp: `citizen-*` files, `metalhead-*` files, `civilian`, `guard`, `hal3-course` (#2194) No more ghost town! Manual patches: - `hal3-course`: In `(anon-function 17 hal3-course)`, the decompiler is doing something strange with `s3-0` that fails to compile, so I just removed the `set!` and inlined the condition in the `when`. - `guard`: Rewrote `(.mula.s)` stuff --- decompiler/analysis/variable_naming.cpp | 4 +- decompiler/config/jak2/all-types.gc | 281 +- .../jak2/anonymous_function_types.jsonc | 6 +- decompiler/config/jak2/hacks.jsonc | 7 +- decompiler/config/jak2/label_types.jsonc | 30 +- decompiler/config/jak2/stack_structures.jsonc | 75 +- decompiler/config/jak2/type_casts.jsonc | 480 +- decompiler/config/jak2/var_names.jsonc | 13 + goal_src/jak2/engine/ai/traffic-h.gc | 6 +- goal_src/jak2/engine/sound/speech-h.gc | 1 - .../jak2/levels/city/common/citizen-chick.gc | 746 ++- .../jak2/levels/city/common/citizen-enemy.gc | 313 +- .../jak2/levels/city/common/citizen-fat.gc | 827 +++- goal_src/jak2/levels/city/common/citizen-h.gc | 50 +- .../jak2/levels/city/common/citizen-norm.gc | 933 +++- goal_src/jak2/levels/city/common/citizen.gc | 1615 +++++++ goal_src/jak2/levels/city/common/civilian.gc | 2259 ++++++++- goal_src/jak2/levels/city/common/guard.gc | 4142 +++++++++++++++- .../levels/city/common/metalhead-flitter.gc | 1194 ++++- .../levels/city/common/metalhead-grunt.gc | 1397 +++++- .../levels/city/common/metalhead-predator.gc | 1201 ++++- .../levels/city/common/traffic-engine-h.gc | 2 +- .../jak2/levels/city/common/traffic-engine.gc | 120 +- .../levels/city/common/traffic-manager.gc | 8 +- goal_src/jak2/levels/city/common/transport.gc | 2 +- .../jak2/levels/city/common/vehicle-guard.gc | 4 +- .../jak2/levels/city/common/vehicle-rider.gc | 2 +- .../city/misc/delivery/delivery-task.gc | 4 +- .../jak2/levels/city/slums/kor/hal3-course.gc | 747 +++ .../jak2/levels/common/guard-projectile.gc | 17 +- .../reference/jak2/engine/ai/traffic-h_REF.gc | 4 +- .../levels/city/common/citizen-chick_REF.gc | 778 +++ .../levels/city/common/citizen-enemy_REF.gc | 357 ++ .../levels/city/common/citizen-fat_REF.gc | 867 ++++ .../jak2/levels/city/common/citizen-h_REF.gc | 50 +- .../levels/city/common/citizen-norm_REF.gc | 980 ++++ .../jak2/levels/city/common/citizen_REF.gc | 1716 +++++++ .../jak2/levels/city/common/civilian_REF.gc | 2386 ++++++++++ .../levels/city/common/ctywide-tasks_REF.gc | 2 +- .../jak2/levels/city/common/guard_REF.gc | 4240 +++++++++++++++++ .../city/common/metalhead-flitter_REF.gc | 1251 +++++ .../levels/city/common/metalhead-grunt_REF.gc | 1474 ++++++ .../city/common/traffic-engine-h_REF.gc | 2 +- .../levels/city/common/traffic-engine_REF.gc | 130 +- .../levels/city/common/traffic-manager_REF.gc | 2 +- .../jak2/levels/city/common/transport_REF.gc | 2 +- .../levels/city/common/vehicle-guard_REF.gc | 4 +- .../levels/city/common/vehicle-rider_REF.gc | 2 +- .../city/misc/delivery/delivery-task_REF.gc | 4 +- .../levels/common/guard-projectile_REF.gc | 2 +- test/offline/config/jak2/config.jsonc | 3 +- 51 files changed, 30127 insertions(+), 615 deletions(-) create mode 100644 test/decompiler/reference/jak2/levels/city/common/citizen-chick_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/city/common/citizen-enemy_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/city/common/citizen-fat_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/city/common/citizen-norm_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/city/common/citizen_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/city/common/civilian_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/city/common/guard_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/city/common/metalhead-flitter_REF.gc create mode 100644 test/decompiler/reference/jak2/levels/city/common/metalhead-grunt_REF.gc diff --git a/decompiler/analysis/variable_naming.cpp b/decompiler/analysis/variable_naming.cpp index ef14a994d9..efaac277c2 100644 --- a/decompiler/analysis/variable_naming.cpp +++ b/decompiler/analysis/variable_naming.cpp @@ -740,7 +740,9 @@ void SSA::make_vars(const Function& function, const DecompilerTypeSystem& dts) { function.guessed_name.to_string() == "(method 74 crimson-guard-level)" || function.guessed_name.to_string() == "widow-handler" || function.guessed_name.to_string() == "(method 74 hal)" || - function.guessed_name.to_string() == "water-anim-event-handler"; + function.guessed_name.to_string() == "water-anim-event-handler" || + function.guessed_name.to_string() == "(method 74 civilian)" || + function.guessed_name.to_string() == "(method 74 crimson-guard)"; } 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 31262d4d72..e63f941c14 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -8976,13 +8976,14 @@ (tdt4 4) (tdt5 5) (tdt6 6) + (tdt7 7) ) ;; ---traffic-h:traffic-danger-type (deftype traffic-danger-info (structure) ((sphere sphere :inline :offset-assert 0) (velocity vector :inline :offset-assert 16) - (handle uint64 :offset-assert 32) + (handle handle :offset-assert 32) (notify-radius float :offset-assert 40) (danger-level float :offset-assert 44) (decay-rate float :offset-assert 48) @@ -9045,7 +9046,7 @@ (position vector :inline :offset-assert 32) (rotation quaternion :inline :offset-assert 48) (velocity vector :inline :offset-assert 64) - (handle uint64 :offset-assert 80) + (handle handle :offset-assert 80) (guard-type uint8 :offset-assert 88) (user-data uint32 :offset-assert 92) (flags uint32 :offset-assert 96) @@ -13334,7 +13335,6 @@ (speech-type-3 3) (speech-type-4 4) (speech-type-5 5) - ) ;; ---speech-h:speech-type @@ -49161,7 +49161,7 @@ (new-suppression-box (_type_ traffic-suppression-params) none 46) (remove-suppression-box (_type_ traffic-suppression-params) none 47) (update-suppression-box (_type_ traffic-suppression-params) none 48) - (traffic-engine-method-49 (_type_ object int traffic-target-status) traffic-target-status 49) + (traffic-engine-method-49 (_type_ vector int traffic-target-status) traffic-target-status 49) (find-closest-to-with-collide-lists "Iterate through collide lists, find the closest thing to the given process." (_type_ process-drawable collide-spec) process-focusable 50) (for-all-active-processes (_type_ (function process-focusable traffic-object-type-info none)) none 51) (send-alert-events (_type_) none 52) @@ -49670,7 +49670,7 @@ (speed-scale float :offset-assert 612) (controller vehicle-controller :inline :offset-assert 624) (danger-pos sphere :inline :offset-assert 768) - (vehicle int64 :offset-assert 784) + (vehicle handle :offset-assert 784) (anim-shuffle int32 :offset-assert 792) (dist-walk-anim float :offset-assert 796) (speed-walk float :offset-assert 800) @@ -49683,7 +49683,7 @@ (last-danger-time time-frame :offset-assert 832) (next-time-look-at time-frame :offset-assert 840) (stop-time-look-at time-frame :offset-assert 848) - (wait-return-state symbol :offset-assert 856) + (wait-return-state (state citizen) :offset-assert 856) (wait-time time-frame :offset-assert 864) (cp-valid? symbol :offset-assert 872) (cp-sphere sphere :inline :offset-assert 880) @@ -49697,31 +49697,30 @@ :method-count-assert 201 :size-assert #x3c4 :flag-assert #xc9035003c4 - ;; Failed to read fields. (:methods - (citizen-method-178 () none 178) - (citizen-method-179 () none 179) - (citizen-method-180 () none 180) - (citizen-method-181 () none 181) - (citizen-method-182 () none 182) - (citizen-method-183 () none 183) - (citizen-method-184 () none 184) - (citizen-method-185 () none 185) - (citizen-method-186 () none 186) - (citizen-method-187 () none 187) - (citizen-method-188 () none 188) - (citizen-method-189 () none 189) - (citizen-method-190 () none 190) - (citizen-method-191 () none 191) - (citizen-method-192 () none 192) - (citizen-method-193 () none 193) - (citizen-method-194 () none 194) - (citizen-method-195 () none 195) - (citizen-method-196 () none 196) - (citizen-method-197 () none 197) - (citizen-method-198 () none 198) - (citizen-method-199 () none 199) - (citizen-method-200 () none 200) + (wait () _type_ :state 178) + (inactive () _type_ :state 179) + (in-ditch () _type_ :state 180) + (citizen-init! "Initialize [[citizen]] defaults." (_type_) none 181) + (citizen-nav-init! "Initialize nav related fields." (_type_) none 182) + (go-inactive (_type_) none 183) + (find-segment (_type_ vector vector) nav-segment 184) + (nav-segment-callback (_type_ vector traffic-find-segment-struct (function traffic-find-segment-struct nav-segment none)) none 185) + (citizen-method-186 (_type_ nav-segment) none 186) + (citizen-method-187 (_type_) symbol 187) + (citizen-method-188 (_type_ vector) none 188) + (calc-danger-vec (_type_ vector vector) none 189) + (citizen-method-190 (_type_ vector) none 190) + (gen-clear-path (_type_) nav-segment 191) + (citizen-method-192 (_type_) none 192) + (throw-off-vehicle (_type_) none 193) + (gen-new-dir (_type_ vector float) nav-segment 194) + (citizen-method-195 (_type_ vector) symbol 195) + (get-run-anim (_type_) int 196) + (trigger-alert (_type_ int target) none 197) + (decrease-alert (_type_ object) none 198) + (set-behavior! (_type_ traffic-object-spawn-params) none 199) + (citizen-method-200 (_type_) none 200) ) ) @@ -51126,9 +51125,8 @@ ;; citizen ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype iter-seg (structure) - ((self basic :offset-assert 0) + ((self citizen :offset-assert 0) (score float :offset-assert 4) (seg nav-segment :offset-assert 8) (cp-plane plane :inline :offset-assert 16) @@ -51138,42 +51136,39 @@ :size-assert #x30 :flag-assert #x900000030 ) -|# -;; (define-extern *citizen-debug* object) +(define-extern *citizen-debug* symbol) (define-extern citizen-init-by-other (function traffic-object-spawn-params none :behavior citizen)) -;; (define-extern citizen-travel-anim function) -;; (define-extern iter-seg-clear-path function) -;; (define-extern iter-seg-new-dir function) +(define-extern citizen-travel-anim (function int int symbol :behavior citizen)) +(define-extern iter-seg-clear-path (function iter-seg nav-segment symbol)) +(define-extern iter-seg-new-dir (function iter-seg nav-segment none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; civilian ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype civilian-anim-info (structure) - ((anim-index UNKNOWN 2 :offset-assert 0) - (anim-index-front int32 :offset-assert 0) - (anim-index-back int32 :offset-assert 4) + ((anim-index int32 2 :offset-assert 0) + (anim-index-front int32 :offset 0) + (anim-index-back int32 :offset 4) ) + :pack-me :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 ) -|# -#| (deftype civilian-global-info (basic) ((prev-yellow-hit int8 :offset-assert 4) (prev-blue-hit int8 :offset-assert 5) - (knocked UNKNOWN 2 :offset-assert 8) - (anim-knocked-front int32 :offset-assert 8) - (anim-knocked-back int32 :offset-assert 12) - (knocked-land UNKNOWN 2 :offset-assert 16) - (anim-knocked-front-land int32 :offset-assert 16) - (anim-knocked-back-land int32 :offset-assert 20) - (yellow-hit-anim UNKNOWN 1 :offset-assert 24) - (blue-hit-anim UNKNOWN 3 :offset-assert 32) + (knocked int32 2 :offset-assert 8) + (anim-knocked-front int32 :offset 8) + (anim-knocked-back int32 :offset 12) + (knocked-land int32 2 :offset-assert 16) + (anim-knocked-front-land int32 :offset 16) + (anim-knocked-back-land int32 :offset 20) + (yellow-hit-anim civilian-anim-info 1 :inline :offset-assert 24) + (blue-hit-anim civilian-anim-info 3 :inline :offset-assert 32) (anim-cover-head-start int32 :offset-assert 56) (anim-cover-head-loop int32 :offset-assert 60) (anim-cover-head-end int32 :offset-assert 64) @@ -51195,10 +51190,9 @@ :size-assert #x5d :flag-assert #x90000005d ) -|# (deftype civilian (citizen) - ((info basic :offset-assert 964) + ((info civilian-global-info :offset-assert 964) (anim-panic-run int32 :offset-assert 968) (anim-on-ground int32 :offset-assert 972) (anim-dive int32 :offset-assert 976) @@ -51206,11 +51200,11 @@ (anim-get-up-back int32 :offset-assert 984) (last-second-pos vector :inline :offset-assert 992) (last-distance float :offset-assert 1008) - (next-time time-frame :offset-assert 1016) + (next-time time-frame :offset-assert 1016) (dive-target-point vector :inline :offset-assert 1024) (dive-reaction float :offset-assert 1040) - (allow-dive basic :offset-assert 1044) - (dive-finished? basic :offset-assert 1048) + (allow-dive symbol :offset-assert 1044) + (dive-finished? symbol :offset-assert 1048) (hit-face uint32 :offset-assert 1052) (seat int32 :offset-assert 1056) ) @@ -51229,22 +51223,22 @@ (move-to-vehicle () _type_ :state 209) (board-vehicle () _type_ :state 210) (ride () _type_ :state 211) - (exit-vehicle () _type_ :state 212) + (exit-vehicle (object object int symbol event-message-block) _type_ :state 212) (wait-at-dest () _type_ :state 213) - (civilian-method-214 () none 214) - (civilian-method-215 () none 215) - (civilian-method-216 () none 216) - (civilian-method-217 () none 217) + (civilian-method-214 (_type_ nav-branch int vector float) float 214) + (civilian-method-215 (_type_ vector) none 215) + (go-dive (_type_) none 216) + (civilian-method-217 (_type_ vector) symbol 217) ) ) -;; (define-extern civilian-flee-post function) -;; (define-extern civilian-avoid-danger-post function) -;; (define-extern civilian-avoid-danger-post2 function) -;; (define-extern civilian-clear-path-post function) -;; (define-extern civilian-clear-path-post2 function) -;; (define-extern civilian-falling-post function) -;; (define-extern do-spline2 function) +(define-extern civilian-flee-post (function none :behavior civilian)) +(define-extern civilian-avoid-danger-post (function none :behavior civilian)) +(define-extern civilian-avoid-danger-post2 (function none :behavior civilian)) +(define-extern civilian-clear-path-post (function none :behavior civilian)) +(define-extern civilian-clear-path-post2 (function none :behavior civilian)) +(define-extern civilian-falling-post (function none :behavior civilian)) +(define-extern do-spline2 (function vector vector vector vector vector float vector)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; guard ;; @@ -51255,30 +51249,29 @@ (anim-index-front int32 :offset 0) (anim-index-back int32 :offset 4) ) + :pack-me :method-count-assert 9 :size-assert #x8 ;; 8 :flag-assert #x900000008 ) -#| -(deftype guard-global-info (UNKNOWN) +(deftype guard-global-info (basic) ((prev-yellow-hit int8 :offset-assert 4) (prev-blue-hit int8 :offset-assert 5) - (knocked UNKNOWN 2 :offset-assert 8) - (knocked-land UNKNOWN 2 :offset-assert 16) - (anim-knocked-front int32 :offset-assert 8) - (anim-knocked-back int32 :offset-assert 12) - (anim-knocked-front-land int32 :offset-assert 16) - (anim-knocked-back-land int32 :offset-assert 20) - (yellow-hit-anim UNKNOWN 2 :offset-assert 24) - (yellow-land-anim UNKNOWN 2 :offset-assert 40) - (blue-hit-anim UNKNOWN 1 :offset-assert 56) + (knocked int32 2 :offset-assert 8) + (knocked-land int32 2 :offset-assert 16) + (anim-knocked-front int32 :offset 8) + (anim-knocked-back int32 :offset 12) + (anim-knocked-front-land int32 :offset 16) + (anim-knocked-back-land int32 :offset 20) + (yellow-hit-anim guard-anim-info 2 :inline :offset-assert 24) + (yellow-land-anim guard-anim-info 2 :inline :offset-assert 40) + (blue-hit-anim int32 :offset-assert 56) ) - :method-count-assert 0 - :size-assert #x0 - :flag-assert #x0 + :method-count-assert 9 + :size-assert #x3c + :flag-assert #x90000003c ) -|# (deftype guard-shoot-info (structure) ((anim-index int32 :offset-assert 0) @@ -51293,7 +51286,7 @@ (deftype crimson-guard (citizen) ( - (info symbol :offset-assert 964) + (info guard-global-info :offset-assert 964) (hit-face uint32 :offset-assert 968) (anim-get-up-front int32 :offset-assert 972) (anim-get-up-back int32 :offset-assert 976) @@ -51303,14 +51296,14 @@ (settings traffic-guard-type-settings :offset-assert 992) (next-time time-frame :offset-assert 1000) (last-time-see-target time-frame :offset-assert 1008) - (joint symbol :offset-assert 1016) + (joint joint-mod :offset-assert 1016) (joint-enable symbol :offset-assert 1020) (already-shot symbol :offset-assert 1024) (miss-amount float :offset-assert 1028) - (l-control symbol :offset-assert 1032) + (l-control lightning-control :offset-assert 1032) (next-shot int64 :offset-assert 1040) (anim-shoot guard-shoot-info 3 :inline :offset-assert 1048) ;; elt size: 13.333333333333334 - (transport int64 :offset-assert 1088) + (transport handle :offset-assert 1088) (transport-side uint32 :offset-assert 1096) (target-flags uint8 :offset-assert 1100) (target-pos vector :inline :offset-assert 1104) @@ -51335,39 +51328,40 @@ :size-assert #x568 ;; 1384 :flag-assert #xe304f00568 (:methods - (crimson-guard-method-201 () none 201) - (crimson-guard-method-202 () none 202) - (crimson-guard-method-203 () none 203) - (crimson-guard-method-204 () none 204) - (crimson-guard-method-205 () none 205) - (crimson-guard-method-206 () none 206) - (crimson-guard-method-207 () none 207) - (crimson-guard-method-208 () none 208) - (crimson-guard-method-209 () none 209) - (crimson-guard-method-210 () none 210) - (crimson-guard-method-211 () none 211) - (crimson-guard-method-212 () none 212) - (crimson-guard-method-213 () none 213) - (crimson-guard-method-214 () none 214) - (crimson-guard-method-215 () none 215) - (crimson-guard-method-216 () none 216) - (crimson-guard-method-217 () none 217) - (crimson-guard-method-218 () none 218) - (crimson-guard-method-219 () none 219) - (crimson-guard-method-220 () none 220) - (crimson-guard-method-221 () none 221) - (crimson-guard-method-222 () none 222) - (crimson-guard-method-223 () none 223) - (crimson-guard-method-224 () none 224) - (crimson-guard-method-225 () none 225) - (crimson-guard-method-226 () none 226)) + (get-up-front () _type_ :state 201) + (get-up-back () _type_ :state 202) + (search () _type_ :state 203) + (attack () _type_ :state 204) + (arrest () _type_ :state 205) + (gun-shoot () _type_ :state 206) + (exit-transport () _type_ :state 207) + (waiting-ambush () _type_ :state 208) + (close-attack () _type_ :state 209) + (knocked-off-vehicle () _type_ :state 210) + (roll-right () _type_ :state 211) + (roll-left () _type_ :state 212) + (close-attack-active () _type_ :state 213) + (crimson-guard-method-214 (_type_) none 214) + (crimson-guard-method-215 (_type_) symbol 215) + (crimson-guard-method-216 (_type_) symbol 216) + (crimson-guard-method-217 (_type_ vector vector vector) int 217) + (crimson-guard-method-218 (_type_ vector) none 218) + (crimson-guard-method-219 (_type_) none 219) + (crimson-guard-method-220 (_type_) none 220) + (crimson-guard-method-221 (_type_) none 221) + (crimson-guard-method-222 (_type_) none 222) + (crimson-guard-method-223 (_type_ float) none 223) + (crimson-guard-method-224 (_type_ vector) float 224) + (crimson-guard-method-225 (_type_ uint symbol) none 225) + (crimson-guard-method-226 (_type_) none 226) + ) ) -;; (define-extern *crimson-guard-global-info* guard-global-info) +(define-extern *crimson-guard-global-info* guard-global-info) (define-extern *crimson-guard-nav-enemy-info* nav-enemy-info) -;; (define-extern *guard-min-id-hack* object) -;; (define-extern do-spline function) -;; (define-extern spread-lightning-lazer function) +(define-extern *guard-min-id-hack* int) +(define-extern do-spline (function vector vector vector vector vector float vector)) +(define-extern spread-lightning-lazer (function lightning-control vector vector vector none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; citizen-norm ;; @@ -51383,8 +51377,8 @@ ) ) -;; (define-extern *citizen-norm-global-info* civilian-global-info) -;; (define-extern *citizen-norm-nav-enemy-info* nav-enemy-info) +(define-extern *citizen-norm-global-info* civilian-global-info) +(define-extern *citizen-norm-nav-enemy-info* nav-enemy-info) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; citizen-fat ;; @@ -51399,8 +51393,8 @@ ) ) -;; (define-extern *citizen-fat-global-info* civilian-global-info) -;; (define-extern *citizen-fat-nav-enemy-info* nav-enemy-info) +(define-extern *citizen-fat-global-info* civilian-global-info) +(define-extern *citizen-fat-nav-enemy-info* nav-enemy-info) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; citizen-chick ;; @@ -51415,23 +51409,23 @@ ) ) -;; (define-extern *citizen-chick-global-info* civilian-global-info) -;; (define-extern *citizen-chick-nav-enemy-info* nav-enemy-info) +(define-extern *citizen-chick-global-info* civilian-global-info) +(define-extern *citizen-chick-nav-enemy-info* nav-enemy-info) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; citizen-enemy ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (deftype citizen-enemy (citizen) - ((next-update-target uint64 :offset-assert 968) + ((next-update-target time-frame :offset-assert 968) (minimap connection-minimap :offset-assert 976) ) :method-count-assert 203 :size-assert #x3d4 :flag-assert #xcb036003d4 (:methods - (citizen-enemy-method-201 () none 201) - (citizen-enemy-method-202 () none 202) + (traffic-danger-init! (_type_) none 201) + (citizen-enemy-method-202 (_type_) none 202) ) ) @@ -51457,7 +51451,7 @@ (next-change int64 :offset-assert 1200) (shoot-angle degrees :offset-assert 1208) (miss-amount float :offset-assert 1212) - (ambient-sound-id uint32 :offset-assert 1216) + (ambient-sound-id sound-id :offset-assert 1216) (shock-effect-time time-frame :offset-assert 1224) (shock-effect-end int64 :offset-assert 1232) (fade float :offset-assert 1240) @@ -51469,10 +51463,11 @@ (:methods (fire () _type_ :state 203) (close-attack () _type_ :state 204) - (metalhead-predator-method-205 () none 205) - (metalhead-predator-method-206 () none 206) - (metalhead-predator-method-207 () none 207) - (metalhead-predator-method-208 () none 208)) + (metalhead-predator-method-205 (_type_ symbol) none 205) + (metalhead-predator-method-206 (_type_ int float) none 206) + (metalhead-predator-method-207 (_type_ vector vector vector) symbol 207) + (metalhead-predator-method-208 (_type_) none 208) + ) ) (define-extern *metalhead-predator-nav-enemy-info* nav-enemy-info) @@ -51488,7 +51483,7 @@ (knocked-anim grunt-anim-info :offset-assert 992) (yellow-hit-anim grunt-anim-info :offset-assert 996) (blue-hit-anim grunt-anim-info :offset-assert 1000) - (intro-path basic :offset-assert 1004) + (intro-path path-control :offset-assert 1004) (pad-jh1b23jhb13 uint32 :offset-assert 1008) (use-charge-anim-index int8 :offset-assert 1012) (knocked-anim-index int8 :offset-assert 1013) @@ -51509,9 +51504,9 @@ (jumping-ambush-cont () _type_ :state 206) (wait-for-focus () _type_ :state 207) (spin-attack () _type_ :state 208) - (metalhead-grunt-method-209 () none 209) - (metalhead-grunt-method-210 () none 210) - (metalhead-grunt-method-211 () none 211) + (metalhead-grunt-method-209 (_type_ float) process-focusable 209) + (get-nav-info (_type_) nav-enemy-info 210) + (metalhead-grunt-method-211 (_type_) none 211) ) ) @@ -51523,7 +51518,7 @@ (deftype metalhead-flitter (citizen-enemy) ((move-angle float :offset-assert 980) - (heading basic :offset-assert 984) + (heading symbol :offset-assert 984) (change-dir-time time-frame :offset-assert 992) (last-change-dir uint64 :offset-assert 1000) (off-screen-timer uint64 :offset-assert 1008) @@ -51539,16 +51534,16 @@ (:methods (attack () _type_ :state 203) (ambush-jumping () _type_ :state 204) - (metalhead-flitter-method-205 () none 205) - (metalhead-flitter-method-206 () none 206) - (metalhead-flitter-method-207 () none 207) - (metalhead-flitter-method-208 () none 208) - (metalhead-flitter-method-209 () none 209) + (metalhead-flitter-method-205 (_type_) none 205) + (metalhead-flitter-method-206 (_type_) none 206) + (metalhead-flitter-method-207 (_type_ process-focusable) symbol 207) + (metalhead-flitter-method-208 (_type_ symbol) none 208) + (metalhead-flitter-method-209 (_type_) float 209) ) ) -;; (define-extern *metalhead-flitter-nav-enemy-info* nav-enemy-info) -;; (define-extern metalhead-flitter-fall-and-play-death-anim function) +(define-extern *metalhead-flitter-nav-enemy-info* nav-enemy-info) +(define-extern metalhead-flitter-fall-and-play-death-anim (function int float time-frame none :behavior metalhead-flitter)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; traffic-engine ;; diff --git a/decompiler/config/jak2/anonymous_function_types.jsonc b/decompiler/config/jak2/anonymous_function_types.jsonc index ea1251e2f9..181b9747a6 100644 --- a/decompiler/config/jak2/anonymous_function_types.jsonc +++ b/decompiler/config/jak2/anonymous_function_types.jsonc @@ -1171,7 +1171,9 @@ [14, "(function vector object)"], [15, "(function int int (pointer object) int)"] ], - "pilot-states": [ - [15, "(function object object object int none)"] + "pilot-states": [[15, "(function object object object int none)"]], + "guard": [ + [19, "(function collide-shape-prim none)"], + [39, "(function crimson-guard collide-shape-moving vector symbol)"] ] } diff --git a/decompiler/config/jak2/hacks.jsonc b/decompiler/config/jak2/hacks.jsonc index eb0695723b..465865b48e 100644 --- a/decompiler/config/jak2/hacks.jsonc +++ b/decompiler/config/jak2/hacks.jsonc @@ -105,7 +105,6 @@ "(method 154 vehicle-racer)", "(method 228 hal-sewer)", "(method 154 vehicle-city-racer)", - "(method 207 metalhead-predator)", "test-to-from-spr", "test-from-spr", "test-to-spr", @@ -503,7 +502,7 @@ 2, 3, 7, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, 30 ], "(method 10 simple-sprite-system)": [0, 1, 3, 4, 5, 6, 9, 11], - "target-pilot-post": [0, 2, 4, 13, 16, 22, 27, 41], + "target-pilot-post": [0, 2, 4, 13, 16, 22, 27, 41], "(anon-function 0 ruins-obs)": [ 0, 5, 7, 12, 13, 15, 17, 23, 24, 33, 42, 45, 46, 53, 58 ], @@ -527,7 +526,9 @@ "(method 11 rigid-body-queue)": [0, 5, 6, 7, 8, 9, 10, 11, 17, 18, 25], "(method 10 rigid-body-queue)": [0, 9, 10, 16, 24, 25, 26, 35, 36, 48], "(method 18 vehicle-controller)": [0, 1, 74, 75], - "(method 15 vehicle-controller)": [0, 3, 5, 6, 7, 10] + "(method 15 vehicle-controller)": [0, 3, 5, 6, 7, 10], + "(anon-function 41 guard)": [9], + "(anon-function 10 metalhead-predator)": [24, 25] }, // Sometimes the game might use format strings that are fetched dynamically, diff --git a/decompiler/config/jak2/label_types.jsonc b/decompiler/config/jak2/label_types.jsonc index 8e0ec74cba..d4e4a62276 100644 --- a/decompiler/config/jak2/label_types.jsonc +++ b/decompiler/config/jak2/label_types.jsonc @@ -1003,9 +1003,25 @@ ], "metalhead-predator": [ ["L175", "uint64", true], - ["L174", "uint64", true] + ["L174", "uint64", true], + ["L134", "vector"], + ["L133", "vector"], + ["L150", "uint64", true], + ["L151", "uint64", true], + ["L149", "uint64", true], + ["L152", "uint64", true] + ], + "guard": [ + ["L654", "uint64", true], + ["L651", "uint64", true], + ["L653", "uint64", true], + ["L652", "uint64", true], + ["L578", "uint64", true], + ["L579", "uint64", true], + ["L579", "uint64", true], + ["L581", "uint64", true], + ["L580", "uint64", true] ], - "guard": [["L654", "uint64", true]], "vehicle-states": [["L90", "attack-info"]], "vehicle": [ ["L290", "attack-info"], @@ -1535,6 +1551,14 @@ "bike": [ ["L63", "(inline-array vector)", 2], ["L64", "(inline-array vector)", 2] - + ], + "citizen": [["L212", "attack-info"]], + "metalhead-grunt": [ + ["L188", "vector"], + ["L187", "vector"] + ], + "metalhead-flitter": [ + ["L161", "vector"], + ["L160", "vector"] ] } diff --git a/decompiler/config/jak2/stack_structures.jsonc b/decompiler/config/jak2/stack_structures.jsonc index 769ccd16b0..5a5bd413b1 100644 --- a/decompiler/config/jak2/stack_structures.jsonc +++ b/decompiler/config/jak2/stack_structures.jsonc @@ -1946,23 +1946,72 @@ "(post draw-closest-minimap nav-graph-editor)": [ [16, ["inline-array", "vector", 5]] ], - "(method 69 traffic-engine)": [ - [16, ["array", "collide-shape", 40]] - ], - "(method 60 traffic-engine)": [ - [16, ["array", "collide-shape", 64]] - ], - "(method 85 bike-base)": [ - [16, ["inline-array", "matrix", 3]] - ], + "(method 69 traffic-engine)": [[16, ["array", "collide-shape", 40]]], + "(method 60 traffic-engine)": [[16, ["array", "collide-shape", 64]]], + "(method 85 bike-base)": [[16, ["inline-array", "matrix", 3]]], "target-pilot-post": [ [48, "collide-query-with-5vec"], [640, "matrix"] ], - "target-pilot-trans": [ - [16, ["inline-array", "vector", 10]] + "target-pilot-trans": [[16, ["inline-array", "vector", 10]]], + "(code target-pilot-get-off)": [[96, ["inline-array", "vector", 10]]], + "(method 194 citizen)": [ + [80, "vector"], + [32, "iter-seg"], + [16, "vector"] ], - "(code target-pilot-get-off)": [ - [96, ["inline-array", "vector", 10]] + "(method 191 citizen)": [[32, "iter-seg"]], + "(method 189 citizen)": [ + [64, "vector"], + [80, "vector"] + ], + "(method 190 citizen)": [ + [80, "vector"], + [96, "vector"] + ], + "iter-seg-clear-path": [ + [16, "vector"], + [32, "vector"], + [48, "vector"], + [64, "vector"] + ], + "(method 202 citizen-enemy)": [ + [32, ["array", "collide-shape", 64]], + [16, "vector"] + ], + "(trans move-to-vehicle civilian)": [ + [32, "vector"], + [128, "vector"] + ], + "civilian-flee-post": [ + [48, "vector"], + [16, "vector"], + [32, "vector"], + [80, "vector"] + ], + "civilian-avoid-danger-post": [[112, "vector"]], + "civilian-clear-path-post": [[96, "vector"]], + "(method 224 crimson-guard)": [ + [32, "vector"], + [656, "vector"], + [720, "vector"] + ], + "(method 218 crimson-guard)": [ + [32, "vector"], + [48, "vector"], + [96, "vector"], + [160, "vector"], + [176, "vector"], + [16, "vector"] + ], + "(method 220 crimson-guard)": [[16, "vector"]], + "(post hostile crimson-guard)": [ + [16, "vector"], + [96, "vector"] + ], + "(method 206 metalhead-predator)": [ + [128, "vector"], + [144, "vector"], + [176, "vector"] ] } diff --git a/decompiler/config/jak2/type_casts.jsonc b/decompiler/config/jak2/type_casts.jsonc index 40ea3e565a..688eb77a46 100644 --- a/decompiler/config/jak2/type_casts.jsonc +++ b/decompiler/config/jak2/type_casts.jsonc @@ -6896,7 +6896,8 @@ [[32, 109], "s3", "process-focusable"], [354, "s5", "process-focusable"], [135, "v0", "(array crimson-guard)"], - [143, "v0", "(array float)"] + [143, "v0", "(array float)"], + ["_stack_", 216, "float"] ], "(method 25 traffic-tracker)": [[24, "a0", "process-focusable"]], "(method 68 traffic-engine)": [ @@ -6928,7 +6929,10 @@ "(method 60 traffic-engine)": [[29, "v1", "collide-shape"]], "(method 26 traffic-tracker)": [[26, "a0", "process-focusable"]], "(method 17 traffic-tracker)": [[23, "s1", "process-focusable"]], - "target-pilot-post": [[96, "s5", "process-focusable"]], + "target-pilot-post": [ + [[96, 114], "s5", "vehicle"], + [[279, 294], "s5", "vehicle"] + ], "(anon-function 1 ruins-obs)": [ [85, "v1", "process-drawable"], [17, "v1", "process-drawable"] @@ -8986,9 +8990,7 @@ [[8, 12], "a1", "handle"], [[11, 19], "a0", "handle"] ], - "(method 10 traffic-engine)": [ - [102, "v1", "(pointer uint128)"] - ], + "(method 10 traffic-engine)": [[102, "v1", "(pointer uint128)"]], "(method 61 traffic-engine)": [ [95, "t0", "uint"], [111, "a2", "uint"], @@ -9000,12 +9002,8 @@ [36, "a2", "pointer"], [[37, 49], "a1", "(pointer int8)"] ], - "(method 10 xz-height-map)": [ - [121, "s0", "pointer"] - ], - "(method 42 nav-graph)": [ - [27, "v1", "uint"] - ], + "(method 10 xz-height-map)": [[121, "s0", "pointer"]], + "(method 42 nav-graph)": [[27, "v1", "uint"]], "make-nav-graph": [ [[28, 31], "v1", "mysql-nav-graph-level-info"], [31, "v1", "mysql-nav-graph-level-info"] @@ -9017,42 +9015,22 @@ [246, "v1", "mysql-nav-edge"], [254, "v1", "mysql-nav-edge"] ], - "(method 11 city-level-info)": [ - [27, "a3", "(pointer int8)"] - ], - "(method 36 bike-base)": [ - [7, "t9", "(function object none)"] - ], + "(method 11 city-level-info)": [[27, "a3", "(pointer int8)"]], + "(method 36 bike-base)": [[7, "t9", "(function object none)"]], "(method 85 bike-base)": [ [7, "t9", "(function object none)"], [[22, 26], "v1", "(pointer uint128)"] ], - "(method 7 bikea)": [ - [44, "t9", "(function object int bikea)"] - ], - "(method 7 bikeb)": [ - [49, "t9", "(function object int bikeb)"] - ], - "(method 7 bikec)": [ - [64, "t9", "(function object int bikec)"] - ], - "(method 7 guard-bike)": [ - [14, "t9", "(function object int guard-bike)"] - ], - "target-pilot-exit": [ - [64, "gp", "vehicle"] - ], + "(method 7 bikea)": [[44, "t9", "(function object int bikea)"]], + "(method 7 bikeb)": [[49, "t9", "(function object int bikeb)"]], + "(method 7 bikec)": [[64, "t9", "(function object int bikec)"]], + "(method 7 guard-bike)": [[14, "t9", "(function object int guard-bike)"]], + "target-pilot-exit": [[64, "gp", "vehicle"]], "target-pilot-init": [ [[61, 68], "s4", "vehicle"], [[68, 138], "s4", "vehicle"] ], - "target-pilot-post": [ - [[96, 114], "s5", "vehicle"], - [[279, 294], "s5", "vehicle"] - ], - "target-pilot-trans": [ - [[53, 130], "s5", "vehicle"] - ], + "target-pilot-trans": [[[53, 130], "s5", "vehicle"]], "(code target-pilot-impact)": [ [83, "v1", "art-joint-anim"], [138, "v1", "art-joint-anim"], @@ -9070,33 +9048,423 @@ [824, "v1", "art-joint-anim"], [882, "v1", "art-joint-anim"] ], - "(trans target-pilot-get-on)": [ - [[28, 48], "gp", "vehicle"] - ], + "(trans target-pilot-get-on)": [[[28, 48], "gp", "vehicle"]], "(code target-pilot-get-on)": [ [65, "gp", "art-joint-anim"], [173, "a1", "vehicle"] ], - "(event target-pilot-grab)": [ - [24, "a0", "process"] - ], - "(enter target-pilot-edge-grab)": [ - [[40, 46], "a0", "process-focusable"] - ], + "(event target-pilot-grab)": [[24, "a0", "process"]], + "(enter target-pilot-edge-grab)": [[[40, 46], "a0", "process-focusable"]], "target-pilot-handler": [ [[28, 33], "a0", "vehicle"], [103, "a0", "process"] ], - "(method 7 cara)": [ - [54, "t9", "(function object object cara)"] + "(method 7 cara)": [[54, "t9", "(function object object cara)"]], + "(method 7 carb)": [[39, "t9", "(function object object carb)"]], + "(method 7 carc)": [[44, "t9", "(function object object carb)"]], + "(method 7 hellcat)": [[14, "t9", "(function object object hellcat)"]], + "(code in-ditch citizen)": [ + [23, "v1", "art-joint-anim"], + [122, "v1", "art-joint-anim"] ], - "(method 7 carb)": [ - [39, "t9", "(function object object carb)"] + "(method 193 citizen)": [ + [24, "s4", "vehicle"], + [29, "s4", "vehicle"], + [35, "s4", "vehicle"], + [61, "s4", "vehicle"] ], - "(method 7 carc)": [ - [44, "t9", "(function object object carb)"] + "(code wait citizen)": [[22, "v1", "art-joint-anim"]], + "(method 55 citizen)": [ + [21, "a0", "process-focusable"], + [24, "a0", "process-focusable"] ], - "(method 7 hellcat)": [ - [14, "t9", "(function object object hellcat)"] + "(method 74 citizen)": [ + [95, "s5", "traffic-object-spawn-params"], + [101, "s5", "traffic-object-spawn-params"], + [105, "s5", "traffic-object-spawn-params"], + [108, "s5", "traffic-object-spawn-params"], + [127, "s5", "traffic-object-spawn-params"] + ], + "(code wait citizen-fat)": [ + [101, "v1", "art-joint-anim"], + [150, "v1", "art-joint-anim"] + ], + "(exit get-up-back citizen-fat)": [ + [9, "v1", "collide-shape-prim-group"], + [12, "v1", "collide-shape-prim-group"], + [14, "v1", "collide-shape-prim-group"], + [17, "v1", "collide-shape-prim-group"], + [20, "v1", "collide-shape-prim-group"], + [23, "v1", "collide-shape-prim-group"] + ], + "(exit get-up-front citizen-fat)": [ + [9, "v1", "collide-shape-prim-group"], + [12, "v1", "collide-shape-prim-group"], + [14, "v1", "collide-shape-prim-group"], + [17, "v1", "collide-shape-prim-group"], + [20, "v1", "collide-shape-prim-group"], + [23, "v1", "collide-shape-prim-group"] + ], + "(enter knocked citizen-fat)": [ + [8, "v1", "collide-shape-prim-group"], + [11, "v1", "collide-shape-prim-group"], + [14, "v1", "collide-shape-prim-group"], + [17, "v1", "collide-shape-prim-group"], + [19, "v1", "collide-shape-prim-group"], + [21, "v1", "collide-shape-prim-group"] + ], + "(method 78 citizen-fat)": [[30, "v1", "art-joint-anim"]], + "(method 79 citizen-fat)": [[58, "v1", "art-joint-anim"]], + "(method 77 citizen-fat)": [ + [40, "a1", "art-joint-anim"], + [92, "a1", "art-joint-anim"], + [140, "s4", "art-joint-anim"], + [28, "a0", "civilian-global-info"], + [80, "a0", "civilian-global-info"] + ], + "(method 51 citizen-fat)": [ + [27, "a0", "process-focusable"], + [30, "a0", "process-focusable"] + ], + "(code wait citizen-norm)": [ + [101, "v1", "art-joint-anim"], + [150, "v1", "art-joint-anim"] + ], + "(exit get-up-back citizen-norm)": [ + [[9, 24], "v1", "collide-shape-prim-group"] + ], + "(exit get-up-front citizen-norm)": [ + [[9, 24], "v1", "collide-shape-prim-group"] + ], + "(enter knocked citizen-norm)": [[[8, 22], "v1", "collide-shape-prim-group"]], + "(method 78 citizen-norm)": [[33, "v1", "art-joint-anim"]], + "(method 77 citizen-norm)": [ + [19, "v1", "art-joint-anim"], + [58, "v1", "art-joint-anim"], + [118, "a1", "art-joint-anim"], + [170, "a1", "art-joint-anim"], + [233, "s4", "art-joint-anim"], + [106, "a0", "civilian-global-info"], + [158, "a0", "civilian-global-info"] + ], + "(method 79 citizen-norm)": [[58, "v1", "art-joint-anim"]], + "(method 51 citizen-norm)": [ + [35, "a0", "process-focusable"], + [38, "a0", "process-focusable"] + ], + "(method 199 citizen-norm)": [[38, "v1", "vehicle"]], + "(code active citizen-enemy)": [[30, "v1", "art-joint-anim"]], + "(code wait citizen-chick)": [[22, "v1", "art-joint-anim"]], + "(exit get-up-back citizen-chick)": [ + [[9, 24], "v1", "collide-shape-prim-group"] + ], + "(exit get-up-front citizen-chick)": [ + [[9, 24], "v1", "collide-shape-prim-group"] + ], + "(enter knocked citizen-chick)": [ + [[8, 22], "v1", "collide-shape-prim-group"] + ], + "(method 78 citizen-chick)": [[30, "v1", "art-joint-anim"]], + "(method 77 citizen-chick)": [ + [40, "a1", "art-joint-anim"], + [92, "a1", "art-joint-anim"], + [140, "s4", "art-joint-anim"], + [28, "a0", "civilian-global-info"], + [80, "a0", "civilian-global-info"] + ], + "(method 79 citizen-chick)": [[58, "v1", "art-joint-anim"]], + "(method 51 citizen-chick)": [ + [27, "a0", "process-focusable"], + [30, "a0", "process-focusable"] + ], + "(method 202 citizen-enemy)": [ + [46, "s1", "process-focusable"], + [50, "s1", "process-focusable"], + [72, "s1", "process-focusable"] + ], + "(method 76 citizen-enemy)": [[46, "v1", "process-focusable"]], + "(code wait-at-dest civilian)": [[22, "v1", "art-joint-anim"]], + "(code exit-vehicle civilian)": [ + [15, "a0", "vehicle"], + [74, "s5", "vehicle"], + [77, "s5", "vehicle"], + [203, "v1", "vehicle"], + [257, "a0", "vehicle"], + [162, "s4", "vehicle"], + [165, "s4", "vehicle"], + [18, "a0", "vehicle"], + [170, "s4", "vehicle"], + [261, "a0", "vehicle"], + [82, "s5", "vehicle"] + ], + "(trans exit-vehicle civilian)": [[14, "v1", "vehicle"]], + "(trans ride civilian)": [[14, "v1", "vehicle"]], + "(event ride civilian)": [[5, "a0", "vector"]], + "(code board-vehicle civilian)": [ + [129, "s2", "vehicle"], + [132, "s2", "vehicle"], + [275, "s5", "vehicle"], + [278, "s5", "vehicle"], + [283, "s5", "vehicle"], + [360, "a0", "vehicle"], + [364, "a0", "vehicle"], + [136, "s2", "vehicle"] + ], + "(trans board-vehicle civilian)": [[14, "v1", "vehicle"]], + "(trans move-to-vehicle civilian)": [ + [14, "s0", "vehicle"], + [28, "s0", "vehicle"], + [52, "s0", "vehicle"] + ], + "(method 217 civilian)": [ + [19, "s3", "vehicle"], + [28, "s3", "vehicle"], + [43, "s3", "vehicle"] + ], + "(code wait-for-ride civilian)": [[22, "v1", "art-joint-anim"]], + "(trans wait-for-ride civilian)": [[31, "v1", "vehicle"]], + "(method 74 civilian)": [ + [30, "a0", "sphere"], + [75, "a0", "vector"], + [[100, 112], "v1", "traffic-danger-info"] + ], + "civilian-flee-post": [[78, "s5", "nav-branch"]], + "(code dive civilian)": [[20, "v1", "art-joint-anim"]], + "(code on-ground civilian)": [[20, "v1", "art-joint-anim"]], + "(code get-up-front civilian)": [[20, "v1", "art-joint-anim"]], + "(code get-up-back civilian)": [[20, "v1", "art-joint-anim"]], + "(event wait-for-ride civilian)": [[[3, 7], "a0", "vehicle"]], + "(method 74 crimson-guard)": [ + [142, "v1", "traffic-danger-info"], + [151, "v1", "traffic-danger-info"], + [[178, 190], "v1", "traffic-danger-info"], + [327, "a1", "process-focusable"], + [331, "a1", "process-focusable"], + [447, "v1", "process-focusable"], + [450, "v1", "process-focusable"] + ], + "(code get-up-front crimson-guard)": [[20, "v1", "art-joint-anim"]], + "(method 7 crimson-guard)": [ + [19, "t9", "(function process-drawable int process-drawable)"] + ], + "(code attack crimson-guard)": [ + [351, "a0", "process-focusable"], + [380, "v1", "art-joint-anim"], + [433, "v1", "collide-shape-prim-group"], + [525, "v1", "collide-shape-prim-group"], + [562, "v1", "art-joint-anim"], + [101, "v1", "art-joint-anim"], + [169, "v1", "art-joint-anim"], + [291, "a0", "process-focusable"] + ], + "(trans attack crimson-guard)": [ + [41, "v1", "process-focusable"], + [46, "v1", "process-focusable"] + ], + "(method 223 crimson-guard)": [[18, "s3", "process-focusable"]], + "(method 224 crimson-guard)": [["_stack_", 768, "vector"]], + "(code waiting-ambush crimson-guard)": [ + [22, "v1", "art-joint-anim"], + [139, "v1", "art-joint-anim"], + [71, "v1", "art-joint-anim"] + ], + "(code arrest crimson-guard)": [ + [29, "v1", "art-joint-anim"], + [171, "v1", "art-joint-anim"], + [106, "v1", "art-joint-anim"] + ], + "(code roll-left crimson-guard)": [ + [95, "a0", "process-focusable"], + [98, "a0", "process-focusable"], + [182, "a0", "process-focusable"], + [185, "a0", "process-focusable"] + ], + "(code roll-right crimson-guard)": [ + [95, "a0", "process-focusable"], + [98, "a0", "process-focusable"], + [182, "a0", "process-focusable"], + [185, "a0", "process-focusable"] + ], + "(code gun-shoot crimson-guard)": [ + [35, "v1", "art-joint-anim"], + [167, "v1", "process-focusable"], + [269, "v1", "art-joint-anim"] + ], + "(trans gun-shoot crimson-guard)": [ + [21, "gp", "process-focusable"], + [57, "gp", "process-focusable"] + ], + "(code close-attack crimson-guard)": [ + [15, "v1", "art-joint-anim"], + [48, "v1", "collide-shape-prim-group"] + ], + "(exit close-attack crimson-guard)": [[2, "v1", "collide-shape-prim-group"]], + "(code get-up-back crimson-guard)": [[20, "v1", "art-joint-anim"]], + "(method 77 crimson-guard)": [ + [19, "v1", "art-joint-anim"], + [58, "v1", "art-joint-anim"], + [120, "a1", "art-joint-anim"], + [178, "a1", "art-joint-anim"], + [207, "a1", "art-joint-anim"], + [238, "v1", "art-joint-anim"], + [281, "a1", "art-joint-anim"], + [314, "a1", "art-joint-anim"], + [168, "v1", "guard-global-info"] + ], + "(enter knocked crimson-guard)": [ + [[8, 22], "v1", "collide-shape-prim-group"] + ], + "(method 199 crimson-guard)": [[166, "v1", "vehicle"]], + "(method 78 crimson-guard)": [ + [22, "a1", "art-joint-anim"], + [76, "a1", "art-joint-anim"], + [108, "a1", "art-joint-anim"], + [140, "v1", "art-joint-anim"], + [182, "a1", "art-joint-anim"], + [66, "v1", "guard-global-info"] + ], + "(exit get-up-back crimson-guard)": [ + [[21, 36], "v1", "collide-shape-prim-group"] + ], + "(exit get-up-front crimson-guard)": [ + [[21, 36], "v1", "collide-shape-prim-group"] + ], + "(code close-attack-active crimson-guard)": [ + [15, "v1", "art-joint-anim"], + [48, "v1", "collide-shape-prim-group"] + ], + "(exit close-attack-active crimson-guard)": [ + [2, "v1", "collide-shape-prim-group"] + ], + "(method 220 crimson-guard)": [ + [127, "s4", "process-focusable"], + [150, "s4", "process-focusable"], + [159, "s4", "process-focusable"] + ], + "(trans hostile crimson-guard)": [[58, "s4", "process-focusable"]], + "(code cower-ground civilian)": [ + [22, "v1", "art-joint-anim"], + [84, "v1", "art-joint-anim"], + [155, "v1", "art-joint-anim"] + ], + "(code falling-ambush metalhead-grunt)": [[18, "v1", "art-joint-anim"]], + "(trans wait-for-focus metalhead-grunt)": [ + [13, "s5", "process-focusable"], + [40, "s5", "process-focusable"] + ], + "(method 78 metalhead-grunt)": [ + [53, "s4", "art-joint-anim"], + [91, "a1", "art-joint-anim"] + ], + "(method 77 metalhead-grunt)": [ + [87, "s4", "art-joint-anim"], + [233, "a1", "art-joint-anim"], + [323, "s4", "art-joint-anim"] + ], + "(code stop-chase metalhead-grunt)": [[77, "gp", "art-joint-anim"]], + "(code spin-attack metalhead-grunt)": [ + [45, "gp", "art-joint-anim"], + [73, "a0", "process-focusable"], + [76, "a0", "process-focusable"] + ], + "(enter spin-attack metalhead-grunt)": [ + [43, "gp", "process-focusable"], + [46, "gp", "process-focusable"] + ], + "(code attack metalhead-grunt)": [ + [55, "gp", "art-joint-anim"], + [155, "a0", "grunt-anim-info"] + ], + "(code hostile metalhead-grunt)": [[122, "gp", "art-joint-anim"]], + "(code active metalhead-grunt)": [ + [227, "gp", "art-joint-anim"], + [271, "gp", "art-joint-anim"], + [354, "v1", "art-joint-anim"], + [414, "v1", "art-joint-anim"], + [143, "gp", "art-joint-anim"] + ], + "(method 208 metalhead-flitter)": [[4, "v1", "collide-shape-prim-group"]], + "(code circling metalhead-flitter)": [[27, "v1", "art-joint-anim"]], + "(trans circling metalhead-flitter)": [[14, "gp", "process-focusable"]], + "(post stare metalhead-flitter)": [[9, "t9", "(function nav-enemy none)"]], + "(code stare metalhead-flitter)": [[126, "v1", "art-joint-anim"]], + "(code attack metalhead-flitter)": [ + [20, "v1", "art-joint-anim"], + [153, "v1", "art-joint-anim"] + ], + "(code ambush-jumping metalhead-flitter)": [ + [14, "v1", "art-joint-anim"], + [191, "v1", "art-joint-anim"] + ], + "(enter ambush metalhead-flitter)": [ + [50, "a0", "process-focusable"], + [53, "a0", "process-focusable"] + ], + "(method 78 metalhead-flitter)": [[15, "a1", "art-joint-anim"]], + "(method 77 metalhead-flitter)": [ + [14, "v1", "art-joint-anim"], + [69, "v1", "art-joint-anim"] + ], + "(post active metalhead-flitter)": [ + [9, "t9", "(function citizen-enemy none)"] + ], + "(method 205 metalhead-flitter)": [[19, "s3", "process-focusable"]], + "(trans attack metalhead-flitter)": [ + [29, "gp", "process-focusable"], + [35, "gp", "process-focusable"], + [53, "gp", "process-focusable"], + [60, "v1", "vector"], + [66, "v0", "vector"], + [56, "gp", "process-focusable"] + ], + "(method 7 metalhead-predator)": [ + [9, "t9", "(function process-drawable int process-drawable)"] + ], + "(method 205 metalhead-predator)": [[4, "v1", "collide-shape-prim-group"]], + "(code close-attack metalhead-predator)": [ + [15, "v1", "art-joint-anim"], + [93, "v1", "art-joint-anim"] + ], + "(trans hostile metalhead-predator)": [ + [20, "gp", "process-focusable"], + [25, "gp", "process-focusable"], + [54, "gp", "process-focusable"], + [57, "gp", "process-focusable"] + ], + "(code fire metalhead-predator)": [ + [26, "v1", "art-joint-anim"], + [102, "s5", "process-focusable"], + [121, "s5", "process-focusable"], + [124, "s5", "process-focusable"] + ], + "(method 206 metalhead-predator)": [ + [67, "s3", "process-drawable"], + [78, "s3", "process-focusable"], + [108, "s3", "process-focusable"], + [200, "s3", "process-focusable"], + [203, "s3", "process-focusable"] + ], + "(method 78 metalhead-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 77 metalhead-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"] + ], + "(code hostile metalhead-predator)": [ + [14, "v1", "art-joint-anim"], + [67, "v1", "art-joint-anim"] + ], + "(trans fire metalhead-predator)": [ + [14, "v1", "process-focusable"], + [19, "v1", "process-focusable"] ] } diff --git a/decompiler/config/jak2/var_names.jsonc b/decompiler/config/jak2/var_names.jsonc index d467d3ebe3..52501b8fcd 100644 --- a/decompiler/config/jak2/var_names.jsonc +++ b/decompiler/config/jak2/var_names.jsonc @@ -4093,5 +4093,18 @@ }, "(method 46 squid)": { "args": ["obj", "src", "arg2", "dest"] + }, + "(method 49 traffic-engine)": { + "vars": { + "sv-192": "guards", + "s3-0": "target-proc", + "s5-0": "target-pos", + "s2-3": "guard", + "sv-196": "guard-target-dists", + "s3-1": "guard-count", + "sv-200": "guard-idx", + "s3-2": "crimson-guard" + }, + "args": ["obj", "los", "arg2", "target-status"] } } diff --git a/goal_src/jak2/engine/ai/traffic-h.gc b/goal_src/jak2/engine/ai/traffic-h.gc index 71defc14c0..3252ca78df 100644 --- a/goal_src/jak2/engine/ai/traffic-h.gc +++ b/goal_src/jak2/engine/ai/traffic-h.gc @@ -15,6 +15,7 @@ (tdt4 4) (tdt5 5) (tdt6 6) + (tdt7 7) ) ;; ---traffic-danger-type @@ -72,11 +73,10 @@ (define *race-vehicle-entity* (the-as object #f)) - (deftype traffic-danger-info (structure) ((sphere sphere :inline :offset-assert 0) (velocity vector :inline :offset-assert 16) - (handle uint64 :offset-assert 32) + (handle handle :offset-assert 32) (notify-radius float :offset-assert 40) (danger-level float :offset-assert 44) (decay-rate float :offset-assert 48) @@ -121,7 +121,7 @@ (position vector :inline :offset-assert 32) (rotation quaternion :inline :offset-assert 48) (velocity vector :inline :offset-assert 64) - (handle uint64 :offset-assert 80) + (handle handle :offset-assert 80) (guard-type uint8 :offset-assert 88) (user-data uint32 :offset-assert 92) (flags uint32 :offset-assert 96) diff --git a/goal_src/jak2/engine/sound/speech-h.gc b/goal_src/jak2/engine/sound/speech-h.gc index ac4171f762..4e0ee0e0e8 100644 --- a/goal_src/jak2/engine/sound/speech-h.gc +++ b/goal_src/jak2/engine/sound/speech-h.gc @@ -27,7 +27,6 @@ (speech-type-3 3) (speech-type-4 4) (speech-type-5 5) - ) ;; ---speech-type diff --git a/goal_src/jak2/levels/city/common/citizen-chick.gc b/goal_src/jak2/levels/city/common/citizen-chick.gc index b0b8bb5d3e..1e68fc58bf 100644 --- a/goal_src/jak2/levels/city/common/citizen-chick.gc +++ b/goal_src/jak2/levels/city/common/citizen-chick.gc @@ -5,15 +5,747 @@ ;; name in dgo: citizen-chick ;; dgos: CWI -(deftype citizen-chick (civilian) - () - :method-count-assert 218 - :size-assert #x424 - :flag-assert #xda03b00424 - (:methods +;; DECOMP BEGINS + +(defskelgroup skel-citizen-chick citizen-chick citizen-chick-lod0-jg -1 + ((citizen-chick-lod0-mg (meters 20)) (citizen-chick-lod2-mg (meters 999999))) + :bounds (static-spherem 0 2 0 3) + :shadow citizen-chick-shadow-mg + ) + +(define *citizen-chick-global-info* + (new 'static 'civilian-global-info + :knocked (new 'static 'array int32 2 20 22) + :knocked-land (new 'static 'array int32 2 21 23) + :yellow-hit-anim (new 'static 'inline-array civilian-anim-info 1 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 20 22)) + ) + :blue-hit-anim (new 'static 'inline-array civilian-anim-info 3 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 19 18)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 19 18)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 19 18)) + ) + :anim-cover-head-start 14 + :anim-cover-head-loop 15 + :anim-cover-head-end 16 + :speech-ambient #x17 + :speech-alert #x18 + :speech-cower #x19 + :speech-touched-by-player #x1a + :speech-shot-by-player #x1b + :speech-avoiding-player-vehicle #x1c + :speech-hit-by-player-vehicle #x1d ) ) +(deftype citizen-chick (civilian) + () + :heap-base #x3b0 + :method-count-assert 218 + :size-assert #x424 + :flag-assert #xda03b00424 + ) -;; DECOMP BEGINS +(define *citizen-chick-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 idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #xa :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 10 + :notice-anim 10 + :hostile-anim -1 + :hit-anim 10 + :knocked-anim 20 + :knocked-land-anim 21 + :die-anim 10 + :die-falling-anim 10 + :victory-anim 10 + :jump-wind-up-anim 4 + :jump-in-air-anim 4 + :jump-land-anim 4 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :notice-distance-delta (meters 0.1) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :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 32768.0 + :knocked-soft-vxz-hi 53248.0 + :knocked-soft-vy-lo 20480.0 + :knocked-soft-vy-hi 40960.0 + :knocked-medium-vxz-lo 40960.0 + :knocked-medium-vxz-hi 73728.0 + :knocked-medium-vy-lo 24576.0 + :knocked-medium-vy-hi 53248.0 + :knocked-hard-vxz-lo 53248.0 + :knocked-hard-vxz-hi 102400.0 + :knocked-hard-vy-lo 40960.0 + :knocked-hard-vy-hi 81920.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 8192.0 + :knocked-yellow-vxz-hi 16384.0 + :knocked-yellow-vy-lo 12288.0 + :knocked-yellow-vy-hi 24576.0 + :knocked-red-vxz-lo 12288.0 + :knocked-red-vxz-hi 24576.0 + :knocked-red-vy-lo 20480.0 + :knocked-red-vy-hi 36864.0 + :knocked-blue-vxz-lo 16384.0 + :knocked-blue-vxz-hi 32768.0 + :knocked-blue-vy-lo 16384.0 + :knocked-blue-vy-hi 32768.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 #f + :use-pacing #f + :walk-anim 4 + :turn-anim 4 + :run-anim 7 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 2) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :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! (-> *citizen-chick-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod get-inv-mass citizen-chick ((obj citizen-chick)) + 0.5 + ) + +(defmethod enemy-method-51 citizen-chick ((obj citizen-chick)) + (let ((f30-0 (quaternion-y-angle (-> obj root-override2 quat)))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (let ((a0-5 (handle->process (-> obj focus handle)))) + (when a0-5 + (get-trans (the-as process-focusable a0-5) 0) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot + (-> obj root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat)) + ) + 0.0 + ) + (vector-negate-in-place! s5-0) + ) + (set! f30-0 (atan (-> s5-0 x) (-> s5-0 z))) + ) + ) + ) + ) + (else + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot s5-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) 0.0) + (vector-negate-in-place! s5-1) + ) + (let* ((f28-0 (atan (-> s5-1 x) (-> s5-1 z))) + (f1-2 (deg- f30-0 f28-0)) + (f2-0 (fabs f1-2)) + (f0-8 (-> obj enemy-info-override knocked-seek-ry-clamp)) + ) + (when (and (< f0-8 f2-0) (< f2-0 (- 32768.0 f0-8))) + (set! f30-0 (+ (cond + ((< f2-0 16384.0) + (if (>= f1-2 0.0) + f0-8 + (- f0-8) + ) + ) + ((>= f1-2 0.0) + (- 32768.0 f0-8) + ) + (else + (+ -32768.0 f0-8) + ) + ) + f28-0 + ) + ) + (if (< f30-0 0.0) + (set! f30-0 (+ 65536.0 f30-0)) + ) + ) + ) + ) + ) + ) + f30-0 + ) + ) + +(defmethod enemy-method-79 citizen-chick ((obj citizen-chick) (arg0 int) (arg1 enemy-knocked-info)) + (case arg0 + ((1) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((s5-0 (ja-done? 0))) + (let ((a0-4 (-> obj skel root-channel 0))) + (set! (-> a0-4 param 0) (the float (+ (-> a0-4 frame-group frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-4 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s5-0 + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + ) + (set! (-> a0-6 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + frames + num-frames + ) + -1 + ) + ) + ) + (set! (-> a0-6 param 1) (-> arg1 anim-speed)) + (set! (-> a0-6 frame-num) 3.0) + (joint-control-channel-group! + a0-6 + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + num-func-seek! + ) + ) + ) + s5-0 + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + +(defmethod enemy-method-77 citizen-chick ((obj citizen-chick) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-0 (ash 1 (-> obj info prev-yellow-hit))) + (v1-3 (enemy-method-120 obj 1 a2-0)) + (a1-7 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-3 8)) (the-as uint (-> obj info)))) + yellow-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-yellow-hit) v1-3) + (let ((a0-15 (-> obj skel root-channel 0))) + (set! (-> a0-15 frame-group) (the-as art-joint-anim a1-7)) + (set! (-> a0-15 param 0) (the float (+ (-> (the-as art-joint-anim a1-7) 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-7) num-func-seek!) + ) + ) + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-2 (ash 1 (-> obj info prev-blue-hit))) + (v1-12 (enemy-method-120 obj 3 a2-2)) + (a1-14 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-12 8)) (the-as uint (-> obj info)))) + blue-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-blue-hit) v1-12) + (let ((a0-30 (-> obj skel root-channel 0))) + (set! (-> a0-30 frame-group) (the-as art-joint-anim a1-14)) + (set! (-> a0-30 param 0) (the float (+ (-> (the-as art-joint-anim a1-14) frames num-frames) -1))) + (set! (-> a0-30 param 1) 1.0) + (set! (-> a0-30 frame-num) 0.0) + (joint-control-channel-group! a0-30 (the-as art-joint-anim a1-14) num-func-seek!) + ) + ) + ) + (else + (let ((s4-0 (if (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-39 (-> obj skel root-channel 0))) + (set! (-> a0-39 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-39 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-39 param 1) (-> arg0 0)) + (set! (-> a0-39 frame-num) 0.0) + (joint-control-channel-group! a0-39 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + #t + ) + +(defmethod enemy-method-78 citizen-chick ((obj citizen-chick) (arg0 (pointer float))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + ) + (set! (-> a0-2 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + 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 (-> obj info knocked-land (-> obj hit-face)))) + num-func-seek! + ) + ) + #t + ) + +(defstate knocked (citizen-chick) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type civilian knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (the-as collide-shape-prim-group (-> self root-override2 root-prim)))) + (logior! (-> v1-5 child 0 prim-core action) (collide-action no-standon)) + (logclear! (-> v1-5 child 1 prim-core action) (collide-action no-standon)) + (set! (-> v1-5 child 1 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 child 1 prim-core collide-with) (collide-spec)) + ) + 0 + (none) + ) + ) + +(defstate get-up-front (citizen-chick) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-front) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +(defstate get-up-back (citizen-chick) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-back) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +(defstate wait (citizen-chick) + :virtual #t + :code (behavior () + (let ((f30-1 (/ 1.0 (rand-vu-float-range 10.0 13.0)))) + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! citizen-chick-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-chick-idle-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + ) + #f + (none) + ) + ) + +(defmethod init-enemy-collision! citizen-chick ((obj citizen-chick)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec civilian)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 8192.0 0.0 12288.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 civilian)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 4096.0 0.0 4096.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 civilian)) + (set! (-> v1-15 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 0.0 4096.0) + ) + (set! (-> s5-0 nav-radius) 4096.0) + (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 init-enemy! citizen-chick ((obj citizen-chick)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-citizen-chick" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *citizen-chick-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 speed-scale) 1.0) + ) + 0 + (set! (-> obj draw lod-set lod 0 dist) 204800.0) + (set! (-> obj draw lod-set lod 1 dist) 491520.0) + (set! (-> obj info) *citizen-chick-global-info*) + (try-update-focus (-> obj focus) *target* obj) + (set-vector! (-> obj neck twist-max) 10922.667 18204.445 0.0 1.0) + (set! (-> obj anim-shuffle) 26) + (let ((v1-18 (get-rand-int obj 3))) + (cond + ((zero? v1-18) + (set! (-> obj anim-walk) 4) + (set! (-> obj dist-walk-anim) 15728.64) + (set! (-> obj speed-walk) 14745.6) + ) + ((= v1-18 1) + (set! (-> obj anim-walk) 5) + (set! (-> obj dist-walk-anim) 8736.768) + (set! (-> obj speed-walk) 8192.0) + ) + ((= v1-18 2) + (set! (-> obj anim-walk) 6) + (set! (-> obj dist-walk-anim) 15728.64) + (set! (-> obj speed-walk) 12288.0) + ) + ) + ) + (let ((v1-33 (get-rand-int obj 3))) + (cond + ((zero? v1-33) + (set! (-> obj anim-panic-run) 11) + ) + ((= v1-33 1) + (set! (-> obj anim-panic-run) 11) + ) + ((= v1-33 2) + (set! (-> obj anim-panic-run) 7) + ) + ) + ) + (let ((v1-39 (get-rand-int obj 3))) + (cond + ((zero? v1-39) + (set! (-> obj dist-run-anim) 26214.4) + (set! (-> obj anim-run) 7) + ) + ((= v1-39 1) + (set! (-> obj dist-run-anim) 28385.28) + (set! (-> obj anim-run) 8) + ) + ((= v1-39 2) + (set! (-> obj dist-run-anim) 26214.4) + (set! (-> obj anim-run) 9) + ) + ) + ) + (set! (-> obj speed-run) 49152.0) + (set! (-> obj anim-on-ground) 13) + (set! (-> obj anim-dive) 17) + (set! (-> obj anim-get-up-back) 25) + (set! (-> obj anim-get-up-front) 24) + (let ((f30-0 (get-rand-float-range obj 1.0 1.25)) + (f0-17 (get-rand-float-range obj 1.0 1.25)) + ) + (set-vector! (-> obj root-override2 scale) f0-17 f30-0 f0-17 1.0) + ) + (let ((f0-19 (get-rand-float-range obj 0.9 1.0))) + (set-vector! (-> obj draw color-mult) f0-19 f0-19 f0-19 1.0) + ) + (set! (-> obj water-anim) 12) + (logior! (-> obj flags) (citizen-flag female)) + 0 + (none) + ) + +(defmethod citizen-init! citizen-chick ((obj citizen-chick)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type civilian citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj dive-reaction) (* 0.2 (rand-vu))) + (logclear! (-> obj mask) (process-mask enemy)) + (setup-masks (-> obj draw) 0 -1) + (setup-masks (-> obj draw) 16 0) + (setup-masks (-> obj draw) 8 0) + (let ((v1-11 (get-rand-int obj 3))) + (cond + ((zero? v1-11) + (setup-masks (-> obj draw) 32 0) + ) + ((= v1-11 1) + (setup-masks (-> obj draw) #x4000 0) + ) + ((= v1-11 2) + (setup-masks (-> obj draw) #x8000 0) + ) + ) + ) + (let ((v1-20 (get-rand-int obj 3))) + (cond + ((zero? v1-20) + (setup-masks (-> obj draw) 64 0) + ) + ((= v1-20 1) + (setup-masks (-> obj draw) 1024 0) + ) + ((= v1-20 2) + (setup-masks (-> obj draw) #x10000 0) + ) + ) + ) + (let ((v1-29 (get-rand-int obj 3))) + (cond + ((zero? v1-29) + (setup-masks (-> obj draw) 4 0) + ) + ((= v1-29 1) + (setup-masks (-> obj draw) 512 0) + ) + ((= v1-29 2) + (setup-masks (-> obj draw) 4096 0) + ) + ) + ) + (let ((v1-38 (get-rand-int obj 3))) + (cond + ((zero? v1-38) + (setup-masks (-> obj draw) 2 0) + (let ((v1-42 (get-rand-int obj 2))) + (cond + ((zero? v1-42) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-42 1) + (setup-masks (-> obj draw) 8192 0) + ) + ) + ) + ) + ((= v1-38 1) + (setup-masks (-> obj draw) 256 0) + ) + ((= v1-38 2) + (setup-masks (-> obj draw) 2048 0) + (let ((v1-54 (get-rand-int obj 2))) + (cond + ((zero? v1-54) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-54 1) + (setup-masks (-> obj draw) 8192 0) + ) + ) + ) + ) + ) + ) + (logior! (-> obj flags) (citizen-flag female)) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/city/common/citizen-enemy.gc b/goal_src/jak2/levels/city/common/citizen-enemy.gc index 67d80f1fd0..7990a0c6fb 100644 --- a/goal_src/jak2/levels/city/common/citizen-enemy.gc +++ b/goal_src/jak2/levels/city/common/citizen-enemy.gc @@ -5,19 +5,324 @@ ;; name in dgo: citizen-enemy ;; dgos: CWI +;; DECOMP BEGINS + (deftype citizen-enemy (citizen) - ((next-update-target uint64 :offset-assert 968) + ((next-update-target time-frame :offset-assert 968) (minimap connection-minimap :offset-assert 976) ) + :heap-base #x360 :method-count-assert 203 :size-assert #x3d4 :flag-assert #xcb036003d4 (:methods - (citizen-enemy-method-201 () none 201) - (citizen-enemy-method-202 () none 202) + (traffic-danger-init! (_type_) none 201) + (citizen-enemy-method-202 (_type_) none 202) ) ) -;; DECOMP BEGINS +(defmethod track-target! citizen-enemy ((obj citizen-enemy)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (let ((a1-0 (new 'stack-no-clear 'overlaps-others-params))) + (set! (-> a1-0 options) (overlaps-others-options)) + (set! (-> a1-0 collide-with-filter) (-> obj enemy-info-override overlaps-others-collide-with-filter)) + (set! (-> a1-0 tlist) *touching-list*) + (find-overlapping-shapes (-> obj root-override2) a1-0) + ) + (when (and (not (logtest? (-> obj focus-status) (focus-status disable dead ignore inactive))) + (< (-> obj next-update-target) (-> pp clock frame-counter)) + (not (logtest? (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (-> obj next-state) + (= (-> obj next-state name) 'active) + ) + (citizen-enemy-method-202 obj) + (set! (-> obj next-update-target) (+ (-> pp clock frame-counter) (seconds 0.2))) + (traffic-danger-init! obj) + ) + ((method-of-type citizen track-target!) obj) + (none) + ) + ) +;; WARN: Return type mismatch object vs symbol. +(defmethod enemy-method-76 citizen-enemy ((obj citizen-enemy) (arg0 process) (arg1 event-message-block)) + (the-as + symbol + (cond + ((and (-> obj next-state) (let ((v1-3 (-> obj next-state name))) + (or (= v1-3 'knocked) (= v1-3 'jump)) + ) + ) + ((method-of-type citizen enemy-method-76) obj arg0 arg1) + ) + (else + (when (!= (-> arg0 type) target) + (let* ((s3-0 (-> arg1 param 0)) + (s2-0 arg0) + (v1-6 (if (type? s2-0 process-focusable) + s2-0 + ) + ) + ) + (cond + ((and (logtest? (-> obj focus-status) (focus-status dangerous)) + (logtest? (process-mask guard civilian) (-> arg0 mask)) + (and v1-6 + (zero? (logand (-> (the-as process-focusable v1-6) focus-status) (focus-status disable dead ignore grabbed))) + ) + ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s3-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 s3-0) + (-> obj root-override2) + (collide-action persistent-attack) + (collide-action) + ) + (-> obj persistent-attack-id) + (-> obj attack-id) + ) + ) + ) + (enemy-method-104 obj arg0 s3-0 a3-2) + ) + ) + (else + (send-event arg0 'touch (-> arg1 param 0)) + ) + ) + ) + ) + ) + ) + ) + ) + +(defmethod general-event-handler citizen-enemy ((obj citizen-enemy) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('event-death) + #f + ) + (('effect-control) + (case (-> arg3 param 0) + (('death-default) + (cond + ((> (-> obj hit-points) 0) + #t + ) + (else + (let ((v1-4 (-> obj root-override2 root-prim))) + (set! (-> v1-4 prim-core collide-as) (collide-spec)) + (set! (-> v1-4 prim-core collide-with) (collide-spec)) + ) + 0 + #f + ) + ) + ) + (else + #f + ) + ) + ) + (('end-task) + (let ((v0-0 (the-as object (logclear (-> obj flags) (citizen-flag persistent))))) + (set! (-> obj flags) (the-as citizen-flag v0-0)) + v0-0 + ) + ) + (else + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +(defmethod traffic-danger-init! citizen-enemy ((obj citizen-enemy)) + (let ((a1-0 (new 'stack-no-clear 'traffic-danger-info))) + (set! (-> a1-0 sphere quad) (-> obj root-override2 trans quad)) + (set! (-> a1-0 sphere r) 40960.0) + (set! (-> a1-0 velocity quad) (-> obj root-override2 transv quad)) + (set! (-> a1-0 notify-radius) 122880.0) + (set! (-> a1-0 danger-level) 1.0) + (set! (-> a1-0 decay-rate) 0.0) + (set! (-> a1-0 flags) (traffic-danger-flags tdf0)) + (set! (-> a1-0 danger-type) (traffic-danger-type tdt7)) + (set! (-> a1-0 handle) (process->handle obj)) + (add-danger (-> obj controller traffic) a1-0) + ) + 0 + (none) + ) + +(defmethod citizen-enemy-method-202 citizen-enemy ((obj citizen-enemy)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj root-override2 trans quad)) + (set! (-> s5-0 w) 122880.0) + (let ((s4-0 (the-as process-drawable #f))) + (let ((f30-0 122880.0)) + (let ((s3-0 (new 'stack-no-clear 'array 'collide-shape 64))) + (countdown (s2-0 (fill-actor-list-for-sphere *actor-hash* (the-as sphere s5-0) s3-0 64)) + (let* ((s1-0 (-> s3-0 s2-0)) + (a0-6 (if (type? s1-0 collide-shape) + s1-0 + ) + ) + ) + (when a0-6 + (let* ((s0-0 (-> a0-6 process)) + (s1-1 (if (type? s0-0 process-focusable) + s0-0 + ) + ) + ) + (when (and s1-1 + (!= obj s1-1) + (not (logtest? (-> (the-as process-focusable s1-1) focus-status) (focus-status inactive))) + (not (logtest? (-> (the-as process-focusable s1-1) focus-status) (focus-status disable))) + (not (logtest? (process-mask enemy) (-> s1-1 mask))) + (not (logtest? (process-mask crate) (-> s1-1 mask))) + (not (logtest? (process-mask vehicle) (-> s1-1 mask))) + s1-1 + (zero? (logand (-> (the-as process-focusable s1-1) focus-status) (focus-status disable dead ignore grabbed))) + ) + (let ((f0-1 (vector-vector-xz-distance (-> obj root-override2 trans) (-> s1-1 root trans)))) + (when (or (not s4-0) (< f0-1 f30-0)) + (set! s4-0 s1-1) + (set! f30-0 f0-1) + ) + ) + ) + ) + ) + ) + ) + ) + (if (and *target* (< (vector-vector-distance (target-pos 0) s5-0) f30-0)) + (set! s4-0 *target*) + ) + ) + (when s4-0 + (try-update-focus (-> obj focus) (the-as process-focusable s4-0) obj) + (go-hostile obj) + ) + ) + ) + 0 + (none) + ) + +(defstate active (citizen-enemy) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (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)) + ) + ) + ) + #f + (none) + ) + ) + +(defstate inactive (citizen-enemy) + :virtual #t + :enter (behavior () + (when (-> self minimap) + (logior! (-> self minimap flags) (minimap-flag fade-out)) + (set! (-> self minimap) #f) + ) + (let ((t9-0 (-> (method-of-type citizen inactive) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + ) + +(defmethod citizen-init! citizen-enemy ((obj citizen-enemy)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type citizen citizen-init!))) + (t9-0 obj) + ) + (if (-> obj skel effect) + (logior! (-> obj skel effect flags) (effect-control-flag ecf0)) + ) + (set! (-> obj mask) (logior (process-mask enemy) (-> obj mask))) + (reset-to-collide-spec (-> obj focus) (collide-spec jak civilian player-list bot-targetable jak-vehicle)) + (let ((v1-12 (-> obj nav))) + (set! (-> v1-12 sphere-mask) (the-as uint #x800e8)) + ) + 0 + (set! (-> obj anim-shuffle) (-> obj enemy-info-override walk-anim)) + (set! (-> obj anim-walk) (-> obj enemy-info-override walk-anim)) + (set! (-> obj speed-walk) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj dist-walk-anim) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj anim-run) (-> obj enemy-info-override run-anim)) + (set! (-> obj dist-run-anim) (-> obj enemy-info-override run-travel-speed)) + (set! (-> obj speed-run) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj fated-time) 0) + (logior! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) + (logior! (-> obj focus-status) (focus-status dangerous)) + (logior! (-> obj enemy-flags) (enemy-flag check-water)) + (set! (-> obj enemy-flags) + (logior (enemy-flag check-water-backup no-initial-move-to-ground) (-> obj enemy-flags)) + ) + (logclear! (-> obj focus-status) (focus-status dead)) + (set! (-> obj mask) (logior (process-mask collectable) (-> obj mask))) + (logior! (-> obj enemy-flags) (enemy-flag look-at-move-dest)) + (if (not (-> obj minimap)) + (set! (-> obj minimap) (add-icon! *minimap* obj (the-as uint 70) (the-as int #f) (the-as vector #t) 0)) + ) + (ja-channel-set! 0) + 0 + (none) + ) + +(defmethod kill-prefer-falling citizen-enemy ((obj citizen-enemy)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + ((method-of-type nav-enemy kill-prefer-falling) obj) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-hostile citizen-enemy ((obj citizen-enemy)) + (if (not (and (-> obj next-state) (= (-> obj next-state name) 'hostile))) + (go (method-of-object obj hostile)) + ) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-stare citizen-enemy ((obj citizen-enemy)) + (go (method-of-object obj active)) + (none) + ) diff --git a/goal_src/jak2/levels/city/common/citizen-fat.gc b/goal_src/jak2/levels/city/common/citizen-fat.gc index 9dd72129a5..bb092f591c 100644 --- a/goal_src/jak2/levels/city/common/citizen-fat.gc +++ b/goal_src/jak2/levels/city/common/citizen-fat.gc @@ -7,11 +7,834 @@ ;; DECOMP BEGINS +(defskelgroup skel-citizen-fat citizen-fat citizen-fat-lod0-jg -1 + ((citizen-fat-lod0-mg (meters 20)) (citizen-fat-lod2-mg (meters 999999))) + :bounds (static-spherem 0 2 0 3) + :shadow citizen-fat-shadow-mg + ) + +(define *citizen-fat-global-info* + (new 'static 'civilian-global-info + :knocked (new 'static 'array int32 2 20 22) + :knocked-land (new 'static 'array int32 2 21 23) + :yellow-hit-anim (new 'static 'inline-array civilian-anim-info 1 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 20 22)) + ) + :blue-hit-anim (new 'static 'inline-array civilian-anim-info 3 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 27 26)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 27 26)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 27 26)) + ) + :anim-cover-head-start 28 + :anim-cover-head-loop 29 + :anim-cover-head-end 30 + :speech-ambient #xf + :speech-alert #x10 + :speech-cower #x11 + :speech-touched-by-player #x12 + :speech-shot-by-player #x13 + :speech-avoiding-player-vehicle #x14 + :speech-hit-by-player-vehicle #x15 + ) + ) + (deftype citizen-fat (civilian) () + :heap-base #x3b0 :method-count-assert 218 :size-assert #x424 :flag-assert #xda03b00424 - (:methods + ) + + +(define *citizen-fat-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 idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x4 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 4 + :notice-anim 4 + :hostile-anim -1 + :hit-anim 4 + :knocked-anim 20 + :knocked-land-anim 21 + :die-anim 4 + :die-falling-anim 4 + :victory-anim 4 + :jump-wind-up-anim 11 + :jump-in-air-anim 11 + :jump-land-anim 11 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :notice-distance-delta (meters 0.1) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :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 32768.0 + :knocked-soft-vxz-hi 53248.0 + :knocked-soft-vy-lo 20480.0 + :knocked-soft-vy-hi 40960.0 + :knocked-medium-vxz-lo 40960.0 + :knocked-medium-vxz-hi 73728.0 + :knocked-medium-vy-lo 24576.0 + :knocked-medium-vy-hi 53248.0 + :knocked-hard-vxz-lo 53248.0 + :knocked-hard-vxz-hi 102400.0 + :knocked-hard-vy-lo 40960.0 + :knocked-hard-vy-hi 81920.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 8192.0 + :knocked-yellow-vxz-hi 16384.0 + :knocked-yellow-vy-lo 12288.0 + :knocked-yellow-vy-hi 24576.0 + :knocked-red-vxz-lo 12288.0 + :knocked-red-vxz-hi 24576.0 + :knocked-red-vy-lo 20480.0 + :knocked-red-vy-hi 36864.0 + :knocked-blue-vxz-lo 16384.0 + :knocked-blue-vxz-hi 32768.0 + :knocked-blue-vy-lo 16384.0 + :knocked-blue-vy-hi 32768.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 #f + :use-pacing #f + :walk-anim 11 + :turn-anim 11 + :run-anim 15 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 2) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :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 ) - ) \ No newline at end of file + ) + +(set! (-> *citizen-fat-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod get-inv-mass citizen-fat ((obj citizen-fat)) + 0.5 + ) + +(defmethod enemy-method-51 citizen-fat ((obj citizen-fat)) + (let ((f30-0 (quaternion-y-angle (-> obj root-override2 quat)))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (let ((a0-5 (handle->process (-> obj focus handle)))) + (when a0-5 + (get-trans (the-as process-focusable a0-5) 0) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot + (-> obj root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat)) + ) + 0.0 + ) + (vector-negate-in-place! s5-0) + ) + (set! f30-0 (atan (-> s5-0 x) (-> s5-0 z))) + ) + ) + ) + ) + (else + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot s5-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) 0.0) + (vector-negate-in-place! s5-1) + ) + (let* ((f28-0 (atan (-> s5-1 x) (-> s5-1 z))) + (f1-2 (deg- f30-0 f28-0)) + (f2-0 (fabs f1-2)) + (f0-8 (-> obj enemy-info-override knocked-seek-ry-clamp)) + ) + (when (and (< f0-8 f2-0) (< f2-0 (- 32768.0 f0-8))) + (set! f30-0 (+ (cond + ((< f2-0 16384.0) + (if (>= f1-2 0.0) + f0-8 + (- f0-8) + ) + ) + ((>= f1-2 0.0) + (- 32768.0 f0-8) + ) + (else + (+ -32768.0 f0-8) + ) + ) + f28-0 + ) + ) + (if (< f30-0 0.0) + (set! f30-0 (+ 65536.0 f30-0)) + ) + ) + ) + ) + ) + ) + f30-0 + ) + ) + +(defmethod enemy-method-79 citizen-fat ((obj citizen-fat) (arg0 int) (arg1 enemy-knocked-info)) + (case arg0 + ((1) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((s5-0 (ja-done? 0))) + (let ((a0-4 (-> obj skel root-channel 0))) + (set! (-> a0-4 param 0) (the float (+ (-> a0-4 frame-group frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-4 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s5-0 + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + ) + (set! (-> a0-6 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + frames + num-frames + ) + -1 + ) + ) + ) + (set! (-> a0-6 param 1) (-> arg1 anim-speed)) + (set! (-> a0-6 frame-num) 3.0) + (joint-control-channel-group! + a0-6 + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + num-func-seek! + ) + ) + ) + s5-0 + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + +(defmethod enemy-method-77 citizen-fat ((obj citizen-fat) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-0 (ash 1 (-> obj info prev-yellow-hit))) + (v1-3 (enemy-method-120 obj 1 a2-0)) + (a1-7 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-3 8)) (the-as uint (-> obj info)))) + yellow-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-yellow-hit) v1-3) + (let ((a0-15 (-> obj skel root-channel 0))) + (set! (-> a0-15 frame-group) (the-as art-joint-anim a1-7)) + (set! (-> a0-15 param 0) (the float (+ (-> (the-as art-joint-anim a1-7) 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-7) num-func-seek!) + ) + ) + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-2 (ash 1 (-> obj info prev-blue-hit))) + (v1-12 (enemy-method-120 obj 3 a2-2)) + (a1-14 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-12 8)) (the-as uint (-> obj info)))) + blue-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-blue-hit) v1-12) + (let ((a0-30 (-> obj skel root-channel 0))) + (set! (-> a0-30 frame-group) (the-as art-joint-anim a1-14)) + (set! (-> a0-30 param 0) (the float (+ (-> (the-as art-joint-anim a1-14) frames num-frames) -1))) + (set! (-> a0-30 param 1) 1.0) + (set! (-> a0-30 frame-num) 0.0) + (joint-control-channel-group! a0-30 (the-as art-joint-anim a1-14) num-func-seek!) + ) + ) + ) + (else + (let ((s4-0 (if (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-39 (-> obj skel root-channel 0))) + (set! (-> a0-39 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-39 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-39 param 1) (-> arg0 0)) + (set! (-> a0-39 frame-num) 0.0) + (joint-control-channel-group! a0-39 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + #t + ) + +(defmethod enemy-method-78 citizen-fat ((obj citizen-fat) (arg0 (pointer float))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + ) + (set! (-> a0-2 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + 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 (-> obj info knocked-land (-> obj hit-face)))) + num-func-seek! + ) + ) + #t + ) + +(defstate knocked (citizen-fat) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type civilian knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (the-as collide-shape-prim-group (-> self root-override2 root-prim)))) + (logior! (-> v1-5 child 0 prim-core action) (collide-action no-standon)) + (logclear! (-> v1-5 child 1 prim-core action) (collide-action no-standon)) + (set! (-> v1-5 child 1 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 child 1 prim-core collide-with) (collide-spec)) + ) + 0 + (none) + ) + ) + +(defstate get-up-front (citizen-fat) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-front) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +(defstate get-up-back (citizen-fat) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-back) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +(defstate wait (citizen-fat) + :virtual #t + :trans (behavior () + '() + (none) + ) + :code (behavior () + (until #f + (let ((f30-1 (/ 1.0 (rand-vu-float-range 10.0 13.0))) + (gp-0 (rand-vu-int-range 1 5)) + (s5-0 (rand-vu-int-count 2)) + ) + (ja-channel-push! 1 (seconds 0.2)) + (if (zero? s5-0) + (ja-no-eval :group! citizen-fat-idle-to-arms-hips-ja :num! min) + (ja-no-eval :group! citizen-fat-idle-to-arms-crossed-ja :num! min) + ) + (let ((f28-0 0.0)) + (while (< f28-0 1.0) + (ja :num-func num-func-identity + :frame-num (lerp-scale 0.0 2.0 (+ (* -2.0 f28-0 f28-0 f28-0) (* 3.0 f28-0 f28-0)) 0.0 1.0) + ) + (suspend) + (+! f28-0 (-> self clock seconds-per-frame)) + ) + ) + (ja-channel-push! 1 (seconds 0.1)) + (while (> gp-0 0) + (+! gp-0 -1) + (cond + ((zero? s5-0) + (ja-no-eval :group! citizen-fat-arms-hips-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-fat-arms-hips-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (else + (ja-no-eval :group! citizen-fat-arms-crossed-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-fat-arms-crossed-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + ) + ) + ) + (if (-> self wait-return-state) + (go (-> self wait-return-state)) + ) + ) + #f + (none) + ) + ) + +(defmethod init-enemy-collision! citizen-fat ((obj citizen-fat)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec civilian)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 8192.0 0.0 12288.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 civilian)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 4096.0 0.0 4096.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 civilian)) + (set! (-> v1-15 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 0.0 4096.0) + ) + (set! (-> s5-0 nav-radius) 4096.0) + (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 init-enemy! citizen-fat ((obj citizen-fat)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-citizen-fat" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *citizen-fat-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 speed-scale) 1.0) + ) + 0 + (set! (-> obj draw lod-set lod 0 dist) 204800.0) + (set! (-> obj draw lod-set lod 1 dist) 491520.0) + (set! (-> obj info) *citizen-fat-global-info*) + (try-update-focus (-> obj focus) *target* obj) + (set-vector! (-> obj neck twist-max) 10922.667 18204.445 0.0 1.0) + (set! (-> obj anim-shuffle) 12) + (let ((v1-18 (get-rand-int obj 3))) + (cond + ((zero? v1-18) + (set! (-> obj anim-walk) 11) + (set! (-> obj dist-walk-anim) 16384.0) + (set! (-> obj speed-walk) 12288.0) + ) + ((= v1-18 1) + (set! (-> obj anim-walk) 13) + (set! (-> obj dist-walk-anim) 16384.0) + (set! (-> obj speed-walk) 12288.0) + ) + ((= v1-18 2) + (set! (-> obj anim-walk) 14) + (set! (-> obj dist-walk-anim) 16384.0) + (set! (-> obj speed-walk) 12288.0) + ) + ) + ) + (let ((v1-33 (get-rand-int obj 3))) + (cond + ((zero? v1-33) + (set! (-> obj anim-panic-run) 17) + ) + ((= v1-33 1) + (set! (-> obj anim-panic-run) 17) + ) + ((= v1-33 2) + (set! (-> obj anim-panic-run) 15) + ) + ) + ) + (set! (-> obj dist-run-anim) 20480.0) + (let ((v1-40 (get-rand-int obj 3))) + (cond + ((zero? v1-40) + (set! (-> obj anim-run) 15) + ) + ((= v1-40 1) + (set! (-> obj anim-run) 16) + ) + ((= v1-40 2) + (set! (-> obj anim-run) 16) + ) + ) + ) + (set! (-> obj speed-run) 32768.0) + (set! (-> obj anim-on-ground) 19) + (set! (-> obj anim-dive) 18) + (set! (-> obj anim-get-up-back) 25) + (set! (-> obj anim-get-up-front) 24) + (let ((f30-0 (get-rand-float-range obj 1.0 1.25)) + (f0-15 (get-rand-float-range obj 1.0 1.25)) + ) + (set-vector! (-> obj root-override2 scale) f0-15 f30-0 f0-15 1.0) + ) + (let ((f0-17 (get-rand-float-range obj 0.9 1.0))) + (set-vector! (-> obj draw color-mult) f0-17 f0-17 f0-17 1.0) + ) + (set! (-> obj water-anim) 32) + 0 + (none) + ) + +(defmethod citizen-init! citizen-fat ((obj citizen-fat)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type civilian citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj dive-reaction) (* 0.2 (rand-vu))) + (logclear! (-> obj mask) (process-mask enemy)) + (setup-masks (-> obj draw) 0 -1) + (let ((v1-7 (get-rand-int obj 2))) + (cond + ((zero? v1-7) + (setup-masks (-> obj draw) 8 0) + (let ((v1-11 (get-rand-int obj 3))) + (cond + ((zero? v1-11) + (setup-masks (-> obj draw) 4 0) + ) + ((= v1-11 1) + (setup-masks (-> obj draw) 256 0) + ) + ((= v1-11 2) + (setup-masks (-> obj draw) #x8000 0) + ) + ) + ) + (let ((v1-20 (get-rand-int obj 4))) + (cond + ((zero? v1-20) + (setup-masks (-> obj draw) 2 0) + ) + ((= v1-20 1) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-20 2) + (setup-masks (-> obj draw) 130 0) + ) + ) + ) + (setup-masks (-> obj draw) 512 0) + (let ((v1-31 (get-rand-int obj 3))) + (cond + ((zero? v1-31) + (setup-masks (-> obj draw) 64 0) + ) + ((= v1-31 1) + (setup-masks (-> obj draw) 4096 0) + ) + ((= v1-31 2) + (setup-masks (-> obj draw) 8192 0) + ) + ) + ) + (let ((v1-40 (get-rand-int obj 3))) + (cond + ((zero? v1-40) + (setup-masks (-> obj draw) 32 0) + ) + ((= v1-40 1) + (setup-masks (-> obj draw) 2048 0) + ) + ((= v1-40 2) + (setup-masks (-> obj draw) #x20000 0) + ) + ) + ) + (let ((v1-49 (get-rand-int obj 3))) + (cond + ((zero? v1-49) + (setup-masks (-> obj draw) 16 0) + ) + ((= v1-49 1) + (setup-masks (-> obj draw) 1024 0) + ) + ((= v1-49 2) + (setup-masks (-> obj draw) #x10000 0) + ) + ) + ) + ) + ((= v1-7 1) + (setup-masks (-> obj draw) #x400000 0) + (setup-masks (-> obj draw) #x200000 0) + (let ((v1-63 (get-rand-int obj 2))) + (cond + ((zero? v1-63) + (setup-masks (-> obj draw) 4096 0) + ) + ((= v1-63 1) + (setup-masks (-> obj draw) #x80000 0) + ) + ) + ) + (let ((v1-70 (get-rand-int obj 2))) + (cond + ((zero? v1-70) + (setup-masks (-> obj draw) 256 0) + ) + ((= v1-70 1) + (setup-masks (-> obj draw) #x100000 0) + ) + ) + ) + (let ((v1-77 (get-rand-int obj 4))) + (cond + ((zero? v1-77) + (setup-masks (-> obj draw) 2 0) + ) + ((= v1-77 1) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-77 2) + (setup-masks (-> obj draw) 130 0) + ) + ) + ) + (if (zero? (get-rand-int obj 1)) + (setup-masks (-> obj draw) #x20000 0) + ) + (let ((v1-91 (get-rand-int obj 3))) + (cond + ((zero? v1-91) + (setup-masks (-> obj draw) 16 0) + ) + ((= v1-91 1) + (setup-masks (-> obj draw) 1024 0) + ) + ((= v1-91 2) + (setup-masks (-> obj draw) #x10000 0) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/city/common/citizen-h.gc b/goal_src/jak2/levels/city/common/citizen-h.gc index 7163ce7c11..23971e7807 100644 --- a/goal_src/jak2/levels/city/common/citizen-h.gc +++ b/goal_src/jak2/levels/city/common/citizen-h.gc @@ -38,7 +38,7 @@ (speed-scale float :offset-assert 612) (controller vehicle-controller :inline :offset-assert 624) (danger-pos sphere :inline :offset-assert 768) - (vehicle int64 :offset-assert 784) + (vehicle handle :offset-assert 784) (anim-shuffle int32 :offset-assert 792) (dist-walk-anim float :offset-assert 796) (speed-walk float :offset-assert 800) @@ -51,7 +51,7 @@ (last-danger-time time-frame :offset-assert 832) (next-time-look-at time-frame :offset-assert 840) (stop-time-look-at time-frame :offset-assert 848) - (wait-return-state symbol :offset-assert 856) + (wait-return-state (state citizen) :offset-assert 856) (wait-time time-frame :offset-assert 864) (cp-valid? symbol :offset-assert 872) (cp-sphere sphere :inline :offset-assert 880) @@ -67,28 +67,28 @@ :size-assert #x3c4 :flag-assert #xc9035003c4 (:methods - (citizen-method-178 () none 178) - (citizen-method-179 () none 179) - (citizen-method-180 () none 180) - (citizen-method-181 () none 181) - (citizen-method-182 () none 182) - (citizen-method-183 () none 183) - (citizen-method-184 () none 184) - (citizen-method-185 () none 185) - (citizen-method-186 () none 186) - (citizen-method-187 () none 187) - (citizen-method-188 () none 188) - (citizen-method-189 () none 189) - (citizen-method-190 () none 190) - (citizen-method-191 () none 191) - (citizen-method-192 () none 192) - (citizen-method-193 () none 193) - (citizen-method-194 () none 194) - (citizen-method-195 () none 195) - (citizen-method-196 () none 196) - (citizen-method-197 () none 197) - (citizen-method-198 () none 198) - (citizen-method-199 () none 199) - (citizen-method-200 () none 200) + (wait () _type_ :state 178) + (inactive () _type_ :state 179) + (in-ditch () _type_ :state 180) + (citizen-init! (_type_) none 181) + (citizen-nav-init! (_type_) none 182) + (go-inactive (_type_) none 183) + (find-segment (_type_ vector vector) nav-segment 184) + (nav-segment-callback (_type_ vector traffic-find-segment-struct (function traffic-find-segment-struct nav-segment none)) none 185) + (citizen-method-186 (_type_ nav-segment) none 186) + (citizen-method-187 (_type_) symbol 187) + (citizen-method-188 (_type_ vector) none 188) + (calc-danger-vec (_type_ vector vector) none 189) + (citizen-method-190 (_type_ vector) none 190) + (gen-clear-path (_type_) nav-segment 191) + (citizen-method-192 (_type_) none 192) + (throw-off-vehicle (_type_) none 193) + (gen-new-dir (_type_ vector float) nav-segment 194) + (citizen-method-195 (_type_ vector) symbol 195) + (get-run-anim (_type_) int 196) + (trigger-alert (_type_ int target) none 197) + (decrease-alert (_type_ object) none 198) + (set-behavior! (_type_ traffic-object-spawn-params) none 199) + (citizen-method-200 (_type_) none 200) ) ) diff --git a/goal_src/jak2/levels/city/common/citizen-norm.gc b/goal_src/jak2/levels/city/common/citizen-norm.gc index 2b84d34372..c956438900 100644 --- a/goal_src/jak2/levels/city/common/citizen-norm.gc +++ b/goal_src/jak2/levels/city/common/citizen-norm.gc @@ -5,8 +5,46 @@ ;; name in dgo: citizen-norm ;; dgos: CWI +;; DECOMP BEGINS + +(defskelgroup skel-citizen-norm citizen-norm citizen-norm-lod0-jg -1 + ((citizen-norm-lod0-mg (meters 20)) (citizen-norm-lod2-mg (meters 999999))) + :bounds (static-spherem 0 2 0 3) + :shadow citizen-norm-shadow-mg + ) + +(define *citizen-norm-global-info* + (new 'static 'civilian-global-info + :knocked (new 'static 'array int32 2 18 20) + :knocked-land (new 'static 'array int32 2 19 21) + :yellow-hit-anim (new 'static 'inline-array civilian-anim-info 1 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 18 20)) + ) + :blue-hit-anim (new 'static 'inline-array civilian-anim-info 3 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 24 24)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 24 24)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 24 24)) + ) + :anim-cover-head-start 26 + :anim-cover-head-loop 27 + :anim-cover-head-end 28 + :car-stance-anim 31 + :bike-stance-anim 30 + :get-in-car-anim 32 + :seat-flag #x2 + :speech-ambient #xf + :speech-alert #x10 + :speech-cower #x11 + :speech-touched-by-player #x12 + :speech-shot-by-player #x13 + :speech-avoiding-player-vehicle #x14 + :speech-hit-by-player-vehicle #x15 + ) + ) + (deftype citizen-norm (civilian) () + :heap-base #x3b0 :method-count-assert 219 :size-assert #x424 :flag-assert #xdb03b00424 @@ -15,5 +53,898 @@ ) ) -;; DECOMP BEGINS +(define *citizen-norm-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 idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x4 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 4 + :notice-anim 4 + :hostile-anim -1 + :hit-anim 4 + :knocked-anim 18 + :knocked-land-anim 19 + :die-anim 4 + :die-falling-anim 4 + :victory-anim 4 + :jump-wind-up-anim 12 + :jump-in-air-anim 12 + :jump-land-anim 12 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :notice-distance (meters 10) + :notice-distance-delta (meters 0.1) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :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 32768.0 + :knocked-soft-vxz-hi 49152.0 + :knocked-soft-vy-lo 36864.0 + :knocked-soft-vy-hi 73728.0 + :knocked-medium-vxz-lo 81920.0 + :knocked-medium-vxz-hi 143360.0 + :knocked-medium-vy-lo 49152.0 + :knocked-medium-vy-hi 102400.0 + :knocked-hard-vxz-lo 102400.0 + :knocked-hard-vxz-hi 122880.0 + :knocked-hard-vy-lo 81920.0 + :knocked-hard-vy-hi 102400.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 16384.0 + :knocked-yellow-vxz-hi 32768.0 + :knocked-yellow-vy-lo 24576.0 + :knocked-yellow-vy-hi 49152.0 + :knocked-red-vxz-lo 40960.0 + :knocked-red-vxz-hi 61440.0 + :knocked-red-vy-lo 36864.0 + :knocked-red-vy-hi 73728.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 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 #t + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 12 + :turn-anim 12 + :run-anim 14 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 2) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 2) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 10) + :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! (-> *citizen-norm-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod enemy-method-51 citizen-norm ((obj citizen-norm)) + (cond + ((logtest? (-> obj flags) (citizen-flag knocked-out-car knocked-out-bike)) + ((method-of-type nav-enemy enemy-method-51) obj) + ) + (else + (let ((f30-0 (quaternion-y-angle (-> obj root-override2 quat)))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (let ((a0-6 (handle->process (-> obj focus handle)))) + (when a0-6 + (get-trans (the-as process-focusable a0-6) 0) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot + (-> obj root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat)) + ) + 0.0 + ) + (vector-negate-in-place! s5-0) + ) + (set! f30-0 (atan (-> s5-0 x) (-> s5-0 z))) + ) + ) + ) + ) + (else + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot s5-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) 0.0) + (vector-negate-in-place! s5-1) + ) + (let* ((f28-0 (atan (-> s5-1 x) (-> s5-1 z))) + (f1-2 (deg- f30-0 f28-0)) + (f2-0 (fabs f1-2)) + (f0-8 (-> obj enemy-info-override knocked-seek-ry-clamp)) + ) + (when (and (< f0-8 f2-0) (< f2-0 (- 32768.0 f0-8))) + (set! f30-0 (+ (cond + ((< f2-0 16384.0) + (if (>= f1-2 0.0) + f0-8 + (- f0-8) + ) + ) + ((>= f1-2 0.0) + (- 32768.0 f0-8) + ) + (else + (+ -32768.0 f0-8) + ) + ) + f28-0 + ) + ) + (if (< f30-0 0.0) + (set! f30-0 (+ 65536.0 f30-0)) + ) + ) + ) + ) + ) + ) + f30-0 + ) + ) + ) + ) + +(defmethod enemy-method-79 citizen-norm ((obj citizen-norm) (arg0 int) (arg1 enemy-knocked-info)) + (case arg0 + ((1) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((s5-0 (ja-done? 0))) + (let ((a0-4 (-> obj skel root-channel 0))) + (set! (-> a0-4 param 0) (the float (+ (-> a0-4 frame-group frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-4 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s5-0 + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + ) + (set! (-> a0-6 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + frames + num-frames + ) + -1 + ) + ) + ) + (set! (-> a0-6 param 1) (-> arg1 anim-speed)) + (set! (-> a0-6 frame-num) 3.0) + (joint-control-channel-group! + a0-6 + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + num-func-seek! + ) + ) + ) + s5-0 + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + +(defmethod enemy-method-77 citizen-norm ((obj citizen-norm) (arg0 (pointer float))) + (local-vars (v1-36 knocked-type)) + (cond + ((logtest? (-> obj flags) (citizen-flag knocked-out-car)) + (ja-channel-push! 1 (seconds 0.1)) + (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!) + ) + (logclear! (-> obj flags) (citizen-flag knocked-out-car)) + ) + ((logtest? (-> obj flags) (citizen-flag knocked-out-bike)) + (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 34))) + (set! (-> a0-5 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 34)) 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 34)) num-func-seek!) + ) + (logclear! (-> obj flags) (citizen-flag knocked-out-bike)) + ) + ((begin (set! v1-36 (-> obj incoming knocked-type)) (= v1-36 (knocked-type knocked-type-4))) + (ja-channel-push! 1 (seconds 0.1)) + (let* ((a2-2 (ash 1 (-> obj info prev-yellow-hit))) + (v1-39 (enemy-method-120 obj 1 a2-2)) + (a1-11 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-39 8)) (the-as uint (-> obj info)))) + yellow-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-yellow-hit) v1-39) + (let ((a0-21 (-> obj skel root-channel 0))) + (set! (-> a0-21 frame-group) (the-as art-joint-anim a1-11)) + (set! (-> a0-21 param 0) (the float (+ (-> (the-as art-joint-anim a1-11) frames num-frames) -1))) + (set! (-> a0-21 param 1) (-> arg0 0)) + (set! (-> a0-21 frame-num) 0.0) + (joint-control-channel-group! a0-21 (the-as art-joint-anim a1-11) num-func-seek!) + ) + ) + ) + ((= v1-36 (knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-4 (ash 1 (-> obj info prev-blue-hit))) + (v1-48 (enemy-method-120 obj 3 a2-4)) + (a1-18 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-48 8)) (the-as uint (-> obj info)))) + blue-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-blue-hit) v1-48) + (let ((a0-36 (-> obj skel root-channel 0))) + (set! (-> a0-36 frame-group) (the-as art-joint-anim a1-18)) + (set! (-> a0-36 param 0) (the float (+ (-> (the-as art-joint-anim a1-18) frames num-frames) -1))) + (set! (-> a0-36 param 1) 1.0) + (set! (-> a0-36 frame-num) 0.0) + (joint-control-channel-group! a0-36 (the-as art-joint-anim a1-18) num-func-seek!) + ) + ) + ) + (else + (let ((s4-0 (if (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.1)) + (if (or (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (= (-> obj incoming knocked-type) (knocked-type knocked-type-3)) + ) + (set! (-> arg0 0) (* 0.5 (-> arg0 0))) + ) + (let ((a0-47 (-> obj skel root-channel 0))) + (set! (-> a0-47 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-47 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-47 param 1) (-> arg0 0)) + (set! (-> a0-47 frame-num) 0.0) + (joint-control-channel-group! a0-47 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + #t + ) + +(defmethod enemy-method-78 citizen-norm ((obj citizen-norm) (arg0 (pointer float))) + (ja-channel-push! 1 (seconds 0.1)) + (set! (-> arg0 0) 1.0) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + ) + (set! (-> a0-2 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + 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 (-> obj info knocked-land (-> obj hit-face)))) + num-func-seek! + ) + ) + #t + ) + +(defstate knocked (citizen-norm) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type civilian knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (the-as collide-shape-prim-group (-> self root-override2 root-prim)))) + (logior! (-> v1-5 child 0 prim-core action) (collide-action no-standon)) + (logclear! (-> v1-5 child 1 prim-core action) (collide-action no-standon)) + (set! (-> v1-5 child 1 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 child 1 prim-core collide-with) (collide-spec)) + ) + 0 + (none) + ) + ) + +(defstate get-up-front (citizen-norm) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-front) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +(defstate get-up-back (citizen-norm) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-back) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +(defstate wait (citizen-norm) + :virtual #t + :trans (behavior () + '() + (none) + ) + :code (behavior () + (until #f + (let ((f30-1 (/ 1.0 (rand-vu-float-range 10.0 13.0))) + (gp-0 (rand-vu-int-range 1 5)) + (s5-0 (rand-vu-int-count 2)) + ) + (ja-channel-push! 1 (seconds 0.2)) + (if (zero? s5-0) + (ja-no-eval :group! citizen-norm-idle-to-arms-hips-ja :num! min) + (ja-no-eval :group! citizen-norm-idle-to-arms-crossed-ja :num! min) + ) + (let ((f28-0 0.0)) + (while (< f28-0 1.0) + (ja :num-func num-func-identity + :frame-num (lerp-scale 0.0 2.0 (+ (* -2.0 f28-0 f28-0 f28-0) (* 3.0 f28-0 f28-0)) 0.0 1.0) + ) + (suspend) + (+! f28-0 (-> self clock seconds-per-frame)) + ) + ) + (ja-channel-push! 1 (seconds 0.1)) + (while (> gp-0 0) + (+! gp-0 -1) + (cond + ((zero? s5-0) + (ja-no-eval :group! citizen-norm-arms-hips-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-norm-arms-hips-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (else + (ja-no-eval :group! citizen-norm-arms-crossed-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-norm-arms-crossed-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + ) + ) + ) + (if (-> self wait-return-state) + (go (-> self wait-return-state)) + ) + ) + #f + (none) + ) + ) + +(defmethod set-behavior! citizen-norm ((obj citizen-norm) (arg0 traffic-object-spawn-params)) + (case (-> arg0 behavior) + ((11) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-1 speech-type-2 speech-type-4)) + (set! (-> obj root-override2 trans quad) (-> arg0 position quad)) + (quaternion-copy! (-> obj root-override2 quat) (-> arg0 rotation)) + (set! (-> obj vehicle) (-> arg0 handle)) + (ja-channel-set! 1) + (case (-> (the-as vehicle (handle->process (-> obj vehicle))) info-override object-type) + ((11 12 13) + (logior! (-> obj flags) (citizen-flag knocked-out-bike)) + (let ((v1-16 (-> obj skel root-channel 0))) + (set! (-> v1-16 frame-group) (the-as art-joint-anim (-> obj draw art-group data 30))) + ) + ) + ((14 15 16) + (logior! (-> obj flags) (citizen-flag knocked-out-car)) + (let ((v1-22 (-> obj skel root-channel 0))) + (set! (-> v1-22 frame-group) (the-as art-joint-anim (-> obj draw art-group data 31))) + ) + ) + ) + (ja-post) + (setup-masks (-> obj draw) 0 -1) + (let ((s5-1 (-> arg0 user-data))) + (if (not (logtest? s5-1 32)) + (setup-masks (-> obj draw) 32 0) + ) + (if (not (logtest? s5-1 16)) + (setup-masks (-> obj draw) 16 0) + ) + (if (not (logtest? s5-1 2)) + (setup-masks (-> obj draw) 2 0) + ) + (if (not (logtest? s5-1 4096)) + (setup-masks (-> obj draw) 8192 0) + ) + (if (not (logtest? s5-1 8)) + (setup-masks (-> obj draw) 8 0) + ) + (if (not (logtest? s5-1 512)) + (setup-masks (-> obj draw) 1024 0) + ) + (if (not (logtest? s5-1 #x4000)) + (setup-masks (-> obj draw) #x8000 0) + ) + (if (not (logtest? s5-1 4)) + (setup-masks (-> obj draw) 4 0) + ) + (if (not (logtest? s5-1 256)) + (setup-masks (-> obj draw) 512 0) + ) + (if (not (logtest? s5-1 8192)) + (setup-masks (-> obj draw) #x4000 0) + ) + (if (not (logtest? s5-1 64)) + (setup-masks (-> obj draw) 128 0) + ) + (if (not (logtest? s5-1 2048)) + (setup-masks (-> obj draw) 4096 0) + ) + (if (not (logtest? #x10000 s5-1)) + (setup-masks (-> obj draw) #x20000 0) + ) + (if (not (logtest? s5-1 128)) + (setup-masks (-> obj draw) 256 0) + ) + (if (logtest? #x40000 s5-1) + (setup-masks (-> obj draw) 2048 0) + (setup-masks (-> obj draw) 2048 0) + ) + ) + (go (method-of-object obj knocked-off-vehicle)) + ) + (else + ((method-of-type civilian set-behavior!) obj arg0) + ) + ) + 0 + (none) + ) + +(defstate knocked-off-vehicle (citizen-norm) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior citizen-norm) enemy-event-handler) + :enter (behavior () + '() + (none) + ) + :code (behavior () + (suspend) + (throw-off-vehicle self) + (none) + ) + ) + +(defmethod init-enemy-collision! citizen-norm ((obj citizen-norm)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec civilian)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak civilian enemy 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 8192.0 0.0 12288.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 civilian)) + (set! (-> v1-13 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 4096.0 0.0 4096.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 civilian)) + (set! (-> v1-15 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 0.0 4096.0) + ) + (set! (-> s5-0 nav-radius) 4096.0) + (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 init-enemy! citizen-norm ((obj citizen-norm)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-citizen-norm" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *citizen-norm-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 speed-scale) 1.0) + ) + 0 + (set! (-> obj draw lod-set lod 0 dist) 204800.0) + (set! (-> obj draw lod-set lod 1 dist) 491520.0) + (try-update-focus (-> obj focus) *target* obj) + (-> obj neck) + (set! (-> obj info) *citizen-norm-global-info*) + (set! (-> obj anim-shuffle) 11) + (let ((v1-18 (get-rand-int obj 3))) + (cond + ((zero? v1-18) + (set! (-> obj anim-walk) 12) + (set! (-> obj dist-walk-anim) 8736.768) + (set! (-> obj speed-walk) 10240.0) + ) + ((= v1-18 1) + (set! (-> obj anim-walk) 13) + (set! (-> obj dist-walk-anim) 13107.2) + (set! (-> obj speed-walk) 12288.0) + ) + ((= v1-18 2) + (set! (-> obj anim-walk) 11) + (set! (-> obj dist-walk-anim) 4370.432) + (set! (-> obj speed-walk) 4096.0) + ) + ) + ) + (let ((v1-33 (get-rand-int obj 3))) + (cond + ((zero? v1-33) + (set! (-> obj anim-panic-run) 15) + ) + ((= v1-33 1) + (set! (-> obj anim-panic-run) 15) + ) + ((= v1-33 2) + (set! (-> obj anim-panic-run) 14) + ) + ) + ) + (set! (-> obj dist-run-anim) 28672.0) + (let ((v1-40 (get-rand-int obj 3))) + (cond + ((zero? v1-40) + (set! (-> obj anim-run) 14) + ) + ((= v1-40 1) + (set! (-> obj anim-run) 14) + ) + ((= v1-40 2) + (set! (-> obj anim-run) 14) + ) + ) + ) + (set! (-> obj speed-run) 49152.0) + (set! (-> obj anim-on-ground) 17) + (set! (-> obj anim-dive) 16) + (set! (-> obj anim-get-up-front) 22) + (set! (-> obj anim-get-up-back) 23) + (let ((f30-0 (get-rand-float-range obj 1.0 1.25)) + (f0-11 (get-rand-float-range obj 1.0 1.25)) + ) + (set-vector! (-> obj root-override2 scale) f0-11 f30-0 f0-11 1.0) + ) + (let ((f0-13 (get-rand-float-range obj 0.9 1.0))) + (set-vector! (-> obj draw color-mult) f0-13 f0-13 f0-13 1.0) + ) + (set! (-> obj water-anim) 29) + 0 + (none) + ) + +(defmethod citizen-init! citizen-norm ((obj citizen-norm)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type civilian citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj dive-reaction) (+ 0.09 (* 0.15 (rand-vu)))) + (logclear! (-> obj mask) (process-mask enemy)) + (setup-masks (-> obj draw) 0 -1) + (setup-masks (-> obj draw) 32 0) + (let ((v1-10 (get-rand-int obj 4))) + (cond + ((zero? v1-10) + (setup-masks (-> obj draw) 64 0) + ) + ((= v1-10 1) + (setup-masks (-> obj draw) 2048 0) + ) + ((= v1-10 2) + (setup-masks (-> obj draw) #x10000 0) + ) + ((= v1-10 3) + (setup-masks (-> obj draw) #x200000 0) + ) + ) + ) + (let ((v1-21 (get-rand-int obj 3))) + (cond + ((zero? v1-21) + (setup-masks (-> obj draw) 2 0) + ) + ((= v1-21 1) + (setup-masks (-> obj draw) 8192 0) + ) + ((= v1-21 2) + (setup-masks (-> obj draw) #x40000 0) + ) + ) + ) + (let ((v1-30 (get-rand-int obj 4))) + (cond + ((zero? v1-30) + (setup-masks (-> obj draw) 8 0) + ) + ((= v1-30 1) + (setup-masks (-> obj draw) 1024 0) + ) + ((= v1-30 2) + (setup-masks (-> obj draw) #x8000 0) + ) + ((= v1-30 3) + (setup-masks (-> obj draw) #x100000 0) + ) + ) + ) + (let ((v1-41 (get-rand-int obj 5))) + (cond + ((zero? v1-41) + (setup-masks (-> obj draw) 4 0) + ) + ((= v1-41 1) + (setup-masks (-> obj draw) 512 0) + ) + ((= v1-41 2) + (setup-masks (-> obj draw) #x4000 0) + ) + ((= v1-41 3) + (setup-masks (-> obj draw) #x80000 0) + ) + ) + ) + (let ((v1-52 (get-rand-int obj 4))) + (cond + ((zero? v1-52) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-52 1) + (setup-masks (-> obj draw) 4096 0) + ) + ((= v1-52 2) + (setup-masks (-> obj draw) #x20000 0) + ) + ((= v1-52 3) + (setup-masks (-> obj draw) #x400000 0) + ) + ) + ) + (setup-masks (-> obj draw) 16 0) + (let ((v1-65 (get-rand-int obj 4))) + (cond + ((zero? v1-65) + (setup-masks (-> obj draw) 256 0) + ) + ((= v1-65 1) + (setup-masks (-> obj draw) #x800000 0) + ) + ) + ) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/city/common/citizen.gc b/goal_src/jak2/levels/city/common/citizen.gc index 2f97b73dab..123a79794f 100644 --- a/goal_src/jak2/levels/city/common/citizen.gc +++ b/goal_src/jak2/levels/city/common/citizen.gc @@ -7,3 +7,1618 @@ ;; DECOMP BEGINS +(define *citizen-debug* #f) + +(defmethod citizen-nav-init! citizen ((obj citizen)) + "Initialize nav related fields." + (let ((v1-0 (-> obj nav))) + (logclear! (-> v1-0 flags) (nav-control-flag limit-rotation-rate output-sphere-hash)) + (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 ((a1-6 v1-0)) + (set! (-> a1-6 sphere-mask) (the-as uint #x800fe)) + ) + 0 + (let ((a1-8 v1-0)) + (set! (-> a1-8 nav-cull-radius) 12288.0) + ) + 0 + (logclear! (-> v1-0 flags) (nav-control-flag output-sphere-hash)) + ) + (set! (-> obj enemy-info-override callback-info) *nav-enemy-physics-callback-info*) + (let ((v1-2 obj)) + (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 + 0 + (none) + ) + +(defmethod citizen-init! citizen ((obj citizen)) + "Initialize [[citizen]] defaults." + (set! (-> obj fact-info-override enemy-options) + (logior (enemy-option knocked-into-water) (-> obj fact-info-override enemy-options)) + ) + (if (-> obj skel effect) + (logclear! (-> obj skel effect flags) (effect-control-flag ecf2)) + ) + (set! (-> obj draw death-draw-overlap) (the-as uint 0)) + (set! (-> obj draw death-timer) (the-as uint 0)) + (set! (-> obj draw death-timer-org) (the-as uint 0)) + (set! (-> obj draw death-vertex-skip) (the-as uint 0)) + (set! (-> obj draw death-effect) (the-as uint 0)) + (logclear! (-> obj focus-status) (focus-status disable dead inactive hit)) + (logclear! (-> obj flags) (citizen-flag persistent in-pursuit hostile)) + (clear-focused (-> obj focus)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logand (enemy-flag dislike-combo) (-> obj enemy-flags)))) + (logclear! (-> obj draw status) (draw-control-status no-draw lod-set)) + (set! (-> obj draw death-timer) (the-as uint 0)) + (logior! (-> obj root-override2 nav-flags) (nav-flags has-root-sphere)) + (let ((v1-28 (-> obj root-override2 root-prim))) + (set! (-> v1-28 prim-core collide-as) (-> obj root-override2 backup-collide-as)) + (set! (-> v1-28 prim-core collide-with) (-> obj root-override2 backup-collide-with)) + ) + (set! (-> obj root-override2 penetrated-by) + (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (logior! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) + (logior! (-> obj focus-status) (focus-status dangerous)) + (logior! (-> obj enemy-flags) (enemy-flag check-water)) + (set! (-> obj enemy-flags) + (logior (enemy-flag check-water-backup no-initial-move-to-ground) (-> obj enemy-flags)) + ) + (set! (-> obj mask) (logior (process-mask collectable) (-> obj mask))) + (logior! (-> obj enemy-flags) (enemy-flag look-at-move-dest)) + (set! (-> obj hit-points) (-> obj enemy-info-override default-hit-points)) + (set! (-> obj fated-time) 0) + (set! (-> obj hit-by-player-count) 0) + (set-vector! (-> obj draw color-mult) 1.0 1.0 1.0 1.0) + (set-vector! (-> obj draw color-emissive) 0.0 0.0 0.0 1.0) + (update-transforms (-> obj root-override2)) + 0 + (none) + ) + +;; WARN: Return type mismatch int vs enemy-aware. +(defmethod update-target-awareness! citizen ((obj citizen) (arg0 process-focusable) (arg1 enemy-best-focus)) + "Checks a variety of criteria to determine the level of awareness the enemy is of the target. Sets `aware` and related fields as well! +@TODO - flesh out docs +@returns the value that sets `aware`" + (when arg1 + (let ((f0-0 (vector-vector-distance (get-trans arg0 0) (-> obj root-override2 trans)))) + (when (< f0-0 (-> arg1 rating)) + (set! (-> arg1 rating) f0-0) + (set! (-> arg1 proc) arg0) + (set! (-> arg1 aware) (enemy-aware enemy-aware-3)) + ) + ) + ) + (the-as enemy-aware 3) + ) + +(defmethod enemy-method-61 citizen ((obj citizen) (arg0 int)) + 3 + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-stare citizen ((obj citizen)) + (go (method-of-object obj flee)) + (none) + ) + +(defmethod go-hostile citizen ((obj citizen)) + (go-inactive obj) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-flee citizen ((obj citizen)) + (go (method-of-object obj flee)) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod react-to-focus citizen ((obj citizen)) + "@TODO - flesh out docs" + (go (method-of-object obj active)) + (none) + ) + +;; WARN: Return type mismatch none vs object. +(defmethod kill-prefer-falling citizen ((obj citizen)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + (logclear! (-> obj flags) (citizen-flag persistent)) + (send-event (ppointer->process (-> obj parent)) 'child-killed) + (the-as object (go-inactive obj)) + ) + +(defmethod cleanup-for-death citizen ((obj citizen)) + (logclear! (-> obj flags) (citizen-flag persistent)) + (send-event (ppointer->process (-> obj parent)) 'child-killed) + (go-inactive obj) + (none) + ) + +(defmethod go-inactive citizen ((obj citizen)) + (vehicle-controller-method-11 (-> obj controller)) + (logior! (-> obj focus-status) (focus-status inactive)) + (set! (-> obj event-hook) (-> (method-of-object obj inactive) event)) + (go (method-of-object obj inactive)) + 0 + (none) + ) + +(defmethod trigger-alert citizen ((obj citizen) (arg0 int) (arg1 target)) + (let ((a0-1 (-> obj controller traffic))) + (when (and (nonzero? a0-1) arg1) + (if #t + (increase-alert-level a0-1 arg0 arg1) + ) + ) + ) + 0 + (none) + ) + +(defmethod decrease-alert citizen ((obj citizen) (arg0 object)) + (let ((a0-1 (-> obj controller traffic))) + (if (nonzero? a0-1) + (decrease-alert-level a0-1 (the-as int arg0)) + ) + ) + 0 + (none) + ) + +(defmethod get-inv-mass citizen ((obj citizen)) + 1.0 + ) + +(defmethod find-segment citizen ((obj citizen) (arg0 vector) (arg1 vector)) + (find-best-segment (-> obj controller traffic) arg0 arg1 1) + ) + +(defmethod nav-segment-callback citizen ((obj citizen) + (arg0 vector) + (arg1 traffic-find-segment-struct) + (arg2 (function traffic-find-segment-struct nav-segment none)) + ) + (callback-on-nav-segments-in-sphere (-> obj controller traffic) arg0 1 arg1 arg2) + 0 + (none) + ) + +(defmethod citizen-method-186 citizen ((obj citizen) (arg0 nav-segment)) + (vehicle-controller-method-11 (-> obj controller)) + (vehicle-controller-method-13 (-> obj controller) (-> arg0 branch) (the-as vector (-> arg0 vertex))) + 0 + (none) + ) + +(defmethod citizen-method-187 citizen ((obj citizen)) + (let* ((v1-0 (-> obj controller)) + (gp-1 (vector-! (new 'stack-no-clear 'vector) (-> v1-0 turn-exit-point) (-> v1-0 path-prev-point))) + (s5-1 (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) (-> v1-0 turn-exit-point))) + ) + (set! (-> s5-1 y) 0.0) + (set! (-> gp-1 y) 0.0) + (vector-xz-normalize! gp-1 1.0) + (< -16384.0 (vector-dot s5-1 gp-1)) + ) + ) + +(defmethod set-behavior! citizen ((obj citizen) (arg0 traffic-object-spawn-params)) + (let ((v1-0 (-> arg0 behavior))) + (cond + ((zero? v1-0) + (go (method-of-object obj idle)) + ) + ((= v1-0 2) + (go (method-of-object obj active)) + ) + ((= v1-0 3) + (go (method-of-object obj hostile)) + ) + (else + (go-inactive obj) + ) + ) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch none vs object. +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 193] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 198] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 69] +(defmethod general-event-handler citizen ((obj citizen) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (let ((v1-0 arg2)) + (the-as + object + (cond + ((or (= v1-0 'hit) (= v1-0 'hit-flinch) (= v1-0 'hit-knocked)) + (let ((v1-1 #f)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) + (knocked-type knocked-type-6) + (knocked-type knocked-type-5) + (knocked-type knocked-type-2) + ) + (set! v1-1 #t) + ) + (((knocked-type knocked-type-0)) + (+! (-> obj hit-by-player-count) 1) + (set! v1-1 (>= (-> obj hit-by-player-count) 2)) + ) + ) + (when v1-1 + (let* ((s5-0 (handle->process (-> obj incoming attacker-handle))) + (a2-5 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (if a2-5 + (trigger-alert obj 1 (the-as target a2-5)) + ) + ) + ) + ) + (go (method-of-object obj knocked)) + ) + ((= v1-0 'traffic-off) + (if (not (logtest? (-> obj flags) (citizen-flag persistent))) + (go-inactive obj) + ) + ) + ((= v1-0 'traffic-off-force) + (go-inactive obj) + ) + ((= v1-0 'traffic-activate) + (set! (-> obj controller traffic) (the-as traffic-engine (-> arg3 param 1))) + (let ((s5-1 (the-as object (-> arg3 param 0)))) + (set! (-> obj root-override2 trans quad) (-> (the-as traffic-object-spawn-params s5-1) position quad)) + (quaternion-copy! (-> obj root-override2 quat) (-> (the-as traffic-object-spawn-params s5-1) rotation)) + (set! (-> obj root-override2 transv quad) (-> (the-as traffic-object-spawn-params s5-1) velocity quad)) + (let ((a0-24 (-> (the-as traffic-object-spawn-params s5-1) nav-mesh))) + (when a0-24 + (change-to a0-24 obj) + (if (not (-> obj nav)) + (go-inactive obj) + ) + (let ((v1-31 (-> obj nav state))) + (set! (-> v1-31 current-poly) (the-as nav-poly #f)) + ) + 0 + (let ((a1-11 (-> (the-as traffic-object-spawn-params s5-1) nav-branch))) + (when a1-11 + (vehicle-controller-method-13 (-> obj controller) a1-11 (-> obj root-override2 trans)) + (let ((a0-28 (-> obj nav state)) + (v1-38 (-> obj controller turn-exit-point)) + ) + (logclear! (-> a0-28 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-28 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-28 target-post quad) (-> v1-38 quad)) + ) + 0 + ) + ) + (citizen-nav-init! obj) + (citizen-init! obj) + (enemy-method-127 obj 40960.0 40960.0 #t (the-as collide-spec (-> obj gnd-collide))) + (set! (-> obj gnd-height) (-> obj root-override2 gspot-pos y)) + (set-behavior! obj (the-as traffic-object-spawn-params s5-1)) + ) + ) + ) + ) + ((= v1-0 'nav-mesh-kill) + (remove-process-drawable (-> obj nav state mesh) obj) + (set! (-> obj nav) #f) + (go-inactive obj) + #t + ) + (else + ((method-of-type nav-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + ) + +(defmethod citizen-method-200 citizen ((obj citizen)) + (with-pp + (set! (-> obj root-override2 transv x) 0.0) + (set! (-> obj root-override2 transv z) 0.0) + (when (-> obj enemy-info-override move-to-ground) + (if (logtest? (-> obj focus-status) (focus-status under-water)) + (enemy-method-47 obj (-> obj root-override2 transv)) + (+! (-> obj root-override2 transv y) + (* (-> obj enemy-info-override movement-gravity) (-> pp clock seconds-per-frame)) + ) + ) + ) + (let ((a2-0 (new 'stack-no-clear 'move-above-ground-params))) + (let ((v1-15 (-> obj enemy-info-override))) + (set! (-> a2-0 gnd-collide-with) (the-as collide-spec (-> obj gnd-collide))) + (set! (-> a2-0 popup) 8192.0) + (set! (-> a2-0 dont-move-if-overlaps?) #t) + (set! (-> a2-0 hover-if-no-ground?) (-> v1-15 hover-if-no-ground)) + (set! (-> a2-0 overlaps-params options) (overlaps-others-options oo0 oo2)) + (set! (-> a2-0 overlaps-params collide-with-filter) (-> v1-15 overlaps-others-collide-with-filter)) + ) + (set! (-> a2-0 overlaps-params tlist) *touching-list*) + (-> a2-0 overlaps-params) + (enemy-method-128 obj (-> obj root-override2 transv) a2-0) + ) + 0 + (none) + ) + ) + +(defmethod track-target! citizen ((obj citizen)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (when (< (-> obj next-time-look-at) (-> pp clock frame-counter)) + (when (nonzero? (-> obj neck)) + (let ((a0-4 (handle->process (-> obj focus handle)))) + (when a0-4 + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> (get-trans (the-as process-focusable a0-4) 2) quad)) + (if (and (-> obj next-state) (= (-> obj next-state name) 'flee)) + (set! (-> s5-0 quad) (-> obj danger-pos quad)) + ) + (when (< (vector-vector-distance s5-0 (-> obj root-override2 trans)) 122880.0) + (look-at-target! obj (enemy-flag lock-focus)) + (target-set! (-> obj neck) s5-0) + ) + ) + ) + ) + (when (< (-> obj stop-time-look-at) (-> pp clock frame-counter)) + (shut-down (-> obj neck)) + (set! (-> obj next-time-look-at) + (+ (-> pp clock frame-counter) (the int (* 300.0 (get-rand-float-range obj 0.0 20.0)))) + ) + (set! (-> obj stop-time-look-at) + (+ (-> obj next-time-look-at) (the int (* 300.0 (get-rand-float-range obj 5.0 10.0)))) + ) + ) + ) + ) + (let ((a0-18 (-> obj enemy-flags))) + (when (and (logtest? a0-18 (enemy-flag attackable-backup)) + (>= (- (-> pp clock frame-counter) (-> obj auto-reset-penetrate-time)) (seconds 0.1)) + ) + (set! (-> obj enemy-flags) (logclear a0-18 (enemy-flag attackable-backup))) + (set! (-> obj root-override2 penetrated-by) (get-penetrate-info obj)) + (let ((v1-50 0)) + (if (logtest? (penetrate knocked) (-> obj root-override2 penetrate-using)) + (set! v1-50 (logior (shl 1 32) v1-50)) + ) + (set! (-> obj root-override2 penetrate-using) (the-as penetrate v1-50)) + ) + ) + ) + (if (and (nonzero? (-> obj draw)) (logtest? (-> obj draw status) (draw-control-status on-screen))) + (set! (-> obj last-draw-time) (-> pp clock frame-counter)) + ) + (let ((s5-3 (-> obj draw shadow-ctrl))) + (when (!= *nav-enemy-dummy-shadow-control* s5-3) + (let ((f0-7 (vector-vector-distance (camera-pos) (-> obj root-override2 trans)))) + (cond + ((< 163840.0 f0-7) + (logior! (-> s5-3 settings flags) (shadow-flags disable-draw)) + 0 + ) + (else + (let ((v1-65 s5-3)) + (logclear! (-> v1-65 settings flags) (shadow-flags disable-draw)) + ) + 0 + (let* ((f0-8 (lerp-scale 0.0 1.0 f0-7 163840.0 40960.0)) + (f0-11 (fmax 0.01 (+ (* -2.0 f0-8 f0-8 f0-8) (* 3.0 f0-8 f0-8)))) + ) + (set! (-> s5-3 settings shadow-dir w) (* 614400.0 f0-11)) + ) + ) + ) + ) + ) + ) + (when (logtest? (enemy-flag trackable-backup directed-ready) (-> obj enemy-flags)) + (enemy-method-54 obj) + (when (and (logtest? (-> obj focus-status) (focus-status touch-water)) + (< (-> obj root-override2 trans y) (+ -11468.8 (-> obj water-surface-height))) + ) + (set! (-> obj root-override2 trans y) (+ -11468.8 (-> obj water-surface-height))) + (if (not (and (-> obj next-state) (= (-> obj next-state name) 'in-ditch))) + (go (method-of-object obj in-ditch)) + ) + ) + ) + (ja-post) + 0 + (none) + ) + ) + +(defmethod enemy-method-128 citizen ((obj citizen) (arg0 vector) (arg1 move-above-ground-params)) + (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 ((gp-0 (-> obj root-override2))) + (set! (-> arg1 on-ground?) #f) + (set! (-> arg1 do-move?) #t) + (set! (-> arg1 old-gspot-pos quad) (-> gp-0 gspot-pos quad)) + (set! (-> arg1 old-gspot-normal quad) (-> gp-0 gspot-normal quad)) + (set! (-> gp-0 trans-old-old-old quad) (-> gp-0 trans-old-old quad)) + (set! (-> gp-0 trans-old-old quad) (-> gp-0 trans-old quad)) + (set! (-> gp-0 trans-old quad) (-> gp-0 trans quad)) + (set! (-> gp-0 prev-status) (-> gp-0 status)) + (vector-v+! (-> gp-0 trans) (-> gp-0 trans) arg0) + (set! (-> arg1 new-pos quad) (-> gp-0 trans quad)) + (when (= (-> obj controller traffic sync-mask-8) (ash 1 (logand (-> obj traffic-id) 7))) + (let ((s2-0 (new 'stack-no-clear 'collide-query))) + (logclear! (-> gp-0 status) (collide-status on-ground)) + (let* ((a0-14 obj) + (t9-1 (method-of-object a0-14 enemy-above-ground?)) + (a1-2 s2-0) + (a2-2 (new 'stack-no-clear 'vector)) + ) + (let ((v1-14 (-> gp-0 trans))) + (let ((a3-0 (-> gp-0 transv))) + (let ((t0-1 0.15)) + (.mov vf7 t0-1) + ) + (.lvf vf5 (&-> a3-0 quad)) + ) + (.lvf vf4 (&-> v1-14 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-2 quad) vf6) + (when (t9-1 a0-14 a1-2 a2-2 (-> arg1 gnd-collide-with) 16384.0 81920.0 1024.0) + (set! (-> gp-0 gspot-pos quad) (-> gp-0 trans quad)) + (set! (-> gp-0 gspot-pos y) (-> s2-0 best-other-tri intersect y)) + (set! (-> gp-0 gspot-normal quad) (-> s2-0 best-other-tri normal quad)) + (logior! (-> gp-0 status) (collide-status on-ground)) + (set! (-> gp-0 ground-pat) (-> s2-0 best-other-tri pat)) + ) + ) + ) + (set! (-> obj gnd-height) (-> gp-0 gspot-pos y)) + (set! (-> gp-0 gspot-pos y) (-> arg1 old-gspot-pos y)) + ) + (let ((f0-5 (- (-> obj gnd-height) (-> gp-0 gspot-pos y)))) + (cond + ((< 0.0 f0-5) + (+! (-> gp-0 gspot-pos y) (* 10.0 (-> pp clock seconds-per-frame) f0-5)) + ) + (else + (+! (-> gp-0 gspot-pos y) (* 10.0 (-> pp clock seconds-per-frame) f0-5)) + (if (< (-> gp-0 gspot-pos y) (-> obj gnd-height)) + (set! (-> gp-0 gspot-pos y) (-> obj gnd-height)) + ) + ) + ) + ) + (set! (-> arg1 on-ground?) #t) + (set! (-> arg1 pat) (-> gp-0 ground-pat)) + (when (>= (-> gp-0 gspot-pos y) (-> arg1 new-pos y)) + (set! (-> arg1 new-pos y) (-> gp-0 gspot-pos y)) + (set! (-> gp-0 ground-impact-vel) (- (vector-dot arg0 (-> gp-0 dynam gravity-normal)))) + (set! (-> arg0 y) 0.0) + ) + (set! (-> gp-0 trans quad) (-> arg1 new-pos quad)) + (when (-> arg1 do-move?) + (cond + ((-> arg1 on-ground?) + (let ((a1-3 (-> gp-0 gspot-pos)) + (a0-22 (-> gp-0 gspot-normal)) + (v1-41 (-> arg1 pat)) + ) + (set! (-> gp-0 grount-touch-point quad) (-> a1-3 quad)) + (set! (-> gp-0 poly-normal quad) (-> a0-22 quad)) + (set! (-> gp-0 surface-normal quad) (-> a0-22 quad)) + (set! (-> gp-0 local-normal quad) (-> a0-22 quad)) + (set! (-> gp-0 ground-poly-normal quad) (-> a0-22 quad)) + (set! (-> gp-0 poly-pat) v1-41) + (set! (-> gp-0 cur-pat) v1-41) + (set! (-> gp-0 ground-pat) v1-41) + ) + (logior! (-> gp-0 status) (collide-status on-surface on-ground touch-surface)) + ) + (else + (logclear! (-> gp-0 status) (collide-status + on-surface + on-ground + touch-surface + touch-wall + touch-ceiling + touch-actor + on-special-surface + touch-edge + blocked + on-water + impact-surface + touch-background + stuck + glance + ) + ) + (when (not (logtest? (-> gp-0 root-prim prim-core action) (collide-action no-normal-reset))) + (let ((v1-51 (-> gp-0 dynam gravity-normal))) + (set! (-> gp-0 local-normal quad) (-> v1-51 quad)) + (set! (-> gp-0 surface-normal quad) (-> v1-51 quad)) + (set! (-> gp-0 poly-normal quad) (-> v1-51 quad)) + ) + (set! (-> gp-0 coverage) 0.0) + (set! (-> gp-0 touch-angle) 0.0) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + ) + +(defmethod nav-enemy-method-142 citizen ((obj citizen) (arg0 nav-control)) + (with-pp + (let ((s3-0 (new 'stack-no-clear 'vector))) + (let ((a1-1 (-> arg0 state))) + (set! (-> s3-0 quad) (-> a1-1 heading quad)) + ) + (set! (-> s3-0 y) 0.0) + (vector-normalize! s3-0 1.0) + (let ((gp-0 (new 'stack-no-clear 'quaternion)) + (s5-1 (-> obj root-override2 quat)) + ) + (quaternion-set! gp-0 0.0 (-> s3-0 x) 0.0 (+ 1.0 (-> s3-0 z))) + (quaternion-normalize! gp-0) + (quaternion-pseudo-seek + s5-1 + s5-1 + gp-0 + (* (fmax 0.5 (* 0.00024414062 (-> arg0 state speed))) (-> pp clock seconds-per-frame)) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod nav-enemy-method-176 citizen ((obj citizen)) + (nav-enemy-method-177 obj) + (let ((a0-2 obj)) + (when (logtest? (enemy-flag enemy-flag36) (-> a0-2 enemy-flags)) + (cond + ((logtest? (enemy-flag enemy-flag38) (-> obj enemy-flags)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag38)))) + (set! (-> obj root-override2 gspot-pos quad) (-> obj root-override2 trans quad)) + (set! (-> obj gnd-height) (-> obj root-override2 gspot-pos y)) + ) + (else + (nav-enemy-method-142 obj (-> obj nav)) + (nav-enemy-method-143 obj (-> obj nav)) + ) + ) + ) + ) + (track-target! obj) + (update-transforms (-> obj root-override2)) + 0 + (none) + ) + +(defmethod go-idle citizen ((obj citizen)) + (go (method-of-object obj active)) + 0 + (none) + ) + +(defmethod init-enemy-behaviour-and-stats! citizen ((obj citizen) (arg0 nav-enemy-info)) + "Initializes a bunch of enemy fields related to how they should react, how many hitpoints they should have, etc" + (set! (-> arg0 nav-mesh) *default-nav-mesh*) + (let ((t9-0 (method-of-type nav-enemy init-enemy-behaviour-and-stats!))) + (t9-0 obj arg0) + ) + (set! (-> obj speed-scale) (get-rand-float-range obj 0.9 1.1)) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + (vehicle-controller-method-9 (-> obj controller)) + (citizen-init! obj) + (if (zero? (-> obj draw light-index)) + (set! (-> obj draw light-index) (the-as uint 10)) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch entity-perm-status vs none. +(defmethod init-from-entity! citizen ((obj citizen) (arg0 entity-actor)) + "Typically the method that does the initial setup on the process, potentially using the [[entity-actor]] provided as part of that. +This commonly includes things such as: +- stack size +- collision information +- loading the skeleton group / bones +- sounds" + (process-entity-status! obj (entity-perm-status dead) #t) + (none) + ) + +(defbehavior citizen-init-by-other citizen ((arg0 traffic-object-spawn-params)) + (stack-size-set! (-> self main-thread) 512) + (logclear! (-> self mask) (process-mask enemy)) + (init-enemy-collision! self) + (set! (-> self root-override2 trans quad) (-> arg0 position quad)) + (quaternion-copy! (-> self root-override2 quat) (-> arg0 rotation)) + (if (not (logtest? (-> arg0 flags) 1)) + (lwide-entity-hack) + ) + (set! (-> self vehicle) (-> arg0 handle)) + (set! (-> self interp) 0.0) + (logclear! (-> self flags) (citizen-flag run-mode)) + (logclear! (-> self flags) (citizen-flag shuffle-mode)) + (if (logtest? (-> arg0 flags) 8) + (logior! (-> self flags) (citizen-flag dark-guard)) + ) + (init-enemy! self) + (set! (-> self traffic-id) (the-as int (-> arg0 id))) + (go-inactive self) + (none) + ) + +(defmethod get-run-anim citizen ((obj citizen)) + (-> obj anim-run) + ) + +;; WARN: new jak 2 until loop case, check carefully +(defbehavior citizen-travel-anim citizen ((arg0 int) (arg1 int)) + (local-vars (f28-0 float)) + (logclear! (-> self flags) (citizen-flag shuffle-mode)) + (logclear! (-> self flags) (citizen-flag run-mode)) + (let ((v1-6 (ja-group))) + (when (not (and v1-6 (= v1-6 (-> self draw art-group data (-> self anim-walk))))) + (ja-channel-push! 2 (the-as time-frame arg1)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-walk)) + :num! (loop!) + :dist (-> self dist-walk-anim) + :frame-num (ja-aframe 4.0 0) + ) + (let ((gp-1 (-> self skel root-channel 1))) + (let ((f0-3 (-> self interp))) + (set! (-> gp-1 frame-interp 1) f0-3) + (set! (-> gp-1 frame-interp 0) f0-3) + ) + (set! (-> gp-1 dist) (-> self dist-run-anim)) + (set! (-> gp-1 frame-group) (the-as art-joint-anim (-> self draw art-group data (get-run-anim self)))) + (set! (-> gp-1 param 0) 0.0) + (joint-control-channel-group! + gp-1 + (the-as art-joint-anim (-> self draw art-group data (get-run-anim self))) + num-func-chan + ) + ) + ) + ) + (until #f + (let ((f30-0 (-> self nav state speed))) + (lerp-scale 0.0 1.0 f30-0 (-> self speed-walk) (-> self speed-run)) + (set! f28-0 + (cond + ((< f30-0 4096.0) + (cond + ((logtest? (-> self flags) (citizen-flag shuffle-mode)) + (set! f28-0 1.0) + (ja :chan 1 :group! (-> self draw art-group data (-> self anim-shuffle)) :dist 4096.0) + ) + (else + (set! f28-0 0.0) + (when (= (-> self interp) 0.0) + (logclear! (-> self flags) (citizen-flag run-mode)) + (logior! (-> self flags) (citizen-flag shuffle-mode)) + ) + ) + ) + f28-0 + ) + ((< 20480.0 f30-0) + (cond + ((logtest? (-> self flags) (citizen-flag run-mode)) + (set! f28-0 1.0) + (ja :chan 1 :group! (-> self draw art-group data (get-run-anim self)) :dist (-> self dist-run-anim)) + ) + (else + (set! f28-0 0.0) + (when (= (-> self interp) 0.0) + (logior! (-> self flags) (citizen-flag run-mode)) + (logclear! (-> self flags) (citizen-flag shuffle-mode)) + ) + ) + ) + f28-0 + ) + ((or (logtest? (-> self flags) (citizen-flag run-mode)) (logtest? (-> self flags) (citizen-flag shuffle-mode))) + (set! f28-0 0.0) + (when (= (-> self interp) 0.0) + (logclear! (-> self flags) (citizen-flag run-mode)) + (logclear! (-> self flags) (citizen-flag shuffle-mode)) + ) + f28-0 + ) + (else + 0.0 + ) + ) + ) + (seek! (-> self interp) f28-0 (* 4.0 (-> self clock seconds-per-frame))) + (let ((v1-76 (-> self skel root-channel 1)) + (f0-21 (-> self interp)) + ) + (set! (-> v1-76 frame-interp 1) f0-21) + (set! (-> v1-76 frame-interp 0) f0-21) + ) + (let* ((f0-22 (current-cycle-distance (-> self skel))) + (f0-25 (/ (/ (* 16.0 f30-0) (* 15.0 f0-22)) (-> self root-override2 scale x))) + ) + (if (logtest? (-> self flags) (citizen-flag shuffle-mode)) + (set! f0-25 1.0) + ) + (ja :num! (loop! f0-25)) + ) + ) + (ja :chan 1 :num! (chan 0)) + (suspend) + ) + #f + ) + +(defmethod citizen-method-188 citizen ((obj citizen) (arg0 vector)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (let ((s1-0 (-> obj nav state current-poly))) + (let ((a1-2 (-> obj nav state))) + (set! (-> s5-0 quad) (-> a1-2 heading quad)) + ) + (set! (-> s5-0 y) 0.0) + (vector-xz-normalize! s5-0 20480.0) + (set! (-> s4-0 quad) (-> s5-0 quad)) + (clamp-vector-to-mesh-no-gaps (-> obj nav) (-> obj root-override2 trans) s1-0 s4-0 s2-0) + ) + (cond + ((-> s2-0 found-boundary) + (let ((s1-2 (vector-! + (new 'stack-no-clear 'vector) + (-> obj controller turn-exit-point) + (-> obj controller path-prev-point) + ) + ) + (s0-1 (vector-! (new 'stack-no-clear 'vector) (-> s2-0 intersection) (-> obj controller path-prev-point))) + ) + (vector-! (new 'stack-no-clear 'vector) s5-0 s4-0) + (set! (-> s1-2 y) 0.0) + (vector-xz-normalize! s1-2 1.0) + (vector-rotate90-around-y! s1-2 s1-2) + (if (< 0.0 (vector-dot s1-2 s0-1)) + (vector-negate! arg0 s1-2) + (set! (-> arg0 quad) (-> s1-2 quad)) + ) + ) + (vector-xz-normalize! arg0 8192.0) + ) + (else + (set! (-> arg0 quad) (the-as uint128 0)) + ) + ) + ) + 0 + (none) + ) + +(defmethod calc-danger-vec citizen ((obj citizen) (arg0 vector) (arg1 vector)) + (let ((s2-0 (new 'stack-no-clear 'vector)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s5-0 quad) (-> obj root-override2 trans quad)) + (let ((a1-1 (-> obj nav state))) + (set! (-> s2-0 quad) (-> a1-1 heading quad)) + ) + (set! (-> s2-0 y) 0.0) + (vector-xz-normalize! s2-0 20480.0) + (set! (-> s5-0 y) (-> arg0 y)) + (cond + ((< (vector-vector-xz-distance arg0 s5-0) (-> arg0 w)) + (vector-! (new 'stack-no-clear 'vector) arg0 s5-0) + (new 'stack-no-clear 'vector) + (new 'stack-no-clear 'vector) + 0.0 + (let ((s2-2 (vector-! + (new 'stack-no-clear 'vector) + (-> obj controller turn-exit-point) + (-> obj controller path-prev-point) + ) + ) + (s1-1 (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj controller path-prev-point))) + ) + (set! (-> s2-2 y) 0.0) + (vector-xz-normalize! s2-2 1.0) + (vector-rotate90-around-y! s2-2 s2-2) + (if (< 0.0 (vector-dot s2-2 s1-1)) + (vector-negate! arg1 s2-2) + (set! (-> arg1 quad) (-> s2-2 quad)) + ) + ) + (vector-xz-normalize! arg1 (* 5.0 (- (-> arg0 w) (vector-vector-xz-distance arg0 s5-0)))) + ) + ((line-sphere-intersection? arg0 s5-0 (vector+! (new 'stack-no-clear 'vector) s5-0 s2-0)) + (let ((s3-3 (vector-! (new 'stack-no-clear 'vector) arg0 s5-0)) + (s5-1 (new 'stack-no-clear 'vector)) + (s4-1 (new 'stack-no-clear 'vector)) + ) + 0.0 + (vector-rotate90-around-y! s5-1 s2-0) + (vector-xz-normalize! s5-1 1.0) + (let ((f30-1 (vector-dot s5-1 s3-3))) + (vector-*! s4-1 s3-3 s5-1 f30-1) + (vector-xz-normalize! s5-1 20480.0) + (if (< 0.0 f30-1) + (vector-negate! arg1 s5-1) + (set! (-> arg1 quad) (-> s5-1 quad)) + ) + ) + ) + ) + (else + (set! (-> arg1 quad) (the-as uint128 0)) + ) + ) + ) + 0 + (none) + ) + +(defmethod citizen-method-190 citizen ((obj citizen) (arg0 vector)) + (local-vars (sv-288 nav-poly) (sv-304 clamp-travel-vector-to-mesh-return-info) (sv-320 vector)) + (let ((s3-1 + (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) (the-as vector (-> obj cp-sphere))) + ) + (s4-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + ) + 0.0 + (set! (-> arg0 quad) (the-as uint128 0)) + (when (-> obj cp-valid?) + (set! (-> obj cp-valid?) #f) + (set! (-> s2-0 quad) (-> obj cp-vec quad)) + (set! (-> s2-0 y) 0.0) + (vector-xz-normalize! s2-0 1.0) + (vector-rotate90-around-y! s2-0 s2-0) + (set! (-> s3-1 y) 0.0) + (vector-*! s4-0 s3-1 s2-0 (vector-dot s3-1 s2-0)) + (let ((f30-0 (- 1.0 (/ (vector-length s4-0) (vector-length (-> obj cp-vec)))))) + (vector+! s4-0 s4-0 (the-as vector (-> obj cp-sphere))) + (let ((s0-0 (new 'stack-no-clear 'vector))) + (set! sv-320 (new 'stack-no-clear 'vector)) + (let ((s1-0 (new 'stack-no-clear 'vector))) + (set! sv-304 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + (set! sv-288 (-> obj nav state current-poly)) + (let ((f28-0 (+ (-> obj cp-sphere r) (-> obj nav-radius-backup)))) + (when sv-288 + (vector-normalize-copy! s0-0 s2-0 f28-0) + (vector-normalize-copy! sv-320 s2-0 (- f28-0)) + (clamp-vector-to-mesh-no-gaps (-> obj nav) s4-0 sv-288 s0-0 sv-304) + (let ((a0-12 (-> obj nav)) + (t9-7 (method-of-type nav-control clamp-vector-to-mesh-no-gaps)) + (a1-10 s4-0) + (a3-3 sv-320) + ) + (t9-7 a0-12 a1-10 sv-288 a3-3 sv-304) + ) + (let* ((v1-22 s0-0) + (f0-11 (sqrtf (+ (* (-> v1-22 x) (-> v1-22 x)) (* (-> v1-22 z) (-> v1-22 z))))) + (v1-24 sv-320) + (f1-10 (sqrtf (+ (* (-> v1-24 x) (-> v1-24 x)) (* (-> v1-24 z) (-> v1-24 z))))) + ) + (cond + ((< 0.0 (vector-dot s2-0 s3-1)) + (if (< 4096.0 f0-11) + (set! (-> s1-0 quad) (-> s0-0 quad)) + (set! (-> s1-0 quad) (-> sv-320 quad)) + ) + ) + ((< 4096.0 f1-10) + (set! (-> s1-0 quad) (-> sv-320 quad)) + ) + (else + (set! (-> s1-0 quad) (-> s0-0 quad)) + ) + ) + ) + (set! (-> arg0 quad) (-> s1-0 quad)) + (let ((a1-11 (new 'stack-no-clear 'vector))) + (set! (-> a1-11 quad) (-> obj root-override2 trans quad)) + (set! (-> a1-11 y) 0.0) + (let ((f0-15 (- f28-0 (vector-vector-xz-distance s4-0 a1-11)))) + (if (< f0-15 0.0) + (set! f0-15 0.0) + ) + (vector-normalize! arg0 (* (-> obj cp-factor) f0-15 f30-0)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +(deftype iter-seg (structure) + ((self citizen :offset-assert 0) + (score float :offset-assert 4) + (seg nav-segment :offset-assert 8) + (cp-plane plane :inline :offset-assert 16) + (desired-dir vector :inline :offset-assert 32) + ) + :method-count-assert 9 + :size-assert #x30 + :flag-assert #x900000030 + ) + + +(defun iter-seg-clear-path ((arg0 iter-seg) (arg1 nav-segment)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((s2-0 (-> arg0 self)) + (a0-1 (-> arg1 branch src-node)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s4-0 quad) (-> a0-1 position quad)) + (set! (-> s4-0 w) 1.0) + (let ((a0-4 (-> arg1 branch dest-node)) + (s3-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s3-0 quad) (-> a0-4 position quad)) + (set! (-> s3-0 w) 1.0) + (set! (-> s4-0 y) 0.0) + (set! (-> s3-0 y) 0.0) + (set! (-> s4-0 w) 1.0) + (set! (-> s3-0 w) 1.0) + (when *citizen-debug* + ) + (cond + ((< 0.0 (vector4-dot (the-as vector (-> arg0 cp-plane)) s3-0)) + (let ((s0-1 (vector-! (new 'stack-no-clear 'vector) s3-0 s4-0)) + (s1-1 (vector-! (new 'stack-no-clear 'vector) (-> s2-0 root-override2 trans) s4-0)) + ) + (set! (-> s1-1 y) 0.0) + (vector-rotate90-around-y! s0-1 s0-1) + (vector-normalize! s0-1 1.0) + (let ((a1-3 s1-1)) + (let ((v1-16 s1-1)) + (let ((a0-12 s0-1)) + (let ((a2-2 (- (vector-dot s0-1 s1-1)))) + (.mov vf7 a2-2) + ) + (.lvf vf5 (&-> a0-12 quad)) + ) + (.lvf vf4 (&-> v1-16 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-3 quad) vf6) + ) + (vector+! s1-1 s1-1 s4-0) + (cond + ((< 0.0 (vector-dot (the-as vector (-> arg0 cp-plane)) (vector-! (new 'stack-no-clear 'vector) s3-0 s1-1))) + (vector-vector-xz-distance s3-0 (-> s2-0 cp-sphere)) + (let ((s1-3 (vector-! (new 'stack-no-clear 'vector) s3-0 (the-as vector (-> s2-0 cp-sphere)))) + (s0-2 (new 'stack-no-clear 'vector)) + ) + (set! (-> s0-2 quad) (-> s2-0 cp-vec quad)) + (set! (-> s0-2 y) 0.0) + (vector-normalize! s0-2 1.0) + (set! (-> s1-3 y) 0.0) + (let ((f0-16 (vector-dot s0-2 s1-3))) + (when (< (-> arg0 score) f0-16) + (set! (-> arg0 score) f0-16) + (set! (-> arg0 seg) arg1) + ) + ) + ) + (if *citizen-debug* + (add-debug-line #t (bucket-id debug-no-zbuf1) s4-0 s3-0 *color-black* #f *color-white*) + ) + ) + (else + (if *citizen-debug* + (add-debug-line #t (bucket-id debug-no-zbuf1) s1-1 s3-0 *color-red* #f (the-as rgba -1)) + ) + ) + ) + ) + ) + (else + #f + ) + ) + ) + ) + ) + ) + +(defmethod gen-clear-path citizen ((obj citizen)) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'iter-seg)) + ) + (let ((s3-0 (new 'stack-no-clear 'vector))) + (set! (-> s3-0 quad) (-> obj cp-vec quad)) + (set! (-> s4-0 quad) (-> obj root-override2 trans quad)) + (set! (-> s4-0 w) 81920.0) + (set! (-> gp-0 seg) #f) + (set! (-> gp-0 score) 0.0) + (set! (-> s3-0 y) 0.0) + (vector-rotate90-around-y! s3-0 s3-0) + (vector-normalize! s3-0 1.0) + (set! (-> gp-0 cp-plane quad) (-> s3-0 quad)) + (set! (-> gp-0 cp-plane w) (- (vector-dot s3-0 (the-as vector (-> obj cp-sphere))))) + ) + (when (< (vector4-dot (the-as vector (-> gp-0 cp-plane)) (-> obj root-override2 trans)) 0.0) + (set! (-> gp-0 cp-plane x) (- (-> gp-0 cp-plane x))) + (set! (-> gp-0 cp-plane y) (- (-> gp-0 cp-plane y))) + (set! (-> gp-0 cp-plane z) (- (-> gp-0 cp-plane z))) + (set! (-> gp-0 cp-plane w) (- (-> gp-0 cp-plane w))) + ) + (set! (-> gp-0 self) obj) + (nav-segment-callback + obj + s4-0 + (the-as traffic-find-segment-struct gp-0) + (the-as (function traffic-find-segment-struct nav-segment none) iter-seg-clear-path) + ) + (when *citizen-debug* + (if (-> gp-0 seg) + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (the-as vector (-> gp-0 seg vertex)) + (-> gp-0 seg vertex 1) + *color-blue* + #f + *color-white* + ) + ) + ) + (-> gp-0 seg) + ) + ) + +(defmethod citizen-method-192 citizen ((obj citizen)) + (when (-> obj cp-valid?) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (set! (-> s4-0 quad) (-> obj cp-force quad)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (let ((a1-0 (-> obj nav state))) + (set! (-> s5-0 quad) (-> a1-0 heading quad)) + ) + (set! (-> s5-0 y) 0.0) + (vector-xz-normalize! s5-0 1.0) + (vector-xz-normalize! s4-0 1.0) + (when (< (fabs (vector-dot s4-0 s5-0)) (cos 14563.556)) + (vector-negate! (new 'stack-no-clear 'vector) s5-0) + (let ((a1-6 (gen-clear-path obj))) + (if a1-6 + (citizen-method-186 obj a1-6) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch nav-segment vs none. +(defun iter-seg-new-dir ((arg0 iter-seg) (arg1 nav-segment)) + (-> arg0 self) + (let ((a1-1 (-> arg1 branch src-node)) + (v1-2 (new 'stack-no-clear 'vector)) + ) + (set! (-> v1-2 quad) (-> a1-1 position quad)) + (set! (-> v1-2 w) 1.0) + (let ((a2-0 (-> arg1 branch dest-node)) + (a0-4 (new 'stack-no-clear 'vector)) + ) + (set! (-> a0-4 quad) (-> a2-0 position quad)) + (set! (-> a0-4 w) 1.0) + (set! (-> v1-2 y) 0.0) + (set! (-> a0-4 y) 0.0) + (set! (-> v1-2 w) 1.0) + (set! (-> a0-4 w) 1.0) + (let ((s4-1 (vector-! (new 'stack-no-clear 'vector) a0-4 v1-2))) + 0.0 + (vector-normalize! s4-1 1.0) + (let ((f0-8 (vector-dot s4-1 (-> arg0 desired-dir)))) + (when (< (-> arg0 score) f0-8) + (set! (-> arg0 score) f0-8) + (set! (-> arg0 seg) arg1) + ) + ) + ) + ) + ) + (none) + ) + +(defmethod gen-new-dir citizen ((obj citizen) (arg0 vector) (arg1 float)) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'iter-seg)) + ) + (set! (-> (new 'stack-no-clear 'vector) quad) (-> obj cp-vec quad)) + (set! (-> s4-0 quad) (-> obj root-override2 trans quad)) + (set! (-> s4-0 w) arg1) + (set! (-> gp-0 seg) #f) + (set! (-> gp-0 score) 0.0) + (set! (-> gp-0 desired-dir quad) (-> arg0 quad)) + (vector-normalize! (-> gp-0 desired-dir) 1.0) + (set! (-> gp-0 self) obj) + (nav-segment-callback + obj + s4-0 + (the-as traffic-find-segment-struct gp-0) + (the-as (function traffic-find-segment-struct nav-segment none) iter-seg-new-dir) + ) + (when *citizen-debug* + (if (-> gp-0 seg) + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (the-as vector (-> gp-0 seg vertex)) + (-> gp-0 seg vertex 1) + *color-blue* + #f + *color-white* + ) + ) + ) + (-> gp-0 seg) + ) + ) + +;; WARN: Return type mismatch int vs symbol. +(defmethod citizen-method-195 citizen ((obj citizen) (arg0 vector)) + (dotimes (s4-0 6) + (let ((a1-2 (gen-new-dir obj arg0 (* 81920.0 (the float (+ s4-0 1)))))) + (when a1-2 + (citizen-method-186 obj a1-2) + (return (the-as symbol #f)) + ) + ) + ) + (the-as symbol 0) + ) + +(defmethod throw-off-vehicle citizen ((obj citizen)) + (with-pp + (let ((s4-0 (handle->process (-> obj vehicle)))) + (let ((v1-4 (-> obj root-override2 root-prim))) + (set! (-> v1-4 prim-core collide-as) (-> obj root-override2 backup-collide-as)) + (set! (-> v1-4 prim-core collide-with) (-> obj root-override2 backup-collide-with)) + ) + (when s4-0 + (let ((s5-1 (vector-! + (new 'stack-no-clear 'vector) + (-> obj root-override2 trans) + (-> (the-as vehicle s4-0) root-override-2 trans) + ) + ) + ) + (let ((s3-0 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> (the-as vehicle s4-0) root-override-2 quat))) + (v1-10 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> (the-as vehicle s4-0) root-override-2 quat))) + ) + (if (< 0.0 (vector-dot s5-1 s3-0)) + (vector+! s5-1 v1-10 s3-0) + (vector-! s5-1 v1-10 s3-0) + ) + ) + (vector-normalize! s5-1 32768.0) + (set! (-> s5-1 y) 71680.0) + (vector+! s5-1 s5-1 (-> (the-as vehicle s4-0) root-override-2 transv)) + (let ((a1-8 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-8 from) (process->ppointer pp)) + (set! (-> a1-8 num-params) 2) + (set! (-> a1-8 message) 'attack) + (set! (-> a1-8 param 0) (the-as uint #f)) + (let ((v1-16 (new 'static 'attack-info :mask (attack-info-mask vector id knock)))) + (let* ((a0-22 *game-info*) + (a2-1 (+ (-> a0-22 attack-id) 1)) + ) + (set! (-> a0-22 attack-id) a2-1) + (set! (-> v1-16 id) a2-1) + ) + (set! (-> v1-16 vector quad) (-> s5-1 quad)) + (set! (-> v1-16 knock) (the-as uint 7)) + (set! (-> a1-8 param 1) (the-as uint v1-16)) + ) + (send-event-function obj a1-8) + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defstate in-ditch (citizen) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior citizen) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self wait-time) (the-as time-frame (get-rand-int-range self 300 1500))) + (if (= (-> self water-anim) -1) + (go-inactive self) + ) + (when (logtest? (-> self focus-status) (focus-status touch-water)) + (let ((a1-3 (new 'stack-no-clear 'vector))) + (set! (-> a1-3 quad) (-> self root-override2 trans quad)) + (set! (-> a1-3 y) (+ 40.96 (-> self water-surface-height))) + (splash-spawn 0.2 a1-3 1) + ) + ) + (none) + ) + :exit (behavior () + '() + (none) + ) + :trans (the-as (function none :behavior citizen) #f) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (cond + ((logtest? (-> self focus-status) (focus-status touch-water)) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self water-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self water-anim))) frames num-frames) -1) + ) + 0.5 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> self root-override2 trans quad)) + (set! (-> gp-0 y) (+ 40.96 (-> self water-surface-height))) + (when (and (logtest? (-> self draw status) (draw-control-status on-screen)) (zero? (-> self draw cur-lod))) + (let ((f0-6 (y-angle (-> self root-override2)))) + (rings-water-spawn f0-6 gp-0 *null-vector* 3072.0 4096.0) + ) + ) + ) + (suspend) + (ja :num! (seek! max 0.5)) + ) + ) + #f + ) + (else + (until #f + (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 + ) + ) + 0.1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.1)) + ) + ) + #f + ) + ) + (none) + ) + :post (behavior () + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate wait (citizen) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior citizen) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :exit (behavior () + '() + (none) + ) + :trans (behavior () + (if (and (-> self wait-return-state) + (>= (- (-> self clock frame-counter) (-> self state-time)) (-> self wait-time)) + ) + (go (-> self wait-return-state)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (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 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a1-1 + (vector-! (new 'stack-no-clear 'vector) (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + ) + (seek-toward-heading-vec! (-> self root-override2) a1-1 32768.0 (seconds 0.05)) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate active (citizen) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior citizen) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-165 self) + (let ((v1-10 (-> self nav state))) + (set! (-> v1-10 speed) 0.0) + ) + 0 + (let ((a0-16 (-> self nav state)) + (v1-13 *null-vector*) + ) + (set! (-> a0-16 velocity quad) (-> v1-13 quad)) + ) + 0 + (let ((v1-16 (-> self nav))) + (set! (-> v1-16 target-speed) (* (-> self speed-scale) (-> self speed-walk))) + ) + 0 + (set! (-> self wait-time) (the-as time-frame (get-rand-int-range self 1200 9000))) + (when (zero? (-> self controller branch)) + (format 0 "citizen has no branch in active enter state~%") + (citizen-method-195 self (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + ) + (none) + ) + :exit (behavior () + '() + (none) + ) + :trans (behavior () + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (not (logtest? (-> self nav state flags) (nav-state-flag in-mesh))) + (< (-> self root-override2 trans y) 4096.0) + ) + (go-virtual in-ditch) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (-> self wait-time)) + (let ((f0-2 (-> self nav state speed))) + (set! (-> self nav target-speed) (seek f0-2 0.0 (* 12288.0 (-> self clock seconds-per-frame)))) + ) + 0 + (when (= (-> self nav state speed) 0.0) + (set! (-> self wait-return-state) (the-as (state citizen) (-> self state))) + (set! (-> self wait-time) (the-as time-frame (get-rand-int-range self 300 1500))) + (go-virtual wait) + ) + ) + (let ((f0-8 2867.2) + (v1-36 (-> self root-override2 transv)) + ) + (if (< f0-8 (sqrtf (+ (* (-> v1-36 x) (-> v1-36 x)) (* (-> v1-36 z) (-> v1-36 z))))) + (set! (-> self cp-next-time) (-> self clock frame-counter)) + ) + ) + (when (< (+ (-> self cp-next-time) (seconds 2)) (-> self clock frame-counter)) + (let ((a1-3 (vector-! + (new 'stack-no-clear 'vector) + (-> self controller path-prev-point) + (-> self controller turn-exit-point) + ) + ) + ) + (set! (-> self cp-next-time) (-> self clock frame-counter)) + (citizen-method-195 self a1-3) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 300) + (none) + ) + :post (behavior () + (if (and (nonzero? (-> self controller branch)) + (let ((f0-0 (vector-vector-xz-distance-squared (-> self root-override2 trans) (-> self controller turn-exit-point))) + (f1-0 16384.0) + ) + (or (< f0-0 (* f1-0 f1-0)) (logtest? (-> self nav state flags) (nav-state-flag at-target))) + ) + ) + (vehicle-controller-method-14 (-> self controller) (the-as vehicle self)) + ) + (let ((a0-5 (-> self nav state)) + (v1-11 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-5 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-5 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-5 target-post quad) (-> v1-11 quad)) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + ) + +(defstate inactive (citizen) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('nav-mesh-kill 'traffic-activate 'traffic-off-force 'traffic-off) + (general-event-handler self proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (when (-> self nav) + (citizen-nav-init! self) + (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 + ) + (logior! (-> self focus-status) (focus-status disable inactive)) + (let ((v1-10 (-> self root-override2 root-prim))) + (set! (-> v1-10 prim-core collide-as) (collide-spec)) + (set! (-> v1-10 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (logclear! (-> self root-override2 nav-flags) (nav-flags has-root-sphere has-extra-sphere)) + (vehicle-controller-method-11 (-> self controller)) + (none) + ) + :exit (behavior () + '() + (none) + ) + :code (the-as (function none :behavior citizen) sleep-code) + ) + +(defstate knocked (citizen) + :virtual #t + :trans (behavior () + (let ((a1-1 (vector-y-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + (gp-0 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-from-two-vectors-max-angle! gp-0 a1-1 *up-vector* (* 7281.778 (-> self clock seconds-per-frame))) + (quaternion*! (-> self root-override2 quat) gp-0 (-> self root-override2 quat)) + ) + (let ((t9-3 (-> (method-of-type nav-enemy knocked) trans))) + (if t9-3 + (t9-3) + ) + ) + (none) + ) + ) diff --git a/goal_src/jak2/levels/city/common/civilian.gc b/goal_src/jak2/levels/city/common/civilian.gc index 8041f9d562..be11e38943 100644 --- a/goal_src/jak2/levels/city/common/civilian.gc +++ b/goal_src/jak2/levels/city/common/civilian.gc @@ -7,23 +7,70 @@ ;; DECOMP BEGINS -(deftype civilian (citizen) - ((info basic :offset-assert 964) - (anim-panic-run int32 :offset-assert 968) - (anim-on-ground int32 :offset-assert 972) - (anim-dive int32 :offset-assert 976) - (anim-get-up-front int32 :offset-assert 980) - (anim-get-up-back int32 :offset-assert 984) - (last-second-pos vector :inline :offset-assert 992) - (last-distance float :offset-assert 1008) - (next-time time-frame :offset-assert 1016) - (dive-target-point vector :inline :offset-assert 1024) - (dive-reaction float :offset-assert 1040) - (allow-dive basic :offset-assert 1044) - (dive-finished? basic :offset-assert 1048) - (hit-face uint32 :offset-assert 1052) - (seat int32 :offset-assert 1056) +(deftype civilian-anim-info (structure) + ((anim-index int32 2 :offset-assert 0) + (anim-index-front int32 :offset 0) + (anim-index-back int32 :offset 4) ) + :pack-me + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + + +(deftype civilian-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (knocked int32 2 :offset-assert 8) + (anim-knocked-front int32 :offset 8) + (anim-knocked-back int32 :offset 12) + (knocked-land int32 2 :offset-assert 16) + (anim-knocked-front-land int32 :offset 16) + (anim-knocked-back-land int32 :offset 20) + (yellow-hit-anim civilian-anim-info 1 :inline :offset-assert 24) + (blue-hit-anim civilian-anim-info 3 :inline :offset-assert 32) + (anim-cover-head-start int32 :offset-assert 56) + (anim-cover-head-loop int32 :offset-assert 60) + (anim-cover-head-end int32 :offset-assert 64) + (car-stance-anim int32 :offset-assert 68) + (bike-stance-anim int32 :offset-assert 72) + (get-in-car-anim int32 :offset-assert 76) + (get-on-bike-anim int32 :offset-assert 80) + (seat-flag uint8 :offset-assert 84) + (speech-ambient int8 :offset-assert 85) + (speech-alert int8 :offset-assert 86) + (speech-cower int8 :offset-assert 87) + (speech-touched-by-player int8 :offset-assert 88) + (speech-shot-by-player int8 :offset-assert 89) + (speech-avoiding-player-vehicle int8 :offset-assert 90) + (speech-hit-by-player-vehicle int8 :offset-assert 91) + (speech-player-stealing-vehicle int8 :offset-assert 92) + ) + :method-count-assert 9 + :size-assert #x5d + :flag-assert #x90000005d + ) + + +(deftype civilian (citizen) + ((info civilian-global-info :offset-assert 964) + (anim-panic-run int32 :offset-assert 968) + (anim-on-ground int32 :offset-assert 972) + (anim-dive int32 :offset-assert 976) + (anim-get-up-front int32 :offset-assert 980) + (anim-get-up-back int32 :offset-assert 984) + (last-second-pos vector :inline :offset-assert 992) + (last-distance float :offset-assert 1008) + (next-time time-frame :offset-assert 1016) + (dive-target-point vector :inline :offset-assert 1024) + (dive-reaction float :offset-assert 1040) + (allow-dive symbol :offset-assert 1044) + (dive-finished? symbol :offset-assert 1048) + (hit-face uint32 :offset-assert 1052) + (seat int32 :offset-assert 1056) + ) + :heap-base #x3b0 :method-count-assert 218 :size-assert #x424 :flag-assert #xda03b00424 @@ -39,11 +86,2179 @@ (move-to-vehicle () _type_ :state 209) (board-vehicle () _type_ :state 210) (ride () _type_ :state 211) - (exit-vehicle () _type_ :state 212) + (exit-vehicle (object object int symbol event-message-block) _type_ :state 212) (wait-at-dest () _type_ :state 213) - (civilian-method-214 () none 214) - (civilian-method-215 () none 215) - (civilian-method-216 () none 216) - (civilian-method-217 () none 217) + (civilian-method-214 (_type_ nav-branch int vector float) float 214) + (civilian-method-215 (_type_ vector) none 215) + (go-dive (_type_) none 216) + (civilian-method-217 (_type_ vector) symbol 217) ) - ) \ No newline at end of file + ) + + +(defmethod get-run-anim civilian ((obj civilian)) + (if (and (-> obj next-state) (= (-> obj next-state name) 'flee)) + (-> obj anim-panic-run) + (-> obj anim-run) + ) + ) + +(defmethod enemy-method-81 civilian ((obj civilian)) + #f + ) + +(defmethod cleanup-for-death civilian ((obj civilian)) + (cond + ((zero? (-> obj hit-points)) + (logclear! (-> obj flags) (citizen-flag persistent)) + (send-event (ppointer->process (-> obj parent)) 'child-killed) + (let ((a1-1 (new 'stack-no-clear 'traffic-danger-info))) + (set! (-> a1-1 sphere quad) (-> obj root-override2 trans quad)) + (set! (-> a1-1 sphere r) 40960.0) + (set! (-> a1-1 velocity quad) (-> obj root-override2 transv quad)) + (set! (-> a1-1 notify-radius) 122880.0) + (set! (-> a1-1 danger-level) 1.0) + (set! (-> a1-1 decay-rate) 0.0) + (set! (-> a1-1 flags) (traffic-danger-flags tdf0)) + (set! (-> a1-1 danger-type) (traffic-danger-type tdt7)) + (set! (-> a1-1 handle) (process->handle obj)) + (set! (-> a1-1 handle) (the-as handle #f)) + (add-danger (-> obj controller traffic) a1-1) + ) + (go-inactive obj) + ) + (else + (set! (-> obj hit-points) (-> obj enemy-info-override default-hit-points)) + (set! (-> obj hit-points) (rand-vu-int-range 1 4)) + (set! (-> obj fated-time) 0) + (logior! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) + (logior! (-> obj focus-status) (focus-status dangerous)) + (logior! (-> obj enemy-flags) (enemy-flag check-water)) + (set! (-> obj enemy-flags) + (logior (enemy-flag check-water-backup no-initial-move-to-ground) (-> obj enemy-flags)) + ) + (logclear! (-> obj focus-status) (focus-status dead)) + (set! (-> obj mask) (logior (process-mask collectable) (-> obj mask))) + (logior! (-> obj enemy-flags) (enemy-flag look-at-move-dest)) + (if (zero? (-> obj hit-face)) + (go (method-of-object obj get-up-front)) + (go (method-of-object obj get-up-back)) + ) + ) + ) + (none) + ) + +(defmethod damage-amount-from-attack civilian ((obj civilian) (arg0 process) (arg1 event-message-block)) + "@returns the amount of damage taken from an attack. This can come straight off the [[attack-info]] or via [[penetrate-using->damage]]" + (cond + ((= (scf-get-territory) 2) + (let ((a1-1 (-> arg1 param 1)) + (a0-1 arg0) + ) + (cond + (a0-1 + (let ((v1-0 (find-offending-process-focusable a0-1 (the-as attack-info a1-1)))) + (cond + (v1-0 + (cond + ((= (-> v1-0 type) target) + 0 + ) + ((or (logtest? (process-mask enemy) (-> v1-0 mask)) (logtest? (process-mask guard) (-> v1-0 mask))) + ((method-of-type nav-enemy damage-amount-from-attack) obj arg0 arg1) + ) + (else + 0 + ) + ) + ) + (else + 0 + ) + ) + ) + ) + (else + 0 + ) + ) + ) + ) + (else + ((method-of-type nav-enemy damage-amount-from-attack) obj arg0 arg1) + ) + ) + ) + +(defmethod enemy-method-108 civilian ((obj civilian) (arg0 enemy) (arg1 event-message-block)) + 0 + ) + +(defmethod go-hostile civilian ((obj civilian)) + (cleanup-for-death obj) + (none) + ) + +;; WARN: Return type mismatch none vs object. +(defmethod kill-prefer-falling civilian ((obj civilian)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + (the-as object (cleanup-for-death obj)) + ) + +(defmethod set-behavior! civilian ((obj civilian) (arg0 traffic-object-spawn-params)) + (let ((v1-0 (-> arg0 behavior))) + (cond + ((zero? v1-0) + (go (method-of-object obj idle)) + ) + ((= v1-0 2) + (go (method-of-object obj active)) + ) + ((= v1-0 3) + (go (method-of-object obj hostile)) + ) + ((= v1-0 7) + (logior! (-> obj flags) (citizen-flag persistent)) + (go (method-of-object obj wait-for-ride)) + ) + (else + (go-inactive obj) + ) + ) + ) + 0 + (none) + ) + +(defmethod citizen-init! civilian ((obj civilian)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type citizen citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj mask) (the-as process-mask (logior (process-mask civilian) (-> obj mask)))) + (set! (-> obj hit-points) (rand-vu-int-range 1 4)) + (set! (-> obj hit-points) 4) + (set! (-> obj fact-info-override pickup-type) (pickup-type none)) + (set! (-> obj fact-info-override pickup-amount) 0.0) + (set! (-> obj fact-info-override pickup-spawn-amount) 0.0) + 0 + (none) + ) + +;; WARN: Return type mismatch nav-segment vs none. +(defmethod civilian-method-215 civilian ((obj civilian) (arg0 vector)) + (let ((v1-0 (new 'stack-no-clear 'vector))) + (set! (-> v1-0 quad) (-> obj root-override2 trans quad)) + (set! (-> v1-0 w) 81920.0) + (let ((s5-0 (find-segment obj v1-0 arg0))) + (if s5-0 + (citizen-method-186 obj s5-0) + ) + ) + ) + (none) + ) + +;; WARN: Return type mismatch none vs object. +(defmethod general-event-handler civilian ((obj civilian) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (with-pp + (let ((v1-0 arg2)) + (the-as + object + (cond + ((= v1-0 'track) + #f + ) + ((= v1-0 'combo) + #f + ) + ((= v1-0 'touched) + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ((= v1-0 'panic) + (let ((a0-6 (-> arg3 param 0))) + (set! (-> obj danger-pos quad) (-> (the-as sphere (+ a0-6 0)) quad)) + ) + (if (and (-> obj next-state) (let ((v1-6 (-> obj next-state name))) + (or (= v1-6 'active) (= v1-6 'wait) (= v1-6 'avoid-danger)) + ) + ) + (go (method-of-object obj flee)) + ) + ) + ((= v1-0 'event-death) + (if (zero? (-> obj hit-points)) + (the-as object (do-effect (-> obj skel effect) 'death-default 0.0 -1)) + ) + ) + ((= v1-0 'avoid) + (set! (-> obj last-danger-time) (-> pp clock frame-counter)) + (let ((a0-15 (-> arg3 param 0))) + (set! (-> obj danger-pos quad) (-> (the-as vector (+ a0-15 0)) quad)) + ) + (if (and (-> obj next-state) (let ((v1-18 (-> obj next-state name))) + (or (= v1-18 'active) (= v1-18 'wait)) + ) + ) + (go (method-of-object obj avoid-danger)) + ) + ) + ((= v1-0 'clear-path) + (set! (-> obj last-danger-time) (-> pp clock frame-counter)) + (let ((v1-23 (the-as traffic-danger-info (-> arg3 param 0)))) + (set! (-> obj cp-valid?) #t) + (set! (-> obj cp-sphere quad) (-> v1-23 sphere quad)) + (set! (-> obj cp-vec quad) (-> v1-23 velocity quad)) + (case (-> v1-23 danger-type) + (((traffic-danger-type tdt0)) + (set! (-> obj allow-dive) #f) + (set! (-> obj cp-factor) 20.0) + ) + (((traffic-danger-type tdt1)) + (set! (-> obj allow-dive) #f) + (set! (-> obj cp-factor) 20.0) + ) + (((traffic-danger-type tdt2)) + (set! (-> obj allow-dive) #t) + (set! (-> obj cp-factor) 50.0) + ) + (((traffic-danger-type tdt3)) + (set! (-> obj allow-dive) #t) + (set! (-> obj cp-factor) 50.0) + ) + (((traffic-danger-type tdt4)) + (set! (-> obj allow-dive) #f) + (set! (-> obj cp-factor) 2.0) + ) + (((traffic-danger-type tdt5)) + (set! (-> obj allow-dive) #t) + (set! (-> obj cp-factor) 50.0) + ) + (((traffic-danger-type tdt6)) + (set! (-> obj allow-dive) #t) + (set! (-> obj cp-factor) 50.0) + ) + ) + ) + (let ((s5-1 (-> obj cp-plane))) + (set! (-> s5-1 quad) (-> obj cp-vec quad)) + (set! (-> s5-1 y) 0.0) + (vector-rotate90-around-y! s5-1 s5-1) + (vector-normalize! s5-1 1.0) + (set! (-> s5-1 w) (- (vector-dot (the-as vector s5-1) (the-as vector (-> obj cp-sphere))))) + ) + (set! (-> obj cp-exit-time) (+ (-> pp clock frame-counter) (seconds 4))) + (if (and (-> obj next-state) (let ((v1-54 (-> obj next-state name))) + (or (= v1-54 'active) (= v1-54 'wait) (= v1-54 'avoid-danger)) + ) + ) + (go (method-of-object obj clear-path)) + ) + ) + ((or (= v1-0 'hit) (= v1-0 'hit-flinch) (= v1-0 'hit-knocked)) + (speech-control-method-13 *speech-control* (the-as handle obj)) + (if (logtest? (-> obj flags) (citizen-flag female)) + (speech-control-method-12 + *speech-control* + obj + (speech-type speech-type-0 speech-type-1 speech-type-3 speech-type-4) + ) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-0 speech-type-1 speech-type-4)) + ) + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ((= v1-0 'end-task) + (let ((v0-0 (the-as object (logclear (-> obj flags) (citizen-flag persistent))))) + (set! (-> obj flags) (the-as citizen-flag v0-0)) + v0-0 + ) + ) + (else + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + ) + ) + +(defmethod civilian-method-214 civilian ((obj civilian) (arg0 nav-branch) (arg1 int) (arg2 vector) (arg3 float)) + (when (nonzero? arg1) + (-> arg0 src-node) + (let* ((s3-0 (-> arg0 dest-node)) + (t9-0 vector-vector-xz-distance) + (a0-1 arg2) + (a2-1 s3-0) + (a1-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> a1-1 quad) (-> a2-1 position quad)) + (set! (-> a1-1 w) 1.0) + (let ((s1-0 (t9-0 a0-1 a1-1)) + (s2-0 (-> s3-0 branch-count)) + (f30-0 0.0) + ) + (dotimes (s0-0 s2-0) + (+! f30-0 (civilian-method-214 obj (-> s3-0 branch-array s0-0) (+ arg1 -1) arg2 s1-0)) + ) + (set! arg3 (+ s1-0 (the float (/ (the int f30-0) s2-0)))) + ) + ) + ) + arg3 + ) + +(defstate wait (civilian) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type citizen wait) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + ) + +(defbehavior civilian-flee-post civilian () + (let* ((gp-0 (-> self controller)) + (s4-0 (-> gp-0 branch dest-node)) + (s5-0 (the-as nav-branch #f)) + (s3-1 (vector-! + (new 'stack-no-clear 'vector) + (-> self controller turn-exit-point) + (-> self controller path-prev-point) + ) + ) + ) + 0.0 + (let ((s2-1 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (-> self controller turn-exit-point)) + ) + ) + (set! (-> s2-1 y) 0.0) + (set! (-> s3-1 y) 0.0) + (vector-xz-normalize! s3-1 1.0) + (let ((f0-4 (vector-dot s2-1 s3-1))) + (when (< -16384.0 f0-4) + (cond + ((zero? (-> s4-0 branch-count)) + ) + (else + (let ((s3-2 (-> s4-0 branch-count)) + (f30-0 0.0) + ) + (dotimes (s2-2 s3-2) + (let* ((s1-0 (-> s4-0 branch-array s2-2)) + (f0-5 (civilian-method-214 self s1-0 4 (-> self danger-pos) 0.0)) + ) + (when (< f30-0 f0-5) + (set! f30-0 f0-5) + (set! s5-0 s1-0) + ) + ) + ) + ) + ) + ) + (when s5-0 + (vehicle-controller-method-11 gp-0) + (let ((s4-1 (new 'stack-no-clear 'vector))) + (set! (-> s4-1 quad) (-> gp-0 turn-exit-point quad)) + (vehicle-controller-method-10 gp-0 (the-as traffic-tracker s5-0)) + (set! (-> gp-0 path-prev-point quad) (-> s4-1 quad)) + ) + (set! (-> gp-0 branch) s5-0) + (let ((a1-3 (-> s5-0 dest-node)) + (v1-23 (-> gp-0 turn-exit-point)) + ) + (set! (-> v1-23 quad) (-> a1-3 position quad)) + (set! (-> v1-23 w) 1.0) + ) + ) + ) + ) + ) + ) + (when (< (-> self cp-next-time) (-> self clock frame-counter)) + (set! (-> self cp-next-time) (+ (-> self clock frame-counter) (get-rand-int-range self 600 1200))) + (citizen-method-190 self (-> self cp-force)) + ) + (add-offset-to-target! (-> self nav state) (-> self cp-force)) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (-> self cp-force)) + *color-red* + #f + (the-as rgba -1) + ) + ) + (let ((a0-18 (-> self nav state)) + (v1-42 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-18 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-18 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-18 target-post quad) (-> v1-42 quad)) + ) + 0 + (set! (-> (new 'stack-no-clear 'vector) quad) (-> self nav state target-post quad)) + (nav-enemy-method-176 self) + (none) + ) + +(defstate flee (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-166 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self speed-run))) + ) + 0 + (let ((a1-5 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (the-as vector (-> self danger-pos))) + ) + ) + (civilian-method-215 self a1-5) + ) + (if (zero? (-> self controller branch)) + (citizen-method-195 self (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + ) + (if (zero? (-> self controller branch)) + (go-dive self) + ) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.0 0.0 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + (when (and (logtest? (-> self draw status) (draw-control-status on-screen)) + (< (vector-vector-distance (-> self root-override2 trans) (camera-pos)) 204800.0) + ) + (if (logtest? (-> self flags) (citizen-flag female)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-3 speech-type-4)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-4)) + ) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.1)) + (not (logtest? (-> self nav state flags) (nav-state-flag in-mesh))) + (< (-> self root-override2 trans y) 4096.0) + ) + (go-virtual in-ditch) + ) + (citizen-method-192 self) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self anim-panic-run))) 30) + (none) + ) + :post (behavior () + (civilian-flee-post) + (none) + ) + ) + +(defbehavior civilian-avoid-danger-post civilian () + (local-vars (sv-352 nav-poly)) + (let ((gp-1 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (the-as vector (-> self danger-pos))) + ) + ) + (let ((s5-1 + (vector-! (new 'stack-no-clear 'vector) (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + ) + (vector-! + (new 'stack-no-clear 'vector) + (-> self controller turn-exit-point) + (the-as vector (-> self danger-pos)) + ) + (let ((s1-1 (vector-! + (new 'stack-no-clear 'vector) + (-> self controller turn-exit-point) + (-> self controller path-prev-point) + ) + ) + ) + (set! (-> s5-1 y) 0.0) + (set! (-> s1-1 y) 0.0) + (vector-xz-normalize! s1-1 1.0) + (vector-rotate90-around-y! s1-1 s1-1) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (let ((v1-6 (-> self nav)) + (a0-8 (-> self danger-pos)) + (a1-5 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-5 point) (the-as vector a0-8) (-> v1-6 state mesh bounds)) + (set! (-> a1-5 y-threshold) (-> v1-6 nearest-y-threshold)) + (set! (-> a1-5 ignore) (the-as uint 2)) + (set! sv-352 (find-poly-containing-point-local (-> v1-6 state mesh) a1-5)) + ) + (when sv-352 + (vector-normalize-copy! s3-0 s1-1 40960.0) + (clamp-vector-to-mesh-no-gaps (-> self nav) (-> self danger-pos) sv-352 s3-0 s0-0) + (vector-normalize-copy! s2-0 s1-1 -40960.0) + (let ((a0-14 (-> self nav)) + (t9-7 (method-of-type nav-control clamp-vector-to-mesh-no-gaps)) + (a1-9 (-> self danger-pos)) + (a3-3 s2-0) + ) + (t9-7 a0-14 a1-9 sv-352 a3-3 s0-0) + ) + (let* ((v1-12 s3-0) + (f0-7 (sqrtf (+ (* (-> v1-12 x) (-> v1-12 x)) (* (-> v1-12 z) (-> v1-12 z))))) + (v1-14 s2-0) + (f1-7 (sqrtf (+ (* (-> v1-14 x) (-> v1-14 x)) (* (-> v1-14 z) (-> v1-14 z))))) + ) + (cond + ((< 0.0 (vector-dot s1-1 gp-1)) + (if (< 8192.0 f0-7) + (set! (-> s4-0 quad) (-> s3-0 quad)) + (set! (-> s4-0 quad) (-> s2-0 quad)) + ) + ) + ((< 8192.0 f1-7) + (set! (-> s4-0 quad) (-> s2-0 quad)) + ) + (else + (set! (-> s4-0 quad) (-> s3-0 quad)) + ) + ) + ) + (let* ((v1-24 gp-1) + (f0-13 (sqrtf (+ (* (-> v1-24 x) (-> v1-24 x)) (* (-> v1-24 z) (-> v1-24 z))))) + ) + (let ((f1-12 0.8) + (v1-27 s5-1) + ) + (* f1-12 (sqrtf (+ (* (-> v1-27 x) (-> v1-27 x)) (* (-> v1-27 z) (-> v1-27 z))))) + ) + (let ((f0-15 (/ (- (-> self danger-pos r) f0-13) (-> self danger-pos r)))) + (if (< f0-15 0.0) + (set! f0-15 0.0) + ) + (if (< 0.8 f0-15) + (set! f0-15 0.8) + ) + (set! (-> gp-1 quad) (-> s4-0 quad)) + (vector-xz-normalize! gp-1 (* 16384.0 f0-15)) + ) + ) + (vector-xz-normalize! s5-1 16384.0) + ) + ) + ) + (vector+! gp-1 gp-1 s5-1) + ) + (vector-xz-normalize! gp-1 4096.0) + (let ((a0-27 (-> self nav state)) + (v1-41 (vector+! (new 'stack-no-clear 'vector) gp-1 (-> self root-override2 trans))) + ) + (logclear! (-> a0-27 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-27 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-27 target-post quad) (-> v1-41 quad)) + ) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + +(defbehavior civilian-avoid-danger-post2 civilian () + (let ((gp-0 (new 'stack-no-clear 'vector))) + (calc-danger-vec self (-> self danger-pos) gp-0) + (add-offset-to-target! (-> self nav state) gp-0) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) gp-0) + *color-blue* + #f + (the-as rgba -1) + ) + ) + ) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (citizen-method-188 self gp-1) + (add-offset-to-target! (-> self nav state) gp-1) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) gp-1) + *color-green* + #f + (the-as rgba -1) + ) + ) + ) + (let ((a0-6 (-> self nav state)) + (v1-23 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-6 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-6 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-6 target-post quad) (-> v1-23 quad)) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + +(defstate avoid-danger (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-165 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self speed-walk))) + ) + 0 + (set! (-> self next-time) (+ (-> self clock frame-counter) (get-rand-int-range self 300 600))) + (set! (-> self last-second-pos quad) (-> self root-override2 trans quad)) + (set! (-> self last-distance) + (vector-vector-xz-distance (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.0 0.0 1.0 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + (if (< (+ (-> self last-danger-time) (seconds 1)) (-> self clock frame-counter)) + (go-virtual active) + ) + (when (citizen-method-187 self) + (cond + ((< (* 2.0 (-> self danger-pos r)) + (vector-vector-xz-distance (-> self danger-pos) (-> self controller turn-exit-point)) + ) + (go-virtual active) + ) + (else + (vehicle-controller-method-14 (-> self controller) (the-as vehicle self)) + (set! (-> self last-distance) + (vector-vector-xz-distance (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 60) + (none) + ) + :post (behavior () + (civilian-avoid-danger-post2) + (none) + ) + ) + +(defbehavior civilian-clear-path-post civilian () + (local-vars (sv-304 nav-poly)) + (let ((s5-1 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (the-as vector (-> self cp-sphere))) + ) + (s1-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> gp-0 quad) (-> self cp-vec quad)) + (set! (-> gp-0 y) 0.0) + (vector-xz-normalize! gp-0 1.0) + (vector-rotate90-around-y! gp-0 gp-0) + (set! (-> s5-1 y) 0.0) + (vector-*! s1-0 s5-1 gp-0 (vector-dot s5-1 gp-0)) + (vector+! s1-0 s1-0 (the-as vector (-> self cp-sphere))) + (vector-xz-normalize! s5-1 1.0) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (set! sv-304 (-> self nav state current-poly)) + (let ((f30-0 (+ 4096.0 (-> self cp-sphere r)))) + (when sv-304 + (vector-normalize-copy! s3-0 gp-0 f30-0) + (vector-normalize-copy! s2-0 gp-0 (- f30-0)) + (clamp-vector-to-mesh-no-gaps (-> self nav) s1-0 sv-304 s3-0 s0-0) + (let ((a0-12 (-> self nav)) + (t9-8 (method-of-type nav-control clamp-vector-to-mesh-no-gaps)) + (a3-3 s2-0) + ) + (t9-8 a0-12 s1-0 sv-304 a3-3 s0-0) + ) + (let* ((v1-14 s3-0) + (f0-9 (sqrtf (+ (* (-> v1-14 x) (-> v1-14 x)) (* (-> v1-14 z) (-> v1-14 z))))) + (v1-16 s2-0) + (f1-8 (sqrtf (+ (* (-> v1-16 x) (-> v1-16 x)) (* (-> v1-16 z) (-> v1-16 z))))) + ) + (cond + ((< 0.0 (vector-dot gp-0 s5-1)) + (if (< 4096.0 f0-9) + (set! (-> s4-0 quad) (-> s3-0 quad)) + (set! (-> s4-0 quad) (-> s2-0 quad)) + ) + ) + ((< 4096.0 f1-8) + (set! (-> s4-0 quad) (-> s2-0 quad)) + ) + (else + (set! (-> s4-0 quad) (-> s3-0 quad)) + ) + ) + ) + (set! (-> gp-0 quad) (-> s4-0 quad)) + ) + ) + ) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) gp-0) + *color-blue* + #f + (the-as rgba -1) + ) + ) + (let ((a0-21 (-> self nav state)) + (v1-34 (vector+! (new 'stack-no-clear 'vector) gp-0 (-> self root-override2 trans))) + ) + (logclear! (-> a0-21 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-21 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-21 target-post quad) (-> v1-34 quad)) + ) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + +(defbehavior civilian-clear-path-post2 civilian () + (citizen-method-192 self) + (when (< (-> self cp-next-time) (-> self clock frame-counter)) + (citizen-method-190 self (-> self cp-force)) + (set! (-> self cp-next-time) (+ (-> self clock frame-counter) (get-rand-int-range self 1200 2400))) + ) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (citizen-method-188 self gp-1) + (add-offset-to-target! (-> self nav state) gp-1) + ) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (-> self cp-force)) + *color-blue* + #f + (the-as rgba -1) + ) + ) + (add-offset-to-target! (-> self nav state) (-> self cp-force)) + (let ((a0-9 (-> self nav state)) + (v1-25 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-9 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-9 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-9 target-post quad) (-> v1-25 quad)) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + +(defstate clear-path (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-165 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self speed-walk))) + ) + 0 + (set! (-> self cp-next-time) (+ (-> self clock frame-counter) (get-rand-int-range self 1200 2400))) + (set! (-> self cp-force quad) (the-as uint128 0)) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.0 1.0 0.0 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + (when (citizen-method-187 self) + (vehicle-controller-method-14 (-> self controller) (the-as vehicle self)) + (set! (-> self last-distance) + (vector-vector-xz-distance (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + ) + (let ((v1-8 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (the-as vector (-> self cp-sphere))) + ) + ) + (cond + ((< (* 0.5 (vector-length (-> self cp-vec))) (vector-length v1-8)) + (let ((a0-10 (-> self nav))) + (set! (-> a0-10 target-speed) (* (-> self speed-scale) (-> self speed-walk))) + ) + 0 + (let ((a0-12 (-> self nav))) + (set! (-> a0-12 acceleration) (-> self enemy-info-override walk-acceleration)) + ) + 0 + (let ((a0-14 (-> self nav))) + (set! (-> a0-14 turning-acceleration) (-> self enemy-info-override walk-turning-acceleration)) + ) + 0 + ) + (else + (let ((a0-16 (-> self nav))) + (set! (-> a0-16 target-speed) (* (-> self speed-scale) (-> self speed-run))) + ) + 0 + (let ((a0-18 (-> self nav))) + (set! (-> a0-18 acceleration) (-> self enemy-info-override run-acceleration)) + ) + 0 + (let ((a0-20 (-> self nav))) + (set! (-> a0-20 turning-acceleration) (-> self enemy-info-override run-turning-acceleration)) + ) + 0 + ) + ) + (if (and (-> self allow-dive) + (< (vector-length v1-8) (* (-> self dive-reaction) (vector-length (-> self cp-vec)))) + (< (fabs (vector4-dot (-> self root-override2 trans) (the-as vector (-> self cp-plane)))) + (* 0.5 (-> self cp-sphere r)) + ) + ) + (go-dive self) + ) + ) + (if (< (-> self cp-exit-time) (-> self clock frame-counter)) + (go-virtual active) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 30) + (none) + ) + :post (behavior () + (civilian-clear-path-post2) + (none) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-dive civilian ((obj civilian)) + (if (< (-> obj nav state speed) 8192.0) + (go (method-of-object obj on-ground)) + (go (method-of-object obj dive)) + ) + (none) + ) + +(defstate on-ground (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((v1-8 (-> self root-override2 root-prim))) + (set! (-> v1-8 prim-core collide-as) (collide-spec)) + (set! (-> v1-8 prim-core collide-with) (collide-spec)) + ) + 0 + (logclear! (-> self root-override2 nav-flags) (nav-flags has-root-sphere has-extra-sphere)) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.5 0.5 1.0 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-5 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (logior! (-> self root-override2 nav-flags) (nav-flags has-root-sphere)) + (none) + ) + :trans (behavior () + (if (< (+ (-> self last-danger-time) (seconds 1)) (-> self clock frame-counter)) + (go-virtual get-up-front) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-on-ground)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-on-ground))) frames num-frames) -1) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (until #f + (suspend) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate dive (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (let ((v1-8 (-> self root-override2 root-prim))) + (set! (-> v1-8 prim-core collide-as) (collide-spec)) + (set! (-> v1-8 prim-core collide-with) (collide-spec)) + ) + 0 + (logclear! (-> self root-override2 nav-flags) (nav-flags has-root-sphere has-extra-sphere)) + (let ((v1-12 (-> self nav))) + (set! (-> v1-12 sphere-mask) (the-as uint 0)) + ) + 0 + (let ((v1-14 (-> self nav))) + (set! (-> v1-14 target-speed) 32768.0) + ) + 0 + (let ((v1-16 (-> self nav))) + (set! (-> v1-16 acceleration) 32768.0) + ) + 0 + (let ((gp-0 (new 'stack-no-clear 'vector))) + (let ((a1-4 (-> self nav state))) + (set! (-> gp-0 quad) (-> a1-4 heading quad)) + ) + (vector-normalize! gp-0 614400.0) + (vector+! (-> self dive-target-point) (-> self root-override2 trans) gp-0) + (set! (-> self dive-target-point quad) (-> gp-0 quad)) + ) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.5 0.5 1.0 1.0) + ) + (set! (-> self dive-finished?) #f) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-5 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (logior! (-> self root-override2 nav-flags) (nav-flags has-root-sphere)) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 sphere-mask) (the-as uint #x800fe)) + ) + 0 + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-dive)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-dive))) frames num-frames) -1) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (add-offset-to-target! (-> self nav state) (-> self dive-target-point)) + (if (>= (ja-frame-num 0) 6.0) + (vector-v*float++! (-> self dive-target-point) (-> self dive-target-point) -20.0) + ) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (set! (-> self dive-finished?) #t) + (set! (-> self root-override2 transv quad) (the-as uint128 0)) + (go-virtual cower-ground) + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 *null-vector*) + ) + (logior! (-> a0-0 flags) (nav-state-flag directional-mode)) + (set! (-> a0-0 travel quad) (-> v1-1 quad)) + ) + 0 + (if (-> self dive-finished?) + (track-target! self) + (nav-enemy-method-176 self) + ) + (none) + ) + ) + +(defstate cower-ground (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((v1-8 (-> self root-override2 root-prim))) + (set! (-> v1-8 prim-core collide-as) (collide-spec)) + (set! (-> v1-8 prim-core collide-with) (collide-spec)) + ) + 0 + (logclear! (-> self root-override2 nav-flags) (nav-flags has-root-sphere has-extra-sphere)) + (let ((v1-12 (-> self nav))) + (set! (-> v1-12 sphere-mask) (the-as uint 0)) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.2 0.2 0.2 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-5 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (logior! (-> self root-override2 nav-flags) (nav-flags has-root-sphere)) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 sphere-mask) (the-as uint #x800fe)) + ) + 0 + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self info anim-cover-head-start)) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self info anim-cover-head-start))) + frames + num-frames + ) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self info anim-cover-head-loop)) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self info anim-cover-head-loop))) + frames + num-frames + ) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (if (< (+ (-> self last-danger-time) (seconds 1)) (-> self clock frame-counter)) + (goto cfg-9) + ) + ) + #f + (label cfg-9) + (ja-no-eval :group! (-> self draw art-group data (-> self info anim-cover-head-end)) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self info anim-cover-head-end))) + frames + num-frames + ) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (go-virtual get-up-front) + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 *null-vector*) + ) + (logior! (-> a0-0 flags) (nav-state-flag directional-mode)) + (set! (-> a0-0 travel quad) (-> v1-1 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +(defstate get-up-front (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.5 0.5 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-get-up-front)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-get-up-front))) frames num-frames) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (go-virtual flee) + (none) + ) + :post (behavior () + (enemy-method-49 self) + (let ((a0-1 (-> self nav state)) + (v1-3 *null-vector*) + ) + (logior! (-> a0-1 flags) (nav-state-flag directional-mode)) + (set! (-> a0-1 travel quad) (-> v1-3 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +(defstate get-up-back (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.5 0.5 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-get-up-back)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-get-up-back))) frames num-frames) -1) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (go-virtual flee) + (none) + ) + :post (behavior () + (enemy-method-49 self) + (let ((a0-1 (-> self nav state)) + (v1-3 *null-vector*) + ) + (logior! (-> a0-1 flags) (nav-state-flag directional-mode)) + (set! (-> a0-1 travel quad) (-> v1-3 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +(defbehavior civilian-falling-post civilian () + (set! (-> self enemy-flags) (logior (enemy-flag directed) (-> self enemy-flags))) + (let ((gp-0 (-> self root-override2))) + (cond + ((logtest? (-> self focus-status) (focus-status under-water)) + (enemy-method-47 self (-> gp-0 transv)) + ) + (else + (let ((a1-1 (new-stack-vector0))) + (vector-v++! + (-> gp-0 transv) + (compute-acc-due-to-gravity gp-0 a1-1 (-> self enemy-info-override slip-factor)) + ) + ) + ) + ) + (let ((a2-1 (new 'stack-no-clear 'collide-query))) + (set! (-> a2-1 collide-with) (-> gp-0 root-prim prim-core collide-with)) + (set! (-> a2-1 ignore-process0) self) + (set! (-> a2-1 ignore-process1) (-> self vehicle process 0)) + (set! (-> a2-1 ignore-pat) (logior (new 'static 'pat-surface :noendlessfall #x1) (-> gp-0 pat-ignore-mask))) + (set! (-> a2-1 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide gp-0 (-> gp-0 transv) a2-1 (meters 0)) + ) + ) + (enemy-method-111 self) + (track-target! self) + (none) + ) + +(defstate knocked (civilian) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type citizen knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self hit-face) + (the-as uint (if (< (vector-dot + (-> self root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat)) + ) + 0.0 + ) + 1 + 0 + ) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (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)) + ) + (let ((t9-0 (-> (method-of-type nav-enemy knocked) exit))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type citizen knocked) trans))) + (if t9-0 + (t9-0) + ) + ) + (enemy-method-49 self) + (none) + ) + ) + +(defstate wait-for-ride (civilian) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('board-vehicle) + (let ((a0-1 (the-as vehicle (-> event param 0)))) + (when a0-1 + (let ((v0-0 (the-as object (process->handle a0-1)))) + (set! (-> self vehicle) (the-as handle v0-0)) + v0-0 + ) + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (logior! (-> self flags) (citizen-flag persistent)) + (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 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((a0-5 (-> self nav state)) + (v1-10 *null-vector*) + ) + (logior! (-> a0-5 flags) (nav-state-flag directional-mode)) + (set! (-> a0-5 travel quad) (-> v1-10 quad)) + ) + 0 + (set! (-> self vehicle) (the-as handle #f)) + (none) + ) + :exit (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (none) + ) + :trans (behavior () + (if (and (not (logtest? (-> self nav state flags) (nav-state-flag in-mesh))) + (< (-> self root-override2 trans y) 4096.0) + ) + (go-virtual in-ditch) + ) + (when (-> self vehicle) + (case (-> (the-as vehicle (handle->process (-> self vehicle))) info-override object-type) + ((14 15 16 11 12 13) + (go-virtual move-to-vehicle) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (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 + ) + ) + 0.1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.1)) + ) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-simple-post) + (none) + ) + ) + +(defmethod civilian-method-217 civilian ((obj civilian) (arg0 vector)) + (let ((s3-0 (handle->process (-> obj vehicle))) + (s4-0 (new 'stack 'collide-query)) + ) + (compute-seat-position (the-as vehicle s3-0) arg0 (-> obj seat)) + (vector-! arg0 arg0 (-> (the-as vehicle s3-0) root-override-2 trans)) + (vector-normalize! arg0 (+ 14336.0 (vector-length arg0))) + (vector+! arg0 arg0 (-> (the-as vehicle s3-0) root-override-2 trans)) + (when (enemy-above-ground? obj s4-0 arg0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> arg0 y) (-> s4-0 best-other-tri intersect y)) + (let ((v1-14 (-> obj nav)) + (a1-10 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-10 point) arg0 (-> v1-14 state mesh bounds)) + (set! (-> a1-10 y-threshold) (-> v1-14 nearest-y-threshold)) + (set! (-> a1-10 ignore) (the-as uint 2)) + (if (find-poly-containing-point-local (-> v1-14 state mesh) a1-10) + (return #t) + ) + ) + ) + ) + #f + ) + +(defun do-spline2 ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 vector) (arg4 vector) (arg5 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let* ((f1-1 (* arg5 arg5)) + (f0-2 (* arg5 f1-1)) + ) + (let ((f2-3 (- (+ 1.0 (* -3.0 arg5) (* 3.0 f1-1)) f0-2)) + (f3-7 (+ (* 3.0 f0-2) (* -6.0 f1-1) (* 3.0 arg5))) + (f1-3 (+ (* -3.0 f0-2) (* 3.0 f1-1))) + ) + (vector-float*! arg0 arg1 f2-3) + (let ((t2-0 arg0)) + (let ((v1-10 arg0)) + (let ((t1-3 (vector+! (new 'stack-no-clear 'vector) arg1 arg2))) + (let ((a1-1 f3-7)) + (.mov vf7 a1-1) + ) + (.lvf vf5 (&-> t1-3 quad)) + ) + (.lvf vf4 (&-> v1-10 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 (&-> t2-0 quad) vf6) + ) + (let ((a2-1 arg0)) + (let ((v1-11 arg0)) + (let ((a1-3 (vector+! (new 'stack-no-clear 'vector) arg3 arg4))) + (let ((t0-1 f1-3)) + (.mov vf7 t0-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 (&-> a2-1 quad) vf6) + ) + ) + (let ((v0-0 arg0)) + (let ((v1-12 arg0)) + (let ((a0-1 arg3)) + (let ((a1-4 f0-2)) + (.mov vf7 a1-4) + ) + (.lvf vf5 (&-> a0-1 quad)) + ) + (.lvf vf4 (&-> v1-12 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 (&-> v0-0 quad) vf6) + v0-0 + ) + ) + ) + ) + +(defstate move-to-vehicle (civilian) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (enemy-event-handler proc arg1 event-type event) + ) + :enter (behavior () + (logior! (-> self flags) (citizen-flag persistent)) + (set! (-> self state-time) (-> self clock frame-counter)) + (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 + (nav-enemy-method-166 self) + (let ((v1-12 (-> self nav state))) + (set! (-> v1-12 speed) 0.0) + ) + 0 + (let ((v1-14 (-> self nav))) + (set! (-> v1-14 sphere-mask) (the-as uint #x800f8)) + ) + 0 + (none) + ) + :exit (behavior () + (let ((v1-0 (-> self nav))) + (set! (-> v1-0 sphere-mask) (the-as uint #x800fe)) + ) + 0 + (logclear! (-> self flags) (citizen-flag persistent)) + (none) + ) + :trans (behavior () + (let ((gp-0 (new 'stack-no-clear 'vector))) + (new 'stack-no-clear 'vector) + (let ((s0-0 (handle->process (-> self vehicle)))) + (cond + (s0-0 + (set! (-> self seat) (get-best-seat-for-vehicle + (the-as vehicle s0-0) + (-> self root-override2 trans) + (the-as int (-> self info seat-flag)) + 1 + ) + ) + (cond + ((!= (-> self seat) -1) + (compute-seat-position (the-as vehicle s0-0) gp-0 (-> self seat)) + (let ((s2-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (let ((s3-0 (new 'stack-no-clear 'vector))) + (new 'stack-no-clear 'vector) + (set! (-> s2-0 quad) (-> self root-override2 trans quad)) + (set! (-> s1-0 quad) (-> gp-0 quad)) + (vector-! s5-0 gp-0 (-> (the-as vehicle s0-0) root-override-2 trans)) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (let ((f30-1 (* 0.5 (vector-vector-xz-distance s2-0 s1-0)))) + (vector-normalize! s4-0 (* 2.0 f30-1)) + (vector-normalize! s5-0 (* 4.0 f30-1)) + ) + (do-spline2 s3-0 s2-0 s4-0 s1-0 s5-0 0.8) + (let ((v1-21 (-> self nav state))) + (logclear! (-> v1-21 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-21 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-21 target-post quad) (-> s3-0 quad)) + ) + ) + 0 + (if (and (< (vector-dot (vector-normalize! s4-0 1.0) (vector-normalize! s5-0 1.0)) -0.5) + (< (vector-vector-xz-distance gp-0 (-> self root-override2 trans)) 18432.0) + (< (fabs (- (-> gp-0 y) (-> self root-override2 trans y))) 20480.0) + ) + (go-virtual board-vehicle) + ) + ) + ) + (else + (go-virtual wait-for-ride) + ) + ) + ) + (else + (go-virtual wait-for-ride) + ) + ) + ) + (if (< 73728.0 (vector-vector-xz-distance gp-0 (-> self root-override2 trans))) + (go-virtual wait-for-ride) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 60) + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +(defstate board-vehicle (civilian) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('vehicle-crash) + #f + ) + (('end-task) + (kill-prefer-falling self) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (logior! (-> self flags) (citizen-flag persistent)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 prim-core collide-with) (collide-spec)) + ) + 0 + (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 + (none) + ) + :exit (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (logclear! (-> self focus-status) (focus-status pilot)) + (none) + ) + :trans (behavior () + (let ((v1-1 (handle->process (-> self vehicle)))) + (if (or (not v1-1) (logtest? (-> (the-as vehicle v1-1) flags) (rigid-body-object-flag dead))) + (throw-off-vehicle self) + ) + ) + (none) + ) + :code (behavior () + (local-vars (sv-128 float) (sv-144 float)) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) :num! min) + (let ((f30-0 0.0)) + (while (< f30-0 1.0) + (ja :num-func num-func-identity + :frame-num (lerp-scale 0.0 1.0 (+ (* -2.0 f30-0 f30-0 f30-0) (* 3.0 f30-0 f30-0)) 0.0 1.0) + ) + (suspend) + (+! f30-0 (* 3.0 (-> self clock seconds-per-frame))) + ) + ) + (let ((gp-2 (new 'stack-no-clear 'vector))) + (set! (-> gp-2 quad) (-> self root-override2 trans quad)) + (let ((s5-0 (quaternion-copy! (new 'stack-no-clear 'quaternion) (-> self root-override2 quat)))) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) + :num! (seek! (ja-aframe 5.0 0) 0.86956525) + :frame-num (ja-aframe 1.0 0) + ) + (until (ja-done? 0) + (let ((s2-0 (handle->process (-> self vehicle))) + (s1-0 (new 'stack-no-clear 'vector)) + (s4-1 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'quaternion)) + ) + (if (not s2-0) + (go-virtual wait-for-ride) + ) + (quaternion-copy! s3-0 (-> (the-as vehicle s2-0) root-override-2 quat)) + (compute-seat-position (the-as vehicle s2-0) s1-0 (-> self seat)) + (vector-! s4-1 s1-0 gp-2) + (let ((s2-1 lerp-scale) + (s1-1 0.0) + (s0-0 1.0) + ) + (set! sv-128 (ja-aframe-num 0)) + (set! sv-144 (ja-aframe 1.0 0)) + (let* ((t0-1 (ja-aframe 5.0 0)) + (f30-1 (s2-1 s1-1 s0-0 sv-128 sv-144 t0-1)) + ) + (quaternion-rotate-local-y! s3-0 s3-0 (* f30-1 (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + ) + (quaternion-slerp! (-> self root-override2 quat) s5-0 s3-0 f30-1) + (vector+float*! (-> self root-override2 trans) gp-2 s4-1 f30-1) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 5.0 0) 0.86956525)) + ) + ) + ) + (quaternion-copy! (new 'stack-no-clear 'quaternion) (-> self root-override2 quat)) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) + :num! (seek! (ja-aframe 12.0 0) 0.4) + :frame-num (ja-aframe 5.0 0) + ) + (until (ja-done? 0) + (let ((s5-1 (handle->process (-> self vehicle))) + (gp-4 (new 'stack-no-clear 'quaternion)) + ) + (if (not s5-1) + (go-virtual wait-for-ride) + ) + (quaternion-copy! gp-4 (-> (the-as vehicle s5-1) root-override-2 quat)) + (compute-seat-position (the-as vehicle s5-1) (-> self root-override2 trans) (-> self seat)) + (let ((f0-22 (lerp-scale 0.0 1.0 (ja-aframe-num 0) (ja-aframe 7.0 0) (ja-aframe 10.0 0)))) + (quaternion-rotate-local-y! (-> self root-override2 quat) gp-4 (* (- 1.0 f0-22) (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 12.0 0) 0.4)) + ) + (put-rider-in-seat (the-as vehicle (handle->process (-> self vehicle))) (-> self seat) self) + (go-virtual ride) + (none) + ) + :post (behavior () + (track-target! self) + (none) + ) + ) + +(defstate ride (civilian) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (let ((v1-0 event-type) + (t0-0 'exit-vehicle) + ) + (cond + ((= v1-0 t0-0) + (let ((a0-1 (the-as object (-> event param 0)))) + (set! (-> self event-param-point quad) (-> (the-as vector a0-1) quad)) + ) + (let ((v1-3 (-> self clock frame-counter)) + (a0-3 (-> self state-time)) + ) + (if (>= (- v1-3 a0-3) (seconds 1)) + (go-virtual + exit-vehicle + a0-3 + arg1 + (the-as int event-type) + (the-as symbol event) + (the-as event-message-block t0-0) + ) + ) + ) + ) + ((= v1-0 'end-task) + (kill-prefer-falling self) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + ) + :enter (behavior () + (logior! (-> self flags) (citizen-flag persistent)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 prim-core collide-with) (collide-spec)) + ) + 0 + (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 focus-status) (logior (focus-status pilot-riding pilot) (-> self focus-status))) + (none) + ) + :exit (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (logclear! (-> self focus-status) (focus-status pilot-riding pilot)) + (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 (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :trans (behavior () + (let ((v1-1 (handle->process (-> self vehicle)))) + (if (or (not v1-1) (logtest? (-> (the-as vehicle v1-1) flags) (rigid-body-object-flag dead))) + (throw-off-vehicle self) + ) + ) + (none) + ) + :code (behavior () + (until #f + (suspend) + ) + #f + (none) + ) + :post (behavior () + (track-target! self) + (none) + ) + ) + +(defstate exit-vehicle (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) enemy-event-handler) + :enter (behavior ((arg0 object) (arg1 object) (arg2 int) (arg3 symbol) (arg4 event-message-block)) + (change-to (find-nearest-nav-mesh (-> self root-override2 trans) (the-as float #x7f800000)) self) + (if (not (-> self nav)) + (go-inactive self) + ) + (let ((v1-8 (-> self nav state))) + (set! (-> v1-8 current-poly) (the-as nav-poly #f)) + ) + 0 + (citizen-method-195 + self + (vector-negate-in-place! (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + ) + (let ((a0-8 (-> self nav state)) + (v1-14 (-> self controller turn-exit-point)) + ) + (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-14 quad)) + ) + 0 + (citizen-nav-init! self) + (set! (-> self gnd-height) (-> self root-override2 gspot-pos y)) + (logior! (-> self flags) (citizen-flag persistent)) + (set! (-> self focus-status) (logior (focus-status pilot-riding pilot) (-> self focus-status))) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-28 (-> self root-override2 root-prim))) + (set! (-> v1-28 prim-core collide-as) (collide-spec)) + (set! (-> v1-28 prim-core collide-with) (collide-spec)) + ) + 0 + (let ((v1-30 self)) + (set! (-> v1-30 enemy-flags) (the-as enemy-flag (logclear (-> v1-30 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-30 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-33 self)) + (set! (-> v1-33 enemy-flags) (the-as enemy-flag (logclear (-> v1-33 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :exit (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (logclear! (-> self focus-status) (focus-status pilot-riding pilot)) + (none) + ) + :trans (behavior () + (let ((v1-1 (handle->process (-> self vehicle)))) + (if (or (not v1-1) (logtest? (-> (the-as vehicle v1-1) flags) (rigid-body-object-flag dead))) + (throw-off-vehicle self) + ) + ) + (none) + ) + :code (behavior ((arg0 object) (arg1 object) (arg2 int) (arg3 symbol) (arg4 event-message-block)) + (local-vars (sv-128 float) (sv-144 float)) + (ja-channel-push! 1 (seconds 0.1)) + (remove-rider (the-as vehicle (handle->process (-> self vehicle))) self) + (logclear! (-> self focus-status) (focus-status pilot-riding pilot)) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) + :num! (seek! (ja-aframe 5.0 0) 0.5) + :frame-num (ja-aframe 12.0 0) + ) + (until (ja-done? 0) + (let ((s5-0 (handle->process (-> self vehicle))) + (gp-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-copy! gp-1 (-> (the-as vehicle s5-0) root-override-2 quat)) + (compute-seat-position (the-as vehicle s5-0) (-> self root-override2 trans) (-> self seat)) + (let ((f0-3 (lerp-scale 0.0 1.0 (ja-aframe-num 0) (ja-aframe 10.0 0) (ja-aframe 7.0 0)))) + (quaternion-rotate-local-y! (-> self root-override2 quat) gp-1 (* f0-3 (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 5.0 0) 0.5)) + ) + (let ((gp-3 (new 'stack-no-clear 'vector)) + (s5-2 (new 'stack-no-clear 'quaternion)) + ) + (while (not (civilian-method-217 self gp-3)) + (let ((s4-1 (handle->process (-> self vehicle))) + (s3-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-copy! s3-1 (-> (the-as vehicle s4-1) root-override-2 quat)) + (compute-seat-position (the-as vehicle s4-1) (-> self root-override2 trans) (-> self seat)) + (quaternion-rotate-local-y! (-> self root-override2 quat) s3-1 (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + ) + (suspend) + ) + (let ((v1-43 (handle->process (-> self vehicle)))) + (quaternion-copy! s5-2 (-> (the-as vehicle v1-43) root-override-2 quat)) + ) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) + :num! (seek! (ja-aframe 1.0 0) 0.5) + :frame-num (ja-aframe 5.0 0) + ) + (until (ja-done? 0) + (let ((a0-47 (handle->process (-> self vehicle))) + (s2-1 (new 'stack-no-clear 'vector)) + (s4-3 (new 'stack-no-clear 'vector)) + (s3-2 (new 'stack-no-clear 'quaternion)) + ) + (compute-seat-position (the-as vehicle a0-47) s2-1 (-> self seat)) + (vector-! s4-3 s2-1 gp-3) + (let ((s2-2 lerp-scale) + (s1-1 0.0) + (s0-0 1.0) + ) + (set! sv-128 (ja-aframe-num 0)) + (set! sv-144 (ja-aframe 5.0 0)) + (let* ((t0-2 (ja-aframe 1.0 0)) + (f0-12 (s2-2 s1-1 s0-0 sv-128 sv-144 t0-2)) + (f30-0 (- 1.0 f0-12)) + ) + (quaternion-rotate-local-y! s3-2 s5-2 (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + (quaternion-copy! (-> self root-override2 quat) s3-2) + (vector+float*! (-> self root-override2 trans) gp-3 s4-3 f30-0) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 1.0 0) 0.5)) + ) + ) + (let ((v1-74 (-> self root-override2 root-prim))) + (set! (-> v1-74 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-74 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (go-virtual active) + (none) + ) + :post (behavior () + (track-target! self) + (none) + ) + ) + +(defstate wait-at-dest (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) enemy-event-handler) + :enter (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (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 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (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 + ) + ) + 0.1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.1)) + ) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-simple-post) + (none) + ) + ) diff --git a/goal_src/jak2/levels/city/common/guard.gc b/goal_src/jak2/levels/city/common/guard.gc index 0316a2dc8e..dd8e6c5f6d 100644 --- a/goal_src/jak2/levels/city/common/guard.gc +++ b/goal_src/jak2/levels/city/common/guard.gc @@ -5,121 +5,4059 @@ ;; name in dgo: guard ;; dgos: CWI -;; stub for now +;; DECOMP BEGINS + +(defskelgroup skel-crimson-guard crimson-guard crimson-guard-lod0-jg -1 + ((crimson-guard-lod0-mg (meters 20)) (crimson-guard-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5) + :shadow crimson-guard-shadow-mg + :origin-joint-index 3 + ) (deftype guard-anim-info (structure) - ((anim-index int32 2 :offset-assert 0) - (anim-index-front int32 :offset 0) - (anim-index-back int32 :offset 4) - ) - :method-count-assert 9 - :size-assert #x8 ;; 8 - :flag-assert #x900000008 - ) - -#| -(deftype guard-global-info (UNKNOWN) - ((prev-yellow-hit int8 :offset-assert 4) - (prev-blue-hit int8 :offset-assert 5) - (knocked UNKNOWN 2 :offset-assert 8) - (knocked-land UNKNOWN 2 :offset-assert 16) - (anim-knocked-front int32 :offset-assert 8) - (anim-knocked-back int32 :offset-assert 12) - (anim-knocked-front-land int32 :offset-assert 16) - (anim-knocked-back-land int32 :offset-assert 20) - (yellow-hit-anim UNKNOWN 2 :offset-assert 24) - (yellow-land-anim UNKNOWN 2 :offset-assert 40) - (blue-hit-anim UNKNOWN 1 :offset-assert 56) - ) - :method-count-assert 0 - :size-assert #x0 - :flag-assert #x0 - ) -|# - -(deftype guard-shoot-info (structure) - ((anim-index int32 :offset-assert 0) - (start float :offset-assert 4) - (end float :offset-assert 8) + ((anim-index int32 2 :offset-assert 0) + (anim-index-front int32 :offset 0) + (anim-index-back int32 :offset 4) ) :pack-me :method-count-assert 9 - :size-assert #xc ;; 12 + :size-assert #x8 + :flag-assert #x900000008 + ) + + +(deftype guard-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (knocked int32 2 :offset-assert 8) + (knocked-land int32 2 :offset-assert 16) + (anim-knocked-front int32 :offset 8) + (anim-knocked-back int32 :offset 12) + (anim-knocked-front-land int32 :offset 16) + (anim-knocked-back-land int32 :offset 20) + (yellow-hit-anim guard-anim-info 2 :inline :offset-assert 24) + (yellow-land-anim guard-anim-info 2 :inline :offset-assert 40) + (blue-hit-anim int32 :offset-assert 56) + ) + :method-count-assert 9 + :size-assert #x3c + :flag-assert #x90000003c + ) + + +(deftype guard-shoot-info (structure) + ((anim-index int32 :offset-assert 0) + (start float :offset-assert 4) + (end float :offset-assert 8) + ) + :pack-me + :method-count-assert 9 + :size-assert #xc :flag-assert #x90000000c ) -(deftype crimson-guard (citizen) - ( - (info symbol :offset-assert 964) - (hit-face uint32 :offset-assert 968) - (anim-get-up-front int32 :offset-assert 972) - (anim-get-up-back int32 :offset-assert 976) - (small-hit int32 :offset-assert 980) - (yellow-anim uint32 :offset-assert 984) - (guard-type uint8 :offset-assert 988) - (settings traffic-guard-type-settings :offset-assert 992) - (next-time time-frame :offset-assert 1000) - (last-time-see-target time-frame :offset-assert 1008) - (joint symbol :offset-assert 1016) - (joint-enable symbol :offset-assert 1020) - (already-shot symbol :offset-assert 1024) - (miss-amount float :offset-assert 1028) - (l-control symbol :offset-assert 1032) - (next-shot int64 :offset-assert 1040) - (anim-shoot guard-shoot-info 3 :inline :offset-assert 1048) ;; elt size: 13.333333333333334 - (transport int64 :offset-assert 1088) - (transport-side uint32 :offset-assert 1096) - (target-flags uint8 :offset-assert 1100) - (target-pos vector :inline :offset-assert 1104) - (target-pos-predict vector :inline :offset-assert 1120) - (target-pos-predict-miss vector :inline :offset-assert 1136) - (target-vel-vec vector :inline :offset-assert 1152) - (target-vel float :offset-assert 1168) - (target-self vector :inline :offset-assert 1184) - (target-self-xz vector :inline :offset-assert 1200) - (target-self-dist float :offset-assert 1216) - (target-self-xz-dist float :offset-assert 1220) - (target-y-angle degrees :offset-assert 1224) - (last-visible-target-pos vector :inline :offset-assert 1232) - (lazer-sound uint32 :offset-assert 1248) - (move-position vector :inline :offset-assert 1264) - (move-index int32 :offset-assert 1280) - (traffic-target-status traffic-target-status :inline :offset-assert 1296) - (minimap connection-minimap :offset-assert 1376) - (other-side symbol :offset-assert 1380) + +(define *crimson-guard-global-info* + (new 'static 'guard-global-info + :knocked (new 'static 'array int32 2 31 8) + :knocked-land (new 'static 'array int32 2 32 9) + :yellow-hit-anim (new 'static 'inline-array guard-anim-info 2 + (new 'static 'guard-anim-info :anim-index (new 'static 'array int32 2 13 15)) + (new 'static 'guard-anim-info :anim-index (new 'static 'array int32 2 15 13)) + ) + :yellow-land-anim (new 'static 'inline-array guard-anim-info 2 + (new 'static 'guard-anim-info :anim-index (new 'static 'array int32 2 14 16)) + (new 'static 'guard-anim-info :anim-index (new 'static 'array int32 2 16 14)) + ) + :blue-hit-anim 10 + ) ) + +(define *crimson-guard-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 idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x4 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 4 + :notice-anim 4 + :hostile-anim -1 + :hit-anim 4 + :knocked-anim 8 + :knocked-land-anim 9 + :die-anim 17 + :die-falling-anim 8 + :victory-anim 4 + :jump-wind-up-anim 7 + :jump-in-air-anim 4 + :jump-land-anim 7 + :neck-joint 27 + :look-at-joint 6 + :bullseye-joint 5 + :sound-hit (static-sound-name "guard-hit") + :sound-die (static-sound-name "guard-die") + :notice-distance (meters 100) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 100) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.5 + :attack-shove-back (meters 3) + :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 0.5) + :jump-height-factor 0.1 + :knocked-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 32768.0 + :knocked-soft-vxz-hi 53248.0 + :knocked-soft-vy-lo 61440.0 + :knocked-soft-vy-hi 61440.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 40960.0 + :knocked-hard-vxz-hi 61440.0 + :knocked-hard-vy-lo 98304.0 + :knocked-hard-vy-hi 106496.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 20480.0 + :knocked-yellow-vxz-hi 24576.0 + :knocked-yellow-vy-lo 28672.0 + :knocked-yellow-vy-hi 40960.0 + :knocked-red-vxz-lo 65536.0 + :knocked-red-vxz-hi 81920.0 + :knocked-red-vy-lo 61440.0 + :knocked-red-vy-hi 61440.0 + :knocked-blue-vxz-lo 32768.0 + :knocked-blue-vxz-hi 65536.0 + :knocked-blue-vy-lo 16384.0 + :knocked-blue-vy-hi 32768.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 #f + :use-pacing #f + :walk-anim 5 + :turn-anim 5 + :run-anim 6 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 2) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 3) + :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! (-> *crimson-guard-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(deftype crimson-guard (citizen) + ((info guard-global-info :offset-assert 964) + (hit-face uint32 :offset-assert 968) + (anim-get-up-front int32 :offset-assert 972) + (anim-get-up-back int32 :offset-assert 976) + (small-hit int32 :offset-assert 980) + (yellow-anim uint32 :offset-assert 984) + (guard-type uint8 :offset-assert 988) + (settings traffic-guard-type-settings :offset-assert 992) + (next-time time-frame :offset-assert 1000) + (last-time-see-target time-frame :offset-assert 1008) + (joint joint-mod :offset-assert 1016) + (joint-enable symbol :offset-assert 1020) + (already-shot symbol :offset-assert 1024) + (miss-amount float :offset-assert 1028) + (l-control lightning-control :offset-assert 1032) + (next-shot int64 :offset-assert 1040) + (anim-shoot guard-shoot-info 3 :inline :offset-assert 1048) + (transport handle :offset-assert 1088) + (transport-side uint32 :offset-assert 1096) + (target-flags uint8 :offset-assert 1100) + (target-pos vector :inline :offset-assert 1104) + (target-pos-predict vector :inline :offset-assert 1120) + (target-pos-predict-miss vector :inline :offset-assert 1136) + (target-vel-vec vector :inline :offset-assert 1152) + (target-vel float :offset-assert 1168) + (target-self vector :inline :offset-assert 1184) + (target-self-xz vector :inline :offset-assert 1200) + (target-self-dist float :offset-assert 1216) + (target-self-xz-dist float :offset-assert 1220) + (target-y-angle degrees :offset-assert 1224) + (last-visible-target-pos vector :inline :offset-assert 1232) + (lazer-sound uint32 :offset-assert 1248) + (move-position vector :inline :offset-assert 1264) + (move-index int32 :offset-assert 1280) + (traffic-target-status traffic-target-status :inline :offset-assert 1296) + (minimap connection-minimap :offset-assert 1376) + (other-side symbol :offset-assert 1380) + ) + :heap-base #x4f0 :method-count-assert 227 - :size-assert #x568 ;; 1384 + :size-assert #x568 :flag-assert #xe304f00568 (:methods - (crimson-guard-method-201 () none 201) - (crimson-guard-method-202 () none 202) - (crimson-guard-method-203 () none 203) - (crimson-guard-method-204 () none 204) - (crimson-guard-method-205 () none 205) - (crimson-guard-method-206 () none 206) - (crimson-guard-method-207 () none 207) - (crimson-guard-method-208 () none 208) - (crimson-guard-method-209 () none 209) - (crimson-guard-method-210 () none 210) - (crimson-guard-method-211 () none 211) - (crimson-guard-method-212 () none 212) - (crimson-guard-method-213 () none 213) - (crimson-guard-method-214 () none 214) - (crimson-guard-method-215 () none 215) - (crimson-guard-method-216 () none 216) - (crimson-guard-method-217 () none 217) - (crimson-guard-method-218 () none 218) - (crimson-guard-method-219 () none 219) - (crimson-guard-method-220 () none 220) - (crimson-guard-method-221 () none 221) - (crimson-guard-method-222 () none 222) - (crimson-guard-method-223 () none 223) - (crimson-guard-method-224 () none 224) - (crimson-guard-method-225 () none 225) - (crimson-guard-method-226 () none 226)) + (get-up-front () _type_ :state 201) + (get-up-back () _type_ :state 202) + (search () _type_ :state 203) + (attack () _type_ :state 204) + (arrest () _type_ :state 205) + (gun-shoot () _type_ :state 206) + (exit-transport () _type_ :state 207) + (waiting-ambush () _type_ :state 208) + (close-attack () _type_ :state 209) + (knocked-off-vehicle () _type_ :state 210) + (roll-right () _type_ :state 211) + (roll-left () _type_ :state 212) + (close-attack-active () _type_ :state 213) + (crimson-guard-method-214 (_type_) none 214) + (crimson-guard-method-215 (_type_) symbol 215) + (crimson-guard-method-216 (_type_) symbol 216) + (crimson-guard-method-217 (_type_ vector vector vector) int 217) + (crimson-guard-method-218 (_type_ vector) none 218) + (crimson-guard-method-219 (_type_) none 219) + (crimson-guard-method-220 (_type_) none 220) + (crimson-guard-method-221 (_type_) none 221) + (crimson-guard-method-222 (_type_) none 222) + (crimson-guard-method-223 (_type_ float) none 223) + (crimson-guard-method-224 (_type_ vector) float 224) + (crimson-guard-method-225 (_type_ uint symbol) none 225) + (crimson-guard-method-226 (_type_) none 226) + ) ) -;; DECOMP BEGINS +(defmethod crimson-guard-method-218 crimson-guard ((obj crimson-guard) (arg0 vector)) + (local-vars + (sv-240 vector) + (sv-256 (function vector vector vector)) + (sv-272 vector) + (sv-288 vector) + (sv-304 vector) + (sv-320 vector) + ) + (with-pp + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (set! sv-240 arg0) + (let ((s0-0 (new 'stack-no-clear 'vector))) + (let ((v1-1 (-> obj root-override2 trans))) + (let ((a0-1 *y-vector*)) + (let ((a1-2 8192.0)) + (.mov vf7 a1-2) + ) + (.lvf vf5 (&-> a0-1 quad)) + ) + (.lvf vf4 (&-> v1-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 (&-> s0-0 quad) vf6) + (set! sv-320 (new 'stack-no-clear 'vector)) + (set! sv-304 (new 'stack-no-clear 'vector)) + (let ((s1-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (-> obj node-list data 4 bone transform) + (let ((s4-0 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (s3-0 (vector-y-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat)) + (set! (-> s0-0 quad) (-> obj root-override2 trans quad)) + (cond + ((logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + (let ((a1-6 s0-0)) + (let ((v1-14 s0-0)) + (let ((a0-9 s4-0)) + (let ((a2-1 4096.0)) + (.mov vf7 a2-1) + ) + (.lvf vf5 (&-> a0-9 quad)) + ) + (.lvf vf4 (&-> v1-14 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-6 quad) vf6) + ) + ) + (else + (let ((a1-7 s0-0)) + (let ((v1-15 s0-0)) + (let ((a0-10 s4-0)) + (let ((a2-3 2048.0)) + (.mov vf7 a2-3) + ) + (.lvf vf5 (&-> a0-10 quad)) + ) + (.lvf vf4 (&-> v1-15 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-7 quad) vf6) + ) + ) + ) + (let ((a1-8 s0-0)) + (let ((v1-16 s0-0)) + (let ((a0-11 s3-0)) + (let ((a2-5 8540.16)) + (.mov vf7 a2-5) + ) + (.lvf vf5 (&-> a0-11 quad)) + ) + (.lvf vf4 (&-> v1-16 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-8 quad) vf6) + ) + (vector-normalize! (vector-! sv-320 sv-240 s0-0) 1.0) + (set! sv-288 (new 'stack-no-clear 'vector)) + (let ((v1-20 (-> sv-240 quad))) + (set! (-> sv-288 quad) v1-20) + ) + (set! sv-256 vector-rotate90-around-y!) + (set! sv-272 (new 'stack-no-clear 'vector)) + (let* ((a1-13 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) sv-288 s0-0) -2998.272)) + (v0-5 (sv-256 sv-272 a1-13)) + ) + (vector+! sv-288 sv-288 v0-5) + ) + (vector-normalize! (vector-! sv-320 sv-288 s0-0) 1.0) + (vector-z-quaternion! sv-304 (-> obj root-override2 quat)) + (rot-zxy-from-vector! s2-0 sv-304) + (rot-zxy-from-vector! s1-0 sv-320) + (set! (-> s5-0 x) (fmax -14563.556 (fmin 14563.556 (deg- (-> s1-0 x) (-> s2-0 x))))) + (set! (-> s5-0 y) (fmax -14563.556 (fmin 14563.556 (deg- (-> s1-0 y) (-> s2-0 y))))) + (set! (-> s5-0 z) 0.0) + (let ((s2-1 (new 'stack-no-clear 'quaternion))) + (let ((s1-1 (new 'stack-no-clear 'quaternion))) + (quaternion-vector-angle! s2-1 s4-0 (-> s5-0 x)) + (quaternion-vector-angle! s1-1 s3-0 (-> s5-0 y)) + (quaternion*! s2-1 s1-1 s2-1) + ) + (quaternion-pseudo-seek (-> obj joint quat) (-> obj joint quat) s2-1 (-> pp clock seconds-per-frame)) + ) + ) + ) + ) + 0 + (none) + ) + ) + ) +(defmethod crimson-guard-method-219 crimson-guard ((obj crimson-guard)) + (with-pp + (quaternion-pseudo-seek + (-> obj joint quat) + (-> obj joint quat) + *unity-quaternion* + (-> pp clock seconds-per-frame) + ) + 0 + (none) + ) + ) + +(define *guard-min-id-hack* 255) + +(defmethod track-target! crimson-guard ((obj crimson-guard)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (let ((t9-0 (method-of-type citizen track-target!))) + (t9-0 obj) + ) + (update-transforms (-> obj root-override2)) + (if (< (-> obj traffic-id) *guard-min-id-hack*) + (set! *guard-min-id-hack* (-> obj traffic-id)) + ) + (if (-> obj joint-enable) + (crimson-guard-method-218 obj (-> obj target-pos-predict-miss)) + (crimson-guard-method-219 obj) + ) + (none) + ) + +(defmethod kill-prefer-falling crimson-guard ((obj crimson-guard)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + ((method-of-type nav-enemy kill-prefer-falling) obj) + ) + +(defmethod react-to-focus crimson-guard ((obj crimson-guard)) + "@TODO - flesh out docs" + (if (not (logtest? (-> obj flags) (citizen-flag hostile))) + (go (method-of-object obj active)) + (go-hostile obj) + ) + (none) + ) + +(defmethod damage-amount-from-attack crimson-guard ((obj crimson-guard) (arg0 process) (arg1 event-message-block)) + "@returns the amount of damage taken from an attack. This can come straight off the [[attack-info]] or via [[penetrate-using->damage]]" + (let ((v0-0 ((method-of-type nav-enemy damage-amount-from-attack) obj arg0 arg1))) + (-> arg1 param 1) + v0-0 + ) + ) + +;; WARN: Return type mismatch none vs object. +;; WARN: disable def twice: 122. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. +(defmethod general-event-handler crimson-guard ((obj crimson-guard) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (with-pp + (let ((v1-0 arg2)) + (the-as + object + (cond + ((or (= v1-0 'hit) (= v1-0 'hit-flinch) (= v1-0 'hit-knocked)) + (speech-control-method-13 *speech-control* (the-as handle obj)) + (logior! (-> obj flags) (citizen-flag hostile)) + (let* ((s0-0 (handle->process (-> obj incoming attacker-handle))) + (s1-0 (if (type? s0-0 process-focusable) + s0-0 + ) + ) + ) + (when s1-0 + (speech-control-method-12 *speech-control* obj (speech-type speech-type-0 speech-type-1 speech-type-3)) + (trigger-alert obj 1 (the-as target s1-0)) + ) + ) + ((method-of-type nav-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ((= v1-0 'event-death) + (if (zero? (-> obj hit-points)) + (the-as object (do-effect (-> obj skel effect) 'death-default 0.0 -1)) + ) + ) + ((= v1-0 'bouncing-off) + (when (or (and (-> obj next-state) (= (-> obj next-state name) 'active)) + (and (-> obj next-state) (= (-> obj next-state name) 'wait)) + ) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-1 speech-type-2 speech-type-3)) + (go (method-of-object obj close-attack-active)) + ) + ) + ((= v1-0 'combo) + (and (not (and (-> obj next-state) (= (-> obj next-state name) 'inactive))) + (and (not (logtest? (enemy-flag multi-focus) (-> obj enemy-flags))) (nonzero? (-> obj hit-points))) + ) + ) + ((= v1-0 'avoid) + #f + ) + ((= v1-0 'panic) + (set! (-> obj last-danger-time) (-> pp clock frame-counter)) + (let ((v1-38 (the-as traffic-danger-info (-> arg3 param 0)))) + (case (-> v1-38 danger-type) + (((traffic-danger-type tdt7)) + (set! (-> obj cp-factor) 20.0) + (let ((s5-1 (method-of-object obj trigger-alert)) + (s4-1 1) + (s3-1 (handle->process (-> v1-38 handle))) + ) + (the-as object (s5-1 obj s4-1 (the-as target (if (type? s3-1 process-focusable) + s3-1 + ) + ) + ) + ) + ) + ) + ) + ) + ) + ((= v1-0 'clear-path) + (set! (-> obj last-danger-time) (-> pp clock frame-counter)) + (let ((v1-44 (the-as traffic-danger-info (-> arg3 param 0)))) + (set! (-> obj cp-valid?) #t) + (set! (-> obj cp-sphere quad) (-> v1-44 sphere quad)) + (set! (-> obj cp-vec quad) (-> v1-44 velocity quad)) + (case (-> v1-44 danger-type) + (((traffic-danger-type tdt0)) + (trigger-alert obj 1 *target*) + ) + (((traffic-danger-type tdt1)) + ) + (((traffic-danger-type tdt2)) + ) + (((traffic-danger-type tdt3)) + ) + (((traffic-danger-type tdt4)) + ) + (((traffic-danger-type tdt5)) + ) + (((traffic-danger-type tdt6)) + ) + (((traffic-danger-type tdt7)) + (trigger-alert obj 1 *target*) + ) + ) + ) + (let ((s5-2 (-> obj cp-plane))) + (set! (-> s5-2 quad) (-> obj cp-vec quad)) + (set! (-> s5-2 y) 0.0) + (vector-rotate90-around-y! s5-2 s5-2) + (vector-normalize! s5-2 1.0) + (set! (-> s5-2 w) (- (vector-dot (the-as vector s5-2) (the-as vector (-> obj cp-sphere))))) + ) + (let ((v0-4 (the-as object (+ (-> pp clock frame-counter) (seconds 1))))) + (set! (-> obj cp-exit-time) (the-as time-frame v0-4)) + v0-4 + ) + ) + ((= v1-0 'end-pursuit) + (when *debug-segment* + (when (logtest? (-> obj focus-status) (focus-status inactive)) + (format 0 "guard::event end-pursuit recieved by inactive process ~d~%" (-> obj pid)) + (break!) + 0 + ) + ) + (when (not (logtest? (-> obj focus-status) (focus-status dead))) + (when (logtest? (-> obj flags) (citizen-flag hostile)) + (logclear! (-> obj flags) (citizen-flag persistent in-pursuit hostile)) + (citizen-method-195 obj (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (go (method-of-object obj active)) + ) + ) + ) + ((= v1-0 'alert-begin) + (when *debug-segment* + (when (logtest? (-> obj focus-status) (focus-status inactive)) + (format 0 "guard::event alert-begin recieved by inactive process ~d~%" (-> obj pid)) + (break!) + 0 + ) + ) + (when (not (logtest? (-> obj focus-status) (focus-status dead))) + (when (not (logtest? (-> obj flags) (citizen-flag hostile))) + (let ((a1-27 (the-as object (-> arg3 param 0)))) + (when (and (the-as uint a1-27) + (zero? (logand (-> (the-as process-focusable a1-27) focus-status) (focus-status disable dead inactive))) + ) + (set! (-> obj traffic-target-status handle) (process->handle (the-as process-focusable a1-27))) + (try-update-focus (-> obj focus) (the-as process-focusable a1-27) obj) + (if (and (not (and (-> obj next-state) (= (-> obj next-state name) 'jump))) + (not (and (-> obj next-state) (= (-> obj next-state name) 'exit-transport))) + ) + (the-as object (go-hostile obj)) + ) + ) + ) + ) + ) + ) + ((= v1-0 'alert-end) + (when *debug-segment* + (when (logtest? (-> obj focus-status) (focus-status inactive)) + (format 0 "guard::event alert-end recieved by inactive process ~d~%" (-> obj pid)) + (break!) + 0 + ) + ) + (when (not (logtest? (-> obj focus-status) (focus-status dead))) + (when (logtest? (-> obj flags) (citizen-flag hostile)) + (logclear! (-> obj flags) (citizen-flag persistent in-pursuit hostile)) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-0 speech-type-2)) + (citizen-method-195 obj (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (go (method-of-object obj active)) + ) + ) + ) + ((= v1-0 'track) + (if (and (-> obj next-state) (let ((v1-129 (-> obj next-state name))) + (or (= v1-129 'exit-transport) (= v1-129 'jump)) + ) + ) + #f + #t + ) + ) + ((= v1-0 'notify) + (let ((a0-84 (-> arg3 param 0)) + (v1-130 (the-as object (-> arg3 param 1))) + ) + (when (= a0-84 'attack) + (when (logtest? (-> (the-as process-focusable v1-130) mask) (process-mask target)) + (when (logtest? (-> (the-as process-focusable v1-130) focus-status) (focus-status dead)) + (format #t "guard killed player~%") + (the-as object (speech-control-method-12 *speech-control* obj (speech-type speech-type-1 speech-type-3))) + ) + ) + ) + ) + ) + (else + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + ) + ) + +(defmethod get-inv-mass crimson-guard ((obj crimson-guard)) + 0.6666667 + ) + +(defstate get-up-front (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.5 0.5 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (set! (-> self hit-face) (the-as uint -1)) + (let ((v1-6 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-6) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core collide-as) (collide-spec enemy)) + (set! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian hit-by-others-list player-list) + ) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-get-up-front)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-get-up-front))) frames num-frames) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (set! (-> self hit-face) (the-as uint -1)) + (react-to-focus self) + (none) + ) + :post (behavior () + (enemy-method-49 self) + (let ((a0-1 (-> self nav state)) + (v1-3 *null-vector*) + ) + (logior! (-> a0-1 flags) (nav-state-flag directional-mode)) + (set! (-> a0-1 travel quad) (-> v1-3 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +(defstate get-up-back (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.5 0.5 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (set! (-> self hit-face) (the-as uint -1)) + (let ((v1-6 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-6) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core collide-as) (collide-spec enemy)) + (set! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian hit-by-others-list player-list) + ) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-get-up-back)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-get-up-back))) frames num-frames) -1) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (set! (-> self hit-face) (the-as uint -1)) + (react-to-focus self) + (none) + ) + :post (behavior () + (enemy-method-49 self) + (let ((a0-1 (-> self nav state)) + (v1-3 *null-vector*) + ) + (logior! (-> a0-1 flags) (nav-state-flag directional-mode)) + (set! (-> a0-1 travel quad) (-> v1-3 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +(defstate knocked (crimson-guard) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (the-as collide-shape-prim-group (-> self root-override2 root-prim)))) + (logior! (-> v1-5 child 0 prim-core action) (collide-action no-standon)) + (logclear! (-> v1-5 child 1 prim-core action) (collide-action no-standon)) + (set! (-> v1-5 child 1 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 child 1 prim-core collide-with) (collide-spec)) + ) + 0 + (if (zero? (-> self hit-points)) + (set! (-> self root-override2 penetrated-by) (the-as penetrate -1)) + ) + (set! (-> self hit-face) + (the-as uint (if (< (vector-dot + (-> self root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat)) + ) + 0.0 + ) + 1 + 0 + ) + ) + ) + (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)) + ) + (let ((t9-0 (-> (method-of-type nav-enemy knocked) exit))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy knocked) trans))) + (if t9-0 + (t9-0) + ) + ) + (enemy-method-49 self) + (none) + ) + ) + +(defmethod enemy-method-77 crimson-guard ((obj crimson-guard) (arg0 (pointer float))) + (cond + ((logtest? (-> obj flags) (citizen-flag knocked-out-car)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 42))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 42)) 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 42)) num-func-seek!) + ) + (logclear! (-> obj flags) (citizen-flag knocked-out-car)) + ) + ((logtest? (-> obj flags) (citizen-flag knocked-out-bike)) + (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 43))) + (set! (-> a0-5 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 43)) 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 43)) num-func-seek!) + ) + (logclear! (-> obj flags) (citizen-flag knocked-out-bike)) + ) + ((begin + (let ((v1-37 (-> obj root-override2 transv))) + (cond + ((< (sqrtf (+ (* (-> v1-37 x) (-> v1-37 x)) (* (-> v1-37 z) (-> v1-37 z)))) 32768.0) + (set! (-> obj small-hit) 1) + ) + (else + (set! (-> obj small-hit) 0) + 0 + ) + ) + ) + (<= (-> obj hit-points) 0) + ) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a1-6 (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + (a0-11 (-> obj skel root-channel 0)) + ) + (set! (-> a0-11 frame-group) (the-as art-joint-anim a1-6)) + (set! (-> a0-11 param 0) (the float (+ (-> (the-as art-joint-anim a1-6) 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 a1-6) num-func-seek!) + ) + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-5) (knocked-type knocked-type-7)) + (ja-channel-push! 1 (seconds 0.01)) + (cond + ((= (-> obj small-hit) 1) + (set! (-> obj yellow-anim) (the-as uint (get-rand-int obj 2))) + (let ((a1-12 (-> obj + draw + art-group + data + (-> (the-as + guard-global-info + (+ (+ (* (-> obj hit-face) 4) (* (-> obj yellow-anim) 8)) (the-as uint (-> obj info))) + ) + yellow-hit-anim + 0 + anim-index-front + ) + ) + ) + (a0-23 (-> obj skel root-channel 0)) + ) + (set! (-> a0-23 frame-group) (the-as art-joint-anim a1-12)) + (set! (-> a0-23 param 0) (the float (+ (-> (the-as art-joint-anim a1-12) frames num-frames) -1))) + (set! (-> a0-23 param 1) (-> arg0 0)) + (set! (-> a0-23 frame-num) 0.0) + (joint-control-channel-group! a0-23 (the-as art-joint-anim a1-12) num-func-seek!) + ) + ) + (else + (let ((a1-13 (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + (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) (-> arg0 0)) + (set! (-> a0-27 frame-num) 0.0) + (joint-control-channel-group! a0-27 (the-as art-joint-anim a1-13) num-func-seek!) + ) + ) + ) + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-30 (-> obj skel root-channel 0))) + (set! (-> a0-30 frame-group) (the-as art-joint-anim (-> obj draw art-group data 10))) + (set! (-> a0-30 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 10)) 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 (-> obj draw art-group data 10)) num-func-seek!) + ) + ) + (((knocked-type knocked-type-2)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-17 (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))))) + (set! (-> arg0 0) (* 0.5 (-> arg0 0))) + (let ((a0-36 (-> obj skel root-channel 0))) + (set! (-> a0-36 frame-group) (the-as art-joint-anim a1-17)) + (set! (-> a0-36 param 0) (the float (+ (-> (the-as art-joint-anim a1-17) frames num-frames) -1))) + (set! (-> a0-36 param 1) (-> arg0 0)) + (set! (-> a0-36 frame-num) 0.0) + (joint-control-channel-group! a0-36 (the-as art-joint-anim a1-17) num-func-seek!) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-19 (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + (a0-41 (-> obj skel root-channel 0)) + ) + (set! (-> a0-41 frame-group) (the-as art-joint-anim a1-19)) + (set! (-> a0-41 param 0) (the float (+ (-> (the-as art-joint-anim a1-19) frames num-frames) -1))) + (set! (-> a0-41 param 1) (-> arg0 0)) + (set! (-> a0-41 frame-num) 0.0) + (joint-control-channel-group! a0-41 (the-as art-joint-anim a1-19) num-func-seek!) + ) + ) + ) + ) + ) + #t + ) + +(defmethod enemy-method-78 crimson-guard ((obj crimson-guard) (arg0 (pointer float))) + (cond + ((<= (-> obj hit-points) 0) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-2 (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + (a0-5 (-> obj skel root-channel 0)) + ) + (set! (-> a0-5 frame-group) (the-as art-joint-anim a1-2)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim a1-2) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> arg0 0)) + (set! (-> a0-5 frame-num) 0.0) + (joint-control-channel-group! a0-5 (the-as art-joint-anim a1-2) num-func-seek!) + ) + (set! (-> obj hit-face) (the-as uint -1)) + #t + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-5) (knocked-type knocked-type-7)) + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((= (-> obj small-hit) 1) + (let ((a1-7 (-> obj + draw + art-group + data + (-> (the-as + guard-global-info + (+ (+ (* (-> obj hit-face) 4) (* (-> obj yellow-anim) 8)) (the-as uint (-> obj info))) + ) + yellow-land-anim + 0 + anim-index-front + ) + ) + ) + (a0-16 (-> obj skel root-channel 0)) + ) + (set! (-> a0-16 frame-group) (the-as art-joint-anim a1-7)) + (set! (-> a0-16 param 0) (the float (+ (-> (the-as art-joint-anim a1-7) frames num-frames) -1))) + (set! (-> a0-16 param 1) (-> arg0 0)) + (set! (-> a0-16 frame-num) 0.0) + (joint-control-channel-group! a0-16 (the-as art-joint-anim a1-7) num-func-seek!) + ) + (set! (-> obj hit-face) (the-as uint -1)) + #t + ) + (else + (let ((a1-8 (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + (a0-20 (-> obj skel root-channel 0)) + ) + (set! (-> a0-20 frame-group) (the-as art-joint-anim a1-8)) + (set! (-> a0-20 param 0) (the float (+ (-> (the-as art-joint-anim a1-8) frames num-frames) -1))) + (set! (-> a0-20 param 1) (-> arg0 0)) + (set! (-> a0-20 frame-num) 0.0) + (joint-control-channel-group! a0-20 (the-as art-joint-anim a1-8) num-func-seek!) + ) + #t + ) + ) + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-23 (-> obj skel root-channel 0))) + (set! (-> a0-23 frame-group) (the-as art-joint-anim (-> obj draw art-group data 11))) + (set! (-> a0-23 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 11)) frames num-frames) -1)) + ) + (set! (-> a0-23 param 1) (-> arg0 0)) + (set! (-> a0-23 frame-num) 0.0) + (joint-control-channel-group! a0-23 (the-as art-joint-anim (-> obj draw art-group data 11)) num-func-seek!) + ) + (set! (-> obj hit-face) (the-as uint -1)) + #t + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-12 (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face))))) + (set! (-> arg0 0) 1.0) + (let ((a0-28 (-> obj skel root-channel 0))) + (set! (-> a0-28 frame-group) (the-as art-joint-anim a1-12)) + (set! (-> a0-28 param 0) (the float (+ (-> (the-as art-joint-anim a1-12) frames num-frames) -1))) + (set! (-> a0-28 param 1) (-> arg0 0)) + (set! (-> a0-28 frame-num) 0.0) + (joint-control-channel-group! a0-28 (the-as art-joint-anim a1-12) num-func-seek!) + ) + ) + #t + ) + ) + ) + ) + ) + +(defmethod set-behavior! crimson-guard ((obj crimson-guard) (arg0 traffic-object-spawn-params)) + (let ((a1-1 (-> arg0 guard-type))) + (if (or (and (!= a1-1 7) (!= a1-1 (-> obj guard-type))) (= (-> arg0 behavior) 11)) + (crimson-guard-method-225 obj a1-1 (= (-> arg0 behavior) 11)) + ) + ) + (case (-> arg0 behavior) + ((5) + (logior! (-> obj flags) (citizen-flag persistent hostile)) + (let ((s4-0 (-> obj focus)) + (s3-0 (method-of-type enemy-focus enemy-focus-method-13)) + (s5-1 (handle->process (-> arg0 handle))) + ) + (s3-0 + s4-0 + (the-as process-focusable (if (type? s5-1 process-focusable) + s5-1 + ) + ) + (enemy-aware enemy-aware-3) + ) + ) + (go (method-of-object obj arrest)) + ) + ((6) + (logior! (-> obj flags) (citizen-flag persistent)) + (logior! (-> obj flags) (citizen-flag hostile)) + (set! (-> obj transport) (-> arg0 handle)) + (set! (-> obj transport-side) (-> arg0 user-data)) + (crimson-guard-method-223 obj 0.0) + (let* ((s4-1 (-> obj controller traffic)) + (s5-2 (get-target s4-1)) + ) + (if (and (>= (the-as uint (get-alert-level s4-1)) (the-as uint 1)) s5-2) + (try-update-focus (-> obj focus) s5-2 obj) + ) + ) + (go (method-of-object obj exit-transport)) + ) + ((9) + (logior! (-> obj flags) (citizen-flag persistent)) + (set! (-> obj focus handle) (-> arg0 handle)) + (set! (-> obj traffic-target-status handle) (-> arg0 handle)) + (go (method-of-object obj waiting-ambush)) + ) + ((3) + (set! (-> obj focus handle) (-> arg0 handle)) + (set! (-> obj traffic-target-status handle) (-> arg0 handle)) + (go (method-of-object obj hostile)) + ) + ((11) + (set! (-> obj root-override2 trans quad) (-> arg0 position quad)) + (quaternion-copy! (-> obj root-override2 quat) (-> arg0 rotation)) + (set! (-> obj vehicle) (-> arg0 handle)) + (ja-channel-set! 1) + (case (-> (the-as vehicle (handle->process (-> obj vehicle))) info-override object-type) + ((11 12 13 18) + (logior! (-> obj flags) (citizen-flag knocked-out-bike)) + (let ((v1-64 (-> obj skel root-channel 0))) + (set! (-> v1-64 frame-group) (the-as art-joint-anim (-> obj draw art-group data 35))) + ) + ) + ((14 15 16 19) + (logior! (-> obj flags) (citizen-flag knocked-out-car)) + (let ((v1-70 (-> obj skel root-channel 0))) + (set! (-> v1-70 frame-group) (the-as art-joint-anim (-> obj draw art-group data 36))) + ) + ) + ) + (ja-post) + (go (method-of-object obj knocked-off-vehicle)) + ) + (else + ((method-of-type citizen set-behavior!) obj arg0) + ) + ) + 0 + (none) + ) + +(defstate knocked-off-vehicle (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + '() + (none) + ) + :code (behavior () + (suspend) + (throw-off-vehicle self) + (none) + ) + ) + +(defmethod go-hostile crimson-guard ((obj crimson-guard)) + (cond + ((handle->process (-> obj focus handle)) + (logior! (-> obj flags) (citizen-flag hostile)) + (let ((v1-6 (-> obj hit-face))) + (cond + ((zero? v1-6) + (go (method-of-object obj get-up-front)) + ) + ((= v1-6 1) + (go (method-of-object obj get-up-back)) + ) + (else + (go (method-of-object obj hostile)) + ) + ) + ) + ) + (else + (go (method-of-object obj active)) + ) + ) + 0 + (none) + ) + +(defmethod crimson-guard-method-214 crimson-guard ((obj crimson-guard)) + (let* ((s4-0 (-> obj target-pos-predict-miss)) + (s5-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 14))) + (v1-2 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 15))) + (v1-3 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s4-0 v1-2) 1.0)) + (s4-1 (new 'stack-no-clear 'projectile-init-by-other-params)) + ) + (set! (-> s4-1 ent) (-> obj entity)) + (set! (-> s4-1 charge) 1.0) + (set! (-> s4-1 options) (projectile-options)) + (set! (-> s4-1 notify-handle) (process->handle obj)) + (set! (-> s4-1 owner-handle) (the-as handle #f)) + (set! (-> s4-1 ignore-handle) (process->handle obj)) + (let* ((a0-13 *game-info*) + (a1-12 (+ (-> a0-13 attack-id) 1)) + ) + (set! (-> a0-13 attack-id) a1-12) + (set! (-> s4-1 attack-id) a1-12) + ) + (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 pos quad) (-> s5-0 quad)) + (set! (-> s4-1 vel quad) (-> v1-3 quad)) + (vector-normalize! (-> s4-1 vel) 819200.0) + (spawn-projectile guard-shot s4-1 obj *default-dead-pool*) + ) + 0 + (none) + ) + +(defstate active (crimson-guard) + :virtual #t + :enter (behavior () + (when (not (-> self nav)) + (format #t "++++++++++++++ guard::active : nav = #f +++++++++++++++~%") + (go-virtual inactive) + ) + (let ((t9-2 (-> (method-of-type citizen active) enter))) + (if t9-2 + (t9-2) + ) + ) + (logclear! (-> self flags) (citizen-flag in-pursuit hostile)) + (set! (-> self already-shot) #f) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type citizen active) trans))) + (if t9-0 + (t9-0) + ) + ) + (if (logtest? (-> self draw status) (draw-control-status on-screen)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0)) + ) + (when (logtest? (-> self controller traffic alert-state flags) (traffic-alert-flag guard-multi-focus)) + (let ((gp-0 (find-closest-to-with-collide-lists (-> self controller traffic) self (-> self focus collide-with)))) + (when gp-0 + (try-update-focus (-> self focus) gp-0 self) + (set! (-> self traffic-target-status handle) (process->handle gp-0)) + (go-hostile self) + ) + ) + ) + (none) + ) + ) + +(defstate close-attack-active (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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 + (let* ((v1-5 *game-info*) + (a0-8 (+ (-> v1-5 attack-id) 1)) + ) + (set! (-> v1-5 attack-id) a0-8) + (set! (-> self attack-id) a0-8) + ) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) 0.0) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (none) + ) + :exit (behavior () + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3))) + (logclear! (-> v1-3 prim-core action) (collide-action deadly)) + ) + (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 () + (ja-channel-push! 1 (seconds 0.2)) + (let ((gp-0 #f)) + (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) + (when (and (< 7.0 (ja-frame-num 0)) (not gp-0)) + (let ((v1-22 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3))) + (logior! (-> v1-22 prim-core action) (collide-action deadly)) + ) + (set! gp-0 #t) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (go-virtual active) + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +(defstate inactive (crimson-guard) + :virtual #t + :enter (behavior () + (when (-> self minimap) + (logior! (-> self minimap flags) (minimap-flag fade-out)) + (set! (-> self minimap) #f) + ) + (let ((t9-0 (-> (method-of-type citizen inactive) enter))) + (if t9-0 + (t9-0) + ) + ) + (logclear! (-> self flags) (citizen-flag in-pursuit hostile)) + (set! (-> self already-shot) #f) + (none) + ) + ) + +(defmethod crimson-guard-method-217 crimson-guard ((obj crimson-guard) (arg0 vector) (arg1 vector) (arg2 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-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 + ) + (return 1) + ) + (else + ) + ) + ) + (else + (vector-! (-> s5-0 move-dist) arg1 arg0) + ) + ) + ) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (let ((a0-19 (-> s5-0 start-pos))) + (let ((v1-15 (-> s5-0 move-dist))) + (let ((a1-10 -0.1)) + (.mov vf7 a1-10) + ) + (.lvf vf5 (&-> v1-15 quad)) + ) + (.lvf vf4 (&-> arg0 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) + ) + (let ((a1-11 (-> s5-0 move-dist))) + (let ((v1-16 (-> s5-0 move-dist))) + (let ((a0-20 (-> s5-0 move-dist))) + (let ((a2-4 0.1)) + (.mov vf7 a2-4) + ) + (.lvf vf5 (&-> a0-20 quad)) + ) + (.lvf vf4 (&-> v1-16 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-11 quad) vf6) + ) + (let ((v1-17 s5-0)) + (set! (-> v1-17 radius) f30-0) + (set! (-> v1-17 collide-with) (collide-spec civilian enemy obstacle hit-by-player-list hit-by-others-list)) + (set! (-> v1-17 ignore-process0) obj) + (set! (-> v1-17 ignore-process1) (handle->process (-> obj focus handle))) + (set! (-> v1-17 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-17 action-mask) (collide-action solid)) + ) + ) + (cond + ((< (fill-and-probe-using-line-sphere *collide-cache* s5-0) 0.0) + 0 + ) + (else + (let ((s4-1 (-> s5-0 best-other-tri collide-ptr))) + (if (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 + ) + ) + 2 + 0 + ) + ) + ) + ) + ) + ) + ) + +(defmethod crimson-guard-method-220 crimson-guard ((obj crimson-guard)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (cond + ((logtest? (-> obj controller traffic alert-state flags) (traffic-alert-flag guard-multi-focus)) + (set! (-> obj enemy-flags) (logior (enemy-flag trackable) (-> obj enemy-flags))) + (when (not (logtest? (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (let ((a0-4 (find-closest-to-with-collide-lists (-> obj controller traffic) obj (-> obj focus collide-with)))) + (if a0-4 + (set! (-> obj traffic-target-status handle) (process->handle a0-4)) + (set! (-> obj traffic-target-status handle) (the-as handle #f)) + ) + ) + ) + ) + (else + (when (logtest? (enemy-flag trackable) (-> obj enemy-flags)) + (logclear! (-> obj enemy-flags) (enemy-flag trackable)) + (let* ((s5-0 (handle->process (-> obj traffic-target-status handle))) + (v1-21 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (if (and v1-21 (!= (-> v1-21 type) target)) + (set! (-> obj traffic-target-status handle) (the-as handle #f)) + ) + ) + ) + ) + ) + (let ((a1-3 (new 'stack-no-clear 'vector))) + (set! (-> a1-3 quad) (-> obj root-override2 trans quad)) + (set! (-> a1-3 y) (+ 8192.0 (-> a1-3 y))) + (let ((s5-1 + (traffic-engine-method-49 (-> obj controller traffic) a1-3 (-> obj traffic-id) (-> obj traffic-target-status)) + ) + ) + (let* ((s4-0 obj) + (s3-0 (method-of-object s4-0 enemy-method-63)) + (s2-0 (handle->process (-> obj traffic-target-status handle))) + ) + (s3-0 + s4-0 + (the-as process-focusable (if (type? s2-0 process-focusable) + s2-0 + ) + ) + (the-as enemy-aware #f) + ) + ) + (let ((s4-1 (handle->process (-> obj focus handle)))) + (cond + ((and s4-1 + (zero? (logand (-> (the-as process-focusable s4-1) focus-status) (focus-status disable dead inactive))) + ) + (when (logtest? (-> s5-1 flags) (traffic-target-flag updated)) + (logclear! (-> obj flags) (citizen-flag target-in-sight)) + (if (crimson-guard-method-215 obj) + (logior! (-> obj flags) (citizen-flag target-in-sight)) + ) + ) + (set! (-> obj target-flags) (the-as uint (-> s5-1 flags))) + (set! (-> obj target-pos quad) (-> (get-trans (the-as process-focusable s4-1) 3) quad)) + (set! (-> obj target-vel-vec quad) (-> (the-as process-focusable s4-1) root-override transv quad)) + (set! (-> obj target-vel) (vector-length (-> obj target-vel-vec))) + (let ((s5-4 (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) (-> obj target-pos)))) + (let* ((f0-3 (vector-length s5-4)) + (f0-4 (* 0.0000012207031 f0-3)) + (a1-9 (-> obj target-pos-predict)) + ) + (let ((v1-62 (-> obj target-pos))) + (let ((a0-36 (-> obj target-vel-vec))) + (let ((a2-3 f0-4)) + (.mov vf7 a2-3) + ) + (.lvf vf5 (&-> a0-36 quad)) + ) + (.lvf vf4 (&-> v1-62 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-9 quad) vf6) + ) + (set! (-> s5-4 y) 0.0) + (vector-rotate90-around-y! s5-4 s5-4) + (if (-> obj other-side) + (vector-negate! s5-4 s5-4) + ) + (vector-normalize! s5-4 (-> obj miss-amount)) + (vector+! (-> obj target-pos-predict-miss) (-> obj target-pos-predict) s5-4) + ) + (vector-! (-> obj target-self) (-> obj target-pos) (-> obj root-override2 trans)) + (set! (-> obj target-self-xz quad) (-> obj target-self quad)) + (set! (-> obj target-self-xz y) 0.0) + (set! (-> obj target-self-dist) (vector-length (-> obj target-self))) + (set! (-> obj target-self-xz-dist) (vector-length (-> obj target-self-xz))) + (set! (-> obj target-y-angle) + (deg-diff (quaternion-y-angle (-> obj root-override2 quat)) (vector-y-angle (-> obj target-self))) + ) + ) + (else + (set! (-> obj traffic-target-status handle) (the-as handle #f)) + (logclear! (-> obj flags) (citizen-flag persistent in-pursuit hostile)) + (citizen-method-195 obj (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (go (method-of-object obj active)) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod crimson-guard-method-221 crimson-guard ((obj crimson-guard)) + (let ((a1-0 (new 'stack-no-clear 'traffic-danger-info))) + (set! (-> a1-0 sphere quad) (-> obj root-override2 trans quad)) + (set! (-> a1-0 sphere r) 40960.0) + (set! (-> a1-0 velocity quad) (-> obj root-override2 transv quad)) + (set! (-> a1-0 notify-radius) 122880.0) + (set! (-> a1-0 danger-level) 1.0) + (set! (-> a1-0 decay-rate) 0.0) + (set! (-> a1-0 flags) (traffic-danger-flags tdf0)) + (set! (-> a1-0 danger-type) (traffic-danger-type tdt0)) + (add-danger (-> obj controller traffic) a1-0) + ) + (none) + ) + +(defmethod crimson-guard-method-215 crimson-guard ((obj crimson-guard)) + (let ((s5-0 (get-trans obj 3)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s4-0 quad) (-> obj target-pos quad)) + (let ((s3-1 (vector-! (new 'stack-no-clear 'vector) s4-0 s5-0))) + (vector-normalize! s3-1 409600.0) + (zero? (crimson-guard-method-217 obj s5-0 (vector+! (new 'stack-no-clear 'vector) s5-0 s3-1) s4-0)) + ) + ) + ) + +(defmethod crimson-guard-method-216 crimson-guard ((obj crimson-guard)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj target-pos-predict-miss quad)) + (let* ((s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 14))) + (a0-3 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 15))) + (s3-1 (vector-! (new 'stack-no-clear 'vector) s5-0 a0-3)) + ) + (vector-normalize! s3-1 409600.0) + (and (crimson-guard-method-215 obj) + (zero? (crimson-guard-method-217 obj s4-0 (vector+! (new 'stack-no-clear 'vector) s4-0 s3-1) s5-0)) + ) + ) + ) + ) + +(defstate search (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-166 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self enemy-info-override run-travel-speed))) + ) + 0 + (if (zero? (-> self controller branch)) + (citizen-method-195 self (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + ) + (none) + ) + :exit (behavior () + '() + (none) + ) + :trans (behavior () + (-> self target-flags) + (crimson-guard-method-220 self) + (cond + ((logtest? (-> self target-flags) 1) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-1)) + (go-hostile self) + ) + (else + (speech-control-method-12 *speech-control* self (speech-type speech-type-2)) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 60) + (none) + ) + :post (behavior () + (if (and (nonzero? (-> self controller branch)) + (let ((f0-0 (vector-vector-xz-distance-squared (-> self root-override2 trans) (-> self controller turn-exit-point))) + (f1-0 16384.0) + ) + (< f0-0 (* f1-0 f1-0)) + ) + ) + (vehicle-controller-method-14 (-> self controller) (the-as vehicle self)) + ) + (let ((a0-2 (-> self nav state)) + (v1-9 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-2 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-2 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-2 target-post quad) (-> v1-9 quad)) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + ) + +(defun do-spline ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 vector) (arg4 vector) (arg5 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let* ((f1-1 (* arg5 arg5)) + (f0-2 (* arg5 f1-1)) + ) + (let ((f2-3 (- (+ 1.0 (* -3.0 arg5) (* 3.0 f1-1)) f0-2)) + (f3-7 (+ (* 3.0 f0-2) (* -6.0 f1-1) (* 3.0 arg5))) + (f1-3 (+ (* -3.0 f0-2) (* 3.0 f1-1))) + ) + (vector-float*! arg0 arg1 f2-3) + (let ((t2-0 arg0)) + (let ((v1-10 arg0)) + (let ((t1-3 (vector+! (new 'stack-no-clear 'vector) arg1 arg2))) + (let ((a1-1 f3-7)) + (.mov vf7 a1-1) + ) + (.lvf vf5 (&-> t1-3 quad)) + ) + (.lvf vf4 (&-> v1-10 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 (&-> t2-0 quad) vf6) + ) + (let ((a2-1 arg0)) + (let ((v1-11 arg0)) + (let ((a1-3 (vector+! (new 'stack-no-clear 'vector) arg3 arg4))) + (let ((t0-1 f1-3)) + (.mov vf7 t0-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 (&-> a2-1 quad) vf6) + ) + ) + (let ((v0-0 arg0)) + (let ((v1-12 arg0)) + (let ((a0-1 arg3)) + (let ((a1-4 f0-2)) + (.mov vf7 a1-4) + ) + (.lvf vf5 (&-> a0-1 quad)) + ) + (.lvf vf4 (&-> v1-12 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 (&-> v0-0 quad) vf6) + v0-0 + ) + ) + ) + ) + +(defstate hostile (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (when *debug-segment* + (when (not (-> self nav)) + (format 0 "guard::enter hostile with nav=#f ~d~%" (-> self pid)) + (break!) + 0 + ) + ) + (let ((t9-1 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-1 + (t9-1) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-11 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-11 enemy-flags))) + (set! (-> v1-11 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-11 enemy-flags)))) + ) + (set! (-> v1-11 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-11 enemy-flags)))) + (set! (-> v1-11 nav callback-info) (-> v1-11 enemy-info-override callback-info)) + ) + 0 + (let ((v1-14 self)) + (set! (-> v1-14 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-14 enemy-flags)))) + ) + 0 + (nav-enemy-method-166 self) + (when (-> self nav) + (let ((v1-20 (-> self nav))) + (set! (-> v1-20 target-speed) (* (-> self speed-scale) (-> self enemy-info-override run-travel-speed))) + ) + 0 + ) + (logior! (-> self flags) (citizen-flag persistent in-pursuit)) + (set! (-> self root-override2 nav-radius) 6144.0) + (none) + ) + :exit (behavior () + (when (-> self nav) + ) + (none) + ) + :trans (behavior () + (crimson-guard-method-220 self) + (when (and (not (logtest? (-> self draw status) (draw-control-status on-screen))) + (= (-> self controller traffic sync-mask-16) (ash 1 (logand (-> self traffic-id) 15))) + (zero? (logand (-> self flags) (citizen-flag sticky-weapon))) + ) + (let ((a1-4 (get-traffic-guard-change-to-type (-> self controller traffic) (the-as int (-> self guard-type))))) + (if (!= a1-4 (-> self guard-type)) + (crimson-guard-method-225 self a1-4 #f) + ) + ) + ) + (let* ((s5-0 (-> self traffic-target-status)) + (s4-0 (handle->process (-> s5-0 handle))) + (gp-0 (if (type? s4-0 process-focusable) + (the-as process-focusable s4-0) + ) + ) + ) + (if (or (logtest? (-> gp-0 focus-status) (focus-status inactive)) + (logtest? (-> gp-0 focus-status) (focus-status disable)) + ) + (set! gp-0 (the-as process-focusable #f)) + ) + (cond + ((not gp-0) + (go-virtual active) + ) + (else + (if (and (not (logtest? (-> s5-0 flags) (traffic-target-flag visible-recently))) + (logtest? (-> s5-0 flags) (traffic-target-flag visible-ever)) + ) + (speech-control-method-12 *speech-control* self (speech-type speech-type-1)) + ) + (when (and (logtest? (-> self nav state flags) (nav-state-flag at-target)) + (zero? (logand (-> s5-0 flags) (traffic-target-flag visible-recently))) + ) + (logclear! (-> self flags) (citizen-flag persistent)) + (citizen-method-195 self (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + (go-virtual search) + ) + (when (or (logtest? (-> s5-0 flags) (traffic-target-flag visible-recently)) + (zero? (logand (-> gp-0 mask) (process-mask target))) + ) + (speech-control-method-15 *speech-control* self) + (cond + ((logtest? (focus-status arrestable) (-> gp-0 focus-status)) + (if (and (< (-> self target-self-xz-dist) 28672.0) + (< (fabs (-> self target-y-angle)) 7281.778) + (>= 8192.0 (fabs (- (-> (get-trans gp-0 1) y) (-> self root-override2 trans y)))) + ) + (go-virtual arrest) + ) + ) + (else + (if (and (< (-> self target-self-xz-dist) 16384.0) + (and (< (fabs (-> self target-y-angle)) 7281.778) + (and gp-0 (zero? (logand (-> gp-0 focus-status) (focus-status disable dead ignore grabbed)))) + (logtest? (-> self flags) (citizen-flag target-in-sight)) + ) + ) + (go-virtual close-attack) + ) + (let ((v1-78 (-> self guard-type))) + (cond + ((= v1-78 1) + (when (and (< (-> self target-self-xz-dist) 163840.0) + (or (< 40960.0 (-> self target-self-xz-dist)) (>= 2 (the-as int (-> self focus aware)))) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) + (the int (* 300.0 (get-rand-float-range self 1.0 3.0))) + ) + (logtest? (-> self flags) (citizen-flag target-in-sight)) + ) + (go-virtual gun-shoot) + ) + ) + ) + ((zero? v1-78) + (if (or (< (-> self target-self-xz-dist) 28672.0) (>= 2 (the-as int (-> self focus aware)))) + (go-virtual attack) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 60) + (none) + ) + :post (behavior () + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (handle->process (-> self focus handle)) + (let ((v1-5 (new 'stack-no-clear 'vector))) + (if (< 32768.0 (-> self target-self-xz-dist)) + (set! (-> v1-5 quad) (-> self move-position quad)) + (set! (-> v1-5 quad) (-> self traffic-target-status position quad)) + ) + (cond + ((< 8192000.0 (-> self target-self-xz-dist)) + (let ((s5-0 (-> self root-override2 trans)) + (s4-0 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (new 'stack-no-clear 'vector) + (set! (-> s3-0 quad) (-> v1-5 quad)) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (let ((f30-0 (* 182.04445 (* 60.0 (the float (- (-> self traffic-id) *guard-min-id-hack*)))))) + (set-vector! s2-0 (cos f30-0) 0.0 (sin f30-0) 1.0) + ) + (let ((a1-6 s3-0)) + (let ((v1-13 s3-0)) + (let ((a0-15 s2-0)) + (let ((a2-1 12288.0)) + (.mov vf7 a2-1) + ) + (.lvf vf5 (&-> a0-15 quad)) + ) + (.lvf vf4 (&-> v1-13 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-6 quad) vf6) + ) + (let ((f30-2 (* 0.5 (vector-vector-xz-distance s5-0 s3-0)))) + (vector-normalize! s4-0 (* 0.5 f30-2)) + (vector-normalize! s2-0 (* 2.0 f30-2)) + ) + (do-spline gp-0 s5-0 s4-0 s3-0 s2-0 0.9) + (let ((v1-19 (-> self nav state))) + (logclear! (-> v1-19 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-19 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-19 target-post quad) (-> gp-0 quad)) + ) + ) + 0 + ) + (else + (let ((a0-26 (-> self nav state))) + (logclear! (-> a0-26 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-26 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-26 target-post quad) (-> v1-5 quad)) + ) + 0 + ) + ) + ) + (nav-enemy-method-176 self) + (none) + ) + ) + ) + +(defstate close-attack (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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)) + (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 (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let* ((v1-9 *game-info*) + (a0-17 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-17) + (set! (-> self attack-id) a0-17) + ) + (let ((v1-10 (-> self nav))) + (set! (-> v1-10 target-speed) 0.0) + ) + 0 + (none) + ) + :exit (behavior () + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3))) + (logclear! (-> v1-3 prim-core action) (collide-action deadly)) + ) + (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 () + (crimson-guard-method-220 self) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((gp-0 #f)) + (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) + (when (and (< 7.0 (ja-frame-num 0)) (not gp-0)) + (let ((v1-22 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3))) + (logior! (-> v1-22 prim-core action) (collide-action deadly)) + ) + (set! gp-0 #t) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (go-virtual hostile) + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +(defstate gun-shoot (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (set! (-> self other-side) (if (< (rand-vu) 0.5) + #t + #f + ) + ) + (nav-enemy-method-166 self) + (let ((v1-6 self)) + (set! (-> v1-6 enemy-flags) (the-as enemy-flag (logclear (-> v1-6 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-6 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-9 self)) + (set! (-> v1-9 enemy-flags) (the-as enemy-flag (logclear (-> v1-9 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((v1-12 (-> self nav state))) + (set! (-> v1-12 speed) 0.0) + ) + 0 + (let ((a0-9 (-> self nav state)) + (v1-15 *null-vector*) + ) + (set! (-> a0-9 velocity quad) (-> v1-15 quad)) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self last-time-see-target) (-> self clock frame-counter)) + (crimson-guard-method-220 self) + (set! (-> self miss-amount) (lerp-scale 0.0 16384.0 (-> self target-self-dist) 40960.0 122880.0)) + (set! (-> self miss-amount) 16384.0) + (let ((v1-27 (handle->process (-> self focus handle)))) + (if (and v1-27 (logtest? (process-mask enemy) (-> v1-27 mask))) + (set! (-> self miss-amount) 0.0) + ) + ) + (set! (-> self next-shot) (the-as int (-> self clock frame-counter))) + (set! (-> self joint-enable) #t) + (none) + ) + :exit (behavior () + (set! (-> self joint-enable) #f) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (crimson-guard-method-220 self) + (let ((gp-0 (handle->process (-> self focus handle)))) + (when gp-0 + (when (not (and gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (set! (-> self miss-amount) (lerp-scale 0.0 16384.0 (-> self target-self-dist) 40960.0 122880.0)) + (set! (-> self miss-amount) 16384.0) + ) + (if (and (< (-> self target-self-xz-dist) 16384.0) + (and (< (fabs (-> self target-y-angle)) 7281.778) + gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (go-virtual close-attack) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1)) + (or (not (logtest? (-> self flags) (citizen-flag target-in-sight))) + (< 184320.0 (-> self target-self-xz-dist)) + (< 10922.667 (fabs (-> self target-y-angle))) + ) + ) + (go-hostile self) + ) + ) + ) + (none) + ) + :code (behavior () + (local-vars (v1-35 object)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-3)) + (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 anim-shoot 0 anim-index)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-shoot 0 anim-index))) frames num-frames) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (label cfg-3) + (when (crimson-guard-method-216 self) + (set! v1-35 #t) + (goto cfg-10) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1)) + (set! v1-35 #f) + (goto cfg-10) + ) + (suspend) + (b! (not #f) cfg-3 :delay (set! v1-35 #f)) + (label cfg-10) + (when v1-35 + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((gp-0 3)) + (until #f + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-shoot 1 anim-index)) :num! min) + (set! (-> self already-shot) #t) + (lerp-scale 1.0 0.2 (-> self target-self-dist) 20480.0 122880.0) + (let ((f0-8 1.0)) + (cond + ((logtest? (-> self draw status) (draw-control-status on-screen)) + (let ((v1-58 (handle->process (-> self focus handle)))) + (when v1-58 + (if (or (< (-> self target-vel) 40.96) + (and (logtest? (focus-status pilot) (-> (the-as process-focusable v1-58) focus-status)) + (< (-> self target-pos y) 49152.0) + ) + ) + (set! (-> self miss-amount) (- (-> self miss-amount) (* 12288.0 f0-8))) + (set! (-> self miss-amount) (- (-> self miss-amount) (* 4096.0 f0-8))) + ) + ) + ) + ) + (else + (set! (-> self miss-amount) (- (-> self miss-amount) (* 3276.8 f0-8))) + ) + ) + ) + (if (< (-> self miss-amount) 0.0) + (set! (-> self miss-amount) 0.0) + ) + (crimson-guard-method-214 self) + (until (ja-done? 0) + (ja :num! (seek!)) + (suspend) + ) + (+! gp-0 -1) + (if (< gp-0 0) + (goto cfg-40) + ) + ) + ) + #f + ) + (label cfg-40) + (let ((f30-1 (get-rand-float-range self 0.9 1.1))) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-shoot 2 anim-index)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-shoot 2 anim-index))) frames num-frames) + -1 + ) + ) + f30-1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (crimson-guard-method-226 self) + (none) + ) + :post (behavior () + (citizen-method-200 self) + (nav-enemy-method-176 self) + (none) + ) + ) + +(defmethod crimson-guard-method-226 crimson-guard ((obj crimson-guard)) + (let ((s4-0 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (s5-0 (-> obj root-override2)) + (s3-0 (lambda ((arg0 crimson-guard) (arg1 collide-shape-moving) (arg2 vector)) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'vector)) + ) + (vector+! s3-0 (-> arg1 trans) arg2) + (cloest-point-on-mesh (-> arg0 nav) s4-0 s3-0 (the-as nav-poly #f)) + (cond + ((< 409.6 (vector-vector-distance s3-0 s4-0)) + #f + ) + ((let ((a1-4 (new 'stack-no-clear 'vector))) + (set! (-> a1-4 quad) (-> s4-0 quad)) + (set! (-> a1-4 w) (-> arg0 root-override2 nav-radius)) + (add-root-sphere-to-hash! (-> arg0 nav) a1-4 #x8046e) + ) + #f + ) + (else + (let ((a1-5 (new 'stack-no-clear 'collide-query))) + (set! (-> a1-5 start-pos quad) (-> arg1 trans quad)) + (vector-! (-> a1-5 move-dist) s4-0 (-> a1-5 start-pos)) + (let ((v1-10 a1-5)) + (set! (-> v1-10 radius) 2048.0) + (set! (-> v1-10 collide-with) (-> arg1 root-prim prim-core collide-with)) + (set! (-> v1-10 ignore-process0) arg0) + (set! (-> v1-10 ignore-process1) #f) + (set! (-> v1-10 ignore-pat) (-> arg1 pat-ignore-mask)) + (set! (-> v1-10 action-mask) (collide-action solid)) + ) + (if (>= (fill-and-probe-using-line-sphere *collide-cache* a1-5) 0.0) + #f + #t + ) + ) + ) + ) + ) + ) + ) + ) + (cond + ((s3-0 obj s5-0 (vector-normalize-copy! (new 'stack-no-clear 'vector) s4-0 24576.0)) + (go (method-of-object obj roll-right)) + ) + ((s3-0 obj s5-0 (vector-normalize-copy! (new 'stack-no-clear 'vector) s4-0 -24576.0)) + (go (method-of-object obj roll-left)) + ) + (else + (go-hostile obj) + ) + ) + ) + (none) + ) + +(defstate roll-right (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :code (behavior () + (vector-reset! (-> self root-override2 transv)) + (vector-x-quaternion! (-> self root-override2 transv) (-> self root-override2 quat)) + (set! (-> self root-override2 transv y) 24576.0) + (vector-xz-normalize! (-> self root-override2 transv) 40960.0) + (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 + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (ja-no-eval :group! (-> self draw art-group data 40) + :num! (seek! (ja-aframe 6.0 0)) + :frame-num (ja-aframe 0.0 0) + ) + (until (ja-done? 0) + (let ((a0-20 (handle->process (-> self focus handle)))) + (if a0-20 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable a0-20) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 6.0 0))) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 41) + :num! (seek! (ja-aframe 9.0 0)) + :frame-num (ja-aframe 0.0 0) + ) + (until (ja-done? 0) + (let ((a0-33 (handle->process (-> self focus handle)))) + (if a0-33 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable a0-33) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 9.0 0))) + ) + ) + ) + (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 + (cond + ((logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (ja-no-eval :group! (-> self draw art-group data 40) + :num! (seek! (ja-aframe 11.0 0)) + :frame-num (ja-aframe 6.0 0) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 11.0 0))) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 41) + :num! (seek! (ja-aframe 11.0 0)) + :frame-num (ja-aframe 9.0 0) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 11.0 0))) + ) + ) + ) + (go-virtual gun-shoot) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag36) (-> a0-0 enemy-flags)) + (vector-v++! + (-> self root-override2 transv) + (compute-acc-due-to-gravity (-> self root-override2) (new 'stack-no-clear 'vector) 0.0) + ) + (let ((a2-1 (new 'stack-no-clear 'collide-query)) + (a0-5 (-> self root-override2)) + ) + (set! (-> a2-1 collide-with) (-> a0-5 root-prim prim-core collide-with)) + (set! (-> a2-1 ignore-process0) self) + (set! (-> a2-1 ignore-process1) #f) + (set! (-> a2-1 ignore-pat) (-> a0-5 pat-ignore-mask)) + (set! (-> a2-1 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide a0-5 (-> self root-override2 transv) a2-1 (meters 0)) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate roll-left (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :code (behavior () + (vector-reset! (-> self root-override2 transv)) + (vector-x-quaternion! (-> self root-override2 transv) (-> self root-override2 quat)) + (set! (-> self root-override2 transv y) 24576.0) + (vector-xz-normalize! (-> self root-override2 transv) -40960.0) + (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 + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (ja-no-eval :group! (-> self draw art-group data 41) + :num! (seek! (ja-aframe 9.0 0)) + :frame-num (ja-aframe 0.0 0) + ) + (until (ja-done? 0) + (let ((a0-20 (handle->process (-> self focus handle)))) + (if a0-20 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable a0-20) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 9.0 0))) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 40) + :num! (seek! (ja-aframe 6.0 0)) + :frame-num (ja-aframe 0.0 0) + ) + (until (ja-done? 0) + (let ((a0-33 (handle->process (-> self focus handle)))) + (if a0-33 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable a0-33) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 6.0 0))) + ) + ) + ) + (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 + (cond + ((logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (ja-no-eval :group! (-> self draw art-group data 41) + :num! (seek! (ja-aframe 11.0 0)) + :frame-num (ja-aframe 9.0 0) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 11.0 0))) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 40) + :num! (seek! (ja-aframe 11.0 0)) + :frame-num (ja-aframe 6.0 0) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 11.0 0))) + ) + ) + ) + (go-virtual gun-shoot) + (none) + ) + :post (-> (method-of-type crimson-guard roll-right) post) + ) + +(defstate arrest (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (nav-enemy-method-167 self) + (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 (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (vector-reset! (-> self root-override2 transv)) + (let ((a0-9 (-> self nav state)) + (v1-12 *null-vector*) + ) + (set! (-> a0-9 velocity quad) (-> v1-12 quad)) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self last-time-see-target) (-> self clock frame-counter)) + (set! (-> self miss-amount) 0.0) + (set! (-> self next-shot) (the-as int (-> self clock frame-counter))) + (set! (-> self joint-enable) #t) + (crimson-guard-method-221 self) + (none) + ) + :exit (behavior () + (set! (-> self joint-enable) #f) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (crimson-guard-method-220 self) + (send-event (handle->process (-> self focus handle)) 'arrest) + (none) + ) + :code (behavior () + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-2 speech-type-3)) + (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 19) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 19)) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (until #f + (if (or (not (logtest? (-> self flags) (citizen-flag target-in-sight))) + (< 49152.0 (-> self target-self-xz-dist)) + (< 10922.667 (fabs (-> self target-y-angle))) + ) + (goto cfg-17) + ) + (ja-no-eval :group! (-> self draw art-group data 20) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 20)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (label cfg-17) + (let ((f30-1 (get-rand-float-range self 0.9 1.1))) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data 24) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 24)) frames num-frames) -1)) + f30-1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (citizen-method-200 self) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate waiting-ambush (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (nav-enemy-method-167 self) + (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 (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (vector-reset! (-> self root-override2 transv)) + (let ((a0-9 (-> self nav state)) + (v1-12 *null-vector*) + ) + (set! (-> a0-9 velocity quad) (-> v1-12 quad)) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self miss-amount) 0.0) + (set! (-> self next-shot) (the-as int (-> self clock frame-counter))) + (set! (-> self joint-enable) #t) + (crimson-guard-method-221 self) + (none) + ) + :exit (behavior () + (set! (-> self joint-enable) #f) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (crimson-guard-method-220 self) + (if (logtest? (-> self flags) (citizen-flag target-in-sight)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-1)) + ) + (none) + ) + :code (behavior () + (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 19) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 19)) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (while (not (logtest? (-> self flags) (citizen-flag target-in-sight))) + (ja-no-eval :group! (-> self draw art-group data 20) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 20)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (let ((f30-1 (get-rand-float-range self 0.9 1.1))) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data 24) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 24)) frames num-frames) -1)) + f30-1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (nav-enemy-simple-post) + (none) + ) + ) + +;; WARN: Return type mismatch symbol vs none. +(defun spread-lightning-lazer ((arg0 lightning-control) (arg1 vector) (arg2 vector) (arg3 vector)) + (local-vars (sv-640 int) (sv-656 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> arg1 quad)) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (set! (-> s4-0 quad) (-> arg2 quad)) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'quaternion)) + ) + (vector-length arg2) + (let ((s1-0 (new 'stack-no-clear 'vector))) + (set! (-> s1-0 quad) (-> arg3 quad)) + (let ((s0-0 (new 'stack-no-clear 'collide-query))) + (set! sv-640 0) + (while (< sv-640 6) + (let ((v1-6 s0-0)) + (set! (-> v1-6 radius) 2867.2) + (set! (-> v1-6 collide-with) + (collide-spec jak bot civilian enemy vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> v1-6 ignore-process0) #f) + (set! (-> v1-6 ignore-process1) #f) + (set! (-> v1-6 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-6 action-mask) (collide-action solid)) + ) + (set! (-> s0-0 start-pos quad) (-> s5-0 quad)) + (set! (-> s0-0 move-dist quad) (-> s4-0 quad)) + (set-from-point-offset-pad! (-> s0-0 bbox) (-> s0-0 start-pos) (-> s0-0 move-dist) (-> s0-0 radius)) + (fill-using-bounding-box *collide-cache* s0-0) + (set! (-> s0-0 radius) 409.6) + (let ((f0-4 (probe-using-line-sphere *collide-cache* s0-0))) + (cond + ((>= f0-4 0.0) + (let ((a1-4 s3-0)) + (let ((v1-13 (-> s0-0 start-pos))) + (let ((a0-12 (-> s0-0 move-dist))) + (let ((a2-2 f0-4)) + (.mov vf7 a2-2) + ) + (.lvf vf5 (&-> a0-12 quad)) + ) + (.lvf vf4 (&-> v1-13 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-4 quad) vf6) + ) + (set! (-> s5-0 quad) (-> s3-0 quad)) + ) + (else + (vector+! (-> s0-0 start-pos) s5-0 s4-0) + (let ((a1-7 (-> s0-0 start-pos))) + (let ((v1-16 (-> s0-0 start-pos))) + (let ((a0-16 s1-0)) + (let ((a2-4 -2048.0)) + (.mov vf7 a2-4) + ) + (.lvf vf5 (&-> a0-16 quad)) + ) + (.lvf vf4 (&-> v1-16 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-7 quad) vf6) + ) + (vector-negate! (-> s0-0 move-dist) s4-0) + (set! f0-4 (probe-using-line-sphere *collide-cache* s0-0)) + (when (>= f0-4 0.0) + (let ((a1-10 s3-0)) + (let ((v1-19 (-> s0-0 start-pos))) + (let ((a0-19 (-> s0-0 move-dist))) + (let ((a2-5 f0-4)) + (.mov vf7 a2-5) + ) + (.lvf vf5 (&-> a0-19 quad)) + ) + (.lvf vf4 (&-> v1-19 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-10 quad) vf6) + ) + (let ((a1-11 s3-0)) + (let ((v1-20 s3-0)) + (let ((a0-20 s1-0)) + (let ((a2-7 2048.0)) + (.mov vf7 a2-7) + ) + (.lvf vf5 (&-> a0-20 quad)) + ) + (.lvf vf4 (&-> v1-20 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-11 quad) vf6) + ) + (set! (-> s5-0 quad) (-> s3-0 quad)) + ) + ) + ) + (cond + ((>= f0-4 0.0) + (+! (-> s3-0 x) (rand-vu-float-range -819.2 819.2)) + (+! (-> s3-0 y) (rand-vu-float-range -819.2 819.2)) + (+! (-> s3-0 z) (rand-vu-float-range -819.2 819.2)) + (set-point! arg0 (-> arg0 state points-to-draw) s3-0) + (+! (-> arg0 state points-to-draw) 1) + (set! sv-656 (-> s0-0 best-other-tri normal)) + (quaternion-from-two-vectors! s2-0 s1-0 sv-656) + (vector-orient-by-quat! s4-0 s4-0 s2-0) + (set! (-> s1-0 quad) (-> sv-656 quad)) + (vector-flatten! s4-0 s4-0 sv-656) + ) + (else + (vector+! s5-0 s5-0 s4-0) + (when (< sv-640 6) + (set-point! arg0 (-> arg0 state points-to-draw) s5-0) + (+! (-> arg0 state points-to-draw) 1) + ) + ) + ) + ) + (set! sv-640 (+ sv-640 1)) + ) + ) + ) + ) + ) + ) + (none) + ) + ) + +(defmethod crimson-guard-method-222 crimson-guard ((obj crimson-guard)) + (local-vars (sv-800 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let* ((s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 14))) + (v0-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 15))) + (s2-0 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s4-0 v0-1) 16384.0)) + (s1-0 + (vector-normalize! (vector-! (new 'stack-no-clear 'vector) (-> obj target-pos-predict-miss) s4-0) 16384.0) + ) + (s5-0 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'collide-query)) + ) + (when (< 1820.4445 (vector-vector-angle-safe s2-0 s1-0)) + (let* ((a1-9 (vector-normalize! (vector-cross! (new 'stack-no-clear 'vector) s2-0 s1-0) 1.0)) + (a2-1 (quaternion-vector-angle! (new 'stack-no-clear 'quaternion) a1-9 1820.4445)) + ) + (vector-orient-by-quat! s1-0 s2-0 a2-1) + ) + ) + (let ((a0-12 s4-0)) + (let ((v1-8 s4-0)) + (let ((a1-12 0.2)) + (.mov vf7 a1-12) + ) + (.lvf vf5 (&-> s2-0 quad)) + (.lvf vf4 (&-> v1-8 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-12 quad) vf6) + ) + (vector+! s5-0 s4-0 s1-0) + (let ((v1-10 s3-0)) + (set! (-> v1-10 radius) 409.6) + (set! (-> v1-10 collide-with) + (collide-spec jak bot civilian enemy vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> v1-10 ignore-process0) #f) + (set! (-> v1-10 ignore-process1) #f) + (set! (-> v1-10 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-10 action-mask) (collide-action solid)) + ) + (set! (-> s3-0 start-pos quad) (-> s4-0 quad)) + (set! (-> s3-0 move-dist quad) (-> s1-0 quad)) + (set! (-> obj l-control state points-to-draw) 0) + (let ((f0-3 (fill-and-probe-using-line-sphere *collide-cache* s3-0)) + (s2-1 (new 'stack-no-clear 'vector)) + ) + (cond + ((>= f0-3 0.0) + (vector-float*! s1-0 (-> s3-0 move-dist) f0-3) + (vector+! s5-0 s4-0 s1-0) + (point-in-plane-<-point+normal! s2-1 s5-0 (-> s3-0 best-other-tri normal)) + (vector-! s2-1 s2-1 s5-0) + (let ((s1-1 quaternion-vector-angle!) + (s0-0 (new 'stack-no-clear 'quaternion)) + ) + (set! sv-800 (-> s3-0 best-other-tri normal)) + (let* ((a2-3 (rand-vu-float-range 0.0 65536.0)) + (a2-4 (s1-1 s0-0 sv-800 a2-3)) + ) + (vector-orient-by-quat! s2-1 s2-1 a2-4) + ) + ) + (let ((s1-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when s1-2 + (let ((t9-14 (method-of-type part-tracker activate))) + (t9-14 (the-as part-tracker s1-2) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-15 run-function-in-process) + (a0-33 s1-2) + (a1-24 part-tracker-init) + (a2-9 (-> *part-group-id-table* 140)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> s4-0 quad)) + ((the-as (function object object object object object object object object none) t9-15) + a0-33 + a1-24 + a2-9 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> s1-2 ppointer) + ) + ) + (let ((s1-3 (get-process *default-dead-pool* part-tracker #x4000))) + (when s1-3 + (let ((t9-17 (method-of-type part-tracker activate))) + (t9-17 (the-as part-tracker s1-3) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-18 run-function-in-process) + (a0-36 s1-3) + (a1-27 part-tracker-init) + (a2-14 (-> *part-group-id-table* 140)) + (a3-3 0) + (t0-1 #f) + (t1-1 #f) + (t2-1 #f) + (t3-1 *launch-matrix*) + ) + (set! (-> t3-1 trans quad) (-> s5-0 quad)) + ((the-as (function object object object object object object object object none) t9-18) + a0-36 + a1-27 + a2-14 + a3-3 + t0-1 + t1-1 + t2-1 + t3-1 + ) + ) + (-> s1-3 ppointer) + ) + ) + (set-point! (-> obj l-control) 0 s4-0) + (set-point! (-> obj l-control) 1 s5-0) + (set! (-> obj l-control spec) (-> *lightning-spec-id-table* 13)) + (+! (-> obj l-control state points-to-draw) 2) + (let* ((s1-4 (-> s3-0 best-other-tri collide-ptr)) + (v1-43 (if (type? s1-4 collide-shape-prim) + s1-4 + ) + ) + (s1-5 #t) + ) + (when v1-43 + (set! s1-5 #f) + (let ((s0-1 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> s0-1 ent) (-> obj entity)) + (set! (-> s0-1 charge) 1.0) + (set! (-> s0-1 options) (projectile-options)) + (set! (-> s0-1 notify-handle) (process->handle obj)) + (set! (-> s0-1 owner-handle) (the-as handle #f)) + (set! (-> s0-1 ignore-handle) (process->handle obj)) + (set! (-> s0-1 attack-id) (-> obj attack-id)) + (set! (-> s0-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s0-1 pos quad) (-> s4-0 quad)) + (vector-! (-> s0-1 vel) s5-0 s4-0) + (vector-normalize! (-> s0-1 vel) 131072.0) + (spawn-projectile guard-lazer-shot s0-1 obj *default-dead-pool*) + ) + ) + ) + (spread-lightning-lazer (-> obj l-control) s5-0 s2-1 (-> s3-0 best-other-tri normal)) + ) + (else + (let ((s3-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s3-1 + (let ((t9-26 (method-of-type part-tracker activate))) + (t9-26 (the-as part-tracker s3-1) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-27 run-function-in-process) + (a0-59 s3-1) + (a1-36 part-tracker-init) + (a2-23 (-> *part-group-id-table* 140)) + (a3-7 0) + (t0-3 #f) + (t1-2 #f) + (t2-2 #f) + (t3-2 *launch-matrix*) + ) + (set! (-> t3-2 trans quad) (-> s4-0 quad)) + ((the-as (function object object object object object object object object none) t9-27) + a0-59 + a1-36 + a2-23 + a3-7 + t0-3 + t1-2 + t2-2 + t3-2 + ) + ) + (-> s3-1 ppointer) + ) + ) + (let ((s3-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when s3-2 + (let ((t9-29 (method-of-type part-tracker activate))) + (t9-29 (the-as part-tracker s3-2) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-30 run-function-in-process) + (a0-62 s3-2) + (a1-39 part-tracker-init) + (a2-28 (-> *part-group-id-table* 140)) + (a3-9 0) + (t0-4 #f) + (t1-3 #f) + (t2-3 #f) + (t3-3 *launch-matrix*) + ) + (set! (-> t3-3 trans quad) (-> s5-0 quad)) + ((the-as (function object object object object object object object object none) t9-30) + a0-62 + a1-39 + a2-28 + a3-9 + t0-4 + t1-3 + t2-3 + t3-3 + ) + ) + (-> s3-2 ppointer) + ) + ) + (set! (-> obj l-control state points-to-draw) 9) + (set! (-> obj l-control spec) (-> *lightning-spec-id-table* 14)) + (let ((v1-77 s4-0)) + (set! (-> obj l-control state meet data 0 quad) (-> v1-77 quad)) + ) + (let ((a0-68 (-> obj l-control)) + (v1-79 s5-0) + ) + (set! (-> a0-68 state meet data (+ (-> a0-68 state points-to-draw) -1) quad) (-> v1-79 quad)) + ) + ) + ) + ) + ) + (none) + ) + ) + +(defstate attack (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (set! (-> self joint-enable) #t) + (logior! (-> self focus-status) (focus-status dangerous)) + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-5 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-8 self)) + (set! (-> v1-8 enemy-flags) (the-as enemy-flag (logclear (-> v1-8 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self miss-amount) 0.0) + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self lazer-sound) (the-as uint 0)) + 0 + (none) + ) + :exit (behavior () + (if (nonzero? (-> self lazer-sound)) + (sound-stop (the-as sound-id (-> self lazer-sound))) + ) + (iterate-prims + (-> self root-override2) + (lambda ((arg0 collide-shape-prim)) (logclear! (-> arg0 prim-core action) (collide-action deadly)) (none)) + ) + (let ((v1-5 (-> self l-control)) + (a0-2 0) + ) + (let ((a1-2 (!= a0-2 (-> v1-5 state mode)))) + (case a0-2 + ((3) + (if a1-2 + (set! (-> v1-5 state counter) 0.0) + ) + ) + ((1) + (set! (-> v1-5 state start-color) (-> v1-5 spec start-color)) + (set! (-> v1-5 state end-color) (-> v1-5 spec end-color)) + ) + ) + ) + (set! (-> v1-5 state mode) (the-as lightning-mode a0-2)) + ) + (set! (-> self joint-enable) #f) + (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 () + (crimson-guard-method-220 self) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1)) + (or (< 32768.0 (-> self target-self-xz-dist)) (zero? (logand (-> self flags) (citizen-flag target-in-sight)))) + ) + (go-hostile self) + ) + (let ((v1-14 (handle->process (-> self focus handle)))) + (if (or (logtest? (-> (the-as process-focusable v1-14) focus-status) (focus-status inactive)) + (logtest? (-> (the-as process-focusable v1-14) focus-status) (focus-status disable)) + ) + (set! v1-14 (the-as process #f)) + ) + (if (not v1-14) + (go-virtual active) + ) + ) + (none) + ) + :code (behavior () + (local-vars (v1-94 symbol)) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data 19) :num! (seek! (ja-aframe 7.0 0)) :frame-num 0.0) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 7.0 0))) + ) + (let ((gp-2 #t)) + (until #f + (while (or (< 7281.778 (fabs (-> self target-y-angle))) (>= (-> self next-shot) (-> self clock frame-counter))) + (when gp-2 + ) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-3)) + (cond + ((< 7281.778 (fabs (-> self target-y-angle))) + (ja-channel-push! 1 (seconds 0.1)) + (while (< 7281.778 (fabs (-> self target-y-angle))) + (let ((f0-6 (the-as float (-> self target-y-angle))) + (f30-0 16384.0) + ) + (if (< (the-as degrees f0-6) 0.0) + (set! f30-0 (- f30-0)) + ) + (if (logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (set! f0-6 (- (the-as degrees f0-6))) + ) + (cond + ((< f0-6 0.0) + (ja-no-eval :group! (-> self draw art-group data 25) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 25)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (quaternion-rotate-local-y! + (-> self root-override2 quat) + (-> self root-override2 quat) + (* f30-0 (-> self clock seconds-per-frame)) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 25) + :num! (seek! 0.0) + :frame-num (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 25)) frames num-frames) -1)) + ) + (until (ja-done? 0) + (quaternion-rotate-local-y! + (-> self root-override2 quat) + (-> self root-override2 quat) + (* f30-0 (-> self clock seconds-per-frame)) + ) + (suspend) + (ja :num! (seek! 0.0)) + ) + ) + ) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 20) :num! (loop!)) + (until v1-94 + (suspend) + (ja :num! (loop!)) + (set! v1-94 + (or (< (-> self clock frame-counter) (-> self next-shot)) + (< (-> self target-self-xz-dist) 16384.0) + (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) + ) + ) + ) + ) + (>= (fabs (-> self target-y-angle)) 7281.778) + ) + ) + ) + ) + ) + (when (< (-> self target-self-xz-dist) 16384.0) + (set! (-> self next-shot) 0) + 0 + ) + ) + (cond + ((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) + ) + ) + ) + (cond + ((< (-> self target-self-xz-dist) 16384.0) + (go-virtual close-attack) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 21) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 21)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (crimson-guard-method-221 self) + (set! (-> self next-shot) (the-as int (+ (-> self clock frame-counter) (seconds 0.1)))) + (let ((v1-155 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 2))) + (logior! (-> v1-155 prim-core action) (collide-action deadly)) + ) + (let* ((v1-156 *game-info*) + (a0-52 (+ (-> v1-156 attack-id) 1)) + ) + (set! (-> v1-156 attack-id) a0-52) + (set! (-> self attack-id) a0-52) + ) + (set! (-> self lazer-sound) (the-as uint (sound-play "guard-zap"))) + (let ((v1-158 (-> self l-control)) + (a0-56 1) + ) + (let ((a1-31 (!= a0-56 (-> v1-158 state mode)))) + (case a0-56 + ((3) + (if a1-31 + (set! (-> v1-158 state counter) 0.0) + ) + ) + ((1) + (set! (-> v1-158 state start-color) (-> v1-158 spec start-color)) + (set! (-> v1-158 state end-color) (-> v1-158 spec end-color)) + ) + ) + ) + (set! (-> v1-158 state mode) (the-as lightning-mode a0-56)) + ) + (let ((s5-1 (-> self clock frame-counter)) + (s4-1 150) + (f30-1 1.0) + ) + (ja-no-eval :group! (-> self draw art-group data 22) :num! (loop! f30-1) :frame-num 0.0) + (until (>= (- (-> self clock frame-counter) s5-1) s4-1) + (crimson-guard-method-222 self) + (suspend) + (ja :num! (loop! f30-1)) + ) + ) + (let ((v1-181 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 2))) + (logclear! (-> v1-181 prim-core action) (collide-action deadly)) + ) + (let ((v1-182 (-> self l-control)) + (a0-62 3) + ) + (let ((a1-44 (!= a0-62 (-> v1-182 state mode)))) + (case a0-62 + ((3) + (if a1-44 + (set! (-> v1-182 state counter) 0.0) + ) + ) + ((1) + (set! (-> v1-182 state start-color) (-> v1-182 spec start-color)) + (set! (-> v1-182 state end-color) (-> v1-182 spec end-color)) + ) + ) + ) + (set! (-> v1-182 state mode) (the-as lightning-mode a0-62)) + ) + (ja-no-eval :group! (-> self draw art-group data 23) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 23)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + ) + (else + (set! (-> self next-shot) (the-as int (+ (-> self clock frame-counter) (seconds 1)))) + (suspend) + 0 + ) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (citizen-method-200 self) + (nav-enemy-method-176 self) + (none) + ) + ) + +(defmethod crimson-guard-method-223 crimson-guard ((obj crimson-guard) (arg0 float)) + (let* ((s3-0 (handle->process (-> obj transport))) + (s4-0 (if (type? s3-0 process-focusable) + (the-as process-focusable s3-0) + ) + ) + ) + (when s4-0 + (let ((s2-0 (matrix<-transformq! (new 'stack-no-clear 'matrix) (the-as transformq (-> s4-0 root-override trans)))) + (s3-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> s3-1 x) (if (zero? (-> obj transport-side)) + -8192.0 + 8192.0 + ) + ) + (set! (-> s3-1 y) 12288.0) + (set! (-> s3-1 z) (lerp-scale -16384.0 -49152.0 arg0 0.0 1.0)) + (set! (-> s3-1 w) 1.0) + (quaternion-rotate-local-y! (-> obj root-override2 quat) (-> s4-0 root-override quat) 32768.0) + (vector-matrix*! (-> obj root-override2 trans) s3-1 s2-0) + ) + ) + ) + (let ((f0-5 (fmax 0.0 (fmin 1.0 (* 3.3333333 arg0))))) + (set-vector! (-> obj draw color-mult) f0-5 f0-5 f0-5 1.0) + ) + 0 + (none) + ) + +;; ERROR: Unsupported inline assembly instruction kind - [mula.s f0, f3] +;; ERROR: Unsupported inline assembly instruction kind - [madda.s f1, f4] +;; ERROR: Unsupported inline assembly instruction kind - [madd.s f0, f2, f5] +(defmethod crimson-guard-method-224 crimson-guard ((obj crimson-guard) (arg0 vector)) + (local-vars + (f0-8 float) + (sv-768 vector) + (sv-784 vector) + (sv-800 nav-control) + (sv-816 nav-poly) + (sv-832 vector) + ) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((s4-0 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (f30-0 0.0) + ) + (dotimes (s3-0 2) + (vector-normalize! s4-0 (* 4096.0 (+ 4.0 (* 2.0 (the float s3-0))))) + (dotimes (s2-0 6) + (set! sv-768 (new 'stack-no-clear 'vector)) + (let ((s1-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack 'collide-query)) + ) + (vector-rotate-around-y! sv-768 s4-0 (* 182.04445 (the float (+ (* 23 s2-0) -70)))) + (let ((v1-10 s1-0)) + (let ((a0-6 (-> obj root-override2 trans))) + (let ((a1-5 sv-768)) + (let ((a2-2 1.0)) + (.mov vf7 a2-2) + ) + (.lvf vf5 (&-> a1-5 quad)) + ) + (.lvf vf4 (&-> a0-6 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-10 quad) vf6) + ) + (if (enemy-above-ground? obj s0-0 s1-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> s1-0 y) (-> s0-0 best-other-tri intersect y)) + ) + (let ((v1-14 (-> obj nav)) + (a0-8 s1-0) + (a1-7 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-7 point) a0-8 (-> v1-14 state mesh bounds)) + (set! (-> a1-7 y-threshold) (-> v1-14 nearest-y-threshold)) + (set! (-> a1-7 ignore) (the-as uint 2)) + (set! sv-816 (find-poly-containing-point-local (-> v1-14 state mesh) a1-7)) + ) + (when sv-816 + (let* ((v1-18 s4-0) + (f0-7 (-> sv-768 x)) + (f1-4 (-> sv-768 y)) + (f2-2 (-> sv-768 z)) + (f3-2 (-> v1-18 x)) + (f4-0 (-> v1-18 y)) + (f5-0 (-> v1-18 z)) + ) + ; (.mula.s f0-7 f3-2) + ; (.madda.s f1-4 f4-0) + ; (.madd.s f0-8 f2-2 f5-0) + (set! f0-8 (+ (* f0-7 f3-2) (* f1-4 f4-0) (* f2-2 f5-0))) + ) + (let ((f28-0 f0-8)) + (new 'stack-no-clear 'vector) + (let ((a1-8 (new 'stack-no-clear 'vector))) + (set! (-> a1-8 quad) (-> s1-0 quad)) + (set! (-> a1-8 w) 8192.0) + (when (not (add-root-sphere-to-hash! (-> obj nav) a1-8 32)) + (when (< f30-0 f28-0) + (set! f30-0 f28-0) + (set! sv-784 (new 'stack-no-clear 'vector)) + (let ((a3-3 (new 'stack-no-clear 'vector))) + (set! sv-800 (-> obj nav)) + (set! sv-832 sv-784) + (let* ((v1-29 s1-0) + (a0-18 (-> sv-800 state mesh)) + (t9-7 (method-of-object a0-18 project-point-onto-plane-of-poly-local)) + (a2-7 sv-832) + (t0-2 (vector-! (new 'stack-no-clear 'vector) v1-29 (-> sv-800 state mesh bounds))) + ) + (t9-7 a0-18 sv-816 a2-7 a3-3 t0-2) + ) + ) + (let ((v1-30 sv-832)) + (let ((a0-21 (-> sv-800 state mesh bounds))) + (.mov.vf vf6 vf0 :mask #b1000) + (.lvf vf4 (&-> sv-832 quad)) + (.lvf vf5 (&-> a0-21 quad)) + ) + (.add.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> v1-30 quad) vf6) + ) + 0 + (set! (-> s1-0 y) (-> sv-784 y)) + (if (enemy-above-ground? obj s0-0 s1-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> s1-0 y) (-> s0-0 best-other-tri intersect y)) + ) + (set! (-> arg0 quad) (-> s1-0 quad)) + ) + ) + ) + ) + ) + ) + ) + ) + f30-0 + ) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod enemy-method-93 crimson-guard ((obj crimson-guard)) + (let ((s5-0 (-> obj nav state)) + (v1-2 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (set! (-> s5-0 heading quad) (-> v1-2 quad)) + ) + 0 + (let ((s5-1 (-> obj nav state)) + (v1-7 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (logior! (-> s5-1 flags) (nav-state-flag directional-mode)) + (set! (-> s5-1 travel quad) (-> v1-7 quad)) + ) + 0 + (let ((s5-2 (-> obj nav state)) + (v1-12 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (set! (-> s5-2 velocity quad) (-> v1-12 quad)) + ) + 0 + (crimson-guard-method-220 obj) + (set! (-> obj move-position quad) (-> obj target-pos quad)) + (go (method-of-object obj hostile)) + (none) + ) + +(defmethod enemy-method-89 crimson-guard ((obj crimson-guard) (arg0 enemy-jump-info)) + #f + ) + +(defmethod enemy-method-87 crimson-guard ((obj crimson-guard) (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!) + ) + (ja-channel-push! 1 (seconds 0.1)) + (let ((s4-0 (-> obj skel root-channel 0))) + (set! (-> s4-0 frame-group) (the-as art-joint-anim (-> obj draw art-group data 38))) + (set! (-> s4-0 param 0) (ja-aframe 3.0 0)) + (set! (-> s4-0 param 1) (-> arg0 anim-speed)) + (set! (-> s4-0 frame-num) (ja-aframe 0.0 0)) + (joint-control-channel-group! s4-0 (the-as art-joint-anim (-> obj draw art-group data 38)) num-func-seek!) + ) + #t + ) + +(defmethod enemy-method-88 crimson-guard ((obj crimson-guard) (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!) + ) + (ja-channel-push! 1 (seconds 0.01)) + (let ((s4-0 (-> obj skel root-channel 0))) + (set! (-> s4-0 frame-group) (the-as art-joint-anim (-> obj draw art-group data 38))) + (set! (-> s4-0 param 0) (ja-aframe 9.0 0)) + (set! (-> s4-0 param 1) (-> arg0 anim-speed)) + (set! (-> s4-0 frame-num) (ja-aframe 4.0 0)) + (joint-control-channel-group! s4-0 (the-as art-joint-anim (-> obj draw art-group data 38)) num-func-seek!) + ) + #t + ) + +(defmethod enemy-method-90 crimson-guard ((obj crimson-guard) (arg0 int) (arg1 enemy-jump-info)) + (local-vars (s5-0 symbol)) + (let ((v1-0 arg0)) + (cond + ((zero? v1-0) + (not (enemy-method-89 obj arg1)) + ) + ((= v1-0 1) + (set! s5-0 (ja-done? 0)) + (let ((s4-1 (-> obj skel root-channel 0))) + (set! (-> s4-1 param 0) (ja-aframe 3.0 0)) + (set! (-> s4-1 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! s4-1 (the-as art-joint-anim #f) num-func-seek!) + ) + (ja-blend-eval) + s5-0 + ) + ((= v1-0 2) + (enemy-method-87 obj arg1) + #f + ) + ((= v1-0 3) + (set! s5-0 (ja-done? 0)) + (let ((s4-2 (-> obj skel root-channel 0))) + (set! (-> s4-2 param 0) (ja-aframe 3.0 0)) + (set! (-> s4-2 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! s4-2 (the-as art-joint-anim #f) num-func-seek!) + ) + (ja-blend-eval) + s5-0 + ) + ((= v1-0 4) + (not (enemy-method-88 obj arg1)) + ) + ((= v1-0 5) + (set! s5-0 (ja-done? 0)) + (let ((s4-3 (-> obj skel root-channel 0))) + (set! (-> s4-3 param 0) (ja-aframe 9.0 0)) + (set! (-> s4-3 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! s4-3 (the-as art-joint-anim #f) num-func-seek!) + ) + (ja-blend-eval) + s5-0 + ) + (else + #t + ) + ) + ) + ) + +(defstate exit-transport (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (logior! (-> self nav flags) (nav-control-flag output-sphere-hash)) + (logclear! (-> self flags) (citizen-flag hostile)) + (nav-enemy-method-166 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self enemy-info-override run-travel-speed))) + ) + 0 + (set! (-> self already-shot) #f) + (none) + ) + :exit (behavior () + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + (logclear! (-> self nav flags) (nav-control-flag output-sphere-hash)) + (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) + (when (not (-> self already-shot)) + (crimson-guard-method-223 self 1.0) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> self root-override2 trans quad)) + (let ((s4-0 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + (s5-0 (new 'stack 'collide-query)) + ) + (let ((a0-3 gp-0)) + (let ((v1-8 gp-0)) + (let ((a1-4 20480.0)) + (.mov vf7 a1-4) + ) + (.lvf vf5 (&-> s4-0 quad)) + (.lvf vf4 (&-> v1-8 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-3 quad) vf6) + ) + (if (enemy-above-ground? 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)) + ) + ) + ) + (when (!= (crimson-guard-method-224 self (-> self event-param-point)) 0.0) + (let* ((v1-16 (-> self nav)) + (a1-7 (-> self event-param-point)) + (f0-3 (-> v1-16 extra-nav-sphere w)) + ) + (set! (-> v1-16 extra-nav-sphere quad) (-> a1-7 quad)) + (set! (-> v1-16 extra-nav-sphere w) f0-3) + ) + 0 + (let ((v1-19 (-> self nav))) + (set! (-> v1-19 extra-nav-sphere w) (-> self nav-radius-backup)) + ) + 0 + (let ((v1-21 (-> self nav))) + (logior! (-> v1-21 shape nav-flags) (nav-flags has-extra-sphere)) + ) + 0 + (set! (-> self already-shot) #t) + ) + (crimson-guard-method-223 self 0.0) + ) + (none) + ) + ) + :code (behavior () + (while (not (-> self already-shot)) + (suspend) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (ja-channel-set! 1) + (let ((gp-0 (-> self clock frame-counter)) + (s5-0 150) + (f30-0 2.0) + ) + (ja-no-eval :group! (-> self draw art-group data 6) :num! (loop! f30-0) :frame-num 0.0) + (until (>= (- (-> self clock frame-counter) gp-0) s5-0) + (crimson-guard-method-223 + self + (* 0.006666667 (the float (- (-> self clock frame-counter) (-> self state-time)))) + ) + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag vulnerable)))) + (send-event self 'jump 0 (-> self event-param-point)) + (until #f + (suspend) + ) + #f + (none) + ) + :post (behavior () + (ja-post) + (none) + ) + ) + +(defmethod init-enemy-collision! crimson-guard ((obj crimson-guard)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 4) 0))) + (set! (-> s5-0 total-prims) (the-as uint 5)) + (set! (-> s4-0 prim-core collide-as) (collide-spec civilian)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak civilian enemy 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 8192.0 0.0 24576.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 civilian)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak civilian hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (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 civilian)) + (set! (-> v1-15 prim-core collide-with) (collide-spec backgnd jak civilian hit-by-others-list player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 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 civilian)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak civilian enemy hit-by-others-list player-list)) + (set! (-> v1-17 transform-index) 14) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 2048.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 civilian)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak civilian enemy hit-by-others-list player-list)) + (set! (-> v1-19 transform-index) 14) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 -12288.0 6144.0) + ) + (set! (-> s5-0 nav-radius) 6144.0) + (let ((v1-21 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-21 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-21 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch process-drawable vs crimson-guard. +(defmethod relocate crimson-guard ((obj crimson-guard) (arg0 int)) + (if (nonzero? (-> obj joint)) + (&+! (-> obj joint) arg0) + ) + (if (nonzero? (-> obj l-control)) + (&+! (-> obj l-control) arg0) + ) + (the-as + crimson-guard + ((the-as (function process-drawable int process-drawable) (find-parent-method crimson-guard 7)) obj arg0) + ) + ) + +(defmethod init-enemy! crimson-guard ((obj crimson-guard)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-crimson-guard" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj joint) (new 'process 'joint-mod (joint-mod-mode joint-set*-world) obj 4)) + (set! (-> obj info) *crimson-guard-global-info*) + (init-enemy-behaviour-and-stats! obj *crimson-guard-nav-enemy-info*) + (let ((v1-7 (-> obj nav))) + (set! (-> v1-7 speed-scale) 1.0) + ) + 0 + (set! (-> obj draw lod-set lod 0 dist) 143360.0) + (set! (-> obj draw lod-set lod 1 dist) 491520.0) + (set! (-> obj anim-shuffle) 5) + (set! (-> obj anim-walk) 5) + (set! (-> obj speed-walk) 12288.0) + (set! (-> obj dist-walk-anim) 12288.0) + (set! (-> obj dist-run-anim) 34078.72) + (set! (-> obj anim-run) 6) + (set! (-> obj speed-run) 49152.0) + (set! (-> obj anim-get-up-front) 33) + (set! (-> obj anim-get-up-back) 34) + (set! (-> obj l-control) (new 'process 'lightning-control (-> *lightning-spec-id-table* 13) obj 0.0)) + (set! (-> obj l-control state points-to-draw) 0) + (set! (-> obj water-anim) -1) + (set! (-> obj minimap) #f) + 0 + (none) + ) + +(defmethod crimson-guard-method-225 crimson-guard ((obj crimson-guard) (arg0 uint) (arg1 symbol)) + (set! (-> obj guard-type) arg0) + (set! (-> obj settings) + (get-traffic-guard-type-settings (-> obj controller traffic) (the-as int (-> obj guard-type))) + ) + (setup-masks (-> obj draw) 0 30) + (cond + ((zero? (-> obj guard-type)) + (setup-masks (-> obj draw) 16 0) + (set! (-> obj root-override2 nav-radius) 8192.0) + ) + (else + (setup-masks (-> obj draw) 8 0) + (set! (-> obj root-override2 nav-radius) 6144.0) + ) + ) + (cond + ((and (not arg1) (logtest? (-> obj flags) (citizen-flag dark-guard))) + (setup-masks (-> obj draw) 5 0) + (set-vector! (-> obj root-override2 scale) 1.1 1.1 1.1 1.0) + (set-vector! (-> obj joint scale) 1.1 1.0 1.1 1.0) + (let* ((a0-16 (-> obj neck)) + (t9-5 (method-of-object a0-16 trs-set!)) + (a1-6 #f) + (a2-5 #f) + (a3-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> a3-0 x) 0.9090909) + (set! (-> a3-0 y) 1.0) + (set! (-> a3-0 z) 0.9090909) + (set! (-> a3-0 w) 1.0) + (t9-5 a0-16 (the-as vector a1-6) (the-as quaternion a2-5) a3-0) + ) + (mode-set! (-> obj neck) (joint-mod-mode rotate2)) + (set! (-> obj joint parented-scale?) #t) + (set! (-> obj neck parented-scale?) #t) + ) + (else + (setup-masks (-> obj draw) 3 0) + (set-vector! (-> obj root-override2 scale) 1.0 1.0 1.0 1.0) + (set-vector! (-> obj joint scale) 1.0 1.0 1.0 1.0) + (let* ((a0-29 (-> obj neck)) + (t9-8 (method-of-object a0-29 trs-set!)) + (a1-9 #f) + (a2-7 #f) + (a3-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> a3-1 x) 1.0) + (set! (-> a3-1 y) 1.0) + (set! (-> a3-1 z) 1.0) + (set! (-> a3-1 w) 1.0) + (t9-8 a0-29 (the-as vector a1-9) (the-as quaternion a2-7) a3-1) + ) + (mode-set! (-> obj neck) (joint-mod-mode reset)) + ) + ) + 0 + (none) + ) + +(defmethod citizen-init! crimson-guard ((obj crimson-guard)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type citizen citizen-init!))) + (t9-0 obj) + ) + (if (logtest? (-> obj flags) (citizen-flag dark-guard)) + (set! (-> obj hit-points) (the int (* 2.0 (the float (-> obj enemy-info-override default-hit-points))))) + ) + (set! (-> obj hit-face) (the-as uint -1)) + (crimson-guard-method-225 obj (get-guard-type-for-traffic-obj (-> obj controller traffic) 6) #f) + (let ((v1-12 (-> obj nav))) + (set! (-> v1-12 sphere-mask) (the-as uint #x800de)) + ) + 0 + (set! (-> obj joint-enable) #f) + (logclear! (-> obj mask) (process-mask enemy)) + (set! (-> obj mask) (logior (process-mask guard) (-> obj mask))) + (set! (-> obj fact-info-override pickup-type) (pickup-type ammo-random)) + (set! (-> obj fact-info-override pickup-amount) 10.0) + (set! (-> obj fact-info-override pickup-spawn-amount) 1.0) + (set! (-> obj traffic-target-status handle) (the-as handle #f)) + (let ((v1-24 (get-rand-int obj 2))) + (cond + ((zero? v1-24) + (set! (-> obj anim-shoot 0 anim-index) 19) + (set! (-> obj anim-shoot 0 start) 1.0) + (set! (-> obj anim-shoot 0 end) 12.0) + (set! (-> obj anim-shoot 1 anim-index) 26) + (set! (-> obj anim-shoot 1 start) 12.0) + (set! (-> obj anim-shoot 1 end) 22.0) + (set! (-> obj anim-shoot 2 anim-index) 24) + (set! (-> obj anim-shoot 2 start) 20.0) + (set! (-> obj anim-shoot 2 end) 30.0) + ) + ((= v1-24 1) + (set! (-> obj anim-shoot 0 anim-index) 27) + (set! (-> obj anim-shoot 0 start) 2.0) + (set! (-> obj anim-shoot 0 end) 9.0) + (set! (-> obj anim-shoot 1 anim-index) 29) + (set! (-> obj anim-shoot 1 start) 18.0) + (set! (-> obj anim-shoot 1 end) 26.0) + (set! (-> obj anim-shoot 2 anim-index) 30) + (set! (-> obj anim-shoot 2 start) 26.0) + (set! (-> obj anim-shoot 2 end) 35.0) + ) + ) + ) + (set-vector! (-> obj draw color-mult) 1.0 1.0 1.0 1.0) + (if (logtest? (-> obj controller traffic alert-state flags) (traffic-alert-flag target-jak)) + (reset-to-collide-spec + (-> obj focus) + (collide-spec jak enemy hit-by-others-list player-list bot-targetable jak-vehicle) + ) + (reset-to-collide-spec (-> obj focus) (collide-spec enemy hit-by-others-list bot-targetable)) + ) + (if (not (-> obj minimap)) + (set! (-> obj minimap) (add-icon! *minimap* obj (the-as uint 32) (the-as int #f) (the-as vector #t) 0)) + ) + (set! (-> obj move-index) -1) + (ja-channel-set! 0) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/city/common/metalhead-flitter.gc b/goal_src/jak2/levels/city/common/metalhead-flitter.gc index 3335fd3ae2..c9623f4fd6 100644 --- a/goal_src/jak2/levels/city/common/metalhead-flitter.gc +++ b/goal_src/jak2/levels/city/common/metalhead-flitter.gc @@ -5,33 +5,1199 @@ ;; name in dgo: metalhead-flitter ;; dgos: CWI +;; DECOMP BEGINS (deftype metalhead-flitter (citizen-enemy) - ((move-angle float :offset-assert 980) - (heading basic :offset-assert 984) + ((move-angle float :offset-assert 980) + (heading symbol :offset-assert 984) (change-dir-time time-frame :offset-assert 992) - (last-change-dir uint64 :offset-assert 1000) - (off-screen-timer uint64 :offset-assert 1008) - (amb-sound-timer uint64 :offset-assert 1016) + (last-change-dir uint64 :offset-assert 1000) + (off-screen-timer uint64 :offset-assert 1008) + (amb-sound-timer uint64 :offset-assert 1016) (attack-time time-frame :offset-assert 1024) - (target-pos vector :inline :offset-assert 1040) - (attack-pos vector :inline :offset-assert 1056) - (base-height float :offset-assert 1072) + (target-pos vector :inline :offset-assert 1040) + (attack-pos vector :inline :offset-assert 1056) + (base-height float :offset-assert 1072) ) + :heap-base #x3c0 :method-count-assert 210 :size-assert #x434 :flag-assert #xd203c00434 (:methods (attack () _type_ :state 203) (ambush-jumping () _type_ :state 204) - (metalhead-flitter-method-205 () none 205) - (metalhead-flitter-method-206 () none 206) - (metalhead-flitter-method-207 () none 207) - (metalhead-flitter-method-208 () none 208) - (metalhead-flitter-method-209 () none 209) + (metalhead-flitter-method-205 (_type_) none 205) + (metalhead-flitter-method-206 (_type_) none 206) + (metalhead-flitter-method-207 (_type_ process-focusable) symbol 207) + (metalhead-flitter-method-208 (_type_ symbol) none 208) + (metalhead-flitter-method-209 (_type_) float 209) ) ) -;; DECOMP BEGINS +(define *metalhead-flitter-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 idle-control-frame 16 + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x3 :param1 #x6) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x6 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x7 :param0 #xf :param1 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x2 :param1 #x4) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #xa :param1 #x14) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x2) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #xf :param1 #x1e) + (new 'static 'idle-control-frame) + ) + :idle-anim 5 + :notice-anim 12 + :hostile-anim 14 + :hit-anim 5 + :knocked-anim 20 + :knocked-land-anim 21 + :die-anim 19 + :die-falling-anim 18 + :victory-anim 5 + :jump-wind-up-anim 5 + :jump-in-air-anim 5 + :jump-land-anim 5 + :neck-joint -1 + :look-at-joint 28 + :bullseye-joint 3 + :sound-hit (static-sound-name "flitter-hit") + :sound-die (static-sound-name "flitter-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 20) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak civilian enemy vehicle-sphere hit-by-others-list player-list) + :penetrate-knocked (penetrate + generic-attack + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + knocked + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 6) + :attack-shove-up (meters 3) + :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 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 275251.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 28 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 696.32 :z 1843.2 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 13 + :turn-anim 15 + :run-anim 14 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 8) + :run-turning-acceleration (meters 120) + :walk-travel-speed (meters 4) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 5) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 5) + :frustration-distance (meters 12) + :frustration-time (seconds 4) + :blocked-time (seconds 0.3) + :circle-dist-lo 20480.0 + :circle-dist-hi 61440.0 + :nav-mesh #f + ) + ) +(set! (-> *metalhead-flitter-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(defmethod metalhead-flitter-method-207 metalhead-flitter ((obj metalhead-flitter) (arg0 process-focusable)) + (and (logtest? (-> obj draw status) (draw-control-status on-screen)) + (let ((s4-0 (camera-matrix))) + (camera-pos) + (let* ((s3-0 (get-trans arg0 0)) + (s5-1 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s4-0 vector 2) 1.0)) + (v1-7 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) s3-0) 1.0)) + ) + (< 0.0 (vector-dot s5-1 v1-7)) + ) + ) + ) + ) + +(defmethod enemy-method-77 metalhead-flitter ((obj metalhead-flitter) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 20))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 20)) 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 20)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-6)) + (let ((v1-17 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-17 (= v1-17 (-> obj draw art-group data 21))) + (ja-channel-push! 1 (seconds 0.17)) + (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 (-> obj draw art-group data 23))) + (set! (-> a0-10 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 23)) 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 (-> obj draw art-group data 23)) num-func-seek!) + ) + #t + ) + (else + ((method-of-type nav-enemy enemy-method-77) obj arg0) + ) + ) + ) + +(defmethod enemy-method-78 metalhead-flitter ((obj metalhead-flitter) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((v1-4 (-> obj skel root-channel 0))) + (set! (-> v1-4 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> v1-4 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> v1-4 param 1) 1.0) + (set! (-> v1-4 frame-num) 0.0) + (joint-control-channel-group! v1-4 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + #t + ) + ) + (else + ((method-of-type citizen-enemy enemy-method-78) obj arg0) + ) + ) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod go-stare2 metalhead-flitter ((obj metalhead-flitter)) + (if (and (= (-> obj focus aware) (enemy-aware enemy-aware-2)) (not (nav-enemy-method-163 obj))) + (go (method-of-object obj pacing)) + (go (method-of-object obj stare)) + ) + (none) + ) + +(defstate ambush (metalhead-flitter) + :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) + ) + ) + ) + ) + (set! (-> self base-height) (-> self root-override2 trans y)) + (let ((v1-13 (-> self root-override2 root-prim))) + (set! (-> v1-13 prim-core collide-as) (collide-spec)) + (set! (-> v1-13 prim-core collide-with) (collide-spec)) + ) + 0 + (let ((a0-4 (handle->process (-> self focus handle)))) + (when a0-4 + (let* ((gp-1 (-> self root-override2)) + (s3-0 + (vector-normalize! + (vector-! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable a0-4) 0) (-> gp-1 trans)) + 1.0 + ) + ) + (f0-1 (deg-diff (quaternion-y-angle (-> gp-1 quat)) (vector-y-angle s3-0))) + ) + (quaternion-rotate-y! (-> gp-1 quat) (-> gp-1 quat) f0-1) + ) + ) + ) + (none) + ) + :code (behavior () + (case (-> self level name) + (('ruins) + (let ((gp-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-0 + (let ((t9-1 (method-of-type part-tracker activate))) + (t9-1 + (the-as part-tracker gp-0) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-2 run-function-in-process) + (a0-4 gp-0) + (a1-2 part-tracker-init) + (a2-4 (-> *part-group-id-table* 163)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-2) + a0-4 + a1-2 + a2-4 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> gp-0 ppointer) + ) + ) + ) + (('strip) + (let ((gp-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-1 + (let ((t9-4 (method-of-type part-tracker activate))) + (t9-4 + (the-as part-tracker gp-1) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-5 run-function-in-process) + (a0-8 gp-1) + (a1-5 part-tracker-init) + (a2-9 (-> *part-group-id-table* 164)) + (a3-3 0) + (t0-1 #f) + (t1-1 #f) + (t2-1 #f) + (t3-1 *launch-matrix*) + ) + (set! (-> t3-1 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-5) + a0-8 + a1-5 + a2-9 + a3-3 + t0-1 + t1-1 + t2-1 + t3-1 + ) + ) + (-> gp-1 ppointer) + ) + ) + ) + ) + (let ((gp-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-2) (seconds 0.6)) + (suspend) + ) + ) + (set! (-> self root-override2 trans y) (+ -8192.0 (-> self root-override2 trans y))) + (logior! (-> self draw status) (draw-control-status no-draw)) + (let ((gp-3 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-3) (the int (* 300.0 (get-rand-float-range self 0.0 0.6)))) + (suspend) + ) + ) + (logclear! (-> self draw status) (draw-control-status no-draw)) + (go-virtual ambush-jumping) + (none) + ) + ) + +(defstate ambush-jumping (metalhead-flitter) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-flitter) + enemy-event-handler + ) + :enter (behavior () + (let ((v1-0 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-0 enemy-flags))) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-0 enemy-flags)))) + ) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-0 enemy-flags)))) + (set! (-> v1-0 nav callback-info) (-> v1-0 enemy-info-override callback-info)) + ) + 0 + (let ((v1-3 self)) + (set! (-> v1-3 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-3 enemy-flags)))) + ) + 0 + (look-at-target! self (enemy-flag lock-focus)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((gp-0 (-> self root-override2))) + (vector-reset! (-> gp-0 transv)) + (set! (-> gp-0 transv y) (* 4096.0 (get-rand-float-range self 34.0 38.0))) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 10) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 10)) frames num-frames) -1))) + ) + (until #f + (when (< (-> self base-height) (-> self root-override2 trans y)) + (let ((gp-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-0 + (let ((t9-3 (method-of-type part-tracker activate))) + (t9-3 + (the-as part-tracker gp-0) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-4 run-function-in-process) + (a0-4 gp-0) + (a1-4 part-tracker-init) + (a2-5 (-> *part-group-id-table* 144)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-4) + a0-4 + a1-4 + a2-5 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> gp-0 ppointer) + ) + ) + (goto cfg-10) + ) + (suspend) + (ja :num! (seek!)) + ) + #f + (until #f + (when (< (+ 204.8 (-> self base-height)) (-> self root-override2 trans y)) + (let ((v1-40 (-> self root-override2 root-prim))) + (set! (-> v1-40 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-40 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (goto cfg-11) + ) + (label cfg-10) + (suspend) + (ja :num! (seek!)) + ) + #f + (until #f + (label cfg-11) + (if (or (and (>= 0.0 (-> self root-override2 transv y)) + (>= (+ 1638.4 (-> self base-height)) (-> self root-override2 trans y)) + ) + (logtest? (-> self root-override2 status) (collide-status on-ground)) + ) + (goto cfg-26) + ) + (suspend) + (if (not (ja-done? 0)) + (ja :num! (seek!)) + ) + ) + #f + (label cfg-26) + (ja-no-eval :group! (-> self draw art-group data 11) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 11)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (until #f + (if (logtest? (-> self root-override2 status) (collide-status on-ground)) + (goto cfg-33) + ) + (suspend) + ) + #f + (label cfg-33) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior metalhead-flitter) nav-enemy-falling-post) + ) + +(defmethod enemy-method-99 metalhead-flitter ((obj metalhead-flitter) (arg0 process-focusable)) + (logtest? (focus-status mech) (-> arg0 focus-status)) + ) + +(defmethod metalhead-flitter-method-205 metalhead-flitter ((obj metalhead-flitter)) + (with-pp + (let* ((s5-0 (handle->process (-> obj focus handle))) + (s3-0 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (when s3-0 + (let* ((s5-1 (get-trans (the-as process-focusable s3-0) 0)) + (s4-1 (vector-! (new 'stack-no-clear 'vector) s5-1 (-> obj root-override2 trans))) + (f30-0 (vector-length s4-1)) + ) + (cond + ((enemy-method-99 obj (the-as process-focusable s3-0)) + (go-flee obj) + ) + ((and (< f30-0 32768.0) (not (metalhead-flitter-method-207 obj (the-as process-focusable s3-0)))) + (go (method-of-object obj circling)) + ) + ((< f30-0 (-> obj enemy-info-override notice-nav-radius)) + (set! (-> obj target-pos quad) (-> s5-1 quad)) + (let ((s3-1 (new 'stack-no-clear 'vector))) + (set! (-> s3-1 quad) (-> s4-1 quad)) + (let ((s5-2 (new 'stack-no-clear 'vector))) + (set! (-> s5-2 quad) (-> obj root-override2 transv quad)) + (vector-normalize! s5-2 f30-0) + (if (>= (vector-dot s3-1 s5-2) 0.98) + (go (method-of-object obj attack)) + ) + ) + ) + ) + ((< f30-0 32768.0) + (set! (-> obj target-pos quad) (-> s5-1 quad)) + ) + ((or (>= (- (-> pp clock frame-counter) (the-as int (-> obj last-change-dir))) (-> obj change-dir-time)) + (< (vector-vector-distance-squared (-> obj root-override2 trans) (-> obj target-pos)) 0.1) + ) + (set! (-> obj last-change-dir) (the-as uint (-> pp clock frame-counter))) + (set! (-> obj change-dir-time) (rand-vu-int-range (seconds 0.5) (seconds 0.7))) + (let ((s3-2 (new 'stack-no-clear 'vector)) + (f0-9 (* 0.5 f30-0 (tan (-> obj move-angle)))) + (s2-0 (new 'stack-no-clear 'vector)) + ) + (if (-> obj heading) + (set-vector! s3-2 (-> s4-1 z) (-> s4-1 y) (- (-> s4-1 x)) 1.0) + (set-vector! s3-2 (- (-> s4-1 z)) (-> s4-1 y) (-> s4-1 x) 1.0) + ) + (set! (-> obj heading) (not (-> obj heading))) + (let ((f28-1 (rand-vu-float-range (* 0.75 f0-9) f0-9)) + (s4-2 (vector-normalize-copy! (new 'stack-no-clear 'vector) s4-1 (* -0.6 f30-0))) + ) + (vector-normalize! s3-2 f28-1) + (vector+! s3-2 s3-2 s4-2) + ) + (clamp-vector-to-mesh-cross-gaps (-> obj nav state) s3-2) + (vector+! s2-0 s5-1 s3-2) + (set! (-> obj target-pos quad) (-> s2-0 quad)) + ) + ) + ) + ) + 0 + ) + ) + 0 + (none) + ) + ) + +;; WARN: Return type mismatch time-frame vs none. +(defmethod metalhead-flitter-method-206 metalhead-flitter ((obj metalhead-flitter)) + (with-pp + (when (>= (- (-> pp clock frame-counter) (the-as int (-> obj amb-sound-timer))) + (the int (* 300.0 (rand-vu-float-range 1.5 3.0))) + ) + (sound-play "flitter-amb" :position (-> obj root-override2 trans)) + (set! (-> obj amb-sound-timer) (the-as uint (-> pp clock frame-counter))) + ) + (none) + ) + ) + +(defbehavior metalhead-flitter-fall-and-play-death-anim metalhead-flitter ((arg0 int) (arg1 float) (arg2 time-frame)) + (local-vars (v1-29 symbol)) + (stop-looking-at-target! self) + (set! (-> self skel root-channel 0 frame-group) (the-as art-joint-anim arg0)) + (let ((s4-1 (enemy-method-50 self (new 'stack-no-clear 'vector))) + (s3-0 (-> self root-override2)) + ) + (when (if (type? s3-0 collide-shape-moving) + s3-0 + ) + (set! (-> self root-override2 transv y) 33775.48) + (ja :num-func num-func-identity :frame-num 0.0) + (set! (-> self state-time) (-> self clock frame-counter)) + (logclear! (-> self root-override2 status) (collide-status on-surface on-ground touch-surface)) + (until v1-29 + (let ((f0-2 102400.0)) + (set! (-> self root-override2 transv x) (* (-> s4-1 x) f0-2)) + (set! (-> self root-override2 transv z) (* (-> s4-1 z) f0-2)) + ) + (suspend) + (ja :num! (seek! max arg1)) + (set! v1-29 (or (ja-done? 0) (>= (- (-> self clock frame-counter) (-> self state-time)) arg2))) + ) + ) + ) + 0 + (none) + ) + +(defstate active (metalhead-flitter) + :virtual #t + :post (behavior () + (let ((a0-0 self)) + (metalhead-flitter-method-206 a0-0) + (let ((t9-1 (-> (method-of-type citizen-enemy active) post))) + (if t9-1 + ((the-as (function citizen-enemy none) t9-1) (the-as citizen-enemy a0-0)) + ) + ) + ) + (none) + ) + ) + +(defstate stare (metalhead-flitter) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (until #f + (when (not (enemy-method-96 self 2730.6667 #t)) + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! (-> self draw art-group data 15)) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 1820.4445 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-25 self)) + (set! (-> v1-25 enemy-flags) (the-as enemy-flag (logclear (-> v1-25 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (let ((v1-29 (ja-group))) + (if (not (and v1-29 (= v1-29 (-> self draw art-group data (-> self enemy-info-override idle-anim))))) + (ja-channel-push! 1 (seconds 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)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (metalhead-flitter-method-206 a0-0) + (let ((t9-1 (-> (method-of-type citizen-enemy stare) post))) + (if t9-1 + ((the-as (function nav-enemy none) t9-1) (the-as nav-enemy a0-0)) + ) + ) + ) + (none) + ) + ) + +(defstate hostile (metalhead-flitter) + :virtual #t + :enter (behavior () + (set! (-> self last-change-dir) (the-as uint (-> self clock frame-counter))) + (set! (-> self change-dir-time) 0) + (set! (-> self attack-time) (+ (-> self clock frame-counter) (seconds 0.35))) + (let ((t9-0 (-> (method-of-type citizen-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type citizen-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (metalhead-flitter-method-205 self) + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 (-> self target-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 die (metalhead-flitter) + :virtual #t + :enter (behavior () + (sound-play "flitter-die") + (let ((t9-2 (-> (method-of-type citizen-enemy die) enter))) + (if t9-2 + (t9-2) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (metalhead-flitter-fall-and-play-death-anim + (the-as int (-> self draw art-group data (-> self enemy-info-override die-anim))) + 1.0 + (seconds 2) + ) + (send-event self 'death-end) + (cleanup-for-death self) + (none) + ) + ) + +(defmethod metalhead-flitter-method-209 metalhead-flitter ((obj metalhead-flitter)) + (lerp-scale 0.0 1.0 (- (-> obj attack-pos y) (-> obj root-override2 trans y)) 13926.4 25600.0) + ) + +(defstate attack (metalhead-flitter) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-flitter) + 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 + (sound-play "flitter-attack") + (set! (-> self amb-sound-timer) (the-as uint 0)) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-8 *game-info*) + (v0-2 (+ (-> v1-8 attack-id) 1)) + ) + (set! (-> v1-8 attack-id) v0-2) + (set! (-> self attack-id) v0-2) + ) + (none) + ) + :exit (behavior () + (metalhead-flitter-method-208 self #f) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (local-vars (s5-2 vector)) + (let* ((s5-0 (handle->process (-> self focus handle))) + (gp-0 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (set! s5-2 + (cond + ((and gp-0 + (< (- (-> self clock frame-counter) (-> self state-time)) (seconds 1.5)) + gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + (let ((s5-1 (-> self nav state)) + (v1-10 (get-trans (the-as process-focusable gp-0) 0)) + ) + (logclear! (-> s5-1 flags) (nav-state-flag directional-mode)) + (logior! (-> s5-1 flags) (nav-state-flag target-poly-dirty)) + (set! (-> s5-1 target-post quad) (-> v1-10 quad)) + ) + 0 + (set! s5-2 (-> self attack-pos)) + (set! (-> s5-2 quad) (the-as uint128 (the-as vector (-> (get-trans (the-as process-focusable gp-0) 3) quad)))) + s5-2 + ) + (else + (the-as vector (go-stare self)) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 2 (seconds 0.1)) + (let ((f30-0 (metalhead-flitter-method-209 self))) + (ja-no-eval :group! (-> self draw art-group data 16) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 16)) frames num-frames) -1)) 0.8) + :frame-num 0.0 + ) + (let ((a0-3 (-> self skel root-channel 1))) + (set! (-> a0-3 frame-interp 1) f30-0) + (set! (-> a0-3 frame-interp 0) f30-0) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> self draw art-group data 17))) + (set! (-> a0-3 param 0) 0.0) + (set! (-> a0-3 frame-num) 0.0) + (joint-control-channel-group! a0-3 (the-as art-joint-anim (-> self draw art-group data 17)) num-func-chan) + ) + (until (ja-done? 0) + (suspend) + (set! f30-0 (seek f30-0 (metalhead-flitter-method-209 self) (* 0.2 (-> self clock seconds-per-frame)))) + (ja :num! (seek! max 0.8)) + (let ((a0-7 (-> self skel root-channel 1))) + (set! (-> a0-7 frame-interp 1) f30-0) + (set! (-> a0-7 frame-interp 0) f30-0) + (set! (-> a0-7 param 0) 0.0) + (joint-control-channel-group-eval! a0-7 (the-as art-joint-anim #f) num-func-chan) + ) + ) + ) + (let ((v1-40 self)) + (set! (-> v1-40 enemy-flags) (the-as enemy-flag (logclear (-> v1-40 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-40 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (ja-channel-push! 1 (seconds 0.1)) + (metalhead-flitter-method-208 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)) + ) + (dotimes (gp-1 (get-rand-int self 3)) + (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 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (react-to-focus self) + (none) + ) + :post (the-as (function none :behavior metalhead-flitter) nav-enemy-travel-post) + ) + +(defstate victory (metalhead-flitter) + :virtual #t + :post (behavior () + (metalhead-flitter-method-206 self) + (nav-enemy-simple-post) + (none) + ) + ) + +(defstate stare (metalhead-flitter) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (until #f + (when (not (enemy-method-96 self 2730.6667 #t)) + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! (-> self draw art-group data 15)) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 1820.4445 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-25 self)) + (set! (-> v1-25 enemy-flags) (the-as enemy-flag (logclear (-> v1-25 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (let ((v1-29 (ja-group))) + (if (not (and v1-29 (= v1-29 (-> self draw art-group data (-> self enemy-info-override idle-anim))))) + (ja-channel-push! 1 (seconds 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)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (metalhead-flitter-method-206 a0-0) + (let ((t9-1 (-> (method-of-type nav-enemy stare) post))) + (if t9-1 + ((the-as (function nav-enemy none) t9-1) (the-as nav-enemy a0-0)) + ) + ) + ) + (none) + ) + ) + +(defstate circling (metalhead-flitter) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy circling) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self off-screen-timer) (the-as uint (-> self clock frame-counter))) + (none) + ) + :trans (behavior () + (let ((gp-0 (handle->process (-> self focus handle)))) + (if gp-0 + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable gp-0) 0) quad)) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.1)) + (let ((v1-11 (-> self focus aware))) + (cond + ((= v1-11 (enemy-aware enemy-aware-3)) + (cond + ((when gp-0 + (let* ((gp-1 self) + (s5-1 (method-of-object gp-1 metalhead-flitter-method-207)) + (s4-0 (handle->process (-> self focus handle))) + ) + (s5-1 gp-1 (the-as process-focusable (if (type? s4-0 process-focusable) + s4-0 + ) + ) + ) + ) + ) + (if (and (get-enemy-target self) + (>= (- (-> self clock frame-counter) (the-as int (-> self off-screen-timer))) (seconds 0.3)) + ) + (go-hostile self) + ) + ) + (else + (set! (-> self off-screen-timer) (the-as uint (-> self clock frame-counter))) + ) + ) + ) + ((= v1-11 (enemy-aware enemy-aware-2)) + (go-stare self) + ) + ((>= 1 (the-as int v1-11)) + (go-virtual active) + ) + ) + ) + (if (or (nav-enemy-method-163 self) (logtest? (enemy-flag enemy-flag41) (-> self enemy-flags))) + (go-stare2 self) + ) + ) + ) + (none) + ) + :code (behavior () + (nav-enemy-method-166 self) + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override run-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override run-anim))) + frames + num-frames + ) + -1 + ) + ) + (get-rand-float-range self 0.9 1.1) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (get-rand-float-range self 0.9 1.1))) + ) + ) + #f + (none) + ) + ) + +(defmethod metalhead-flitter-method-208 metalhead-flitter ((obj metalhead-flitter) (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)) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod init-enemy-collision! metalhead-flitter ((obj metalhead-flitter)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 3) 0))) + (set! (-> s5-0 total-prims) (the-as uint 4)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate civilian enemy obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid can-ride deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 10240.0 0.0 15360.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-12 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-12 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-12 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-12 prim-core action) (collide-action solid can-ride deadly no-standon)) + (set-vector! (-> v1-12 local-sphere) 0.0 5734.4 0.0 5734.4) + ) + (let ((v1-14 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-14 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-14 prim-core collide-with) (collide-spec jak bot crate civilian hit-by-others-list player-list)) + (set! (-> v1-14 prim-core action) (collide-action deadly)) + (set! (-> v1-14 transform-index) 34) + (set-vector! (-> v1-14 local-sphere) 0.0 0.0 0.0 3481.6) + ) + (let ((v1-16 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-16 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-16 prim-core collide-with) (collide-spec jak bot crate civilian hit-by-others-list player-list)) + (set! (-> v1-16 prim-core action) (collide-action deadly)) + (set! (-> v1-16 transform-index) 35) + (set-vector! (-> v1-16 local-sphere) 0.0 0.0 0.0 3481.6) + ) + (set! (-> s5-0 nav-radius) 3686.4) + (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-priority) (the-as uint 8)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch symbol vs none. +(defmethod init-enemy! metalhead-flitter ((obj metalhead-flitter)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-flitter" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *metalhead-flitter-nav-enemy-info*) + (set! (-> obj move-angle) 10922.667) + (set! (-> obj heading) (if (= (rand-vu-int-range 0 1) 1) + #t + #f + ) + ) + (set! (-> obj change-dir-time) 0) + (set! (-> obj off-screen-timer) (the-as uint 0)) + (set! (-> obj amb-sound-timer) (the-as uint 0)) + (add-connection + *part-engine* + obj + 28 + obj + 318 + (new 'static 'vector :x 942.08 :y -860.16 :z 1269.76 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 28 + obj + 318 + (new 'static 'vector :x -942.08 :y -860.16 :z 1269.76 :w 163840.0) + ) + (set-gravity-length (-> obj root-override2 dynam) 491520.0) + (set! (-> obj minimap) #f) + (none) + ) + +(defmethod citizen-init! metalhead-flitter ((obj metalhead-flitter)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type citizen-enemy citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj speed-walk) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj dist-walk-anim) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj dist-run-anim) (-> obj enemy-info-override run-travel-speed)) + (set! (-> obj speed-run) (-> obj enemy-info-override walk-travel-speed)) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/city/common/metalhead-grunt.gc b/goal_src/jak2/levels/city/common/metalhead-grunt.gc index 1a7a6bc913..210f85cd14 100644 --- a/goal_src/jak2/levels/city/common/metalhead-grunt.gc +++ b/goal_src/jak2/levels/city/common/metalhead-grunt.gc @@ -5,6 +5,219 @@ ;; name in dgo: metalhead-grunt ;; dgos: CWI +;; DECOMP BEGINS + +(define *metalhead-grunt-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array idle-control-frame 36 + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x6 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x7 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x3c) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x6 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x7 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #xa :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #xa :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x6 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x7 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #xa :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x1e :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x3c) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + ) + :idle-anim 5 + :notice-anim 13 + :hostile-anim -1 + :hit-anim 34 + :knocked-anim -1 + :knocked-land-anim -1 + :die-anim 19 + :die-falling-anim 32 + :victory-anim -1 + :jump-wind-up-anim 45 + :jump-in-air-anim 46 + :jump-land-anim 47 + :neck-joint 5 + :look-at-joint 6 + :bullseye-joint 18 + :sound-hit (static-sound-name "grunt-hit") + :sound-die (static-sound-name "grunt-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 20) + :default-hit-points 5 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak civilian enemy vehicle-sphere hit-by-others-list player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 5) + :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 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 614.4 :z -3276.8 :r 327680.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #t + :use-circling #f + :use-pacing #f + :walk-anim 11 + :turn-anim -1 + :run-anim 14 + :taunt-anim 20 + :run-travel-speed (meters 7) + :run-acceleration (meters 6) + :run-turning-acceleration (meters 50) + :walk-travel-speed (meters 4) + :walk-acceleration (meters 6) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 360.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! (-> *metalhead-grunt-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + (deftype metalhead-grunt (citizen-enemy) ((patrol-anim grunt-anim-info :offset-assert 980) (charge-anim grunt-anim-info :offset-assert 984) @@ -12,17 +225,18 @@ (knocked-anim grunt-anim-info :offset-assert 992) (yellow-hit-anim grunt-anim-info :offset-assert 996) (blue-hit-anim grunt-anim-info :offset-assert 1000) - (intro-path basic :offset-assert 1004) + (intro-path path-control :offset-assert 1004) (pad-jh1b23jhb13 uint32 :offset-assert 1008) (use-charge-anim-index int8 :offset-assert 1012) (knocked-anim-index int8 :offset-assert 1013) (jumping-ambush-path-pt int8 :offset-assert 1014) (grunt-flags uint8 :offset-assert 1015) (state-timeout2 uint64 :offset-assert 1016) - (next-warn-time time-frame :offset-assert 1024) + (next-warn-time time-frame :offset-assert 1024) (dest vector :inline :offset-assert 1040) - (pad-kj1n23kj1n23 uint32 4 :offset-assert 1056) + (pad-kj1n23kj1n23 uint32 4 :offset-assert 1056) ) + :heap-base #x3b0 :method-count-assert 212 :size-assert #x430 :flag-assert #xd403b00430 @@ -33,11 +247,1180 @@ (jumping-ambush-cont () _type_ :state 206) (wait-for-focus () _type_ :state 207) (spin-attack () _type_ :state 208) - (metalhead-grunt-method-209 () none 209) - (metalhead-grunt-method-210 () none 210) - (metalhead-grunt-method-211 () none 211) + (metalhead-grunt-method-209 (_type_ float) process-focusable 209) + (get-nav-info (_type_) nav-enemy-info 210) + (metalhead-grunt-method-211 (_type_) none 211) ) ) -;; DECOMP BEGINS +(defmethod general-event-handler metalhead-grunt ((obj metalhead-grunt) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('hit 'hit-knocked) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (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)) + ) + ) + (kill-prefer-falling 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 citizen-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +(defmethod go-ambush metalhead-grunt ((obj metalhead-grunt)) + (cond + ((logtest? (-> obj fact-info-override enemy-options) (enemy-option user10)) + (go (method-of-object obj falling-ambush)) + ) + ((logtest? (-> obj fact-info-override enemy-options) (enemy-option user11)) + (go (method-of-object obj jumping-ambush)) + ) + (else + (format 0 "ERROR: ~A doesn't specify which ambush behavior to use.~%" (-> obj name)) + (go-hostile obj) + ) + ) + (none) + ) + +(defstate falling-ambush (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :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* ((gp-1 *target*) + (a0-4 (if (type? gp-1 process-focusable) + gp-1 + ) + ) + ) + (when a0-4 + (let* ((gp-2 (-> self root-override2)) + (s3-0 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) (get-trans a0-4 0) (-> gp-2 trans)) 1.0)) + (f0-0 (deg-diff (quaternion-y-angle (-> gp-2 quat)) (vector-y-angle s3-0))) + ) + (quaternion-rotate-y! (-> gp-2 quat) (-> gp-2 quat) f0-0) + ) + ) + ) + (logclear! (-> self draw status) (draw-control-status no-draw)) + (let* ((v1-17 *game-info*) + (v0-9 (+ (-> v1-17 attack-id) 1)) + ) + (set! (-> v1-17 attack-id) v0-9) + (set! (-> self attack-id) v0-9) + ) + (none) + ) + :code (behavior () + (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 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (sound-play "grunt-notice") + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior metalhead-grunt) nav-enemy-falling-post) + ) + +(defmethod enemy-method-93 metalhead-grunt ((obj metalhead-grunt)) + (case (-> obj jump-why) + ((2) + (go (method-of-object obj jumping-ambush-cont)) + ) + (else + ((method-of-type citizen-enemy enemy-method-93) obj) + ) + ) + (none) + ) + +(defstate jumping-ambush (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :enter (behavior () + ((-> (method-of-type nav-enemy ambush) enter)) + (when (zero? (-> self intro-path)) + (format 0 "ERROR: ~A has no intro path, skipping jumping-ambush~%" (-> self name)) + (go-virtual notice) + ) + (get-point-in-path! (-> self intro-path) (-> self root-override2 trans) 0.0 'interp) + (none) + ) + :code (behavior () + (set! (-> self jumping-ambush-path-pt) 1) + (until #f + (let ((gp-0 (new 'stack-no-clear 'vector))) + (get-point-in-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-5 (process->ppointer self))) + (set! (-> a1-1 from) v1-5) + ) + (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) + ) + ) + +(defstate jumping-ambush-cont (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :code (behavior () + (let ((a0-0 (-> self intro-path)) + (v1-1 (+ (-> self jumping-ambush-path-pt) 1)) + ) + (if (< v1-1 (-> a0-0 curve num-cverts)) + (set! (-> self jumping-ambush-path-pt) v1-1) + (react-to-focus self) + ) + ) + (until #f + (let ((gp-0 (new 'stack-no-clear 'vector))) + (get-point-in-path! (-> self intro-path) gp-0 (the float (-> self jumping-ambush-path-pt)) '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-9 (process->ppointer self))) + (set! (-> a1-1 from) v1-9) + ) + (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) + ) + ) + +(defstate active (metalhead-grunt) + :virtual #t + :code (behavior () + (let ((v1-2 (ja-group))) + (when (or (and v1-2 (or (= v1-2 (-> self draw art-group data 14)) + (= v1-2 (-> self draw art-group data 15)) + (= v1-2 (-> self draw art-group data 16)) + ) + ) + (let ((v1-8 (ja-group))) + (and v1-8 (or (= v1-8 (-> self draw art-group data 11)) + (= v1-8 (-> self draw art-group data 12)) + (= v1-8 (-> self draw art-group data 14)) + (= v1-8 (-> self draw art-group data 15)) + ) + ) + ) + ) + (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 + (set! (-> self patrol-anim) (-> *grunt-global-info* patrol-anim (get-rand-int self 4))) + (let ((v1-28 (-> self nav))) + (set! (-> v1-28 target-speed) (-> self patrol-anim travel-speed)) + ) + 0 + (let ((gp-0 (-> self draw art-group data (-> self patrol-anim anim-index))) + (s5-0 (get-rand-int-range self 1 8)) + ) + (let ((v1-37 (ja-group))) + (if (not (and v1-37 (= v1-37 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 (nonzero? (-> self patrol-anim anim-index)) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (set! (-> self patrol-anim) (the-as grunt-anim-info (-> *grunt-global-info* patrol-anim))) + (let ((v1-67 (-> self nav))) + (set! (-> v1-67 target-speed) (-> self patrol-anim travel-speed)) + ) + 0 + (let ((gp-1 (-> self draw art-group data (-> self patrol-anim anim-index))) + (s5-1 (get-rand-int-range self 2 5)) + ) + (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) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (dotimes (s4-1 s5-1) + (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)) + ) + ) + ) + ) + (when (zero? (get-rand-int self 3)) + (let ((v1-107 self)) + (set! (-> v1-107 enemy-flags) + (the-as enemy-flag (logclear (-> v1-107 enemy-flags) (enemy-flag enemy-flag36))) + ) + (set! (-> v1-107 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (ja-channel-push! 1 (seconds 0.3)) + (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)) + ) + (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-171 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-171 enemy-flags))) + (set! (-> v1-171 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-171 enemy-flags)))) + ) + (set! (-> v1-171 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-171 enemy-flags)))) + (set! (-> v1-171 nav callback-info) (-> v1-171 enemy-info-override callback-info)) + ) + 0 + ) + ) + ) + #f + (none) + ) + ) + +(defmethod metalhead-grunt-method-209 metalhead-grunt ((obj metalhead-grunt) (arg0 float)) + (local-vars (v1-5 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (let ((gp-0 (get-enemy-target obj))) + (when gp-0 + (let ((v1-3 (get-trans gp-0 0)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (vector-! s4-0 v1-3 (-> obj root-override2 trans)) + (.lvf vf1 (&-> s4-0 quad)) + (.add.w.vf vf2 vf0 vf0 :mask #b1) + (.mul.vf vf1 vf1 vf1) + (.mul.x.vf acc vf2 vf1 :mask #b1) + (.add.mul.y.vf acc vf2 vf1 acc :mask #b1) + (.add.mul.z.vf vf1 vf2 vf1 acc :mask #b1) + (.mov v1-5 vf1) + (let* ((f30-0 v1-5) + (f0-0 arg0) + (f28-0 (* f0-0 f0-0)) + (f0-2 12288.0) + ) + (when (or (>= (* f0-2 f0-2) f30-0) (>= f28-0 f30-0)) + (let ((f26-0 (quaternion-y-angle (-> obj root-override2 quat))) + (f0-7 (atan (-> s4-0 x) (-> s4-0 z))) + (f1-0 1228.8) + ) + (cond + ((and (< (* f1-0 f1-0) f30-0) (>= f28-0 f30-0) (>= 8192.0 (fabs (deg- f26-0 f0-7)))) + (go (method-of-object obj attack)) + ) + ((let ((f0-10 12288.0)) + (< f30-0 (* f0-10 f0-10)) + ) + (go (method-of-object obj spin-attack)) + ) + ) + ) + ) + ) + ) + ) + gp-0 + ) + ) + ) + +(defstate hostile (metalhead-grunt) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type citizen-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (metalhead-grunt-method-209 self 13312.0)) + (gp-0 (-> self clock frame-counter)) + ) + (when (and (>= gp-0 (-> self next-warn-time)) + (zero? (logand (-> self draw status) (draw-control-status on-screen))) + ) + (when (and a0-1 + (let ((f0-0 65536.0)) + (>= (* f0-0 f0-0) (vector-vector-xz-distance-squared (get-trans a0-1 0) (-> self root-override2 trans))) + ) + ) + (sound-play "grunt-warn") + (set! (-> self next-warn-time) (+ gp-0 (get-rand-int-range self 300 360))) + ) + ) + ) + (none) + ) + :code (behavior () + (let ((v1-2 (ja-group))) + (when (and v1-2 (or (= v1-2 (-> self draw art-group data 14)) + (= v1-2 (-> self draw art-group data 15)) + (= v1-2 (-> self draw art-group data 16)) + ) + ) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) (-> self charge-anim travel-speed)) + ) + 0 + (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))) + (let ((v1-19 (-> self use-charge-anim-index))) + (cond + ((>= v1-19 0) + (set! (-> self charge-anim) (-> *grunt-global-info* charge-anim v1-19)) + (set! (-> self use-charge-anim-index) -1) + ) + (else + (set! (-> self charge-anim) (-> *grunt-global-info* charge-anim (get-rand-int self 3))) + ) + ) + ) + (until #f + (metalhead-grunt-method-209 self 22528.0) + (let ((gp-0 (-> self draw art-group data (-> self charge-anim anim-index)))) + (let ((v1-37 (ja-group))) + (when (not (and v1-37 (= v1-37 gp-0))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((v1-41 (-> self nav))) + (set! (-> v1-41 target-speed) (-> self charge-anim travel-speed)) + ) + 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)) + ) + ) + ) + #f + (none) + ) + :post (the-as (function none :behavior metalhead-grunt) nav-enemy-chase-post) + ) + +(defstate attack (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :enter (behavior () + (let ((v1-1 (-> self nav state))) + (set! (-> v1-1 speed) (-> self enemy-info-override run-travel-speed)) + ) + 0 + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (let* ((v1-10 *game-info*) + (a0-5 (+ (-> v1-10 attack-id) 1)) + ) + (set! (-> v1-10 attack-id) a0-5) + (set! (-> self attack-id) a0-5) + ) + (let* ((a0-6 self) + (t9-1 (method-of-object a0-6 metalhead-grunt-method-211)) + ) + #t + (t9-1 a0-6) + ) + (none) + ) + :exit (behavior () + (let* ((a0-0 self) + (t9-0 (method-of-object a0-0 metalhead-grunt-method-211)) + ) + (t9-0 a0-0) + ) + (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) + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "grunt-hit") + ) + (none) + ) + :code (behavior () + (set! (-> self attack-anim) (-> *grunt-global-info* attack-anim (get-rand-int self 2))) + (let ((v1-5 (-> self nav))) + (set! (-> v1-5 target-speed) (-> self attack-anim travel-speed)) + ) + 0 + (let ((v1-7 (-> self nav))) + (set! (-> v1-7 turning-acceleration) 49152.0) + ) + 0 + (let ((gp-0 (-> self draw art-group data (-> self attack-anim anim-index))) + (f30-0 (get-rand-float-range self 0.9 1.1)) + ) + (let ((v1-17 (ja-group))) + (if (not (and v1-17 (= v1-17 gp-0))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (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)) + ) + ) + (let ((v1-36 (-> self nav))) + (set! (-> v1-36 target-speed) (-> self charge-anim travel-speed)) + ) + 0 + (let ((v1-38 (-> self nav))) + (set! (-> v1-38 turning-acceleration) (-> self enemy-info-override run-turning-acceleration)) + ) + 0 + (let ((gp-1 (-> self draw art-group data (-> self charge-anim anim-index)))) + (ja-channel-push! 1 (seconds 0.1)) + (set! (-> self skel root-channel 0 frame-group) (the-as art-joint-anim gp-1)) + ) + (ja :num-func num-func-identity :frame-num (ja-aframe 3.0 0)) + (let ((gp-3 (-> self focus aware))) + (if (or (not (get-enemy-target self)) (!= gp-3 3)) + (go-stare self) + ) + ) + (let ((v1-57 0)) + (let ((a0-22 (the-as object (-> *grunt-global-info* charge-anim))) + (a1-7 (-> self charge-anim)) + ) + (dotimes (a2-3 3) + (when (= a0-22 a1-7) + (set! v1-57 a2-3) + (goto cfg-21) + ) + (set! a0-22 (&+ (the-as grunt-anim-info a0-22) 8)) + ) + ) + (label cfg-21) + (set! (-> self use-charge-anim-index) v1-57) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior metalhead-grunt) nav-enemy-chase-post) + ) + +(defstate spin-attack (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + 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 ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-stare self) + ) + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable gp-0) 0) quad)) + ) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-21 *game-info*) + (a0-13 (+ (-> v1-21 attack-id) 1)) + ) + (set! (-> v1-21 attack-id) a0-13) + (set! (-> self attack-id) a0-13) + ) + (let* ((a0-14 self) + (t9-3 (method-of-object a0-14 metalhead-grunt-method-211)) + ) + #t + (t9-3 a0-14) + ) + (none) + ) + :exit (behavior () + (let* ((a0-0 self) + (t9-0 (method-of-object a0-0 metalhead-grunt-method-211)) + ) + (t9-0 a0-0) + ) + (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 "grunt-hit") + ) + (none) + ) + :code (behavior () + (set! (-> self attack-anim) (-> *grunt-global-info* attack-anim (get-rand-int self 2))) + (let ((gp-0 (-> self draw art-group data (-> self attack-anim anim-index))) + (f30-0 (get-rand-float-range self 0.9 1.1)) + ) + (let ((v1-13 (ja-group))) + (if (not (and v1-13 (= v1-13 gp-0))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (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) + (let ((a0-9 (handle->process (-> self focus handle)))) + (if a0-9 + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable a0-9) 0) quad)) + ) + ) + (seek-to-point-toward-point! (-> self root-override2) (-> self focus-pos) 546133.3 (seconds 0.1)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((gp-3 (-> self focus aware))) + (if (or (not (get-enemy-target self)) (!= gp-3 3)) + (go-stare self) + ) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior metalhead-grunt) nav-enemy-simple-post) + ) + +(defstate stop-chase (metalhead-grunt) + :virtual #t + :code (behavior () + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (set! (-> self patrol-anim) (-> *grunt-global-info* patrol-anim (get-rand-int self 4))) + (let ((v1-14 (-> self nav))) + (set! (-> v1-14 target-speed) (-> self patrol-anim travel-speed)) + ) + 0 + (let ((f30-0 (get-rand-float-range self 0.9 1.1)) + (gp-0 (-> self draw art-group data (-> self patrol-anim anim-index))) + ) + (let ((v1-24 (ja-group))) + (if (not (and v1-24 (= v1-24 gp-0))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (until #f + (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)) + ) + ) + ) + #f + (none) + ) + ) + +(defmethod enemy-method-77 metalhead-grunt ((obj metalhead-grunt) (arg0 (pointer float))) + (local-vars (v1-72 int) (a2-3 int) (a2-5 int)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (let ((v1-2 (ash 1 (-> *grunt-global-info* prev-yellow-hit-anim-index))) + (a0-7 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and a0-7 (or (= a0-7 (-> obj draw art-group data 16)) + (= a0-7 (-> obj draw art-group data 38)) + (= a0-7 (-> obj draw art-group data 39)) + (= a0-7 (-> obj draw art-group data 40)) + ) + ) + (set! a2-3 (logior v1-2 4)) + (set! a2-3 (logior v1-2 8)) + ) + ) + (let ((s4-0 (enemy-method-120 obj 4 a2-3))) + (set! (-> *grunt-global-info* prev-yellow-hit-anim-index) s4-0) + (set! (-> obj yellow-hit-anim) (-> *grunt-global-info* yellow-hit-anim s4-0)) + (let ((v1-11 (get-rand-int obj 3))) + (if (= s4-0 3) + (set! v1-11 2) + ) + (set! (-> obj use-charge-anim-index) v1-11) + ) + ) + (let ((s4-1 (-> obj draw art-group data (-> obj yellow-hit-anim anim-index)))) + (ja-channel-push! 1 0) + (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 + ) + (((knocked-type knocked-type-6)) + (let* ((v1-24 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + (s4-2 (and v1-24 (or (= v1-24 (-> obj draw art-group data 16)) + (= v1-24 (-> obj draw art-group data 38)) + (= v1-24 (-> obj draw art-group data 39)) + (= v1-24 (-> obj draw art-group data 40)) + ) + ) + ) + ) + (if (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (logior! (-> obj grunt-flags) 2) + ) + (cond + ((and (not s4-2) (logtest? (-> obj grunt-flags) 2)) + (set! s4-2 #t) + (ja-channel-push! 1 (seconds 0.17)) + ) + (else + (let ((v1-36 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-36 (= v1-36 (-> obj draw art-group data 44))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + ) + ) + (let ((v1-42 (ash 1 (-> *grunt-global-info* prev-blue-hit-anim-index)))) + (if s4-2 + (set! a2-5 (logior v1-42 56)) + (set! a2-5 (logior v1-42 7)) + ) + ) + (let ((v1-46 (enemy-method-120 obj 6 a2-5))) + (set! (-> *grunt-global-info* prev-blue-hit-anim-index) v1-46) + (set! (-> obj blue-hit-anim) (-> *grunt-global-info* blue-hit-anim v1-46)) + ) + (let ((a2-6 0)) + (when (not (logtest? (-> obj grunt-flags) 2)) + (if s4-2 + (set! a2-6 (logior a2-6 3)) + (set! a2-6 (logior a2-6 4)) + ) + ) + (set! (-> obj use-charge-anim-index) (enemy-method-120 obj 3 a2-6)) + ) + ) + (let ((a1-26 (-> obj draw art-group data (-> obj blue-hit-anim anim-index))) + (a0-51 (-> obj skel root-channel 0)) + ) + (set! (-> a0-51 frame-group) (the-as art-joint-anim a1-26)) + (set! (-> a0-51 param 0) (the float (+ (-> (the-as art-joint-anim a1-26) frames num-frames) -1))) + (set! (-> a0-51 param 1) (-> arg0 0)) + (set! (-> a0-51 frame-num) 0.0) + (joint-control-channel-group! a0-51 (the-as art-joint-anim a1-26) num-func-seek!) + ) + #t + ) + (else + 0 + (cond + ((or (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (= (-> obj incoming knocked-type) (knocked-type knocked-type-3)) + ) + (set! v1-72 3) + ) + (else + (let ((s4-3 (ash 1 (-> *grunt-global-info* prev-knocked-anim-index)))) + (let ((s3-0 (-> obj root-override2))) + (if (>= 16384.0 (fabs (deg- (quaternion-y-angle (-> s3-0 quat)) (atan (-> s3-0 transv x) (-> s3-0 transv z))))) + (set! s4-3 (logior s4-3 4)) + ) + ) + (set! v1-72 (enemy-method-120 obj 3 s4-3)) + ) + ) + ) + (set! (-> *grunt-global-info* prev-knocked-anim-index) v1-72) + (set! (-> obj knocked-anim-index) v1-72) + (set! (-> obj knocked-anim) (-> *grunt-global-info* knocked-anim v1-72)) + (let ((s4-4 (-> obj draw art-group data (-> obj knocked-anim anim-index)))) + (ja-channel-push! 1 0) + (let ((a0-68 (-> obj skel root-channel 0))) + (set! (-> a0-68 frame-group) (the-as art-joint-anim s4-4)) + (set! (-> a0-68 param 0) (the float (+ (-> (the-as art-joint-anim s4-4) frames num-frames) -1))) + (set! (-> a0-68 param 1) (-> arg0 0)) + (set! (-> a0-68 frame-num) 0.0) + (joint-control-channel-group! a0-68 (the-as art-joint-anim s4-4) num-func-seek!) + ) + ) + #t + ) + ) + ) + +(defmethod enemy-method-78 metalhead-grunt ((obj metalhead-grunt) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (or (logtest? (-> obj grunt-flags) 2) (let ((v1-7 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (not (and v1-7 (or (= v1-7 (-> obj draw art-group data 16)) + (= v1-7 (-> obj draw art-group data 38)) + (= v1-7 (-> obj draw art-group data 39)) + (= v1-7 (-> obj draw art-group data 40)) + ) + ) + ) + ) + ) + (let ((s4-0 (-> obj draw art-group data 44))) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-16 (-> obj skel root-channel 0))) + (set! (-> a0-16 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-16 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-16 param 1) (-> arg0 0)) + (set! (-> a0-16 frame-num) 0.0) + (joint-control-channel-group! a0-16 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + (set! (-> obj grunt-flags) (logand -3 (-> obj grunt-flags))) + #t + ) + ) + ((!= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) + (let ((a1-6 + (-> obj draw art-group data (-> *grunt-global-info* knocked-land-anim (-> obj knocked-anim-index) anim-index)) + ) + (a0-23 (-> obj skel root-channel 0)) + ) + (set! (-> a0-23 frame-group) (the-as art-joint-anim a1-6)) + (set! (-> a0-23 param 0) (the float (+ (-> (the-as art-joint-anim a1-6) frames num-frames) -1))) + (set! (-> a0-23 param 1) (-> arg0 0)) + (set! (-> a0-23 frame-num) 0.0) + (joint-control-channel-group! a0-23 (the-as art-joint-anim a1-6) num-func-seek!) + ) + #t + ) + ) + ) + +(defstate wait-for-focus (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :enter (-> (method-of-type nav-enemy idle) enter) + :trans (behavior () + (let ((s5-0 (handle->process (-> self focus handle)))) + (when s5-0 + (let ((gp-0 (get-trans (the-as process-focusable s5-0) 0))) + (when (and (or (not (logtest? (-> self enemy-flags) (enemy-flag enable-on-notice))) + (>= 163840.0 (vector-vector-distance (-> self root-override2 trans) gp-0)) + ) + (or (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user8))) + (and (not (logtest? (-> (the-as process-focusable s5-0) focus-status) (focus-status in-air))) + (>= 4096.0 (fabs (- (-> gp-0 y) (-> self root-override2 trans y)))) + ) + ) + ) + (cond + ((and (logtest? (-> self fact-info-override enemy-options) (enemy-option user9)) + (logtest? (-> self enemy-flags) (enemy-flag enable-on-notice)) + ) + (let ((s5-1 (new 'stack-no-clear 'vector))) + (vector-! s5-1 gp-0 (-> self root-override2 trans)) + (let ((f0-2 32768.0) + (v1-26 s5-1) + ) + (if (or (>= f0-2 (sqrtf (+ (* (-> v1-26 x) (-> v1-26 x)) (* (-> v1-26 z) (-> v1-26 z))))) + (>= 20024.889 (fabs (deg- (y-angle (-> self root-override2)) (atan (-> s5-1 x) (-> s5-1 z))))) + ) + (go-virtual notice) + ) + ) + ) + ) + (else + (go-virtual notice) + ) + ) + ) + ) + ) + ) + (none) + ) + :code (-> (method-of-type nav-enemy idle) code) + :post (-> (method-of-type nav-enemy idle) post) + ) + +(defmethod metalhead-grunt-method-211 metalhead-grunt ((obj metalhead-grunt)) + 0 + (none) + ) + +;; WARN: Return type mismatch citizen-enemy vs metalhead-grunt. +(defmethod relocate metalhead-grunt ((obj metalhead-grunt) (arg0 int)) + (if (nonzero? (-> obj intro-path)) + (&+! (-> obj intro-path) arg0) + ) + (the-as metalhead-grunt ((method-of-type citizen-enemy relocate) obj arg0)) + ) + +(defmethod init-enemy-collision! metalhead-grunt ((obj metalhead-grunt)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 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 civilian enemy obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid can-ride deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 6144.0 0.0 17408.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 hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid can-ride deadly 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-with) (collide-spec backgnd jak hit-by-others-list player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 0.0 4915.2) + ) + (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 civilian hit-by-others-list player-list)) + (set! (-> v1-17 prim-core action) (collide-action semi-solid)) + (set! (-> v1-17 transform-index) 4) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 4915.2) + ) + (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 civilian hit-by-others-list player-list)) + (set! (-> v1-19 prim-core action) (collide-action semi-solid)) + (set! (-> v1-19 transform-index) 18) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 2252.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 civilian hit-by-others-list 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 2048.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 civilian hit-by-others-list player-list)) + (set! (-> v1-23 prim-core action) (collide-action deadly)) + (set! (-> v1-23 transform-index) 12) + (set-vector! (-> v1-23 local-sphere) 0.0 0.0 0.0 2048.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 civilian hit-by-others-list player-list)) + (set! (-> v1-25 prim-core action) (collide-action semi-solid)) + (set! (-> v1-25 transform-index) 6) + (set-vector! (-> v1-25 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (set! (-> s5-0 nav-radius) 8192.0) + (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! (-> s5-0 event-priority) (the-as uint 8)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +(defmethod get-nav-info metalhead-grunt ((obj metalhead-grunt)) + *metalhead-grunt-nav-enemy-info* + ) + +(defmethod init-enemy! metalhead-grunt ((obj metalhead-grunt)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-grunt" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj (get-nav-info obj)) + (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) 11832.889 11832.889 0.0 1.0) + (set! (-> v1-6 ignore-angle) 30947.555) + ) + (let ((v1-8 (-> obj nav))) + (set! (-> v1-8 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (let ((s5-2 *grunt-global-info*)) + (set! (-> obj patrol-anim) (-> s5-2 patrol-anim (get-rand-int obj 4))) + (set! (-> obj charge-anim) (-> s5-2 charge-anim (get-rand-int obj 3))) + (set! (-> obj attack-anim) (-> s5-2 attack-anim (get-rand-int obj 2))) + ) + (set! (-> obj use-charge-anim-index) -1) + (if (zero? (get-rand-int obj 2)) + (logior! (-> obj grunt-flags) 1) + ) + (if (zero? (get-rand-int obj 2)) + (logior! (-> obj grunt-flags) 4) + ) + (set! (-> obj intro-path) (new 'process 'path-control obj 'intro 0.0 (the-as entity #f) #t)) + (add-connection + *part-engine* + obj + 6 + obj + 318 + (new 'static 'vector :x 1433.6 :y 2785.28 :z -1761.28 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 6 + obj + 318 + (new 'static 'vector :x -1433.6 :y 2785.28 :z -1761.28 :w 163840.0) + ) + (set! (-> obj water-anim) -1) + (set! (-> obj minimap) #f) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/city/common/metalhead-predator.gc b/goal_src/jak2/levels/city/common/metalhead-predator.gc index 4b81c851ae..abd69e9d61 100644 --- a/goal_src/jak2/levels/city/common/metalhead-predator.gc +++ b/goal_src/jak2/levels/city/common/metalhead-predator.gc @@ -5,41 +5,1198 @@ ;; name in dgo: metalhead-predator ;; dgos: CWI +;; DECOMP BEGINS (deftype metalhead-predator-shot (metalhead-shot) () + :heap-base #x170 :method-count-assert 40 - :size-assert #x1f0 ;; 496 + :size-assert #x1f0 :flag-assert #x28017001f0 ) -(deftype metalhead-predator (citizen-enemy) - ( - (los los-control :inline :offset-assert 992) - (want-stop symbol :offset-assert 1140) - (target-pos vector :inline :offset-assert 1152) - (curr-node int32 :offset-assert 1168) - (hide-pos vector :inline :offset-assert 1184) - (next-change int64 :offset-assert 1200) - (shoot-angle degrees :offset-assert 1208) - (miss-amount float :offset-assert 1212) - (ambient-sound-id uint32 :offset-assert 1216) - (shock-effect-time time-frame :offset-assert 1224) - (shock-effect-end int64 :offset-assert 1232) - (fade float :offset-assert 1240) - (dest-fade float :offset-assert 1244) + +;; WARN: Return type mismatch sound-id vs none. +(defmethod play-impact-sound metalhead-predator-shot ((obj metalhead-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-8 (static-sound-spec "pred-shot-loop" :volume 0.0 :mask (pitch reg0))) + ) + (set! (-> a0-8 volume) 1024) + (set! (-> a0-8 pitch-mod) (the int (* 1524.0 f0-0))) + (sound-play-by-spec a0-8 (-> obj sound-id) (-> obj root-override trans)) + ) + ) + ) + (none) ) + +(defmethod init-proj-collision! metalhead-predator-shot ((obj metalhead-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! metalhead-predator-shot ((obj metalhead-predator-shot)) + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" + (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) + (set! (-> obj attack-mode) '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-metalhead-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) + ) + +(define *metalhead-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 idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 5 + :notice-anim 5 + :hostile-anim -1 + :hit-anim 5 + :knocked-anim 12 + :knocked-land-anim 13 + :die-anim 11 + :die-falling-anim 11 + :victory-anim 5 + :jump-wind-up-anim 5 + :jump-in-air-anim 5 + :jump-land-anim 5 + :neck-joint 7 + :look-at-joint 8 + :bullseye-joint 6 + :sound-hit (static-sound-name "metalhead-preda") + :sound-die (static-sound-name "metalhead-preda") + :notice-distance-delta (meters 0.1) + :default-hit-points 5 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak civilian enemy vehicle-sphere hit-by-others-list player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :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 0.5) + :jump-height-factor 0.1 + :knocked-seek-ry-clamp 6371.5557 + :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 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 #t + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 6 + :turn-anim 5 + :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) + :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! (-> *metalhead-predator-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +(deftype metalhead-predator (citizen-enemy) + ((los los-control :inline :offset-assert 992) + (want-stop symbol :offset-assert 1140) + (target-pos vector :inline :offset-assert 1152) + (curr-node int32 :offset-assert 1168) + (hide-pos vector :inline :offset-assert 1184) + (next-change int64 :offset-assert 1200) + (shoot-angle degrees :offset-assert 1208) + (miss-amount float :offset-assert 1212) + (ambient-sound-id sound-id :offset-assert 1216) + (shock-effect-time time-frame :offset-assert 1224) + (shock-effect-end int64 :offset-assert 1232) + (fade float :offset-assert 1240) + (dest-fade float :offset-assert 1244) + ) + :heap-base #x460 :method-count-assert 209 - :size-assert #x4e0 ;; 1248 + :size-assert #x4e0 :flag-assert #xd1046004e0 (:methods (fire () _type_ :state 203) (close-attack () _type_ :state 204) - (metalhead-predator-method-205 () none 205) - (metalhead-predator-method-206 () none 206) - (metalhead-predator-method-207 () none 207) - (metalhead-predator-method-208 () none 208)) + (metalhead-predator-method-205 (_type_ symbol) none 205) + (metalhead-predator-method-206 (_type_ int float) none 206) + (metalhead-predator-method-207 (_type_ vector vector vector) symbol 207) + (metalhead-predator-method-208 (_type_) none 208) + ) ) -;; DECOMP BEGINS +(set! (-> *lightning-spec-id-table* 15) (new 'static 'lightning-spec + :name "lightning-metalhead-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.5 + :num-points 32 + :box-size 2048.0 + :merge-factor 0.5 + :merge-count 2 + :radius 2048.0 + :duration 30.0 + :sound (static-sound-spec "predator-zap") + ) + ) + +(defmethod metalhead-predator-method-208 metalhead-predator ((obj metalhead-predator)) + (with-pp + (cond + ((< (-> obj hit-points) 2) + (when (!= (-> obj dest-fade) 128.0) + (sound-play "pred-uncloak") + (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) (-> 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* 15) + lightning-probe-callback + (-> *part-id-table* 166) + 2048.0 + -1 + -1 + ) + ) + ) + 0 + (none) + ) + ) + +(defmethod track-target! metalhead-predator ((obj metalhead-predator)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (let ((t9-0 (method-of-type citizen-enemy track-target!))) + (t9-0 obj) + ) + (metalhead-predator-method-208 obj) + (set-dst-proc! (-> obj los) (-> obj focus handle)) + (los-control-method-9 (-> obj los) (the-as process-focusable #f) (the-as vector #f) 2048.0) + (none) + ) + +;; WARN: disable def twice: 21. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. +(defmethod general-event-handler metalhead-predator ((obj metalhead-predator) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (with-pp + (case arg2 + (('attack) + (set! (-> obj shock-effect-end) (the-as int (+ (-> pp clock frame-counter) (seconds 1)))) + ((method-of-type citizen-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + (('combo) + (and (not (and (-> obj next-state) (= (-> obj next-state name) 'inactive))) + (and (not (logtest? (enemy-flag multi-focus) (-> obj enemy-flags))) (nonzero? (-> obj hit-points))) + ) + ) + (else + ((method-of-type citizen-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + +(defmethod enemy-method-77 metalhead-predator ((obj metalhead-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 metalhead-predator ((obj metalhead-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 + ) + ) + ) + +(defmethod get-inv-mass metalhead-predator ((obj metalhead-predator)) + 0.5 + ) + +(defmethod metalhead-predator-method-207 metalhead-predator ((obj metalhead-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))) + (if (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 + ) + ) + #f + ) + ) + ) + ) + ) + ) + +(defmethod metalhead-predator-method-206 metalhead-predator ((obj metalhead-predator) (arg0 int) (arg1 float)) + (local-vars (sv-240 vector) (sv-256 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 ((s3-0 (handle->process (-> obj focus handle))) + (s2-0 (new 'stack-no-clear 'vector)) + ) + (when s3-0 + (seek! (-> obj miss-amount) (* 0.2 (vector-length (-> (the-as process-drawable s3-0) root transv))) 4096.0) + (set! (-> s2-0 quad) (-> (get-trans (the-as process-focusable s3-0) 3) quad)) + (set! sv-240 (new 'stack-no-clear 'vector)) + (let ((v1-25 (-> s5-0 pos)) + (a0-18 s2-0) + ) + (.lvf vf4 (&-> v1-25 quad)) + (.lvf vf5 (&-> a0-18 quad)) + ) + (.mov.vf vf6 vf0 :mask #b1000) + (.sub.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> sv-240 quad) vf6) + (let* ((f0-5 (vector-length sv-240)) + (f0-6 (* 0.0000018780048 f0-5)) + ) + (set! sv-256 (new 'stack-no-clear 'vector)) + (let ((s0-0 (new 'stack-no-clear 'vector)) + (s1-1 (new 'stack-no-clear 'vector)) + ) + (let ((a0-19 s2-0)) + (let ((v1-31 s2-0)) + (let ((a1-6 (-> (the-as process-focusable s3-0) root-override transv))) + (let ((a2-2 f0-6)) + (.mov vf7 a2-2) + ) + (.lvf vf5 (&-> a1-6 quad)) + ) + (.lvf vf4 (&-> v1-31 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-240 1.0) + (vector-flatten! sv-256 *up-vector* sv-240) + (vector-normalize! sv-256 1.0) + (vector-cross! s0-0 sv-240 sv-256) + (vector-normalize! s0-0 1.0) + (let ((a2-5 (quaternion-vector-angle! (new 'stack-no-clear 'quaternion) sv-240 (-> obj shoot-angle)))) + (vector-orient-by-quat! sv-256 sv-256 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-240 a2-6)) + ) + (vector-orient-by-quat! s0-0 s0-0 a2-7) + ) + (let ((a0-29 s1-1)) + (let ((v1-33 s2-0)) + (let ((a1-17 (-> obj miss-amount))) + (.mov vf7 a1-17) + ) + (.lvf vf5 (&-> sv-256 quad)) + (.lvf vf4 (&-> v1-33 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-34 s2-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-34 quad) vf6) + ) + ) + ) + (vector-! (-> s5-0 vel) s2-0 (-> s5-0 pos)) + (vector-normalize! (-> s5-0 vel) 409600.0) + (when (metalhead-predator-method-207 + obj + (-> s5-0 pos) + (vector+! (new 'stack-no-clear 'vector) (-> s5-0 pos) (-> s5-0 vel)) + (get-trans (the-as process-focusable s3-0) 3) + ) + (vector-normalize! (-> s5-0 vel) 532480.0) + (spawn-projectile metalhead-predator-shot s5-0 obj *default-dead-pool*) + ) + ) + ) + ) + 0 + (none) + ) + ) + +(defstate active (metalhead-predator) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type citizen-enemy active) enter))) + (if t9-0 + (t9-0) + ) + ) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type citizen-enemy active) trans))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + ) + +(defstate hostile (metalhead-predator) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type citizen-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 int (+ (-> 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 citizen-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((gp-0 (handle->process (-> self focus handle)))) + (if (and gp-0 (or (logtest? (-> (the-as process-focusable gp-0) focus-status) (focus-status inactive)) + (logtest? (-> (the-as process-focusable gp-0) focus-status) (focus-status disable)) + ) + ) + (set! gp-0 (the-as process #f)) + ) + (if (not gp-0) + (go-virtual active) + ) + (when (get-enemy-target self) + (when (and gp-0 (>= (- (-> self clock frame-counter) (-> self state-time)) (-> self reaction-time))) + (cond + ((< (vector-vector-xz-distance (get-trans (the-as process-focusable gp-0) 0) (-> self root-override2 trans)) + 16384.0 + ) + (go-virtual close-attack) + ) + ((check-los? (-> self los) 0) + (go-virtual fire) + ) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (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 6.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (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) + ) + ) + +(defstate fire (metalhead-predator) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-predator) + enemy-event-handler + ) + :enter (behavior () + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-2 *game-info*) + (a0-1 (+ (-> v1-2 attack-id) 1)) + ) + (set! (-> v1-2 attack-id) a0-1) + (set! (-> self attack-id) a0-1) + ) + (traffic-danger-init! self) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (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 () + (let ((v1-2 (handle->process (-> self focus handle)))) + (if (and v1-2 (or (logtest? (-> (the-as process-focusable v1-2) focus-status) (focus-status inactive)) + (logtest? (-> (the-as process-focusable v1-2) focus-status) (focus-status disable)) + ) + ) + (set! v1-2 (the-as process #f)) + ) + (if (not v1-2) + (go-virtual active) + ) + ) + (none) + ) + :code (behavior () + (label cfg-0) + 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! (-> self draw art-group data 10) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 10)) 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) + (metalhead-predator-method-206 self 12 1.0) + ) + (when (and (< 11.0 (ja-frame-num 0)) (= gp-0 1)) + (set! gp-0 2) + (metalhead-predator-method-206 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!)) + (b! (not #f) cfg-0 :delay (empty-form)) + (label cfg-26) + (go-hostile self) + (none) + ) + :post (the-as (function none :behavior metalhead-predator) enemy-simple-post) + ) + +(defstate close-attack (metalhead-predator) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-predator) + enemy-event-handler + ) + :enter (behavior () + (traffic-danger-init! self) + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (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) 4096.0) + ) + 0 + (none) + ) + :exit (behavior () + (metalhead-predator-method-205 self #f) + (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 () + (ja-channel-push! 1 (seconds 0.2)) + (let ((gp-0 #f)) + (ja-no-eval :group! (-> self draw art-group data 8) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 8)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (when (and (< 4.0 (ja-frame-num 0)) (not gp-0)) + (metalhead-predator-method-205 self #t) + (set! gp-0 #t) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (let ((v1-32 (-> self nav state))) + (set! (-> v1-32 speed) 0.0) + ) + 0 + (ja-no-eval :group! (-> self draw art-group data 9) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 9)) 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-hostile self) + (none) + ) + :post (the-as (function none :behavior metalhead-predator) nav-enemy-chase-post) + ) + +(defmethod metalhead-predator-method-205 metalhead-predator ((obj metalhead-predator) (arg0 symbol)) + (let ((v1-1 (-> obj root-override2 root-prim))) + (dotimes (a0-1 (the-as int (+ (-> v1-1 specific 0) -2))) + (let ((a2-1 (-> (the-as collide-shape-prim-group v1-1) child (+ a0-1 2)))) + (if arg0 + (logior! (-> a2-1 prim-core action) (collide-action deadly)) + (logclear! (-> a2-1 prim-core action) (collide-action deadly)) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod init-enemy-collision! metalhead-predator ((obj metalhead-predator)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 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 civilian enemy 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 backgnd jak civilian 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 backgnd jak civilian hit-by-others-list player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 9216.0 0.0 5120.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 civilian hit-by-others-list player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set! (-> v1-17 transform-index) 7) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 3072.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 civilian hit-by-others-list player-list)) + (set! (-> v1-19 transform-index) 16) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 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 jak civilian hit-by-others-list player-list)) + (set! (-> v1-21 transform-index) 12) + (set-vector! (-> v1-21 local-sphere) 0.0 0.0 0.0 3276.8) + ) + (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! (-> s5-0 event-priority) (the-as uint 8)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch process-drawable vs metalhead-predator. +(defmethod relocate metalhead-predator ((obj metalhead-predator) (arg0 int)) + (the-as + metalhead-predator + ((the-as (function process-drawable int process-drawable) (find-parent-method metalhead-predator 7)) obj arg0) + ) + ) + +(defmethod init-enemy! metalhead-predator ((obj metalhead-predator)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-metalhead-predator" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *metalhead-predator-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 speed-scale) 1.0) + ) + 0 + (set! (-> obj draw lod-set lod 0 dist) 491520.0) + (set! (-> obj draw lod-set lod 1 dist) 573440.0) + (set! (-> obj anim-shuffle) 6) + (set! (-> obj anim-walk) 6) + (set! (-> obj speed-walk) 12288.0) + (set! (-> obj dist-walk-anim) 16179.2) + (set! (-> obj dist-run-anim) 26214.4) + (set! (-> obj anim-run) 7) + (set! (-> obj speed-run) 49152.0) + (set! (-> obj water-anim) -1) + (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 obstacle)) + (set! (-> obj minimap) #f) + 0 + (none) + ) + +(defmethod citizen-init! metalhead-predator ((obj metalhead-predator)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type citizen-enemy citizen-init!))) + (t9-0 obj) + ) + (setup-masks (-> obj draw) 8 0) + (setup-masks (-> obj draw) 0 4) + (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) 0) + (set! (-> obj miss-amount) 16384.0) + (set-vector! (-> obj draw color-mult) 1.0 1.0 1.0 1.0) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/city/common/traffic-engine-h.gc b/goal_src/jak2/levels/city/common/traffic-engine-h.gc index aa45c4959f..2ceb8aba0a 100644 --- a/goal_src/jak2/levels/city/common/traffic-engine-h.gc +++ b/goal_src/jak2/levels/city/common/traffic-engine-h.gc @@ -458,7 +458,7 @@ (new-suppression-box (_type_ traffic-suppression-params) none 46) (remove-suppression-box (_type_ traffic-suppression-params) none 47) (update-suppression-box (_type_ traffic-suppression-params) none 48) - (traffic-engine-method-49 (_type_ object int traffic-target-status) traffic-target-status 49) + (traffic-engine-method-49 (_type_ vector int traffic-target-status) traffic-target-status 49) (find-closest-to-with-collide-lists (_type_ process-drawable collide-spec) process-focusable 50) (for-all-active-processes (_type_ (function process-focusable traffic-object-type-info none)) none 51) (send-alert-events (_type_) none 52) diff --git a/goal_src/jak2/levels/city/common/traffic-engine.gc b/goal_src/jak2/levels/city/common/traffic-engine.gc index e2583ce7b3..b4765562f1 100644 --- a/goal_src/jak2/levels/city/common/traffic-engine.gc +++ b/goal_src/jak2/levels/city/common/traffic-engine.gc @@ -644,7 +644,7 @@ Process is recycled and moved to reserved, if it deactivates." (let ((gp-0 (-> arg0 object-type))) (set! (-> arg0 proc) #f) (when (> (-> obj traffic object-type-info-array gp-0 inactive-count) 0) - (set! sv-16 (get-from-inactive-by-handle obj gp-0 (the-as handle (-> arg0 handle)))) + (set! sv-16 (get-from-inactive-by-handle obj gp-0 (-> arg0 handle))) (let ((s3-0 (handle->process sv-16))) (when s3-0 (cond @@ -1292,7 +1292,7 @@ Process is recycled and moved to reserved, if it deactivates." (let ((s5-0 *target*)) (when s5-0 (let ((v1-1 (-> obj danger-sphere-array))) - (set! (-> v1-1 0 handle) (the-as uint (process->handle s5-0))) + (set! (-> v1-1 0 handle) (process->handle s5-0)) (let ((a0-4 (-> s5-0 focus-status)) (f0-0 0.0) (f1-0 0.0) @@ -2139,31 +2139,35 @@ Process is recycled and moved to reserved, if it deactivates." ) ) -(defmethod traffic-engine-method-49 traffic-engine ((obj traffic-engine) (arg0 object) (arg1 int) (arg2 traffic-target-status)) - (local-vars (sv-192 (pointer crimson-guard)) (sv-196 (pointer float)) (sv-200 int) (sv-208 int) (sv-216 float)) +(defmethod traffic-engine-method-49 traffic-engine ((obj traffic-engine) (los vector) (arg2 int) (target-status traffic-target-status)) + (local-vars + (guards (pointer crimson-guard)) + (guard-dists (pointer float)) + (guard-idx int) + (sv-208 int) + (sv-216 float) + ) (with-pp - (logclear! (-> arg2 flags) (traffic-target-flag visible-now updated)) + (logclear! (-> target-status flags) (traffic-target-flag visible-now updated)) (cond - ((= (-> obj sync-mask-16) (ash 1 (logand arg1 15))) - (logior! (-> arg2 flags) (traffic-target-flag updated)) - (let ((s3-0 (handle->process (-> arg2 handle))) - (s5-0 (new 'stack-no-clear 'vector)) + ((= (-> obj sync-mask-16) (ash 1 (logand arg2 15))) + (logior! (-> target-status flags) (traffic-target-flag updated)) + (let ((target-proc (handle->process (-> target-status handle))) + (target-pos (new 'stack-no-clear 'vector)) ) - (when s3-0 - (set! (-> s5-0 quad) (-> (get-trans (the-as process-focusable s3-0) 3) quad)) + (when target-proc + (set! (-> target-pos quad) (-> (get-trans (the-as process-focusable target-proc) 3) quad)) (cond - ((= (-> (the-as process-focusable s3-0) type) target) + ((= (-> (the-as process-focusable target-proc) type) target) (let ((s1-1 (-> obj alert-state target-status-array))) (logclear! (-> s1-1 0 flags) (traffic-target-flag visible-now updated)) (logior! (-> s1-1 0 flags) (traffic-target-flag updated)) (cond - ((or (logtest? (-> s1-1 0 flags) (traffic-target-flag force-visible)) - (traffic-los-clear? (the-as vector arg0) s5-0) - ) + ((or (logtest? (-> s1-1 0 flags) (traffic-target-flag force-visible)) (traffic-los-clear? los target-pos)) (logior! (-> s1-1 0 flags) (traffic-target-flag visible-now visible-recently visible-ever)) (set! (-> s1-1 0 last-seen-time) (-> pp clock frame-counter)) - (set! (-> s1-1 0 position quad) (-> s5-0 quad)) - (set! (-> s1-1 0 velocity quad) (-> (get-transv (the-as process-focusable s3-0)) quad)) + (set! (-> s1-1 0 position quad) (-> target-pos quad)) + (set! (-> s1-1 0 velocity quad) (-> (get-transv (the-as process-focusable target-proc)) quad)) ) (else (if (>= (- (-> pp clock frame-counter) (-> s1-1 0 last-seen-time)) (seconds 2)) @@ -2171,36 +2175,38 @@ Process is recycled and moved to reserved, if it deactivates." ) ) ) - (mem-copy! (the-as pointer arg2) (the-as pointer s1-1) 80) + (mem-copy! (the-as pointer target-status) (the-as pointer s1-1) 80) ) 0 ) (else - (logior! (-> arg2 flags) (traffic-target-flag visible-now visible-recently visible-ever)) - (set! (-> arg2 last-seen-time) (-> pp clock frame-counter)) - (set! (-> arg2 position quad) (-> s5-0 quad)) - (set! (-> arg2 velocity quad) (-> (get-transv (the-as process-focusable s3-0)) quad)) + (logior! (-> target-status flags) (traffic-target-flag visible-now visible-recently visible-ever)) + (set! (-> target-status last-seen-time) (-> pp clock frame-counter)) + (set! (-> target-status position quad) (-> target-pos quad)) + (set! (-> target-status velocity quad) (-> (get-transv (the-as process-focusable target-proc)) quad)) ) ) - (set! (-> s5-0 quad) (-> arg2 position quad)) - (when (not (update-guard-status-spots s5-0)) + (set! (-> target-pos quad) (-> target-status position quad)) + (when (not (update-guard-status-spots target-pos)) ) - (when (update-guard-status-spots s5-0) - (set! sv-192 (new 'stack-no-clear 'array 'crimson-guard 16)) - (set! sv-196 (new 'stack-no-clear 'array 'float 16)) - (set! sv-200 0) - (dotimes (s3-1 (the-as int (-> obj vehicle-tracker-array active-object-count))) - (case (-> obj vehicle-tracker-array active-object-type-list s3-1) + (when (update-guard-status-spots target-pos) + (set! guards (new 'stack-no-clear 'array 'crimson-guard 16)) + (set! guard-dists (new 'stack-no-clear 'array 'float 16)) + (set! guard-idx 0) + (dotimes (guard-count (the-as int (-> obj vehicle-tracker-array active-object-count))) + (case (-> obj vehicle-tracker-array active-object-type-list guard-count) (((traffic-type crimson-guard-1)) - (let ((s2-3 (handle->process (-> obj vehicle-tracker-array active-object-list s3-1)))) - (when (and s2-3 - (not (logtest? (-> (the-as process-focusable s2-3) focus-status) (focus-status dead inactive))) - (= (-> (the-as crimson-guard s2-3) traffic-target-status handle) (-> arg2 handle)) + (let ((guard (handle->process (-> obj vehicle-tracker-array active-object-list guard-count)))) + (when (and guard + (not (logtest? (-> (the-as process-focusable guard) focus-status) (focus-status dead inactive))) + (= (-> (the-as crimson-guard guard) traffic-target-status handle) (-> target-status handle)) ) - (set! (-> sv-192 sv-200) (the-as crimson-guard s2-3)) - (set! (-> sv-196 sv-200) (vector-vector-distance (-> (the-as crimson-guard s2-3) root-override2 trans) s5-0)) - (set! sv-200 (+ sv-200 1)) - (set! (-> (the-as crimson-guard s2-3) move-index) -1) + (set! (-> guards guard-idx) (the-as crimson-guard guard)) + (set! (-> guard-dists guard-idx) + (vector-vector-distance (-> (the-as crimson-guard guard) root-override2 trans) target-pos) + ) + (set! guard-idx (+ guard-idx 1)) + (set! (-> (the-as crimson-guard guard) move-index) -1) ) ) ) @@ -2209,30 +2215,30 @@ Process is recycled and moved to reserved, if it deactivates." (let ((a0-35 #t)) (while a0-35 (set! a0-35 #f) - (dotimes (v1-77 (+ sv-200 -1)) - (when (< (-> sv-196 (+ v1-77 1)) (-> sv-196 v1-77)) - (let ((a0-38 (-> sv-192 v1-77)) - (f0-2 (-> sv-196 v1-77)) + (dotimes (v1-77 (+ guard-idx -1)) + (when (< (-> guard-dists (+ v1-77 1)) (-> guard-dists v1-77)) + (let ((a0-38 (-> guards v1-77)) + (f0-2 (-> guard-dists v1-77)) ) - (set! (-> sv-192 v1-77) (-> sv-192 (+ v1-77 1))) - (set! (-> sv-192 (+ v1-77 1)) a0-38) - (set! (-> sv-196 v1-77) (-> sv-196 (+ v1-77 1))) - (set! (-> sv-196 (+ v1-77 1)) f0-2) + (set! (-> guards v1-77) (-> guards (+ v1-77 1))) + (set! (-> guards (+ v1-77 1)) a0-38) + (set! (-> guard-dists v1-77) (-> guard-dists (+ v1-77 1))) + (set! (-> guard-dists (+ v1-77 1)) f0-2) ) (set! a0-35 #t) ) ) ) ) - (dotimes (s4-1 sv-200) - (let ((s3-2 (-> (the-as (array crimson-guard) sv-192) s4-1))) - (when (= (-> s3-2 move-index) -1) + (dotimes (s4-1 guard-idx) + (let ((crimson-guard (-> (the-as (pointer crimson-guard) guards) s4-1))) + (when (= (-> crimson-guard move-index) -1) (set! sv-208 -1) (set! sv-216 100000000000000000.0) ;; kinda hacky, was ps2 weird infinity. (dotimes (s2-4 (-> *guard-target-spots* length)) (when (= (-> *guard-status-spots* s2-4) 1) - (let* ((a0-53 (vector+! (new 'stack-no-clear 'vector) s5-0 (-> *guard-target-spots* s2-4))) - (f0-4 (vector-vector-distance a0-53 (-> s3-2 root-override2 trans))) + (let* ((a0-53 (vector+! (new 'stack-no-clear 'vector) target-pos (-> *guard-target-spots* s2-4))) + (f0-4 (vector-vector-distance a0-53 (-> crimson-guard root-override2 trans))) ) (when (or (= sv-208 -1) (< f0-4 sv-216)) (set! sv-208 s2-4) @@ -2244,10 +2250,10 @@ Process is recycled and moved to reserved, if it deactivates." (cond ((!= sv-208 -1) (set! (-> *guard-status-spots* sv-208) 0) - (vector+! (-> s3-2 move-position) s5-0 (-> *guard-target-spots* sv-208)) + (vector+! (-> crimson-guard move-position) target-pos (-> *guard-target-spots* sv-208)) ) (else - (set! (-> s3-2 move-position quad) (-> s5-0 quad)) + (set! (-> crimson-guard move-position quad) (-> target-pos quad)) ) ) ) @@ -2258,24 +2264,24 @@ Process is recycled and moved to reserved, if it deactivates." ) ) (else - (let ((s5-1 (handle->process (-> arg2 handle))) + (let ((s5-1 (handle->process (-> target-status handle))) (s3-3 (new 'stack-no-clear 'vector)) ) (when s5-1 (set! (-> s3-3 quad) (-> (get-trans (the-as process-focusable s5-1) 3) quad)) (cond ((= (-> s5-1 type) target) - (mem-copy! (the-as pointer arg2) (the-as pointer (-> obj alert-state target-status-array)) 80) + (mem-copy! (the-as pointer target-status) (the-as pointer (-> obj alert-state target-status-array)) 80) ) (else ) ) ) ) - (logclear! (-> arg2 flags) (traffic-target-flag updated)) + (logclear! (-> target-status flags) (traffic-target-flag updated)) ) ) - arg2 + target-status ) ) diff --git a/goal_src/jak2/levels/city/common/traffic-manager.gc b/goal_src/jak2/levels/city/common/traffic-manager.gc index 74358f7b6c..a298d9702d 100644 --- a/goal_src/jak2/levels/city/common/traffic-manager.gc +++ b/goal_src/jak2/levels/city/common/traffic-manager.gc @@ -186,7 +186,7 @@ (+! s4-1 1) (b! #t cfg-28 :delay (nop!)) (label cfg-27) - (format 0 "traffic-manager: unable to spawn~%") + (format #t "traffic-manager: unable to spawn~%") (b! #t cfg-41 :delay (nop!)) (label cfg-28) (b! #t cfg-33 :delay (nop!)) @@ -237,10 +237,6 @@ ;; WARN: Return type mismatch process vs process-drawable. (defun citizen-spawn ((arg0 process) (arg1 type) (arg2 traffic-object-spawn-params)) - ;; added check - (when (zero? citizen-init-by-other) - (return (the process-drawable #f)) - ) (let ((gp-0 (the-as process #f))) (let* ((s3-0 (get-process *default-dead-pool* arg1 #x4000)) (v1-1 (when s3-0 @@ -423,7 +419,7 @@ (set! (-> s5-1 nav-mesh) #f) (set! (-> s5-1 nav-branch) #f) (set! (-> s5-1 proc) #f) - (set! (-> s5-1 handle) (the-as uint #f)) + (set! (-> s5-1 handle) (the-as handle #f)) (set! (-> s5-1 user-data) (the-as uint 0)) (set! (-> s5-1 flags) (the-as uint 2)) (set! (-> s5-1 guard-type) (the-as uint 7)) diff --git a/goal_src/jak2/levels/city/common/transport.gc b/goal_src/jak2/levels/city/common/transport.gc index 208818d94c..d160cebd17 100644 --- a/goal_src/jak2/levels/city/common/transport.gc +++ b/goal_src/jak2/levels/city/common/transport.gc @@ -440,7 +440,7 @@ (set! (-> s5-0 nav-mesh) (-> obj nav-mesh)) (set! (-> s5-0 nav-branch) #f) (set! (-> s5-0 proc) #f) - (set! (-> s5-0 handle) (the-as uint (process->handle obj))) + (set! (-> s5-0 handle) (process->handle obj)) (set! (-> s5-0 user-data) (-> obj spawn-side)) (set! (-> s5-0 flags) (the-as uint 0)) (set! (-> s5-0 guard-type) (the-as uint 7)) diff --git a/goal_src/jak2/levels/city/common/vehicle-guard.gc b/goal_src/jak2/levels/city/common/vehicle-guard.gc index 5dc04d814e..9f08f42be0 100644 --- a/goal_src/jak2/levels/city/common/vehicle-guard.gc +++ b/goal_src/jak2/levels/city/common/vehicle-guard.gc @@ -814,7 +814,7 @@ (set! (-> a1-2 decay-rate) 0.0) (set! (-> a1-2 flags) (traffic-danger-flags tdf0)) (set! (-> a1-2 danger-type) (traffic-danger-type tdt6)) - (set! (-> a1-2 handle) (the-as uint #f)) + (set! (-> a1-2 handle) (the-as handle #f)) (add-danger (-> obj controller traffic) a1-2) ) ) @@ -1033,7 +1033,7 @@ ((9) (vehicle-method-128 obj) (set! (-> obj flags) (logior (rigid-body-object-flag persistent alert) (-> obj flags))) - (set! (-> obj pursuit-target) (the-as handle (-> arg0 handle))) + (set! (-> obj pursuit-target) (-> arg0 handle)) (go (method-of-object obj waiting-ambush)) ) (else diff --git a/goal_src/jak2/levels/city/common/vehicle-rider.gc b/goal_src/jak2/levels/city/common/vehicle-rider.gc index 072b016b05..9035a5e17a 100644 --- a/goal_src/jak2/levels/city/common/vehicle-rider.gc +++ b/goal_src/jak2/levels/city/common/vehicle-rider.gc @@ -154,7 +154,7 @@ ) (set! (-> gp-0 nav-branch) #f) (set! (-> gp-0 proc) #f) - (set! (-> gp-0 handle) (the-as uint (process->handle (-> self parent-override 0)))) + (set! (-> gp-0 handle) (process->handle (-> self parent-override 0))) (set! (-> gp-0 user-data) (-> self draw seg-mask)) (set! (-> gp-0 flags) (the-as uint 0)) (set! (-> gp-0 guard-type) (the-as uint 7)) diff --git a/goal_src/jak2/levels/city/misc/delivery/delivery-task.gc b/goal_src/jak2/levels/city/misc/delivery/delivery-task.gc index ac42e4ed1a..41363b927a 100644 --- a/goal_src/jak2/levels/city/misc/delivery/delivery-task.gc +++ b/goal_src/jak2/levels/city/misc/delivery/delivery-task.gc @@ -255,7 +255,7 @@ This commonly includes things such as: (set! (-> s5-0 nav-mesh) #f) (set! (-> s5-0 nav-branch) #f) (set! (-> s5-0 proc) #f) - (set! (-> s5-0 handle) (the-as uint (process->handle *target*))) + (set! (-> s5-0 handle) (process->handle *target*)) (set! (-> s5-0 user-data) (the-as uint 0)) (set! (-> s5-0 flags) (the-as uint 2)) (set! (-> s5-0 guard-type) (the-as uint 1)) @@ -327,7 +327,7 @@ This commonly includes things such as: (set! (-> s5-0 nav-mesh) #f) (set! (-> s5-0 nav-branch) #f) (set! (-> s5-0 proc) #f) - (set! (-> s5-0 handle) (the-as uint (process->handle *target*))) + (set! (-> s5-0 handle) (process->handle *target*)) (set! (-> s5-0 user-data) (the-as uint 0)) (set! (-> s5-0 flags) (the-as uint 2)) (set! (-> s5-0 guard-type) (the-as uint 1)) diff --git a/goal_src/jak2/levels/city/slums/kor/hal3-course.gc b/goal_src/jak2/levels/city/slums/kor/hal3-course.gc index 74069baf44..d197ff1dfc 100644 --- a/goal_src/jak2/levels/city/slums/kor/hal3-course.gc +++ b/goal_src/jak2/levels/city/slums/kor/hal3-course.gc @@ -7,3 +7,750 @@ ;; DECOMP BEGINS +(deftype hal3-course (bot-course) + ((transport handle :offset-assert 48) + ) + :method-count-assert 9 + :size-assert #x38 + :flag-assert #x900000038 + ) + + +(deftype hal-help-kid (hal) + ((nav-mesh nav-mesh :offset-assert 1024) + (alley-bbox bounding-box :inline :offset-assert 1040) + (suppress traffic-suppression-params 2 :inline :offset-assert 1072) + ) + :heap-base #x410 + :method-count-assert 229 + :size-assert #x490 + :flag-assert #xe504100490 + (:methods + (hal-help-kid-method-227 (_type_) none 227) + (hal-help-kid-method-228 (_type_ vector) none 228) + ) + ) + + +(defmethod init! hal-help-kid ((obj hal-help-kid)) + "Set defaults for various fields." + (let ((t9-0 (method-of-type hal init!))) + (t9-0 obj) + ) + (let ((v1-1 (-> obj suppress))) + (set! (-> v1-1 0 duration) (the-as uint 300)) + (set! (-> v1-1 0 id) -1) + (let ((a0-4 (-> v1-1 0))) + (set! (-> a0-4 bbox min x) 2170880.0) + (set! (-> a0-4 bbox min y) 20480.0) + (set! (-> a0-4 bbox min z) -233472.0) + (set! (-> a0-4 bbox min w) 1.0) + ) + (set-vector! (-> v1-1 0 bbox max) 2785280.0 40960.0 20480.0 1.0) + ) + (let ((v1-3 (-> obj suppress 1)) + (a1-4 (-> obj alley-bbox)) + ) + (set-vector! (-> a1-4 min) 2531328.0 20480.0 -675840.0 1.0) + (set-vector! (-> a1-4 max) 2785280.0 40960.0 -233472.0 1.0) + (set! (-> v1-3 duration) (the-as uint 300)) + (set! (-> v1-3 id) -1) + (mem-copy! (the-as pointer (-> v1-3 bbox)) (the-as pointer a1-4) 32) + ) + (set! (-> obj channel) (the-as uint 30)) + (none) + ) + +(defmethod hal-help-kid-method-228 hal-help-kid ((obj hal-help-kid) (arg0 vector)) + (let ((v1-0 (new 'stack-no-clear 'traffic-danger-info))) + (set! (-> v1-0 sphere quad) (-> arg0 quad)) + (set! (-> v1-0 sphere r) 32768.0) + (set! (-> v1-0 velocity quad) (the-as uint128 0)) + (set! (-> v1-0 notify-radius) 122880.0) + (set! (-> v1-0 danger-level) 0.4) + (set! (-> v1-0 decay-rate) 0.0) + (set! (-> v1-0 flags) (traffic-danger-flags tdf0)) + (set! (-> v1-0 danger-type) (traffic-danger-type tdt4)) + (add-danger (-> (the-as traffic-manager *traffic-manager*) traffic-engine) v1-0) + ) + (none) + ) + +(defmethod general-event-handler hal-help-kid ((obj hal-help-kid) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (local-vars (v0-0 object)) + (case arg2 + (('fail) + (set! v0-0 (logior (-> obj bot-task-bits) 1)) + (set! (-> obj bot-task-bits) (the-as uint v0-0)) + v0-0 + ) + (('request) + (case (-> arg3 param 0) + (('scene-player) + (set! v0-0 (logior (-> obj bot-task-bits) 8)) + (set! (-> obj bot-task-bits) (the-as uint v0-0)) + v0-0 + ) + (else + ((method-of-type hal general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + (else + ((method-of-type hal general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +(defmethod hal-help-kid-method-227 hal-help-kid ((obj hal-help-kid)) + (let ((s4-0 (-> obj suppress)) + (gp-0 (-> obj suppress 1)) + ) + ((method-of-type traffic-suppression-params create-or-update-suppression-box) + (the-as traffic-suppression-params s4-0) + ) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (s3-1 (-> obj alley-bbox)) + ) + (set! (-> s5-0 quad) (-> (target-pos 0) quad)) + (mem-copy! (the-as pointer (-> gp-0 bbox)) (the-as pointer s3-1) 32) + (if (or ((method-of-type bounding-box inside-xz?) (the-as bounding-box (-> s4-0 0)) s5-0) (inside-xz? s3-1 s5-0)) + (set! (-> gp-0 bbox min z) (fmax (fmin (-> s5-0 z) (-> gp-0 bbox min z)) (-> gp-0 bbox min z))) + ) + ) + (create-or-update-suppression-box gp-0) + ) + 0 + (none) + ) + +;; WARN: Return type mismatch nav-mesh vs none. +(defmethod init-enemy! hal-help-kid ((obj hal-help-kid)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (let ((t9-0 (method-of-type hal init-enemy!))) + (t9-0 obj) + ) + (set! (-> obj nav-mesh) (nav-mesh-from-res-tag (-> obj entity) 'nav-mesh-actor 0)) + (none) + ) + +(define *hal3-course* + (new 'static 'hal3-course + :course-id #x6 + :spot-count #x4 + :default-check-too-far #f + :waypoints (new 'static 'boxed-array :type bot-waypoint + (new 'static 'bot-waypoint + :waypoint-id 1 + :skip-to -1 + :on-set (lambda ((arg0 hal-help-kid)) + (process-entity-status! arg0 (entity-perm-status no-kill) #t) + (clear-speech-flags! arg0) + (let ((v1-4 (-> arg0 actor-group 0 data 3 actor))) + (if v1-4 + (logior! (-> v1-4 extra perm status) (entity-perm-status bit-9)) + ) + ) + (let ((v1-7 (get-task-by-type (-> arg0 ai-ctrl) halt-wait-spot arg0))) + (set! (-> v1-7 bytes 5) (the-as uint 1)) + (set! (-> v1-7 bytes 6) (the-as uint 0)) + (set! (-> v1-7 bytes 4) (the-as uint 0)) + (set! (-> (the-as halt-wait-spot v1-7) check-done) + (the-as + (function halt-wait-spot hal symbol) + (lambda ((arg0 object) (arg1 hal-help-kid)) + (let* ((v1-3 (-> arg1 actor-group 0 data 1 actor)) + (s4-0 (if v1-3 + (-> v1-3 extra process) + ) + ) + (v1-8 (-> arg1 actor-group 0 data 2 actor)) + (s5-0 (if v1-8 + (-> v1-8 extra process) + ) + ) + (s3-0 *traffic-manager*) + ) + (cond + ((not (logtest? (-> arg1 waypoint-bits) 1)) + ;; (set! s3-0 (and s4-0 (and s5-0 s3-0))) + (when (and s4-0 (and s5-0 s3-0)) + (let* ((v1-15 (-> *game-info* sub-task-list 4)) + (v1-18 (handle->process (if (-> v1-15 info) + (-> v1-15 info manager) + (the-as handle #f) + ) + ) + ) + ) + (when v1-18 + (set! (-> (the-as task-manager v1-18) slave 0) (process->handle arg1)) + (logior! (-> arg1 waypoint-bits) 1) + (set! (-> arg1 slave-handle 0) (process->handle s4-0)) + (set! (-> arg1 slave-handle 1) (process->handle s5-0)) + ) + ) + ) + #f + ) + ((not (logtest? (-> arg1 waypoint-bits) 2)) + (logior! (-> arg1 waypoint-bits) 2) + (hal-method-226 arg1) + (send-event s4-0 'request 'waypoint 2) + (send-event s5-0 'request 'waypoint 2) + #f + ) + ((not (logtest? (-> arg1 waypoint-bits) 4)) + (logior! (-> arg1 waypoint-bits) 4) + (send-event s3-0 'deactivate-by-type 6) + (send-event s3-0 'deactivate-by-type 18) + (send-event s3-0 'deactivate-by-type 19) + (send-event s3-0 'deactivate-by-type 20) + (send-event s3-0 'set-guard-target-level 0) + (send-event s3-0 'set-object-reserve-count 6 14) + #f + ) + (else + (let ((a0-34 s4-0)) + (when (and (and a0-34 (let ((s4-1 1)) + (< s4-1 (the-as int (send-event a0-34 'query 'waypoint))) + ) + ) + (let ((a0-36 s5-0)) + (and a0-36 (let ((s5-1 1)) + (< s5-1 (the-as int (send-event a0-36 'query 'waypoint))) + ) + ) + ) + ) + (ai-task-control-method-12 (-> arg1 ai-ctrl) arg1) + (go-to-waypoint! arg1 2 #f) + (ai-task-control-method-10 (-> arg1 ai-ctrl) arg1) + #t + ) + ) + ) + ) + ) + ) + ) + ) + ) + (none) + ) + :on-update #f + :on-skipping-here #f + :check-too-far #f + ) + (new 'static 'bot-waypoint + :waypoint-id 2 + :skip-to -1 + :on-set (lambda ((arg0 hal-help-kid)) + (let ((v1-1 (get-current-task-event (-> arg0 task)))) + (if (= (-> v1-1 action) (game-task-action say)) + (add-process + *gui-control* + arg0 + (gui-channel art-load) + (gui-action queue) + (the-as string (-> v1-1 scene)) + -99.0 + 0 + ) + ) + ) + (let ((v1-3 (get-task-by-type (-> arg0 ai-ctrl) halt-wait-spot arg0))) + (set! (-> v1-3 bytes 5) (the-as uint 1)) + (set! (-> v1-3 bytes 6) (the-as uint 0)) + (set! (-> v1-3 bytes 4) (the-as uint 0)) + (set! (-> (the-as halt-wait-spot v1-3) check-done) + (the-as + (function halt-wait-spot hal symbol) + (lambda ((arg0 object) (arg1 hal-help-kid)) + (when *target* + (let* ((s5-0 (target-pos 0)) + (s4-0 (-> arg1 root-override2 trans)) + (f30-0 (vector-vector-xz-distance s5-0 s4-0)) + (f28-0 (- (-> s5-0 z) (-> s4-0 z))) + (v1-4 (get-current-task-event (-> arg1 task))) + ) + (when (and (= (-> v1-4 action) (game-task-action say)) + (and (or (>= 40960.0 f30-0) (>= 30515.2 f28-0)) (scene-play arg1 (the-as string (-> v1-4 scene)) #f)) + ) + (ai-task-control-method-12 (-> arg1 ai-ctrl) arg1) + (go-to-waypoint! arg1 3 #f) + (ai-task-control-method-10 (-> arg1 ai-ctrl) arg1) + (return #t) + ) + ) + ) + #f + ) + ) + ) + ) + (none) + ) + :on-update #f + :on-skipping-here #f + :check-too-far #f + ) + (new 'static 'bot-waypoint + :waypoint-id 3 + :skip-to -1 + :on-set (lambda ((arg0 hal-help-kid)) + (let ((v1-1 (get-task-by-type (-> arg0 ai-ctrl) halt-wait-spot arg0))) + (set! (-> v1-1 bytes 5) (the-as uint 1)) + (set! (-> v1-1 bytes 6) (the-as uint 0)) + (set! (-> v1-1 bytes 4) (the-as uint 0)) + (set! (-> (the-as halt-wait-spot v1-1) check-done) + (the-as + (function halt-wait-spot hal symbol) + (lambda ((arg0 object) (arg1 hal-help-kid)) (when (scene-release? arg1) + (ai-task-control-method-12 (-> arg1 ai-ctrl) arg1) + (go-to-waypoint! arg1 4 #f) + (ai-task-control-method-10 (-> arg1 ai-ctrl) arg1) + #t + ) + ) + ) + ) + ) + (none) + ) + :on-update #f + :on-skipping-here #f + :check-too-far #f + ) + (new 'static 'bot-waypoint + :waypoint-id 4 + :skip-to -1 + :on-set (lambda ((arg0 hal-help-kid)) + (with-pp + (set-setting! 'sound-mode #f 0 1) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer pp)) + (set! (-> a1-1 num-params) 2) + (set! (-> a1-1 message) 'request) + (set! (-> a1-1 param 0) (the-as uint 'waypoint)) + (set! (-> a1-1 param 1) (the-as uint 6)) + (let ((t9-1 send-event-function) + (v1-10 (-> arg0 actor-group 0 data 1 actor)) + ) + (t9-1 + (if v1-10 + (-> v1-10 extra process) + ) + a1-1 + ) + ) + ) + (let ((s5-0 *traffic-manager*)) + (send-event s5-0 'set-guard-multi-focus #t) + (send-event s5-0 'set-disable-pursuit-control #t) + (send-event s5-0 'set-guard-force-visible #t) + (send-event s5-0 'set-max-alert-level 1) + (send-event s5-0 'set-alert-level 1) + (send-event s5-0 'set-alert-duration #xa4cb80) + (send-event s5-0 'set-guard-target-level 0) + ) + (dotimes (s5-1 3) + (let ((s4-0 (new 'stack 'traffic-object-spawn-params))) + (set! (-> s4-0 object-type) (traffic-type crimson-guard-1)) + (set! (-> s4-0 behavior) (the-as uint 3)) + (set! (-> s4-0 id) (the-as uint 0)) + (set! (-> s4-0 nav-mesh) (-> arg0 nav-mesh)) + (set! (-> s4-0 nav-branch) #f) + (set! (-> s4-0 proc) #f) + (set! (-> s4-0 handle) (the-as handle #f)) + (set! (-> s4-0 user-data) (the-as uint 0)) + (set! (-> s4-0 flags) (the-as uint 0)) + (set! (-> s4-0 guard-type) (the-as uint 7)) + (vector-reset! (-> s4-0 velocity)) + (set! (-> s4-0 position quad) (-> arg0 course spots (+ s5-1 1) center quad)) + (set! (-> s4-0 position w) 1.0) + (quaternion-vector-angle! + (-> s4-0 rotation) + *up-vector* + (* 182.04445 (* 0.00024414062 (-> arg0 course spots (+ s5-1 1) center w))) + ) + (send-event *traffic-manager* 'activate-object s4-0) + ) + ) + (add-process *gui-control* arg0 (gui-channel art-load) (gui-action queue) "city-help-kid-resolution" -99.0 0) + (let ((v1-70 (get-task-by-type (-> arg0 ai-ctrl) halt-wait-spot arg0))) + (set! (-> v1-70 bytes 5) (the-as uint 1)) + (set! (-> v1-70 bytes 6) (the-as uint 0)) + (set! (-> v1-70 bytes 4) (the-as uint 0)) + (set! (-> (the-as halt-wait-spot v1-70) check-done) + (the-as + (function halt-wait-spot hal symbol) + (lambda ((arg0 object) (arg1 hal-help-kid)) + (cond + ((and (logtest? (-> arg1 bot-task-bits) 1) (zero? (logand (-> arg1 bot-flags) (bot-flags bf09)))) + (ai-task-control-method-12 (-> arg1 ai-ctrl) arg1) + (go-to-waypoint! arg1 7 #f) + (ai-task-control-method-10 (-> arg1 ai-ctrl) arg1) + #t + ) + ((zero? (send-event *traffic-manager* 'get-object-remaining-count 6)) + (let ((v1-16 *target*)) + (when v1-16 + (cond + ((logtest? (focus-status dark) (-> v1-16 focus-status)) + (if (and (not (logtest? (-> arg1 bot-task-bits) 4)) (send-event *target* 'end-mode)) + (logior! (-> arg1 bot-task-bits) 4) + ) + #f + ) + (else + (ai-task-control-method-12 (-> arg1 ai-ctrl) arg1) + (go-to-waypoint! arg1 8 #f) + (ai-task-control-method-10 (-> arg1 ai-ctrl) arg1) + #t + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (none) + ) + ) + :on-update (lambda ((arg0 hal-help-kid)) + (with-pp + (gui-control-method-12 + *gui-control* + arg0 + (gui-channel art-load) + (gui-action queue) + "city-help-kid-resolution" + 0 + -1.0 + (new 'static 'sound-id) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer pp)) + (set! (-> a1-1 num-params) 1) + (set! (-> a1-1 message) 'get-object-remaining-count) + (set! (-> a1-1 param 0) (the-as uint 6)) + (let ((v1-6 (send-event-function *traffic-manager* a1-1))) + (if (and (not (logtest? (-> arg0 bot-task-bits) 2)) + (and (>= 12 (the-as int v1-6)) (send-event *target* 'change-mode 'darkjak #f 2)) + ) + (logior! (-> arg0 bot-task-bits) 2) + ) + ) + ) + (when (and (not (logtest? (-> arg0 waypoint-bits) 2)) + (>= (- (-> pp clock frame-counter) (-> arg0 waypoint-time0)) (seconds 3)) + ) + (logior! (-> arg0 waypoint-bits) 2) + (let ((s5-0 (new 'stack-no-clear 'transport-params))) + (set-vector! (-> s5-0 spawn-pos) 2689966.0 65208.32 -481075.2 1.0) + (quaternion-copy! (-> s5-0 quat) *unity-quaternion*) + (set! (-> s5-0 nav-mesh) (-> arg0 nav-mesh)) + (set! (-> s5-0 max-guard) (the-as uint 0)) + (set! (-> s5-0 turret?) #f) + (set! (-> s5-0 speeches?) #f) + (set! (-> (the-as hal3-course (-> arg0 course)) transport) + (ppointer->handle (process-spawn transport s5-0 :to arg0)) + ) + ) + ) + (hal-help-kid-method-227 arg0) + (when (and (not (logtest? (-> arg0 waypoint-bits) 1)) + (>= (- (-> pp clock frame-counter) (-> arg0 waypoint-time0)) (seconds 0.2)) + ) + (logior! (-> arg0 waypoint-bits) 1) + (let ((a1-7 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-7 from) (process->ppointer pp)) + (set! (-> a1-7 num-params) 2) + (set! (-> a1-7 message) 'request) + (set! (-> a1-7 param 0) (the-as uint 'waypoint)) + (set! (-> a1-7 param 1) (the-as uint 6)) + (let ((t9-8 send-event-function) + (v1-52 (-> arg0 actor-group 0 data 2 actor)) + ) + (t9-8 + (if v1-52 + (-> v1-52 extra process) + ) + a1-7 + ) + ) + ) + ) + ) + ) + :on-skipping-here #f + :check-too-far #f + ) + (new 'static 'bot-waypoint + :waypoint-id 7 + :skip-to -1 + :on-set (lambda ((arg0 hal-help-kid)) + (remove-setting! 'sound-mode) + (remove-setting! 'music) + (let* ((a0-3 (-> arg0 actor-group 0 data 2 actor)) + (v1-7 (if a0-3 + (the-as process-focusable (-> a0-3 extra process)) + ) + ) + ) + (logior! (-> v1-7 focus-status) (focus-status disable)) + (logclear! (-> v1-7 focus-status) (focus-status arrestable)) + ) + (let ((a0-8 *traffic-manager*)) + (send-event a0-8 'deactivate-by-type 6) + ) + (set-action! + *gui-control* + (gui-action stop) + (the-as sound-id 1) + (gui-channel art-load) + (gui-action none) + (the-as string #f) + (the-as (function gui-connection symbol) #f) + (the-as process #f) + ) + (let ((v1-17 (get-task-by-type (-> arg0 ai-ctrl) halt-wait-spot arg0))) + (set! (-> v1-17 bytes 5) (the-as uint 1)) + (set! (-> v1-17 bytes 6) (the-as uint 0)) + (set! (-> v1-17 bytes 4) (the-as uint 0)) + (set! (-> (the-as halt-wait-spot v1-17) check-done) + (the-as (function halt-wait-spot hal symbol) (lambda ((arg0 hal-help-kid)) #f)) + ) + ) + (none) + ) + :on-update (lambda ((arg0 hal-help-kid)) + (with-pp + (when (not (logtest? (-> arg0 waypoint-bits) 1)) + (let* ((s4-0 (new 'stack 'traffic-object-spawn-params)) + (v1-6 (-> arg0 actor-group 0 data 1 actor)) + (s5-0 (if v1-6 + (-> v1-6 extra process) + ) + ) + ) + (set! (-> s4-0 object-type) (traffic-type crimson-guard-1)) + (set! (-> s4-0 behavior) (the-as uint 5)) + (set! (-> s4-0 id) (the-as uint 0)) + (set! (-> s4-0 nav-mesh) (-> arg0 nav-mesh)) + (set! (-> s4-0 nav-branch) #f) + (set! (-> s4-0 proc) #f) + (set! (-> s4-0 handle) (process->handle s5-0)) + (set! (-> s4-0 user-data) (the-as uint 0)) + (set! (-> s4-0 flags) (the-as uint 0)) + (set! (-> s4-0 guard-type) (the-as uint 7)) + (vector-reset! (-> s4-0 velocity)) + (set! (-> s4-0 position quad) (-> (the-as process-drawable s5-0) root trans quad)) + (set! (-> s4-0 position x) (+ 13312.0 (-> s4-0 position x))) + (set! (-> s4-0 position z) (+ 17408.0 (-> s4-0 position z))) + (let ((a1-1 (new 'stack-no-clear 'vector))) + (vector-! a1-1 (-> (the-as process-drawable s5-0) root trans) (-> s4-0 position)) + (forward-up->quaternion (-> s4-0 rotation) a1-1 *up-vector*) + ) + (send-event *traffic-manager* 'activate-object s4-0) + (let ((s4-1 (-> s4-0 proc))) + (when s4-1 + (logior! (-> arg0 waypoint-bits) 1) + (send-event s5-0 'instant-arrest s4-1) + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) (process->ppointer pp)) + (set! (-> a1-4 num-params) 1) + (set! (-> a1-4 message) 'instant-arrest) + (set! (-> a1-4 param 0) (the-as uint s4-1)) + (let ((t9-4 send-event-function) + (v1-38 (-> arg0 actor-group 0 data 2 actor)) + ) + (t9-4 + (if v1-38 + (-> v1-38 extra process) + ) + a1-4 + ) + ) + ) + ) + ) + ) + ) + (none) + ) + ) + :on-skipping-here #f + :check-too-far #f + ) + (new 'static 'bot-waypoint + :waypoint-id 8 + :skip-to -1 + :on-set (lambda ((arg0 hal-help-kid)) + (remove-setting! 'sound-mode) + (remove-setting! 'music) + (send-event (handle->process (-> (the-as hal3-course (-> arg0 course)) transport)) 'leave) + (task-node-close! (game-task-node city-help-kid-battle)) + (send-event *target* 'end-mode) + (let ((s5-0 *traffic-manager*)) + (send-event s5-0 'set-alert-level 0) + (send-event s5-0 'restore-default-settings) + ) + (let* ((v1-24 (-> arg0 actor-group 0 data 1 actor)) + (a0-15 (if v1-24 + (-> v1-24 extra process) + ) + ) + ) + (send-event a0-15 'request 'waypoint 8) + ) + (let* ((v1-35 (-> arg0 actor-group 0 data 2 actor)) + (a0-16 (if v1-35 + (-> v1-35 extra process) + ) + ) + ) + (send-event a0-16 'request 'waypoint 8) + ) + (let ((v1-44 (get-task-by-type (-> arg0 ai-ctrl) halt-wait-spot arg0))) + (set! (-> v1-44 bytes 5) (the-as uint 1)) + (set! (-> v1-44 bytes 6) (the-as uint 0)) + (set! (-> v1-44 bytes 4) (the-as uint 0)) + (set! (-> (the-as halt-wait-spot v1-44) check-done) + (the-as + (function halt-wait-spot hal symbol) + (lambda ((arg0 object) (arg1 hal-help-kid)) + (with-pp + (if (and *target* (zero? (logand (-> arg1 bot-task-bits) 8))) + (set! (-> arg1 waypoint-time0) (-> pp clock frame-counter)) + ) + (let ((v1-7 (get-current-task-event (-> arg1 task)))) + (when (and (= (-> v1-7 action) (game-task-action say)) (scene-play arg1 (the-as string (-> v1-7 scene)) #f)) + (bot-method-196 arg1) + (ai-task-control-method-12 (-> arg1 ai-ctrl) arg1) + (go-to-waypoint! arg1 9 #f) + (ai-task-control-method-10 (-> arg1 ai-ctrl) arg1) + #t + ) + ) + ) + ) + ) + ) + ) + (none) + ) + :on-update #f + :on-skipping-here #f + :check-too-far #f + ) + (new 'static 'bot-waypoint + :waypoint-id 9 + :skip-to -1 + :on-set (lambda ((arg0 hal-help-kid)) + (with-pp + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) (process->ppointer pp)) + (set! (-> a1-0 num-params) 2) + (set! (-> a1-0 message) 'request) + (set! (-> a1-0 param 0) (the-as uint 'waypoint)) + (set! (-> a1-0 param 1) (the-as uint 10)) + (let ((t9-0 send-event-function) + (v1-8 (-> arg0 actor-group 0 data 1 actor)) + ) + (t9-0 + (if v1-8 + (-> v1-8 extra process) + ) + a1-0 + ) + ) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer pp)) + (set! (-> a1-1 num-params) 2) + (set! (-> a1-1 message) 'request) + (set! (-> a1-1 param 0) (the-as uint 'waypoint)) + (set! (-> a1-1 param 1) (the-as uint 10)) + (let ((t9-1 send-event-function) + (v1-19 (-> arg0 actor-group 0 data 2 actor)) + ) + (t9-1 + (if v1-19 + (-> v1-19 extra process) + ) + a1-1 + ) + ) + ) + (let ((v1-23 (get-task-by-type (-> arg0 ai-ctrl) halt-wait-spot arg0))) + (set! (-> v1-23 bytes 5) (the-as uint 1)) + (set! (-> v1-23 bytes 6) (the-as uint 0)) + (set! (-> v1-23 bytes 4) (the-as uint 0)) + (set! (-> (the-as halt-wait-spot v1-23) check-done) + (the-as + (function halt-wait-spot hal symbol) + (lambda ((arg0 object) (arg1 hal-help-kid)) (when (scene-release? arg1) + (ai-task-control-method-12 (-> arg1 ai-ctrl) arg1) + (go-to-waypoint! arg1 10 #f) + (ai-task-control-method-10 (-> arg1 ai-ctrl) arg1) + #t + ) + ) + ) + ) + ) + (none) + ) + ) + :on-update #f + :on-skipping-here #f + :check-too-far #f + ) + (new 'static 'bot-waypoint + :waypoint-id 10 + :skip-to -1 + :on-set (lambda ((arg0 hal-help-kid)) + (let ((v1-2 (-> arg0 actor-group 0 data 3 actor))) + (if v1-2 + (logclear! (-> v1-2 extra perm status) (entity-perm-status bit-9)) + ) + ) + (let ((v1-5 (get-task-by-type (-> arg0 ai-ctrl) halt-wait-spot arg0))) + (set! (-> v1-5 bytes 5) (the-as uint 1)) + (set! (-> v1-5 bytes 6) (the-as uint 0)) + (set! (-> v1-5 bytes 4) (the-as uint 0)) + (set! (-> (the-as halt-wait-spot v1-5) check-done) + (the-as (function halt-wait-spot hal symbol) (lambda ((arg0 object) (arg1 hal-help-kid)) + (when (hal-method-225 arg1) + (process-entity-status! arg1 (entity-perm-status bit-4) #f) + (send-event arg1 'die-fast) + ) + #f + ) + ) + ) + ) + (none) + ) + :on-update #f + :on-skipping-here #f + :check-too-far #f + ) + ) + :spots (new 'static 'inline-array bot-spot 4 + (new 'static 'bot-spot :center (new 'static 'vector :x 2618286.0 :y 32768.0 :z -372572.16 :w 4096.0)) + (new 'static 'bot-spot :center (new 'static 'vector :x 2630023.5 :y 41015.707 :z -478801.5 :w 300843.8)) + (new 'static 'bot-spot :center (new 'static 'vector :x 2623395.8 :y 41011.61 :z -515509.44 :w 321568.78)) + (new 'static 'bot-spot :center (new 'static 'vector :x 2675472.0 :y 47819.98 :z -516537.56 :w 395983.66)) + ) + ) + ) + +(set! (-> *bot-course-table* course 6) *hal3-course*) diff --git a/goal_src/jak2/levels/common/guard-projectile.gc b/goal_src/jak2/levels/common/guard-projectile.gc index 1e83d19c7c..65d1ad3a74 100644 --- a/goal_src/jak2/levels/common/guard-projectile.gc +++ b/goal_src/jak2/levels/common/guard-projectile.gc @@ -332,8 +332,7 @@ ) (defmethod draw-laser-sight guard-shot ((obj guard-shot)) - "TODO - confirm If applicable, draw the laser sight particles -:virtual" + "TODO - confirm If applicable, draw the laser sight particles" (draw-beam (-> *part-id-table* 610) (-> obj tail-pos) (-> obj starting-dir) #f #t) (let* ((a0-3 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> obj starting-dir) 2048.0)) (v1-2 (vector+! (new 'stack-no-clear 'vector) (-> obj tail-pos) a0-3)) @@ -549,7 +548,7 @@ (set! (-> v1-5 decay-rate) 0.0) (set! (-> v1-5 flags) (traffic-danger-flags tdf0)) (set! (-> v1-5 danger-type) (traffic-danger-type tdt0)) - (set! (-> v1-5 handle) (the-as uint #f)) + (set! (-> v1-5 handle) (the-as handle #f)) (send-event *traffic-manager* 'add-danger-sphere v1-5) ) ) @@ -656,8 +655,7 @@ ) (defmethod init-proj-settings! guard-shot ((obj guard-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj hit-actor?) #f) (set! (-> obj tail-pos quad) (-> obj root-override trans quad)) (set! (-> obj attack-mode) 'guard-shot) @@ -737,8 +735,7 @@ ) (defmethod init-proj-settings! vehicle-grenade ((obj vehicle-grenade)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj attack-mode) 'eco-dark) (initialize-skeleton obj @@ -772,8 +769,7 @@ ) (defmethod play-impact-sound! vehicle-grenade ((obj vehicle-grenade)) - "Plays impact sound -:virtual" + "Plays impact sound" (let* ((a2-0 (-> obj root-override)) (v1-0 (-> a2-0 status)) ) @@ -1020,8 +1016,7 @@ ) (defmethod init-proj-settings! guard-lazer-shot ((obj guard-lazer-shot)) - "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc -:virtual" + "Init relevant settings for the [[projectile]] such as gravity, speed, timeout, etc" (set! (-> obj attack-mode) 'shock) (set! (-> obj max-speed) 131072.0) (set! (-> obj timeout) (seconds 0.125)) diff --git a/test/decompiler/reference/jak2/engine/ai/traffic-h_REF.gc b/test/decompiler/reference/jak2/engine/ai/traffic-h_REF.gc index c6ad6601a7..3bba546111 100644 --- a/test/decompiler/reference/jak2/engine/ai/traffic-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/ai/traffic-h_REF.gc @@ -17,7 +17,7 @@ (deftype traffic-danger-info (structure) ((sphere sphere :inline :offset-assert 0) (velocity vector :inline :offset-assert 16) - (handle uint64 :offset-assert 32) + (handle handle :offset-assert 32) (notify-radius float :offset-assert 40) (danger-level float :offset-assert 44) (decay-rate float :offset-assert 48) @@ -96,7 +96,7 @@ (position vector :inline :offset-assert 32) (rotation quaternion :inline :offset-assert 48) (velocity vector :inline :offset-assert 64) - (handle uint64 :offset-assert 80) + (handle handle :offset-assert 80) (guard-type uint8 :offset-assert 88) (user-data uint32 :offset-assert 92) (flags uint32 :offset-assert 96) diff --git a/test/decompiler/reference/jak2/levels/city/common/citizen-chick_REF.gc b/test/decompiler/reference/jak2/levels/city/common/citizen-chick_REF.gc new file mode 100644 index 0000000000..0c51af975a --- /dev/null +++ b/test/decompiler/reference/jak2/levels/city/common/citizen-chick_REF.gc @@ -0,0 +1,778 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defskelgroup skel-citizen-chick citizen-chick citizen-chick-lod0-jg -1 + ((citizen-chick-lod0-mg (meters 20)) (citizen-chick-lod2-mg (meters 999999))) + :bounds (static-spherem 0 2 0 3) + :shadow citizen-chick-shadow-mg + ) + +;; definition for symbol *citizen-chick-global-info*, type civilian-global-info +(define *citizen-chick-global-info* + (new 'static 'civilian-global-info + :knocked (new 'static 'array int32 2 20 22) + :knocked-land (new 'static 'array int32 2 21 23) + :yellow-hit-anim (new 'static 'inline-array civilian-anim-info 1 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 20 22)) + ) + :blue-hit-anim (new 'static 'inline-array civilian-anim-info 3 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 19 18)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 19 18)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 19 18)) + ) + :anim-cover-head-start 14 + :anim-cover-head-loop 15 + :anim-cover-head-end 16 + :speech-ambient #x17 + :speech-alert #x18 + :speech-cower #x19 + :speech-touched-by-player #x1a + :speech-shot-by-player #x1b + :speech-avoiding-player-vehicle #x1c + :speech-hit-by-player-vehicle #x1d + ) + ) + +;; definition of type citizen-chick +(deftype citizen-chick (civilian) + () + :heap-base #x3b0 + :method-count-assert 218 + :size-assert #x424 + :flag-assert #xda03b00424 + ) + +;; definition for method 3 of type citizen-chick +(defmethod inspect citizen-chick ((obj citizen-chick)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type civilian inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition for symbol *citizen-chick-nav-enemy-info*, type nav-enemy-info +(define *citizen-chick-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 idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #xa :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 10 + :notice-anim 10 + :hostile-anim -1 + :hit-anim 10 + :knocked-anim 20 + :knocked-land-anim 21 + :die-anim 10 + :die-falling-anim 10 + :victory-anim 10 + :jump-wind-up-anim 4 + :jump-in-air-anim 4 + :jump-land-anim 4 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :notice-distance-delta (meters 0.1) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :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 32768.0 + :knocked-soft-vxz-hi 53248.0 + :knocked-soft-vy-lo 20480.0 + :knocked-soft-vy-hi 40960.0 + :knocked-medium-vxz-lo 40960.0 + :knocked-medium-vxz-hi 73728.0 + :knocked-medium-vy-lo 24576.0 + :knocked-medium-vy-hi 53248.0 + :knocked-hard-vxz-lo 53248.0 + :knocked-hard-vxz-hi 102400.0 + :knocked-hard-vy-lo 40960.0 + :knocked-hard-vy-hi 81920.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 8192.0 + :knocked-yellow-vxz-hi 16384.0 + :knocked-yellow-vy-lo 12288.0 + :knocked-yellow-vy-hi 24576.0 + :knocked-red-vxz-lo 12288.0 + :knocked-red-vxz-hi 24576.0 + :knocked-red-vy-lo 20480.0 + :knocked-red-vy-hi 36864.0 + :knocked-blue-vxz-lo 16384.0 + :knocked-blue-vxz-hi 32768.0 + :knocked-blue-vy-lo 16384.0 + :knocked-blue-vy-hi 32768.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 #f + :use-pacing #f + :walk-anim 4 + :turn-anim 4 + :run-anim 7 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 2) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :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! (-> *citizen-chick-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 26 of type citizen-chick +(defmethod get-inv-mass citizen-chick ((obj citizen-chick)) + 0.5 + ) + +;; definition for method 51 of type citizen-chick +;; INFO: Used lq/sq +(defmethod enemy-method-51 citizen-chick ((obj citizen-chick)) + (let ((f30-0 (quaternion-y-angle (-> obj root-override2 quat)))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (let ((a0-5 (handle->process (-> obj focus handle)))) + (when a0-5 + (get-trans (the-as process-focusable a0-5) 0) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot + (-> obj root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat)) + ) + 0.0 + ) + (vector-negate-in-place! s5-0) + ) + (set! f30-0 (atan (-> s5-0 x) (-> s5-0 z))) + ) + ) + ) + ) + (else + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot s5-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) 0.0) + (vector-negate-in-place! s5-1) + ) + (let* ((f28-0 (atan (-> s5-1 x) (-> s5-1 z))) + (f1-2 (deg- f30-0 f28-0)) + (f2-0 (fabs f1-2)) + (f0-8 (-> obj enemy-info-override knocked-seek-ry-clamp)) + ) + (when (and (< f0-8 f2-0) (< f2-0 (- 32768.0 f0-8))) + (set! f30-0 (+ (cond + ((< f2-0 16384.0) + (if (>= f1-2 0.0) + f0-8 + (- f0-8) + ) + ) + ((>= f1-2 0.0) + (- 32768.0 f0-8) + ) + (else + (+ -32768.0 f0-8) + ) + ) + f28-0 + ) + ) + (if (< f30-0 0.0) + (set! f30-0 (+ 65536.0 f30-0)) + ) + ) + ) + ) + ) + ) + f30-0 + ) + ) + +;; definition for method 79 of type citizen-chick +(defmethod enemy-method-79 citizen-chick ((obj citizen-chick) (arg0 int) (arg1 enemy-knocked-info)) + (case arg0 + ((1) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((s5-0 (ja-done? 0))) + (let ((a0-4 (-> obj skel root-channel 0))) + (set! (-> a0-4 param 0) (the float (+ (-> a0-4 frame-group frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-4 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s5-0 + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + ) + (set! (-> a0-6 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + frames + num-frames + ) + -1 + ) + ) + ) + (set! (-> a0-6 param 1) (-> arg1 anim-speed)) + (set! (-> a0-6 frame-num) 3.0) + (joint-control-channel-group! + a0-6 + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + num-func-seek! + ) + ) + ) + s5-0 + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + +;; definition for method 77 of type citizen-chick +(defmethod enemy-method-77 citizen-chick ((obj citizen-chick) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-0 (ash 1 (-> obj info prev-yellow-hit))) + (v1-3 (enemy-method-120 obj 1 a2-0)) + (a1-7 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-3 8)) (the-as uint (-> obj info)))) + yellow-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-yellow-hit) v1-3) + (let ((a0-15 (-> obj skel root-channel 0))) + (set! (-> a0-15 frame-group) (the-as art-joint-anim a1-7)) + (set! (-> a0-15 param 0) (the float (+ (-> (the-as art-joint-anim a1-7) 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-7) num-func-seek!) + ) + ) + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-2 (ash 1 (-> obj info prev-blue-hit))) + (v1-12 (enemy-method-120 obj 3 a2-2)) + (a1-14 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-12 8)) (the-as uint (-> obj info)))) + blue-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-blue-hit) v1-12) + (let ((a0-30 (-> obj skel root-channel 0))) + (set! (-> a0-30 frame-group) (the-as art-joint-anim a1-14)) + (set! (-> a0-30 param 0) (the float (+ (-> (the-as art-joint-anim a1-14) frames num-frames) -1))) + (set! (-> a0-30 param 1) 1.0) + (set! (-> a0-30 frame-num) 0.0) + (joint-control-channel-group! a0-30 (the-as art-joint-anim a1-14) num-func-seek!) + ) + ) + ) + (else + (let ((s4-0 (if (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-39 (-> obj skel root-channel 0))) + (set! (-> a0-39 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-39 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-39 param 1) (-> arg0 0)) + (set! (-> a0-39 frame-num) 0.0) + (joint-control-channel-group! a0-39 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + #t + ) + +;; definition for method 78 of type citizen-chick +(defmethod enemy-method-78 citizen-chick ((obj citizen-chick) (arg0 (pointer float))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + ) + (set! (-> a0-2 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + 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 (-> obj info knocked-land (-> obj hit-face)))) + num-func-seek! + ) + ) + #t + ) + +;; failed to figure out what this is: +(defstate knocked (citizen-chick) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type civilian knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (the-as collide-shape-prim-group (-> self root-override2 root-prim)))) + (logior! (-> v1-5 child 0 prim-core action) (collide-action no-standon)) + (logclear! (-> v1-5 child 1 prim-core action) (collide-action no-standon)) + (set! (-> v1-5 child 1 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 child 1 prim-core collide-with) (collide-spec)) + ) + 0 + (none) + ) + ) + +;; failed to figure out what this is: +(defstate get-up-front (citizen-chick) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-front) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate get-up-back (citizen-chick) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-back) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate wait (citizen-chick) + :virtual #t + :code (behavior () + (let ((f30-1 (/ 1.0 (rand-vu-float-range 10.0 13.0)))) + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! citizen-chick-idle-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-chick-idle-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + ) + #f + (none) + ) + ) + +;; definition for method 114 of type citizen-chick +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! citizen-chick ((obj citizen-chick)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec civilian)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 8192.0 0.0 12288.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 civilian)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 4096.0 0.0 4096.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 civilian)) + (set! (-> v1-15 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 0.0 4096.0) + ) + (set! (-> s5-0 nav-radius) 4096.0) + (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 citizen-chick +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! citizen-chick ((obj citizen-chick)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-citizen-chick" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *citizen-chick-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 speed-scale) 1.0) + ) + 0 + (set! (-> obj draw lod-set lod 0 dist) 204800.0) + (set! (-> obj draw lod-set lod 1 dist) 491520.0) + (set! (-> obj info) *citizen-chick-global-info*) + (try-update-focus (-> obj focus) *target* obj) + (set-vector! (-> obj neck twist-max) 10922.667 18204.445 0.0 1.0) + (set! (-> obj anim-shuffle) 26) + (let ((v1-18 (get-rand-int obj 3))) + (cond + ((zero? v1-18) + (set! (-> obj anim-walk) 4) + (set! (-> obj dist-walk-anim) 15728.64) + (set! (-> obj speed-walk) 14745.6) + ) + ((= v1-18 1) + (set! (-> obj anim-walk) 5) + (set! (-> obj dist-walk-anim) 8736.768) + (set! (-> obj speed-walk) 8192.0) + ) + ((= v1-18 2) + (set! (-> obj anim-walk) 6) + (set! (-> obj dist-walk-anim) 15728.64) + (set! (-> obj speed-walk) 12288.0) + ) + ) + ) + (let ((v1-33 (get-rand-int obj 3))) + (cond + ((zero? v1-33) + (set! (-> obj anim-panic-run) 11) + ) + ((= v1-33 1) + (set! (-> obj anim-panic-run) 11) + ) + ((= v1-33 2) + (set! (-> obj anim-panic-run) 7) + ) + ) + ) + (let ((v1-39 (get-rand-int obj 3))) + (cond + ((zero? v1-39) + (set! (-> obj dist-run-anim) 26214.4) + (set! (-> obj anim-run) 7) + ) + ((= v1-39 1) + (set! (-> obj dist-run-anim) 28385.28) + (set! (-> obj anim-run) 8) + ) + ((= v1-39 2) + (set! (-> obj dist-run-anim) 26214.4) + (set! (-> obj anim-run) 9) + ) + ) + ) + (set! (-> obj speed-run) 49152.0) + (set! (-> obj anim-on-ground) 13) + (set! (-> obj anim-dive) 17) + (set! (-> obj anim-get-up-back) 25) + (set! (-> obj anim-get-up-front) 24) + (let ((f30-0 (get-rand-float-range obj 1.0 1.25)) + (f0-17 (get-rand-float-range obj 1.0 1.25)) + ) + (set-vector! (-> obj root-override2 scale) f0-17 f30-0 f0-17 1.0) + ) + (let ((f0-19 (get-rand-float-range obj 0.9 1.0))) + (set-vector! (-> obj draw color-mult) f0-19 f0-19 f0-19 1.0) + ) + (set! (-> obj water-anim) 12) + (logior! (-> obj flags) (citizen-flag female)) + 0 + (none) + ) + +;; definition for method 181 of type citizen-chick +;; WARN: Return type mismatch int vs none. +(defmethod citizen-init! citizen-chick ((obj citizen-chick)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type civilian citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj dive-reaction) (* 0.2 (rand-vu))) + (logclear! (-> obj mask) (process-mask enemy)) + (setup-masks (-> obj draw) 0 -1) + (setup-masks (-> obj draw) 16 0) + (setup-masks (-> obj draw) 8 0) + (let ((v1-11 (get-rand-int obj 3))) + (cond + ((zero? v1-11) + (setup-masks (-> obj draw) 32 0) + ) + ((= v1-11 1) + (setup-masks (-> obj draw) #x4000 0) + ) + ((= v1-11 2) + (setup-masks (-> obj draw) #x8000 0) + ) + ) + ) + (let ((v1-20 (get-rand-int obj 3))) + (cond + ((zero? v1-20) + (setup-masks (-> obj draw) 64 0) + ) + ((= v1-20 1) + (setup-masks (-> obj draw) 1024 0) + ) + ((= v1-20 2) + (setup-masks (-> obj draw) #x10000 0) + ) + ) + ) + (let ((v1-29 (get-rand-int obj 3))) + (cond + ((zero? v1-29) + (setup-masks (-> obj draw) 4 0) + ) + ((= v1-29 1) + (setup-masks (-> obj draw) 512 0) + ) + ((= v1-29 2) + (setup-masks (-> obj draw) 4096 0) + ) + ) + ) + (let ((v1-38 (get-rand-int obj 3))) + (cond + ((zero? v1-38) + (setup-masks (-> obj draw) 2 0) + (let ((v1-42 (get-rand-int obj 2))) + (cond + ((zero? v1-42) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-42 1) + (setup-masks (-> obj draw) 8192 0) + ) + ) + ) + ) + ((= v1-38 1) + (setup-masks (-> obj draw) 256 0) + ) + ((= v1-38 2) + (setup-masks (-> obj draw) 2048 0) + (let ((v1-54 (get-rand-int obj 2))) + (cond + ((zero? v1-54) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-54 1) + (setup-masks (-> obj draw) 8192 0) + ) + ) + ) + ) + ) + ) + (logior! (-> obj flags) (citizen-flag female)) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/city/common/citizen-enemy_REF.gc b/test/decompiler/reference/jak2/levels/city/common/citizen-enemy_REF.gc new file mode 100644 index 0000000000..cc22f76fd2 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/city/common/citizen-enemy_REF.gc @@ -0,0 +1,357 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type citizen-enemy +(deftype citizen-enemy (citizen) + ((next-update-target time-frame :offset-assert 968) + (minimap connection-minimap :offset-assert 976) + ) + :heap-base #x360 + :method-count-assert 203 + :size-assert #x3d4 + :flag-assert #xcb036003d4 + (:methods + (traffic-danger-init! (_type_) none 201) + (citizen-enemy-method-202 (_type_) none 202) + ) + ) + +;; definition for method 3 of type citizen-enemy +(defmethod inspect citizen-enemy ((obj citizen-enemy)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type citizen inspect))) + (t9-0 obj) + ) + (format #t "~2Tnext-update-target: ~D~%" (-> obj next-update-target)) + (format #t "~2Tminimap: #~%" (-> obj minimap)) + (label cfg-4) + obj + ) + +;; definition for method 55 of type citizen-enemy +(defmethod track-target! citizen-enemy ((obj citizen-enemy)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (let ((a1-0 (new 'stack-no-clear 'overlaps-others-params))) + (set! (-> a1-0 options) (overlaps-others-options)) + (set! (-> a1-0 collide-with-filter) (-> obj enemy-info-override overlaps-others-collide-with-filter)) + (set! (-> a1-0 tlist) *touching-list*) + (find-overlapping-shapes (-> obj root-override2) a1-0) + ) + (when (and (not (logtest? (-> obj focus-status) (focus-status disable dead ignore inactive))) + (< (-> obj next-update-target) (-> pp clock frame-counter)) + (not (logtest? (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (-> obj next-state) + (= (-> obj next-state name) 'active) + ) + (citizen-enemy-method-202 obj) + (set! (-> obj next-update-target) (+ (-> pp clock frame-counter) (seconds 0.2))) + (traffic-danger-init! obj) + ) + ((method-of-type citizen track-target!) obj) + (none) + ) + ) + +;; definition for method 76 of type citizen-enemy +;; WARN: Return type mismatch object vs symbol. +(defmethod enemy-method-76 citizen-enemy ((obj citizen-enemy) (arg0 process) (arg1 event-message-block)) + (the-as + symbol + (cond + ((and (-> obj next-state) (let ((v1-3 (-> obj next-state name))) + (or (= v1-3 'knocked) (= v1-3 'jump)) + ) + ) + ((method-of-type citizen enemy-method-76) obj arg0 arg1) + ) + (else + (when (!= (-> arg0 type) target) + (let* ((s3-0 (-> arg1 param 0)) + (s2-0 arg0) + (v1-6 (if (type? s2-0 process-focusable) + s2-0 + ) + ) + ) + (cond + ((and (logtest? (-> obj focus-status) (focus-status dangerous)) + (logtest? (process-mask guard civilian) (-> arg0 mask)) + (and v1-6 + (zero? (logand (-> (the-as process-focusable v1-6) focus-status) (focus-status disable dead ignore grabbed))) + ) + ((method-of-type touching-shapes-entry prims-touching-action?) + (the-as touching-shapes-entry s3-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 s3-0) + (-> obj root-override2) + (collide-action persistent-attack) + (collide-action) + ) + (-> obj persistent-attack-id) + (-> obj attack-id) + ) + ) + ) + (enemy-method-104 obj arg0 s3-0 a3-2) + ) + ) + (else + (send-event arg0 'touch (-> arg1 param 0)) + ) + ) + ) + ) + ) + ) + ) + ) + +;; definition for method 74 of type citizen-enemy +(defmethod general-event-handler citizen-enemy ((obj citizen-enemy) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('event-death) + #f + ) + (('effect-control) + (case (-> arg3 param 0) + (('death-default) + (cond + ((> (-> obj hit-points) 0) + #t + ) + (else + (let ((v1-4 (-> obj root-override2 root-prim))) + (set! (-> v1-4 prim-core collide-as) (collide-spec)) + (set! (-> v1-4 prim-core collide-with) (collide-spec)) + ) + 0 + #f + ) + ) + ) + (else + #f + ) + ) + ) + (('end-task) + (let ((v0-0 (the-as object (logclear (-> obj flags) (citizen-flag persistent))))) + (set! (-> obj flags) (the-as citizen-flag v0-0)) + v0-0 + ) + ) + (else + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +;; definition for method 201 of type citizen-enemy +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod traffic-danger-init! citizen-enemy ((obj citizen-enemy)) + (let ((a1-0 (new 'stack-no-clear 'traffic-danger-info))) + (set! (-> a1-0 sphere quad) (-> obj root-override2 trans quad)) + (set! (-> a1-0 sphere r) 40960.0) + (set! (-> a1-0 velocity quad) (-> obj root-override2 transv quad)) + (set! (-> a1-0 notify-radius) 122880.0) + (set! (-> a1-0 danger-level) 1.0) + (set! (-> a1-0 decay-rate) 0.0) + (set! (-> a1-0 flags) (traffic-danger-flags tdf0)) + (set! (-> a1-0 danger-type) (traffic-danger-type tdt7)) + (set! (-> a1-0 handle) (process->handle obj)) + (add-danger (-> obj controller traffic) a1-0) + ) + 0 + (none) + ) + +;; definition for method 202 of type citizen-enemy +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod citizen-enemy-method-202 citizen-enemy ((obj citizen-enemy)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj root-override2 trans quad)) + (set! (-> s5-0 w) 122880.0) + (let ((s4-0 (the-as process-drawable #f))) + (let ((f30-0 122880.0)) + (let ((s3-0 (new 'stack-no-clear 'array 'collide-shape 64))) + (countdown (s2-0 (fill-actor-list-for-sphere *actor-hash* (the-as sphere s5-0) s3-0 64)) + (let* ((s1-0 (-> s3-0 s2-0)) + (a0-6 (if (type? s1-0 collide-shape) + s1-0 + ) + ) + ) + (when a0-6 + (let* ((s0-0 (-> a0-6 process)) + (s1-1 (if (type? s0-0 process-focusable) + s0-0 + ) + ) + ) + (when (and s1-1 + (!= obj s1-1) + (not (logtest? (-> (the-as process-focusable s1-1) focus-status) (focus-status inactive))) + (not (logtest? (-> (the-as process-focusable s1-1) focus-status) (focus-status disable))) + (not (logtest? (process-mask enemy) (-> s1-1 mask))) + (not (logtest? (process-mask crate) (-> s1-1 mask))) + (not (logtest? (process-mask vehicle) (-> s1-1 mask))) + s1-1 + (zero? (logand (-> (the-as process-focusable s1-1) focus-status) (focus-status disable dead ignore grabbed))) + ) + (let ((f0-1 (vector-vector-xz-distance (-> obj root-override2 trans) (-> s1-1 root trans)))) + (when (or (not s4-0) (< f0-1 f30-0)) + (set! s4-0 s1-1) + (set! f30-0 f0-1) + ) + ) + ) + ) + ) + ) + ) + ) + (if (and *target* (< (vector-vector-distance (target-pos 0) s5-0) f30-0)) + (set! s4-0 *target*) + ) + ) + (when s4-0 + (try-update-focus (-> obj focus) (the-as process-focusable s4-0) obj) + (go-hostile obj) + ) + ) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate active (citizen-enemy) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (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)) + ) + ) + ) + #f + (none) + ) + ) + +;; failed to figure out what this is: +(defstate inactive (citizen-enemy) + :virtual #t + :enter (behavior () + (when (-> self minimap) + (logior! (-> self minimap flags) (minimap-flag fade-out)) + (set! (-> self minimap) #f) + ) + (let ((t9-0 (-> (method-of-type citizen inactive) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + ) + +;; definition for method 181 of type citizen-enemy +;; WARN: Return type mismatch int vs none. +(defmethod citizen-init! citizen-enemy ((obj citizen-enemy)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type citizen citizen-init!))) + (t9-0 obj) + ) + (if (-> obj skel effect) + (logior! (-> obj skel effect flags) (effect-control-flag ecf0)) + ) + (set! (-> obj mask) (logior (process-mask enemy) (-> obj mask))) + (reset-to-collide-spec (-> obj focus) (collide-spec jak civilian player-list bot-targetable jak-vehicle)) + (let ((v1-12 (-> obj nav))) + (set! (-> v1-12 sphere-mask) (the-as uint #x800e8)) + ) + 0 + (set! (-> obj anim-shuffle) (-> obj enemy-info-override walk-anim)) + (set! (-> obj anim-walk) (-> obj enemy-info-override walk-anim)) + (set! (-> obj speed-walk) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj dist-walk-anim) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj anim-run) (-> obj enemy-info-override run-anim)) + (set! (-> obj dist-run-anim) (-> obj enemy-info-override run-travel-speed)) + (set! (-> obj speed-run) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj fated-time) 0) + (logior! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) + (logior! (-> obj focus-status) (focus-status dangerous)) + (logior! (-> obj enemy-flags) (enemy-flag check-water)) + (set! (-> obj enemy-flags) + (logior (enemy-flag check-water-backup no-initial-move-to-ground) (-> obj enemy-flags)) + ) + (logclear! (-> obj focus-status) (focus-status dead)) + (set! (-> obj mask) (logior (process-mask collectable) (-> obj mask))) + (logior! (-> obj enemy-flags) (enemy-flag look-at-move-dest)) + (if (not (-> obj minimap)) + (set! (-> obj minimap) (add-icon! *minimap* obj (the-as uint 70) (the-as int #f) (the-as vector #t) 0)) + ) + (ja-channel-set! 0) + 0 + (none) + ) + +;; definition for method 73 of type citizen-enemy +(defmethod kill-prefer-falling citizen-enemy ((obj citizen-enemy)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + ((method-of-type nav-enemy kill-prefer-falling) obj) + ) + +;; definition for method 70 of type citizen-enemy +;; WARN: Return type mismatch object vs none. +(defmethod go-hostile citizen-enemy ((obj citizen-enemy)) + (if (not (and (-> obj next-state) (= (-> obj next-state name) 'hostile))) + (go (method-of-object obj hostile)) + ) + (none) + ) + +;; definition for method 67 of type citizen-enemy +;; WARN: Return type mismatch object vs none. +(defmethod go-stare citizen-enemy ((obj citizen-enemy)) + (go (method-of-object obj active)) + (none) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/city/common/citizen-fat_REF.gc b/test/decompiler/reference/jak2/levels/city/common/citizen-fat_REF.gc new file mode 100644 index 0000000000..f3df8c7dfd --- /dev/null +++ b/test/decompiler/reference/jak2/levels/city/common/citizen-fat_REF.gc @@ -0,0 +1,867 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defskelgroup skel-citizen-fat citizen-fat citizen-fat-lod0-jg -1 + ((citizen-fat-lod0-mg (meters 20)) (citizen-fat-lod2-mg (meters 999999))) + :bounds (static-spherem 0 2 0 3) + :shadow citizen-fat-shadow-mg + ) + +;; definition for symbol *citizen-fat-global-info*, type civilian-global-info +(define *citizen-fat-global-info* + (new 'static 'civilian-global-info + :knocked (new 'static 'array int32 2 20 22) + :knocked-land (new 'static 'array int32 2 21 23) + :yellow-hit-anim (new 'static 'inline-array civilian-anim-info 1 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 20 22)) + ) + :blue-hit-anim (new 'static 'inline-array civilian-anim-info 3 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 27 26)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 27 26)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 27 26)) + ) + :anim-cover-head-start 28 + :anim-cover-head-loop 29 + :anim-cover-head-end 30 + :speech-ambient #xf + :speech-alert #x10 + :speech-cower #x11 + :speech-touched-by-player #x12 + :speech-shot-by-player #x13 + :speech-avoiding-player-vehicle #x14 + :speech-hit-by-player-vehicle #x15 + ) + ) + +;; definition of type citizen-fat +(deftype citizen-fat (civilian) + () + :heap-base #x3b0 + :method-count-assert 218 + :size-assert #x424 + :flag-assert #xda03b00424 + ) + +;; definition for method 3 of type citizen-fat +(defmethod inspect citizen-fat ((obj citizen-fat)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type civilian inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition for symbol *citizen-fat-nav-enemy-info*, type nav-enemy-info +(define *citizen-fat-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 idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x4 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 4 + :notice-anim 4 + :hostile-anim -1 + :hit-anim 4 + :knocked-anim 20 + :knocked-land-anim 21 + :die-anim 4 + :die-falling-anim 4 + :victory-anim 4 + :jump-wind-up-anim 11 + :jump-in-air-anim 11 + :jump-land-anim 11 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :notice-distance-delta (meters 0.1) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :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 32768.0 + :knocked-soft-vxz-hi 53248.0 + :knocked-soft-vy-lo 20480.0 + :knocked-soft-vy-hi 40960.0 + :knocked-medium-vxz-lo 40960.0 + :knocked-medium-vxz-hi 73728.0 + :knocked-medium-vy-lo 24576.0 + :knocked-medium-vy-hi 53248.0 + :knocked-hard-vxz-lo 53248.0 + :knocked-hard-vxz-hi 102400.0 + :knocked-hard-vy-lo 40960.0 + :knocked-hard-vy-hi 81920.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 8192.0 + :knocked-yellow-vxz-hi 16384.0 + :knocked-yellow-vy-lo 12288.0 + :knocked-yellow-vy-hi 24576.0 + :knocked-red-vxz-lo 12288.0 + :knocked-red-vxz-hi 24576.0 + :knocked-red-vy-lo 20480.0 + :knocked-red-vy-hi 36864.0 + :knocked-blue-vxz-lo 16384.0 + :knocked-blue-vxz-hi 32768.0 + :knocked-blue-vy-lo 16384.0 + :knocked-blue-vy-hi 32768.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 #f + :use-pacing #f + :walk-anim 11 + :turn-anim 11 + :run-anim 15 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 2) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :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! (-> *citizen-fat-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 26 of type citizen-fat +(defmethod get-inv-mass citizen-fat ((obj citizen-fat)) + 0.5 + ) + +;; definition for method 51 of type citizen-fat +;; INFO: Used lq/sq +(defmethod enemy-method-51 citizen-fat ((obj citizen-fat)) + (let ((f30-0 (quaternion-y-angle (-> obj root-override2 quat)))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (let ((a0-5 (handle->process (-> obj focus handle)))) + (when a0-5 + (get-trans (the-as process-focusable a0-5) 0) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot + (-> obj root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat)) + ) + 0.0 + ) + (vector-negate-in-place! s5-0) + ) + (set! f30-0 (atan (-> s5-0 x) (-> s5-0 z))) + ) + ) + ) + ) + (else + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot s5-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) 0.0) + (vector-negate-in-place! s5-1) + ) + (let* ((f28-0 (atan (-> s5-1 x) (-> s5-1 z))) + (f1-2 (deg- f30-0 f28-0)) + (f2-0 (fabs f1-2)) + (f0-8 (-> obj enemy-info-override knocked-seek-ry-clamp)) + ) + (when (and (< f0-8 f2-0) (< f2-0 (- 32768.0 f0-8))) + (set! f30-0 (+ (cond + ((< f2-0 16384.0) + (if (>= f1-2 0.0) + f0-8 + (- f0-8) + ) + ) + ((>= f1-2 0.0) + (- 32768.0 f0-8) + ) + (else + (+ -32768.0 f0-8) + ) + ) + f28-0 + ) + ) + (if (< f30-0 0.0) + (set! f30-0 (+ 65536.0 f30-0)) + ) + ) + ) + ) + ) + ) + f30-0 + ) + ) + +;; definition for method 79 of type citizen-fat +(defmethod enemy-method-79 citizen-fat ((obj citizen-fat) (arg0 int) (arg1 enemy-knocked-info)) + (case arg0 + ((1) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((s5-0 (ja-done? 0))) + (let ((a0-4 (-> obj skel root-channel 0))) + (set! (-> a0-4 param 0) (the float (+ (-> a0-4 frame-group frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-4 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s5-0 + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + ) + (set! (-> a0-6 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + frames + num-frames + ) + -1 + ) + ) + ) + (set! (-> a0-6 param 1) (-> arg1 anim-speed)) + (set! (-> a0-6 frame-num) 3.0) + (joint-control-channel-group! + a0-6 + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + num-func-seek! + ) + ) + ) + s5-0 + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + +;; definition for method 77 of type citizen-fat +(defmethod enemy-method-77 citizen-fat ((obj citizen-fat) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-0 (ash 1 (-> obj info prev-yellow-hit))) + (v1-3 (enemy-method-120 obj 1 a2-0)) + (a1-7 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-3 8)) (the-as uint (-> obj info)))) + yellow-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-yellow-hit) v1-3) + (let ((a0-15 (-> obj skel root-channel 0))) + (set! (-> a0-15 frame-group) (the-as art-joint-anim a1-7)) + (set! (-> a0-15 param 0) (the float (+ (-> (the-as art-joint-anim a1-7) 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-7) num-func-seek!) + ) + ) + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-2 (ash 1 (-> obj info prev-blue-hit))) + (v1-12 (enemy-method-120 obj 3 a2-2)) + (a1-14 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-12 8)) (the-as uint (-> obj info)))) + blue-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-blue-hit) v1-12) + (let ((a0-30 (-> obj skel root-channel 0))) + (set! (-> a0-30 frame-group) (the-as art-joint-anim a1-14)) + (set! (-> a0-30 param 0) (the float (+ (-> (the-as art-joint-anim a1-14) frames num-frames) -1))) + (set! (-> a0-30 param 1) 1.0) + (set! (-> a0-30 frame-num) 0.0) + (joint-control-channel-group! a0-30 (the-as art-joint-anim a1-14) num-func-seek!) + ) + ) + ) + (else + (let ((s4-0 (if (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-39 (-> obj skel root-channel 0))) + (set! (-> a0-39 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-39 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-39 param 1) (-> arg0 0)) + (set! (-> a0-39 frame-num) 0.0) + (joint-control-channel-group! a0-39 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + #t + ) + +;; definition for method 78 of type citizen-fat +(defmethod enemy-method-78 citizen-fat ((obj citizen-fat) (arg0 (pointer float))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + ) + (set! (-> a0-2 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + 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 (-> obj info knocked-land (-> obj hit-face)))) + num-func-seek! + ) + ) + #t + ) + +;; failed to figure out what this is: +(defstate knocked (citizen-fat) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type civilian knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (the-as collide-shape-prim-group (-> self root-override2 root-prim)))) + (logior! (-> v1-5 child 0 prim-core action) (collide-action no-standon)) + (logclear! (-> v1-5 child 1 prim-core action) (collide-action no-standon)) + (set! (-> v1-5 child 1 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 child 1 prim-core collide-with) (collide-spec)) + ) + 0 + (none) + ) + ) + +;; failed to figure out what this is: +(defstate get-up-front (citizen-fat) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-front) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate get-up-back (citizen-fat) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-back) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate wait (citizen-fat) + :virtual #t + :trans (behavior () + '() + (none) + ) + :code (behavior () + (until #f + (let ((f30-1 (/ 1.0 (rand-vu-float-range 10.0 13.0))) + (gp-0 (rand-vu-int-range 1 5)) + (s5-0 (rand-vu-int-count 2)) + ) + (ja-channel-push! 1 (seconds 0.2)) + (if (zero? s5-0) + (ja-no-eval :group! citizen-fat-idle-to-arms-hips-ja :num! min) + (ja-no-eval :group! citizen-fat-idle-to-arms-crossed-ja :num! min) + ) + (let ((f28-0 0.0)) + (while (< f28-0 1.0) + (ja :num-func num-func-identity + :frame-num (lerp-scale 0.0 2.0 (+ (* -2.0 f28-0 f28-0 f28-0) (* 3.0 f28-0 f28-0)) 0.0 1.0) + ) + (suspend) + (+! f28-0 (-> self clock seconds-per-frame)) + ) + ) + (ja-channel-push! 1 (seconds 0.1)) + (while (> gp-0 0) + (+! gp-0 -1) + (cond + ((zero? s5-0) + (ja-no-eval :group! citizen-fat-arms-hips-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-fat-arms-hips-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (else + (ja-no-eval :group! citizen-fat-arms-crossed-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-fat-arms-crossed-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + ) + ) + ) + (if (-> self wait-return-state) + (go (-> self wait-return-state)) + ) + ) + #f + (none) + ) + ) + +;; definition for method 114 of type citizen-fat +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! citizen-fat ((obj citizen-fat)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec civilian)) + (set! (-> s4-0 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> s4-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 8192.0 0.0 12288.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 civilian)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 4096.0 0.0 4096.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 civilian)) + (set! (-> v1-15 prim-core collide-with) (collide-spec backgnd jak player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 0.0 4096.0) + ) + (set! (-> s5-0 nav-radius) 4096.0) + (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 citizen-fat +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! citizen-fat ((obj citizen-fat)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-citizen-fat" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *citizen-fat-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 speed-scale) 1.0) + ) + 0 + (set! (-> obj draw lod-set lod 0 dist) 204800.0) + (set! (-> obj draw lod-set lod 1 dist) 491520.0) + (set! (-> obj info) *citizen-fat-global-info*) + (try-update-focus (-> obj focus) *target* obj) + (set-vector! (-> obj neck twist-max) 10922.667 18204.445 0.0 1.0) + (set! (-> obj anim-shuffle) 12) + (let ((v1-18 (get-rand-int obj 3))) + (cond + ((zero? v1-18) + (set! (-> obj anim-walk) 11) + (set! (-> obj dist-walk-anim) 16384.0) + (set! (-> obj speed-walk) 12288.0) + ) + ((= v1-18 1) + (set! (-> obj anim-walk) 13) + (set! (-> obj dist-walk-anim) 16384.0) + (set! (-> obj speed-walk) 12288.0) + ) + ((= v1-18 2) + (set! (-> obj anim-walk) 14) + (set! (-> obj dist-walk-anim) 16384.0) + (set! (-> obj speed-walk) 12288.0) + ) + ) + ) + (let ((v1-33 (get-rand-int obj 3))) + (cond + ((zero? v1-33) + (set! (-> obj anim-panic-run) 17) + ) + ((= v1-33 1) + (set! (-> obj anim-panic-run) 17) + ) + ((= v1-33 2) + (set! (-> obj anim-panic-run) 15) + ) + ) + ) + (set! (-> obj dist-run-anim) 20480.0) + (let ((v1-40 (get-rand-int obj 3))) + (cond + ((zero? v1-40) + (set! (-> obj anim-run) 15) + ) + ((= v1-40 1) + (set! (-> obj anim-run) 16) + ) + ((= v1-40 2) + (set! (-> obj anim-run) 16) + ) + ) + ) + (set! (-> obj speed-run) 32768.0) + (set! (-> obj anim-on-ground) 19) + (set! (-> obj anim-dive) 18) + (set! (-> obj anim-get-up-back) 25) + (set! (-> obj anim-get-up-front) 24) + (let ((f30-0 (get-rand-float-range obj 1.0 1.25)) + (f0-15 (get-rand-float-range obj 1.0 1.25)) + ) + (set-vector! (-> obj root-override2 scale) f0-15 f30-0 f0-15 1.0) + ) + (let ((f0-17 (get-rand-float-range obj 0.9 1.0))) + (set-vector! (-> obj draw color-mult) f0-17 f0-17 f0-17 1.0) + ) + (set! (-> obj water-anim) 32) + 0 + (none) + ) + +;; definition for method 181 of type citizen-fat +;; WARN: Return type mismatch int vs none. +(defmethod citizen-init! citizen-fat ((obj citizen-fat)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type civilian citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj dive-reaction) (* 0.2 (rand-vu))) + (logclear! (-> obj mask) (process-mask enemy)) + (setup-masks (-> obj draw) 0 -1) + (let ((v1-7 (get-rand-int obj 2))) + (cond + ((zero? v1-7) + (setup-masks (-> obj draw) 8 0) + (let ((v1-11 (get-rand-int obj 3))) + (cond + ((zero? v1-11) + (setup-masks (-> obj draw) 4 0) + ) + ((= v1-11 1) + (setup-masks (-> obj draw) 256 0) + ) + ((= v1-11 2) + (setup-masks (-> obj draw) #x8000 0) + ) + ) + ) + (let ((v1-20 (get-rand-int obj 4))) + (cond + ((zero? v1-20) + (setup-masks (-> obj draw) 2 0) + ) + ((= v1-20 1) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-20 2) + (setup-masks (-> obj draw) 130 0) + ) + ) + ) + (setup-masks (-> obj draw) 512 0) + (let ((v1-31 (get-rand-int obj 3))) + (cond + ((zero? v1-31) + (setup-masks (-> obj draw) 64 0) + ) + ((= v1-31 1) + (setup-masks (-> obj draw) 4096 0) + ) + ((= v1-31 2) + (setup-masks (-> obj draw) 8192 0) + ) + ) + ) + (let ((v1-40 (get-rand-int obj 3))) + (cond + ((zero? v1-40) + (setup-masks (-> obj draw) 32 0) + ) + ((= v1-40 1) + (setup-masks (-> obj draw) 2048 0) + ) + ((= v1-40 2) + (setup-masks (-> obj draw) #x20000 0) + ) + ) + ) + (let ((v1-49 (get-rand-int obj 3))) + (cond + ((zero? v1-49) + (setup-masks (-> obj draw) 16 0) + ) + ((= v1-49 1) + (setup-masks (-> obj draw) 1024 0) + ) + ((= v1-49 2) + (setup-masks (-> obj draw) #x10000 0) + ) + ) + ) + ) + ((= v1-7 1) + (setup-masks (-> obj draw) #x400000 0) + (setup-masks (-> obj draw) #x200000 0) + (let ((v1-63 (get-rand-int obj 2))) + (cond + ((zero? v1-63) + (setup-masks (-> obj draw) 4096 0) + ) + ((= v1-63 1) + (setup-masks (-> obj draw) #x80000 0) + ) + ) + ) + (let ((v1-70 (get-rand-int obj 2))) + (cond + ((zero? v1-70) + (setup-masks (-> obj draw) 256 0) + ) + ((= v1-70 1) + (setup-masks (-> obj draw) #x100000 0) + ) + ) + ) + (let ((v1-77 (get-rand-int obj 4))) + (cond + ((zero? v1-77) + (setup-masks (-> obj draw) 2 0) + ) + ((= v1-77 1) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-77 2) + (setup-masks (-> obj draw) 130 0) + ) + ) + ) + (if (zero? (get-rand-int obj 1)) + (setup-masks (-> obj draw) #x20000 0) + ) + (let ((v1-91 (get-rand-int obj 3))) + (cond + ((zero? v1-91) + (setup-masks (-> obj draw) 16 0) + ) + ((= v1-91 1) + (setup-masks (-> obj draw) 1024 0) + ) + ((= v1-91 2) + (setup-masks (-> obj draw) #x10000 0) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/city/common/citizen-h_REF.gc b/test/decompiler/reference/jak2/levels/city/common/citizen-h_REF.gc index 45670578fb..7a03b11714 100644 --- a/test/decompiler/reference/jak2/levels/city/common/citizen-h_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/citizen-h_REF.gc @@ -10,7 +10,7 @@ (speed-scale float :offset-assert 612) (controller vehicle-controller :inline :offset-assert 624) (danger-pos sphere :inline :offset-assert 768) - (vehicle int64 :offset-assert 784) + (vehicle handle :offset-assert 784) (anim-shuffle int32 :offset-assert 792) (dist-walk-anim float :offset-assert 796) (speed-walk float :offset-assert 800) @@ -23,7 +23,7 @@ (last-danger-time time-frame :offset-assert 832) (next-time-look-at time-frame :offset-assert 840) (stop-time-look-at time-frame :offset-assert 848) - (wait-return-state symbol :offset-assert 856) + (wait-return-state (state citizen) :offset-assert 856) (wait-time time-frame :offset-assert 864) (cp-valid? symbol :offset-assert 872) (cp-sphere sphere :inline :offset-assert 880) @@ -39,29 +39,29 @@ :size-assert #x3c4 :flag-assert #xc9035003c4 (:methods - (citizen-method-178 () none 178) - (citizen-method-179 () none 179) - (citizen-method-180 () none 180) - (citizen-method-181 () none 181) - (citizen-method-182 () none 182) - (citizen-method-183 () none 183) - (citizen-method-184 () none 184) - (citizen-method-185 () none 185) - (citizen-method-186 () none 186) - (citizen-method-187 () none 187) - (citizen-method-188 () none 188) - (citizen-method-189 () none 189) - (citizen-method-190 () none 190) - (citizen-method-191 () none 191) - (citizen-method-192 () none 192) - (citizen-method-193 () none 193) - (citizen-method-194 () none 194) - (citizen-method-195 () none 195) - (citizen-method-196 () none 196) - (citizen-method-197 () none 197) - (citizen-method-198 () none 198) - (citizen-method-199 () none 199) - (citizen-method-200 () none 200) + (wait () _type_ :state 178) + (inactive () _type_ :state 179) + (in-ditch () _type_ :state 180) + (citizen-init! (_type_) none 181) + (citizen-nav-init! (_type_) none 182) + (go-inactive (_type_) none 183) + (find-segment (_type_ vector vector) nav-segment 184) + (nav-segment-callback (_type_ vector traffic-find-segment-struct (function traffic-find-segment-struct nav-segment none)) none 185) + (citizen-method-186 (_type_ nav-segment) none 186) + (citizen-method-187 (_type_) symbol 187) + (citizen-method-188 (_type_ vector) none 188) + (calc-danger-vec (_type_ vector vector) none 189) + (citizen-method-190 (_type_ vector) none 190) + (gen-clear-path (_type_) nav-segment 191) + (citizen-method-192 (_type_) none 192) + (throw-off-vehicle (_type_) none 193) + (gen-new-dir (_type_ vector float) nav-segment 194) + (citizen-method-195 (_type_ vector) symbol 195) + (get-run-anim (_type_) int 196) + (trigger-alert (_type_ int target) none 197) + (decrease-alert (_type_ object) none 198) + (set-behavior! (_type_ traffic-object-spawn-params) none 199) + (citizen-method-200 (_type_) none 200) ) ) diff --git a/test/decompiler/reference/jak2/levels/city/common/citizen-norm_REF.gc b/test/decompiler/reference/jak2/levels/city/common/citizen-norm_REF.gc new file mode 100644 index 0000000000..7f60fa61f8 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/city/common/citizen-norm_REF.gc @@ -0,0 +1,980 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defskelgroup skel-citizen-norm citizen-norm citizen-norm-lod0-jg -1 + ((citizen-norm-lod0-mg (meters 20)) (citizen-norm-lod2-mg (meters 999999))) + :bounds (static-spherem 0 2 0 3) + :shadow citizen-norm-shadow-mg + ) + +;; definition for symbol *citizen-norm-global-info*, type civilian-global-info +(define *citizen-norm-global-info* + (new 'static 'civilian-global-info + :knocked (new 'static 'array int32 2 18 20) + :knocked-land (new 'static 'array int32 2 19 21) + :yellow-hit-anim (new 'static 'inline-array civilian-anim-info 1 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 18 20)) + ) + :blue-hit-anim (new 'static 'inline-array civilian-anim-info 3 + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 24 24)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 24 24)) + (new 'static 'civilian-anim-info :anim-index (new 'static 'array int32 2 24 24)) + ) + :anim-cover-head-start 26 + :anim-cover-head-loop 27 + :anim-cover-head-end 28 + :car-stance-anim 31 + :bike-stance-anim 30 + :get-in-car-anim 32 + :seat-flag #x2 + :speech-ambient #xf + :speech-alert #x10 + :speech-cower #x11 + :speech-touched-by-player #x12 + :speech-shot-by-player #x13 + :speech-avoiding-player-vehicle #x14 + :speech-hit-by-player-vehicle #x15 + ) + ) + +;; definition of type citizen-norm +(deftype citizen-norm (civilian) + () + :heap-base #x3b0 + :method-count-assert 219 + :size-assert #x424 + :flag-assert #xdb03b00424 + (:methods + (knocked-off-vehicle () _type_ :state 218) + ) + ) + +;; definition for method 3 of type citizen-norm +(defmethod inspect citizen-norm ((obj citizen-norm)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type civilian inspect))) + (t9-0 obj) + ) + (label cfg-4) + obj + ) + +;; definition for symbol *citizen-norm-nav-enemy-info*, type nav-enemy-info +(define *citizen-norm-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 idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x4 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 4 + :notice-anim 4 + :hostile-anim -1 + :hit-anim 4 + :knocked-anim 18 + :knocked-land-anim 19 + :die-anim 4 + :die-falling-anim 4 + :victory-anim 4 + :jump-wind-up-anim 12 + :jump-in-air-anim 12 + :jump-land-anim 12 + :neck-joint 5 + :look-at-joint 5 + :bullseye-joint 4 + :notice-distance (meters 10) + :notice-distance-delta (meters 0.1) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :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 32768.0 + :knocked-soft-vxz-hi 49152.0 + :knocked-soft-vy-lo 36864.0 + :knocked-soft-vy-hi 73728.0 + :knocked-medium-vxz-lo 81920.0 + :knocked-medium-vxz-hi 143360.0 + :knocked-medium-vy-lo 49152.0 + :knocked-medium-vy-hi 102400.0 + :knocked-hard-vxz-lo 102400.0 + :knocked-hard-vxz-hi 122880.0 + :knocked-hard-vy-lo 81920.0 + :knocked-hard-vy-hi 102400.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 16384.0 + :knocked-yellow-vxz-hi 32768.0 + :knocked-yellow-vy-lo 24576.0 + :knocked-yellow-vy-hi 49152.0 + :knocked-red-vxz-lo 40960.0 + :knocked-red-vxz-hi 61440.0 + :knocked-red-vy-lo 36864.0 + :knocked-red-vy-hi 73728.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 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 #t + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 12 + :turn-anim 12 + :run-anim 14 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 2) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 2) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 10) + :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! (-> *citizen-norm-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 51 of type citizen-norm +;; INFO: Used lq/sq +(defmethod enemy-method-51 citizen-norm ((obj citizen-norm)) + (cond + ((logtest? (-> obj flags) (citizen-flag knocked-out-car knocked-out-bike)) + ((method-of-type nav-enemy enemy-method-51) obj) + ) + (else + (let ((f30-0 (quaternion-y-angle (-> obj root-override2 quat)))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-6)) + (let ((a0-6 (handle->process (-> obj focus handle)))) + (when a0-6 + (get-trans (the-as process-focusable a0-6) 0) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot + (-> obj root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat)) + ) + 0.0 + ) + (vector-negate-in-place! s5-0) + ) + (set! f30-0 (atan (-> s5-0 x) (-> s5-0 z))) + ) + ) + ) + ) + (else + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set! (-> s5-1 quad) (-> obj root-override2 transv quad)) + (if (< (vector-dot s5-1 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) 0.0) + (vector-negate-in-place! s5-1) + ) + (let* ((f28-0 (atan (-> s5-1 x) (-> s5-1 z))) + (f1-2 (deg- f30-0 f28-0)) + (f2-0 (fabs f1-2)) + (f0-8 (-> obj enemy-info-override knocked-seek-ry-clamp)) + ) + (when (and (< f0-8 f2-0) (< f2-0 (- 32768.0 f0-8))) + (set! f30-0 (+ (cond + ((< f2-0 16384.0) + (if (>= f1-2 0.0) + f0-8 + (- f0-8) + ) + ) + ((>= f1-2 0.0) + (- 32768.0 f0-8) + ) + (else + (+ -32768.0 f0-8) + ) + ) + f28-0 + ) + ) + (if (< f30-0 0.0) + (set! f30-0 (+ 65536.0 f30-0)) + ) + ) + ) + ) + ) + ) + f30-0 + ) + ) + ) + ) + +;; definition for method 79 of type citizen-norm +(defmethod enemy-method-79 citizen-norm ((obj citizen-norm) (arg0 int) (arg1 enemy-knocked-info)) + (case arg0 + ((1) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (let ((s5-0 (ja-done? 0))) + (let ((a0-4 (-> obj skel root-channel 0))) + (set! (-> a0-4 param 0) (the float (+ (-> a0-4 frame-group frames num-frames) -1))) + (set! (-> a0-4 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! a0-4 (the-as art-joint-anim #f) num-func-seek!) + ) + (when s5-0 + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-6 (-> obj skel root-channel 0))) + (set! (-> a0-6 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + ) + (set! (-> a0-6 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + frames + num-frames + ) + -1 + ) + ) + ) + (set! (-> a0-6 param 1) (-> arg1 anim-speed)) + (set! (-> a0-6 frame-num) 3.0) + (joint-control-channel-group! + a0-6 + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + num-func-seek! + ) + ) + ) + s5-0 + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + (else + ((method-of-type nav-enemy enemy-method-79) obj arg0 arg1) + ) + ) + ) + +;; definition for method 77 of type citizen-norm +(defmethod enemy-method-77 citizen-norm ((obj citizen-norm) (arg0 (pointer float))) + (local-vars (v1-36 knocked-type)) + (cond + ((logtest? (-> obj flags) (citizen-flag knocked-out-car)) + (ja-channel-push! 1 (seconds 0.1)) + (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!) + ) + (logclear! (-> obj flags) (citizen-flag knocked-out-car)) + ) + ((logtest? (-> obj flags) (citizen-flag knocked-out-bike)) + (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 34))) + (set! (-> a0-5 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 34)) 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 34)) num-func-seek!) + ) + (logclear! (-> obj flags) (citizen-flag knocked-out-bike)) + ) + ((begin (set! v1-36 (-> obj incoming knocked-type)) (= v1-36 (knocked-type knocked-type-4))) + (ja-channel-push! 1 (seconds 0.1)) + (let* ((a2-2 (ash 1 (-> obj info prev-yellow-hit))) + (v1-39 (enemy-method-120 obj 1 a2-2)) + (a1-11 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-39 8)) (the-as uint (-> obj info)))) + yellow-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-yellow-hit) v1-39) + (let ((a0-21 (-> obj skel root-channel 0))) + (set! (-> a0-21 frame-group) (the-as art-joint-anim a1-11)) + (set! (-> a0-21 param 0) (the float (+ (-> (the-as art-joint-anim a1-11) frames num-frames) -1))) + (set! (-> a0-21 param 1) (-> arg0 0)) + (set! (-> a0-21 frame-num) 0.0) + (joint-control-channel-group! a0-21 (the-as art-joint-anim a1-11) num-func-seek!) + ) + ) + ) + ((= v1-36 (knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let* ((a2-4 (ash 1 (-> obj info prev-blue-hit))) + (v1-48 (enemy-method-120 obj 3 a2-4)) + (a1-18 + (-> obj + draw + art-group + data + (-> (the-as civilian-global-info (+ (+ (* (-> obj hit-face) 4) (* v1-48 8)) (the-as uint (-> obj info)))) + blue-hit-anim + 0 + anim-index-front + ) + ) + ) + ) + (set! (-> obj info prev-blue-hit) v1-48) + (let ((a0-36 (-> obj skel root-channel 0))) + (set! (-> a0-36 frame-group) (the-as art-joint-anim a1-18)) + (set! (-> a0-36 param 0) (the float (+ (-> (the-as art-joint-anim a1-18) frames num-frames) -1))) + (set! (-> a0-36 param 1) 1.0) + (set! (-> a0-36 frame-num) 0.0) + (joint-control-channel-group! a0-36 (the-as art-joint-anim a1-18) num-func-seek!) + ) + ) + ) + (else + (let ((s4-0 (if (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))) + ) + ) + ) + (ja-channel-push! 1 (seconds 0.1)) + (if (or (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (= (-> obj incoming knocked-type) (knocked-type knocked-type-3)) + ) + (set! (-> arg0 0) (* 0.5 (-> arg0 0))) + ) + (let ((a0-47 (-> obj skel root-channel 0))) + (set! (-> a0-47 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-47 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-47 param 1) (-> arg0 0)) + (set! (-> a0-47 frame-num) 0.0) + (joint-control-channel-group! a0-47 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + ) + ) + #t + ) + +;; definition for method 78 of type citizen-norm +(defmethod enemy-method-78 citizen-norm ((obj citizen-norm) (arg0 (pointer float))) + (ja-channel-push! 1 (seconds 0.1)) + (set! (-> arg0 0) 1.0) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) + (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + ) + (set! (-> a0-2 param 0) + (the float + (+ (-> (the-as art-joint-anim (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + 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 (-> obj info knocked-land (-> obj hit-face)))) + num-func-seek! + ) + ) + #t + ) + +;; failed to figure out what this is: +(defstate knocked (citizen-norm) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type civilian knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (the-as collide-shape-prim-group (-> self root-override2 root-prim)))) + (logior! (-> v1-5 child 0 prim-core action) (collide-action no-standon)) + (logclear! (-> v1-5 child 1 prim-core action) (collide-action no-standon)) + (set! (-> v1-5 child 1 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 child 1 prim-core collide-with) (collide-spec)) + ) + 0 + (none) + ) + ) + +;; failed to figure out what this is: +(defstate get-up-front (citizen-norm) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-front) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate get-up-back (citizen-norm) + :virtual #t + :exit (behavior () + (let ((t9-0 (-> (method-of-type civilian get-up-back) exit))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-5) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-as) (collide-spec civilian)) + (set! (-> (the-as collide-shape-prim-group v1-5) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate wait (citizen-norm) + :virtual #t + :trans (behavior () + '() + (none) + ) + :code (behavior () + (until #f + (let ((f30-1 (/ 1.0 (rand-vu-float-range 10.0 13.0))) + (gp-0 (rand-vu-int-range 1 5)) + (s5-0 (rand-vu-int-count 2)) + ) + (ja-channel-push! 1 (seconds 0.2)) + (if (zero? s5-0) + (ja-no-eval :group! citizen-norm-idle-to-arms-hips-ja :num! min) + (ja-no-eval :group! citizen-norm-idle-to-arms-crossed-ja :num! min) + ) + (let ((f28-0 0.0)) + (while (< f28-0 1.0) + (ja :num-func num-func-identity + :frame-num (lerp-scale 0.0 2.0 (+ (* -2.0 f28-0 f28-0 f28-0) (* 3.0 f28-0 f28-0)) 0.0 1.0) + ) + (suspend) + (+! f28-0 (-> self clock seconds-per-frame)) + ) + ) + (ja-channel-push! 1 (seconds 0.1)) + (while (> gp-0 0) + (+! gp-0 -1) + (cond + ((zero? s5-0) + (ja-no-eval :group! citizen-norm-arms-hips-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-norm-arms-hips-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (else + (ja-no-eval :group! citizen-norm-arms-crossed-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim citizen-norm-arms-crossed-ja) frames num-frames) -1)) f30-1) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + ) + ) + ) + (if (-> self wait-return-state) + (go (-> self wait-return-state)) + ) + ) + #f + (none) + ) + ) + +;; definition for method 199 of type citizen-norm +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod set-behavior! citizen-norm ((obj citizen-norm) (arg0 traffic-object-spawn-params)) + (case (-> arg0 behavior) + ((11) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-1 speech-type-2 speech-type-4)) + (set! (-> obj root-override2 trans quad) (-> arg0 position quad)) + (quaternion-copy! (-> obj root-override2 quat) (-> arg0 rotation)) + (set! (-> obj vehicle) (-> arg0 handle)) + (ja-channel-set! 1) + (case (-> (the-as vehicle (handle->process (-> obj vehicle))) info-override object-type) + ((11 12 13) + (logior! (-> obj flags) (citizen-flag knocked-out-bike)) + (let ((v1-16 (-> obj skel root-channel 0))) + (set! (-> v1-16 frame-group) (the-as art-joint-anim (-> obj draw art-group data 30))) + ) + ) + ((14 15 16) + (logior! (-> obj flags) (citizen-flag knocked-out-car)) + (let ((v1-22 (-> obj skel root-channel 0))) + (set! (-> v1-22 frame-group) (the-as art-joint-anim (-> obj draw art-group data 31))) + ) + ) + ) + (ja-post) + (setup-masks (-> obj draw) 0 -1) + (let ((s5-1 (-> arg0 user-data))) + (if (not (logtest? s5-1 32)) + (setup-masks (-> obj draw) 32 0) + ) + (if (not (logtest? s5-1 16)) + (setup-masks (-> obj draw) 16 0) + ) + (if (not (logtest? s5-1 2)) + (setup-masks (-> obj draw) 2 0) + ) + (if (not (logtest? s5-1 4096)) + (setup-masks (-> obj draw) 8192 0) + ) + (if (not (logtest? s5-1 8)) + (setup-masks (-> obj draw) 8 0) + ) + (if (not (logtest? s5-1 512)) + (setup-masks (-> obj draw) 1024 0) + ) + (if (not (logtest? s5-1 #x4000)) + (setup-masks (-> obj draw) #x8000 0) + ) + (if (not (logtest? s5-1 4)) + (setup-masks (-> obj draw) 4 0) + ) + (if (not (logtest? s5-1 256)) + (setup-masks (-> obj draw) 512 0) + ) + (if (not (logtest? s5-1 8192)) + (setup-masks (-> obj draw) #x4000 0) + ) + (if (not (logtest? s5-1 64)) + (setup-masks (-> obj draw) 128 0) + ) + (if (not (logtest? s5-1 2048)) + (setup-masks (-> obj draw) 4096 0) + ) + (if (not (logtest? #x10000 s5-1)) + (setup-masks (-> obj draw) #x20000 0) + ) + (if (not (logtest? s5-1 128)) + (setup-masks (-> obj draw) 256 0) + ) + (if (logtest? #x40000 s5-1) + (setup-masks (-> obj draw) 2048 0) + (setup-masks (-> obj draw) 2048 0) + ) + ) + (go (method-of-object obj knocked-off-vehicle)) + ) + (else + ((method-of-type civilian set-behavior!) obj arg0) + ) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate knocked-off-vehicle (citizen-norm) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior citizen-norm) enemy-event-handler) + :enter (behavior () + '() + (none) + ) + :code (behavior () + (suspend) + (throw-off-vehicle self) + (none) + ) + ) + +;; definition for method 114 of type citizen-norm +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! citizen-norm ((obj citizen-norm)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0))) + (set! (-> s5-0 total-prims) (the-as uint 3)) + (set! (-> s4-0 prim-core collide-as) (collide-spec civilian)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak civilian enemy 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 8192.0 0.0 12288.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 civilian)) + (set! (-> v1-13 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 4096.0 0.0 4096.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 civilian)) + (set! (-> v1-15 prim-core collide-with) + (collide-spec backgnd jak civilian enemy hit-by-others-list player-list) + ) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 0.0 4096.0) + ) + (set! (-> s5-0 nav-radius) 4096.0) + (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 citizen-norm +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! citizen-norm ((obj citizen-norm)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-citizen-norm" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *citizen-norm-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 speed-scale) 1.0) + ) + 0 + (set! (-> obj draw lod-set lod 0 dist) 204800.0) + (set! (-> obj draw lod-set lod 1 dist) 491520.0) + (try-update-focus (-> obj focus) *target* obj) + (-> obj neck) + (set! (-> obj info) *citizen-norm-global-info*) + (set! (-> obj anim-shuffle) 11) + (let ((v1-18 (get-rand-int obj 3))) + (cond + ((zero? v1-18) + (set! (-> obj anim-walk) 12) + (set! (-> obj dist-walk-anim) 8736.768) + (set! (-> obj speed-walk) 10240.0) + ) + ((= v1-18 1) + (set! (-> obj anim-walk) 13) + (set! (-> obj dist-walk-anim) 13107.2) + (set! (-> obj speed-walk) 12288.0) + ) + ((= v1-18 2) + (set! (-> obj anim-walk) 11) + (set! (-> obj dist-walk-anim) 4370.432) + (set! (-> obj speed-walk) 4096.0) + ) + ) + ) + (let ((v1-33 (get-rand-int obj 3))) + (cond + ((zero? v1-33) + (set! (-> obj anim-panic-run) 15) + ) + ((= v1-33 1) + (set! (-> obj anim-panic-run) 15) + ) + ((= v1-33 2) + (set! (-> obj anim-panic-run) 14) + ) + ) + ) + (set! (-> obj dist-run-anim) 28672.0) + (let ((v1-40 (get-rand-int obj 3))) + (cond + ((zero? v1-40) + (set! (-> obj anim-run) 14) + ) + ((= v1-40 1) + (set! (-> obj anim-run) 14) + ) + ((= v1-40 2) + (set! (-> obj anim-run) 14) + ) + ) + ) + (set! (-> obj speed-run) 49152.0) + (set! (-> obj anim-on-ground) 17) + (set! (-> obj anim-dive) 16) + (set! (-> obj anim-get-up-front) 22) + (set! (-> obj anim-get-up-back) 23) + (let ((f30-0 (get-rand-float-range obj 1.0 1.25)) + (f0-11 (get-rand-float-range obj 1.0 1.25)) + ) + (set-vector! (-> obj root-override2 scale) f0-11 f30-0 f0-11 1.0) + ) + (let ((f0-13 (get-rand-float-range obj 0.9 1.0))) + (set-vector! (-> obj draw color-mult) f0-13 f0-13 f0-13 1.0) + ) + (set! (-> obj water-anim) 29) + 0 + (none) + ) + +;; definition for method 181 of type citizen-norm +;; WARN: Return type mismatch int vs none. +(defmethod citizen-init! citizen-norm ((obj citizen-norm)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type civilian citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj dive-reaction) (+ 0.09 (* 0.15 (rand-vu)))) + (logclear! (-> obj mask) (process-mask enemy)) + (setup-masks (-> obj draw) 0 -1) + (setup-masks (-> obj draw) 32 0) + (let ((v1-10 (get-rand-int obj 4))) + (cond + ((zero? v1-10) + (setup-masks (-> obj draw) 64 0) + ) + ((= v1-10 1) + (setup-masks (-> obj draw) 2048 0) + ) + ((= v1-10 2) + (setup-masks (-> obj draw) #x10000 0) + ) + ((= v1-10 3) + (setup-masks (-> obj draw) #x200000 0) + ) + ) + ) + (let ((v1-21 (get-rand-int obj 3))) + (cond + ((zero? v1-21) + (setup-masks (-> obj draw) 2 0) + ) + ((= v1-21 1) + (setup-masks (-> obj draw) 8192 0) + ) + ((= v1-21 2) + (setup-masks (-> obj draw) #x40000 0) + ) + ) + ) + (let ((v1-30 (get-rand-int obj 4))) + (cond + ((zero? v1-30) + (setup-masks (-> obj draw) 8 0) + ) + ((= v1-30 1) + (setup-masks (-> obj draw) 1024 0) + ) + ((= v1-30 2) + (setup-masks (-> obj draw) #x8000 0) + ) + ((= v1-30 3) + (setup-masks (-> obj draw) #x100000 0) + ) + ) + ) + (let ((v1-41 (get-rand-int obj 5))) + (cond + ((zero? v1-41) + (setup-masks (-> obj draw) 4 0) + ) + ((= v1-41 1) + (setup-masks (-> obj draw) 512 0) + ) + ((= v1-41 2) + (setup-masks (-> obj draw) #x4000 0) + ) + ((= v1-41 3) + (setup-masks (-> obj draw) #x80000 0) + ) + ) + ) + (let ((v1-52 (get-rand-int obj 4))) + (cond + ((zero? v1-52) + (setup-masks (-> obj draw) 128 0) + ) + ((= v1-52 1) + (setup-masks (-> obj draw) 4096 0) + ) + ((= v1-52 2) + (setup-masks (-> obj draw) #x20000 0) + ) + ((= v1-52 3) + (setup-masks (-> obj draw) #x400000 0) + ) + ) + ) + (setup-masks (-> obj draw) 16 0) + (let ((v1-65 (get-rand-int obj 4))) + (cond + ((zero? v1-65) + (setup-masks (-> obj draw) 256 0) + ) + ((= v1-65 1) + (setup-masks (-> obj draw) #x800000 0) + ) + ) + ) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/city/common/citizen_REF.gc b/test/decompiler/reference/jak2/levels/city/common/citizen_REF.gc new file mode 100644 index 0000000000..cdef84911e --- /dev/null +++ b/test/decompiler/reference/jak2/levels/city/common/citizen_REF.gc @@ -0,0 +1,1716 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol *citizen-debug*, type symbol +(define *citizen-debug* #f) + +;; definition for method 182 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod citizen-nav-init! citizen ((obj citizen)) + "Initialize nav related fields." + (let ((v1-0 (-> obj nav))) + (logclear! (-> v1-0 flags) (nav-control-flag limit-rotation-rate output-sphere-hash)) + (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 ((a1-6 v1-0)) + (set! (-> a1-6 sphere-mask) (the-as uint #x800fe)) + ) + 0 + (let ((a1-8 v1-0)) + (set! (-> a1-8 nav-cull-radius) 12288.0) + ) + 0 + (logclear! (-> v1-0 flags) (nav-control-flag output-sphere-hash)) + ) + (set! (-> obj enemy-info-override callback-info) *nav-enemy-physics-callback-info*) + (let ((v1-2 obj)) + (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 + 0 + (none) + ) + +;; definition for method 181 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod citizen-init! citizen ((obj citizen)) + "Initialize [[citizen]] defaults." + (set! (-> obj fact-info-override enemy-options) + (logior (enemy-option knocked-into-water) (-> obj fact-info-override enemy-options)) + ) + (if (-> obj skel effect) + (logclear! (-> obj skel effect flags) (effect-control-flag ecf2)) + ) + (set! (-> obj draw death-draw-overlap) (the-as uint 0)) + (set! (-> obj draw death-timer) (the-as uint 0)) + (set! (-> obj draw death-timer-org) (the-as uint 0)) + (set! (-> obj draw death-vertex-skip) (the-as uint 0)) + (set! (-> obj draw death-effect) (the-as uint 0)) + (logclear! (-> obj focus-status) (focus-status disable dead inactive hit)) + (logclear! (-> obj flags) (citizen-flag persistent in-pursuit hostile)) + (clear-focused (-> obj focus)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logand (enemy-flag dislike-combo) (-> obj enemy-flags)))) + (logclear! (-> obj draw status) (draw-control-status no-draw lod-set)) + (set! (-> obj draw death-timer) (the-as uint 0)) + (logior! (-> obj root-override2 nav-flags) (nav-flags has-root-sphere)) + (let ((v1-28 (-> obj root-override2 root-prim))) + (set! (-> v1-28 prim-core collide-as) (-> obj root-override2 backup-collide-as)) + (set! (-> v1-28 prim-core collide-with) (-> obj root-override2 backup-collide-with)) + ) + (set! (-> obj root-override2 penetrated-by) + (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (logior! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) + (logior! (-> obj focus-status) (focus-status dangerous)) + (logior! (-> obj enemy-flags) (enemy-flag check-water)) + (set! (-> obj enemy-flags) + (logior (enemy-flag check-water-backup no-initial-move-to-ground) (-> obj enemy-flags)) + ) + (set! (-> obj mask) (logior (process-mask collectable) (-> obj mask))) + (logior! (-> obj enemy-flags) (enemy-flag look-at-move-dest)) + (set! (-> obj hit-points) (-> obj enemy-info-override default-hit-points)) + (set! (-> obj fated-time) 0) + (set! (-> obj hit-by-player-count) 0) + (set-vector! (-> obj draw color-mult) 1.0 1.0 1.0 1.0) + (set-vector! (-> obj draw color-emissive) 0.0 0.0 0.0 1.0) + (update-transforms (-> obj root-override2)) + 0 + (none) + ) + +;; definition for method 57 of type citizen +;; WARN: Return type mismatch int vs enemy-aware. +(defmethod update-target-awareness! citizen ((obj citizen) (arg0 process-focusable) (arg1 enemy-best-focus)) + "Checks a variety of criteria to determine the level of awareness the enemy is of the target. Sets `aware` and related fields as well! +@TODO - flesh out docs +@returns the value that sets `aware`" + (when arg1 + (let ((f0-0 (vector-vector-distance (get-trans arg0 0) (-> obj root-override2 trans)))) + (when (< f0-0 (-> arg1 rating)) + (set! (-> arg1 rating) f0-0) + (set! (-> arg1 proc) arg0) + (set! (-> arg1 aware) (enemy-aware enemy-aware-3)) + ) + ) + ) + (the-as enemy-aware 3) + ) + +;; definition for method 61 of type citizen +(defmethod enemy-method-61 citizen ((obj citizen) (arg0 int)) + 3 + ) + +;; definition for method 67 of type citizen +;; WARN: Return type mismatch object vs none. +(defmethod go-stare citizen ((obj citizen)) + (go (method-of-object obj flee)) + (none) + ) + +;; definition for method 70 of type citizen +(defmethod go-hostile citizen ((obj citizen)) + (go-inactive obj) + (none) + ) + +;; definition for method 71 of type citizen +;; WARN: Return type mismatch object vs none. +(defmethod go-flee citizen ((obj citizen)) + (go (method-of-object obj flee)) + (none) + ) + +;; definition for method 72 of type citizen +;; WARN: Return type mismatch object vs none. +(defmethod react-to-focus citizen ((obj citizen)) + "@TODO - flesh out docs" + (go (method-of-object obj active)) + (none) + ) + +;; definition for method 73 of type citizen +;; WARN: Return type mismatch none vs object. +(defmethod kill-prefer-falling citizen ((obj citizen)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + (logclear! (-> obj flags) (citizen-flag persistent)) + (send-event (ppointer->process (-> obj parent)) 'child-killed) + (the-as object (go-inactive obj)) + ) + +;; definition for method 17 of type citizen +(defmethod cleanup-for-death citizen ((obj citizen)) + (logclear! (-> obj flags) (citizen-flag persistent)) + (send-event (ppointer->process (-> obj parent)) 'child-killed) + (go-inactive obj) + (none) + ) + +;; definition for method 183 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod go-inactive citizen ((obj citizen)) + (vehicle-controller-method-11 (-> obj controller)) + (logior! (-> obj focus-status) (focus-status inactive)) + (set! (-> obj event-hook) (-> (method-of-object obj inactive) event)) + (go (method-of-object obj inactive)) + 0 + (none) + ) + +;; definition for method 197 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod trigger-alert citizen ((obj citizen) (arg0 int) (arg1 target)) + (let ((a0-1 (-> obj controller traffic))) + (when (and (nonzero? a0-1) arg1) + (if #t + (increase-alert-level a0-1 arg0 arg1) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 198 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod decrease-alert citizen ((obj citizen) (arg0 object)) + (let ((a0-1 (-> obj controller traffic))) + (if (nonzero? a0-1) + (decrease-alert-level a0-1 (the-as int arg0)) + ) + ) + 0 + (none) + ) + +;; definition for method 26 of type citizen +(defmethod get-inv-mass citizen ((obj citizen)) + 1.0 + ) + +;; definition for method 184 of type citizen +(defmethod find-segment citizen ((obj citizen) (arg0 vector) (arg1 vector)) + (find-best-segment (-> obj controller traffic) arg0 arg1 1) + ) + +;; definition for method 185 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod nav-segment-callback citizen ((obj citizen) + (arg0 vector) + (arg1 traffic-find-segment-struct) + (arg2 (function traffic-find-segment-struct nav-segment none)) + ) + (callback-on-nav-segments-in-sphere (-> obj controller traffic) arg0 1 arg1 arg2) + 0 + (none) + ) + +;; definition for method 186 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod citizen-method-186 citizen ((obj citizen) (arg0 nav-segment)) + (vehicle-controller-method-11 (-> obj controller)) + (vehicle-controller-method-13 (-> obj controller) (-> arg0 branch) (the-as vector (-> arg0 vertex))) + 0 + (none) + ) + +;; definition for method 187 of type citizen +(defmethod citizen-method-187 citizen ((obj citizen)) + (let* ((v1-0 (-> obj controller)) + (gp-1 (vector-! (new 'stack-no-clear 'vector) (-> v1-0 turn-exit-point) (-> v1-0 path-prev-point))) + (s5-1 (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) (-> v1-0 turn-exit-point))) + ) + (set! (-> s5-1 y) 0.0) + (set! (-> gp-1 y) 0.0) + (vector-xz-normalize! gp-1 1.0) + (< -16384.0 (vector-dot s5-1 gp-1)) + ) + ) + +;; definition for method 199 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod set-behavior! citizen ((obj citizen) (arg0 traffic-object-spawn-params)) + (let ((v1-0 (-> arg0 behavior))) + (cond + ((zero? v1-0) + (go (method-of-object obj idle)) + ) + ((= v1-0 2) + (go (method-of-object obj active)) + ) + ((= v1-0 3) + (go (method-of-object obj hostile)) + ) + (else + (go-inactive obj) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 74 of type citizen +;; 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: 193] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 198] +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 69] +(defmethod general-event-handler citizen ((obj citizen) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (let ((v1-0 arg2)) + (the-as + object + (cond + ((or (= v1-0 'hit) (= v1-0 'hit-flinch) (= v1-0 'hit-knocked)) + (let ((v1-1 #f)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) + (knocked-type knocked-type-6) + (knocked-type knocked-type-5) + (knocked-type knocked-type-2) + ) + (set! v1-1 #t) + ) + (((knocked-type knocked-type-0)) + (+! (-> obj hit-by-player-count) 1) + (set! v1-1 (>= (-> obj hit-by-player-count) 2)) + ) + ) + (when v1-1 + (let* ((s5-0 (handle->process (-> obj incoming attacker-handle))) + (a2-5 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (if a2-5 + (trigger-alert obj 1 (the-as target a2-5)) + ) + ) + ) + ) + (go (method-of-object obj knocked)) + ) + ((= v1-0 'traffic-off) + (if (not (logtest? (-> obj flags) (citizen-flag persistent))) + (go-inactive obj) + ) + ) + ((= v1-0 'traffic-off-force) + (go-inactive obj) + ) + ((= v1-0 'traffic-activate) + (set! (-> obj controller traffic) (the-as traffic-engine (-> arg3 param 1))) + (let ((s5-1 (the-as object (-> arg3 param 0)))) + (set! (-> obj root-override2 trans quad) (-> (the-as traffic-object-spawn-params s5-1) position quad)) + (quaternion-copy! (-> obj root-override2 quat) (-> (the-as traffic-object-spawn-params s5-1) rotation)) + (set! (-> obj root-override2 transv quad) (-> (the-as traffic-object-spawn-params s5-1) velocity quad)) + (let ((a0-24 (-> (the-as traffic-object-spawn-params s5-1) nav-mesh))) + (when a0-24 + (change-to a0-24 obj) + (if (not (-> obj nav)) + (go-inactive obj) + ) + (let ((v1-31 (-> obj nav state))) + (set! (-> v1-31 current-poly) (the-as nav-poly #f)) + ) + 0 + (let ((a1-11 (-> (the-as traffic-object-spawn-params s5-1) nav-branch))) + (when a1-11 + (vehicle-controller-method-13 (-> obj controller) a1-11 (-> obj root-override2 trans)) + (let ((a0-28 (-> obj nav state)) + (v1-38 (-> obj controller turn-exit-point)) + ) + (logclear! (-> a0-28 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-28 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-28 target-post quad) (-> v1-38 quad)) + ) + 0 + ) + ) + (citizen-nav-init! obj) + (citizen-init! obj) + (enemy-method-127 obj 40960.0 40960.0 #t (the-as collide-spec (-> obj gnd-collide))) + (set! (-> obj gnd-height) (-> obj root-override2 gspot-pos y)) + (set-behavior! obj (the-as traffic-object-spawn-params s5-1)) + ) + ) + ) + ) + ((= v1-0 'nav-mesh-kill) + (remove-process-drawable (-> obj nav state mesh) obj) + (set! (-> obj nav) #f) + (go-inactive obj) + #t + ) + (else + ((method-of-type nav-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + ) + +;; definition for method 200 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod citizen-method-200 citizen ((obj citizen)) + (with-pp + (set! (-> obj root-override2 transv x) 0.0) + (set! (-> obj root-override2 transv z) 0.0) + (when (-> obj enemy-info-override move-to-ground) + (if (logtest? (-> obj focus-status) (focus-status under-water)) + (enemy-method-47 obj (-> obj root-override2 transv)) + (+! (-> obj root-override2 transv y) + (* (-> obj enemy-info-override movement-gravity) (-> pp clock seconds-per-frame)) + ) + ) + ) + (let ((a2-0 (new 'stack-no-clear 'move-above-ground-params))) + (let ((v1-15 (-> obj enemy-info-override))) + (set! (-> a2-0 gnd-collide-with) (the-as collide-spec (-> obj gnd-collide))) + (set! (-> a2-0 popup) 8192.0) + (set! (-> a2-0 dont-move-if-overlaps?) #t) + (set! (-> a2-0 hover-if-no-ground?) (-> v1-15 hover-if-no-ground)) + (set! (-> a2-0 overlaps-params options) (overlaps-others-options oo0 oo2)) + (set! (-> a2-0 overlaps-params collide-with-filter) (-> v1-15 overlaps-others-collide-with-filter)) + ) + (set! (-> a2-0 overlaps-params tlist) *touching-list*) + (-> a2-0 overlaps-params) + (enemy-method-128 obj (-> obj root-override2 transv) a2-0) + ) + 0 + (none) + ) + ) + +;; definition for method 55 of type citizen +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod track-target! citizen ((obj citizen)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (with-pp + (when (< (-> obj next-time-look-at) (-> pp clock frame-counter)) + (when (nonzero? (-> obj neck)) + (let ((a0-4 (handle->process (-> obj focus handle)))) + (when a0-4 + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> (get-trans (the-as process-focusable a0-4) 2) quad)) + (if (and (-> obj next-state) (= (-> obj next-state name) 'flee)) + (set! (-> s5-0 quad) (-> obj danger-pos quad)) + ) + (when (< (vector-vector-distance s5-0 (-> obj root-override2 trans)) 122880.0) + (look-at-target! obj (enemy-flag lock-focus)) + (target-set! (-> obj neck) s5-0) + ) + ) + ) + ) + (when (< (-> obj stop-time-look-at) (-> pp clock frame-counter)) + (shut-down (-> obj neck)) + (set! (-> obj next-time-look-at) + (+ (-> pp clock frame-counter) (the int (* 300.0 (get-rand-float-range obj 0.0 20.0)))) + ) + (set! (-> obj stop-time-look-at) + (+ (-> obj next-time-look-at) (the int (* 300.0 (get-rand-float-range obj 5.0 10.0)))) + ) + ) + ) + ) + (let ((a0-18 (-> obj enemy-flags))) + (when (and (logtest? a0-18 (enemy-flag attackable-backup)) + (>= (- (-> pp clock frame-counter) (-> obj auto-reset-penetrate-time)) (seconds 0.1)) + ) + (set! (-> obj enemy-flags) (logclear a0-18 (enemy-flag attackable-backup))) + (set! (-> obj root-override2 penetrated-by) (get-penetrate-info obj)) + (let ((v1-50 0)) + (if (logtest? (penetrate knocked) (-> obj root-override2 penetrate-using)) + (set! v1-50 (logior (shl 1 32) v1-50)) + ) + (set! (-> obj root-override2 penetrate-using) (the-as penetrate v1-50)) + ) + ) + ) + (if (and (nonzero? (-> obj draw)) (logtest? (-> obj draw status) (draw-control-status on-screen))) + (set! (-> obj last-draw-time) (-> pp clock frame-counter)) + ) + (let ((s5-3 (-> obj draw shadow-ctrl))) + (when (!= *nav-enemy-dummy-shadow-control* s5-3) + (let ((f0-7 (vector-vector-distance (camera-pos) (-> obj root-override2 trans)))) + (cond + ((< 163840.0 f0-7) + (logior! (-> s5-3 settings flags) (shadow-flags disable-draw)) + 0 + ) + (else + (let ((v1-65 s5-3)) + (logclear! (-> v1-65 settings flags) (shadow-flags disable-draw)) + ) + 0 + (let* ((f0-8 (lerp-scale 0.0 1.0 f0-7 163840.0 40960.0)) + (f0-11 (fmax 0.01 (+ (* -2.0 f0-8 f0-8 f0-8) (* 3.0 f0-8 f0-8)))) + ) + (set! (-> s5-3 settings shadow-dir w) (* 614400.0 f0-11)) + ) + ) + ) + ) + ) + ) + (when (logtest? (enemy-flag trackable-backup directed-ready) (-> obj enemy-flags)) + (enemy-method-54 obj) + (when (and (logtest? (-> obj focus-status) (focus-status touch-water)) + (< (-> obj root-override2 trans y) (+ -11468.8 (-> obj water-surface-height))) + ) + (set! (-> obj root-override2 trans y) (+ -11468.8 (-> obj water-surface-height))) + (if (not (and (-> obj next-state) (= (-> obj next-state name) 'in-ditch))) + (go (method-of-object obj in-ditch)) + ) + ) + ) + (ja-post) + 0 + (none) + ) + ) + +;; definition for method 128 of type citizen +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod enemy-method-128 citizen ((obj citizen) (arg0 vector) (arg1 move-above-ground-params)) + (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 ((gp-0 (-> obj root-override2))) + (set! (-> arg1 on-ground?) #f) + (set! (-> arg1 do-move?) #t) + (set! (-> arg1 old-gspot-pos quad) (-> gp-0 gspot-pos quad)) + (set! (-> arg1 old-gspot-normal quad) (-> gp-0 gspot-normal quad)) + (set! (-> gp-0 trans-old-old-old quad) (-> gp-0 trans-old-old quad)) + (set! (-> gp-0 trans-old-old quad) (-> gp-0 trans-old quad)) + (set! (-> gp-0 trans-old quad) (-> gp-0 trans quad)) + (set! (-> gp-0 prev-status) (-> gp-0 status)) + (vector-v+! (-> gp-0 trans) (-> gp-0 trans) arg0) + (set! (-> arg1 new-pos quad) (-> gp-0 trans quad)) + (when (= (-> obj controller traffic sync-mask-8) (ash 1 (logand (-> obj traffic-id) 7))) + (let ((s2-0 (new 'stack-no-clear 'collide-query))) + (logclear! (-> gp-0 status) (collide-status on-ground)) + (let* ((a0-14 obj) + (t9-1 (method-of-object a0-14 enemy-above-ground?)) + (a1-2 s2-0) + (a2-2 (new 'stack-no-clear 'vector)) + ) + (let ((v1-14 (-> gp-0 trans))) + (let ((a3-0 (-> gp-0 transv))) + (let ((t0-1 0.15)) + (.mov vf7 t0-1) + ) + (.lvf vf5 (&-> a3-0 quad)) + ) + (.lvf vf4 (&-> v1-14 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-2 quad) vf6) + (when (t9-1 a0-14 a1-2 a2-2 (-> arg1 gnd-collide-with) 16384.0 81920.0 1024.0) + (set! (-> gp-0 gspot-pos quad) (-> gp-0 trans quad)) + (set! (-> gp-0 gspot-pos y) (-> s2-0 best-other-tri intersect y)) + (set! (-> gp-0 gspot-normal quad) (-> s2-0 best-other-tri normal quad)) + (logior! (-> gp-0 status) (collide-status on-ground)) + (set! (-> gp-0 ground-pat) (-> s2-0 best-other-tri pat)) + ) + ) + ) + (set! (-> obj gnd-height) (-> gp-0 gspot-pos y)) + (set! (-> gp-0 gspot-pos y) (-> arg1 old-gspot-pos y)) + ) + (let ((f0-5 (- (-> obj gnd-height) (-> gp-0 gspot-pos y)))) + (cond + ((< 0.0 f0-5) + (+! (-> gp-0 gspot-pos y) (* 10.0 (-> pp clock seconds-per-frame) f0-5)) + ) + (else + (+! (-> gp-0 gspot-pos y) (* 10.0 (-> pp clock seconds-per-frame) f0-5)) + (if (< (-> gp-0 gspot-pos y) (-> obj gnd-height)) + (set! (-> gp-0 gspot-pos y) (-> obj gnd-height)) + ) + ) + ) + ) + (set! (-> arg1 on-ground?) #t) + (set! (-> arg1 pat) (-> gp-0 ground-pat)) + (when (>= (-> gp-0 gspot-pos y) (-> arg1 new-pos y)) + (set! (-> arg1 new-pos y) (-> gp-0 gspot-pos y)) + (set! (-> gp-0 ground-impact-vel) (- (vector-dot arg0 (-> gp-0 dynam gravity-normal)))) + (set! (-> arg0 y) 0.0) + ) + (set! (-> gp-0 trans quad) (-> arg1 new-pos quad)) + (when (-> arg1 do-move?) + (cond + ((-> arg1 on-ground?) + (let ((a1-3 (-> gp-0 gspot-pos)) + (a0-22 (-> gp-0 gspot-normal)) + (v1-41 (-> arg1 pat)) + ) + (set! (-> gp-0 grount-touch-point quad) (-> a1-3 quad)) + (set! (-> gp-0 poly-normal quad) (-> a0-22 quad)) + (set! (-> gp-0 surface-normal quad) (-> a0-22 quad)) + (set! (-> gp-0 local-normal quad) (-> a0-22 quad)) + (set! (-> gp-0 ground-poly-normal quad) (-> a0-22 quad)) + (set! (-> gp-0 poly-pat) v1-41) + (set! (-> gp-0 cur-pat) v1-41) + (set! (-> gp-0 ground-pat) v1-41) + ) + (logior! (-> gp-0 status) (collide-status on-surface on-ground touch-surface)) + ) + (else + (logclear! (-> gp-0 status) (collide-status + on-surface + on-ground + touch-surface + touch-wall + touch-ceiling + touch-actor + on-special-surface + touch-edge + blocked + on-water + impact-surface + touch-background + stuck + glance + ) + ) + (when (not (logtest? (-> gp-0 root-prim prim-core action) (collide-action no-normal-reset))) + (let ((v1-51 (-> gp-0 dynam gravity-normal))) + (set! (-> gp-0 local-normal quad) (-> v1-51 quad)) + (set! (-> gp-0 surface-normal quad) (-> v1-51 quad)) + (set! (-> gp-0 poly-normal quad) (-> v1-51 quad)) + ) + (set! (-> gp-0 coverage) 0.0) + (set! (-> gp-0 touch-angle) 0.0) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + ) + +;; definition for method 142 of type citizen +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod nav-enemy-method-142 citizen ((obj citizen) (arg0 nav-control)) + (with-pp + (let ((s3-0 (new 'stack-no-clear 'vector))) + (let ((a1-1 (-> arg0 state))) + (set! (-> s3-0 quad) (-> a1-1 heading quad)) + ) + (set! (-> s3-0 y) 0.0) + (vector-normalize! s3-0 1.0) + (let ((gp-0 (new 'stack-no-clear 'quaternion)) + (s5-1 (-> obj root-override2 quat)) + ) + (quaternion-set! gp-0 0.0 (-> s3-0 x) 0.0 (+ 1.0 (-> s3-0 z))) + (quaternion-normalize! gp-0) + (quaternion-pseudo-seek + s5-1 + s5-1 + gp-0 + (* (fmax 0.5 (* 0.00024414062 (-> arg0 state speed))) (-> pp clock seconds-per-frame)) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 176 of type citizen +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod nav-enemy-method-176 citizen ((obj citizen)) + (nav-enemy-method-177 obj) + (let ((a0-2 obj)) + (when (logtest? (enemy-flag enemy-flag36) (-> a0-2 enemy-flags)) + (cond + ((logtest? (enemy-flag enemy-flag38) (-> obj enemy-flags)) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag38)))) + (set! (-> obj root-override2 gspot-pos quad) (-> obj root-override2 trans quad)) + (set! (-> obj gnd-height) (-> obj root-override2 gspot-pos y)) + ) + (else + (nav-enemy-method-142 obj (-> obj nav)) + (nav-enemy-method-143 obj (-> obj nav)) + ) + ) + ) + ) + (track-target! obj) + (update-transforms (-> obj root-override2)) + 0 + (none) + ) + +;; definition for method 116 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod go-idle citizen ((obj citizen)) + (go (method-of-object obj active)) + 0 + (none) + ) + +;; definition for method 113 of type citizen +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-behaviour-and-stats! citizen ((obj citizen) (arg0 nav-enemy-info)) + "Initializes a bunch of enemy fields related to how they should react, how many hitpoints they should have, etc" + (set! (-> arg0 nav-mesh) *default-nav-mesh*) + (let ((t9-0 (method-of-type nav-enemy init-enemy-behaviour-and-stats!))) + (t9-0 obj arg0) + ) + (set! (-> obj speed-scale) (get-rand-float-range obj 0.9 1.1)) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj enemy-flags) (enemy-flag notice)) + (vehicle-controller-method-9 (-> obj controller)) + (citizen-init! obj) + (if (zero? (-> obj draw light-index)) + (set! (-> obj draw light-index) (the-as uint 10)) + ) + 0 + (none) + ) + +;; definition for method 11 of type citizen +;; WARN: Return type mismatch entity-perm-status vs none. +(defmethod init-from-entity! citizen ((obj citizen) (arg0 entity-actor)) + "Typically the method that does the initial setup on the process, potentially using the [[entity-actor]] provided as part of that. +This commonly includes things such as: +- stack size +- collision information +- loading the skeleton group / bones +- sounds" + (process-entity-status! obj (entity-perm-status dead) #t) + (none) + ) + +;; definition for function citizen-init-by-other +;; INFO: Used lq/sq +(defbehavior citizen-init-by-other citizen ((arg0 traffic-object-spawn-params)) + (stack-size-set! (-> self main-thread) 512) + (logclear! (-> self mask) (process-mask enemy)) + (init-enemy-collision! self) + (set! (-> self root-override2 trans quad) (-> arg0 position quad)) + (quaternion-copy! (-> self root-override2 quat) (-> arg0 rotation)) + (if (not (logtest? (-> arg0 flags) 1)) + (lwide-entity-hack) + ) + (set! (-> self vehicle) (-> arg0 handle)) + (set! (-> self interp) 0.0) + (logclear! (-> self flags) (citizen-flag run-mode)) + (logclear! (-> self flags) (citizen-flag shuffle-mode)) + (if (logtest? (-> arg0 flags) 8) + (logior! (-> self flags) (citizen-flag dark-guard)) + ) + (init-enemy! self) + (set! (-> self traffic-id) (the-as int (-> arg0 id))) + (go-inactive self) + (none) + ) + +;; definition for method 196 of type citizen +(defmethod get-run-anim citizen ((obj citizen)) + (-> obj anim-run) + ) + +;; definition for function citizen-travel-anim +;; WARN: new jak 2 until loop case, check carefully +(defbehavior citizen-travel-anim citizen ((arg0 int) (arg1 int)) + (local-vars (f28-0 float)) + (logclear! (-> self flags) (citizen-flag shuffle-mode)) + (logclear! (-> self flags) (citizen-flag run-mode)) + (let ((v1-6 (ja-group))) + (when (not (and v1-6 (= v1-6 (-> self draw art-group data (-> self anim-walk))))) + (ja-channel-push! 2 (the-as time-frame arg1)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-walk)) + :num! (loop!) + :dist (-> self dist-walk-anim) + :frame-num (ja-aframe 4.0 0) + ) + (let ((gp-1 (-> self skel root-channel 1))) + (let ((f0-3 (-> self interp))) + (set! (-> gp-1 frame-interp 1) f0-3) + (set! (-> gp-1 frame-interp 0) f0-3) + ) + (set! (-> gp-1 dist) (-> self dist-run-anim)) + (set! (-> gp-1 frame-group) (the-as art-joint-anim (-> self draw art-group data (get-run-anim self)))) + (set! (-> gp-1 param 0) 0.0) + (joint-control-channel-group! + gp-1 + (the-as art-joint-anim (-> self draw art-group data (get-run-anim self))) + num-func-chan + ) + ) + ) + ) + (until #f + (let ((f30-0 (-> self nav state speed))) + (lerp-scale 0.0 1.0 f30-0 (-> self speed-walk) (-> self speed-run)) + (set! f28-0 + (cond + ((< f30-0 4096.0) + (cond + ((logtest? (-> self flags) (citizen-flag shuffle-mode)) + (set! f28-0 1.0) + (ja :chan 1 :group! (-> self draw art-group data (-> self anim-shuffle)) :dist 4096.0) + ) + (else + (set! f28-0 0.0) + (when (= (-> self interp) 0.0) + (logclear! (-> self flags) (citizen-flag run-mode)) + (logior! (-> self flags) (citizen-flag shuffle-mode)) + ) + ) + ) + f28-0 + ) + ((< 20480.0 f30-0) + (cond + ((logtest? (-> self flags) (citizen-flag run-mode)) + (set! f28-0 1.0) + (ja :chan 1 :group! (-> self draw art-group data (get-run-anim self)) :dist (-> self dist-run-anim)) + ) + (else + (set! f28-0 0.0) + (when (= (-> self interp) 0.0) + (logior! (-> self flags) (citizen-flag run-mode)) + (logclear! (-> self flags) (citizen-flag shuffle-mode)) + ) + ) + ) + f28-0 + ) + ((or (logtest? (-> self flags) (citizen-flag run-mode)) (logtest? (-> self flags) (citizen-flag shuffle-mode))) + (set! f28-0 0.0) + (when (= (-> self interp) 0.0) + (logclear! (-> self flags) (citizen-flag run-mode)) + (logclear! (-> self flags) (citizen-flag shuffle-mode)) + ) + f28-0 + ) + (else + 0.0 + ) + ) + ) + (seek! (-> self interp) f28-0 (* 4.0 (-> self clock seconds-per-frame))) + (let ((v1-76 (-> self skel root-channel 1)) + (f0-21 (-> self interp)) + ) + (set! (-> v1-76 frame-interp 1) f0-21) + (set! (-> v1-76 frame-interp 0) f0-21) + ) + (let* ((f0-22 (current-cycle-distance (-> self skel))) + (f0-25 (/ (/ (* 16.0 f30-0) (* 15.0 f0-22)) (-> self root-override2 scale x))) + ) + (if (logtest? (-> self flags) (citizen-flag shuffle-mode)) + (set! f0-25 1.0) + ) + (ja :num! (loop! f0-25)) + ) + ) + (ja :chan 1 :num! (chan 0)) + (suspend) + ) + #f + ) + +;; definition for method 188 of type citizen +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod citizen-method-188 citizen ((obj citizen) (arg0 vector)) + (let ((s5-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (let ((s1-0 (-> obj nav state current-poly))) + (let ((a1-2 (-> obj nav state))) + (set! (-> s5-0 quad) (-> a1-2 heading quad)) + ) + (set! (-> s5-0 y) 0.0) + (vector-xz-normalize! s5-0 20480.0) + (set! (-> s4-0 quad) (-> s5-0 quad)) + (clamp-vector-to-mesh-no-gaps (-> obj nav) (-> obj root-override2 trans) s1-0 s4-0 s2-0) + ) + (cond + ((-> s2-0 found-boundary) + (let ((s1-2 (vector-! + (new 'stack-no-clear 'vector) + (-> obj controller turn-exit-point) + (-> obj controller path-prev-point) + ) + ) + (s0-1 (vector-! (new 'stack-no-clear 'vector) (-> s2-0 intersection) (-> obj controller path-prev-point))) + ) + (vector-! (new 'stack-no-clear 'vector) s5-0 s4-0) + (set! (-> s1-2 y) 0.0) + (vector-xz-normalize! s1-2 1.0) + (vector-rotate90-around-y! s1-2 s1-2) + (if (< 0.0 (vector-dot s1-2 s0-1)) + (vector-negate! arg0 s1-2) + (set! (-> arg0 quad) (-> s1-2 quad)) + ) + ) + (vector-xz-normalize! arg0 8192.0) + ) + (else + (set! (-> arg0 quad) (the-as uint128 0)) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 189 of type citizen +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod calc-danger-vec citizen ((obj citizen) (arg0 vector) (arg1 vector)) + (let ((s2-0 (new 'stack-no-clear 'vector)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s5-0 quad) (-> obj root-override2 trans quad)) + (let ((a1-1 (-> obj nav state))) + (set! (-> s2-0 quad) (-> a1-1 heading quad)) + ) + (set! (-> s2-0 y) 0.0) + (vector-xz-normalize! s2-0 20480.0) + (set! (-> s5-0 y) (-> arg0 y)) + (cond + ((< (vector-vector-xz-distance arg0 s5-0) (-> arg0 w)) + (vector-! (new 'stack-no-clear 'vector) arg0 s5-0) + (new 'stack-no-clear 'vector) + (new 'stack-no-clear 'vector) + 0.0 + (let ((s2-2 (vector-! + (new 'stack-no-clear 'vector) + (-> obj controller turn-exit-point) + (-> obj controller path-prev-point) + ) + ) + (s1-1 (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj controller path-prev-point))) + ) + (set! (-> s2-2 y) 0.0) + (vector-xz-normalize! s2-2 1.0) + (vector-rotate90-around-y! s2-2 s2-2) + (if (< 0.0 (vector-dot s2-2 s1-1)) + (vector-negate! arg1 s2-2) + (set! (-> arg1 quad) (-> s2-2 quad)) + ) + ) + (vector-xz-normalize! arg1 (* 5.0 (- (-> arg0 w) (vector-vector-xz-distance arg0 s5-0)))) + ) + ((line-sphere-intersection? arg0 s5-0 (vector+! (new 'stack-no-clear 'vector) s5-0 s2-0)) + (let ((s3-3 (vector-! (new 'stack-no-clear 'vector) arg0 s5-0)) + (s5-1 (new 'stack-no-clear 'vector)) + (s4-1 (new 'stack-no-clear 'vector)) + ) + 0.0 + (vector-rotate90-around-y! s5-1 s2-0) + (vector-xz-normalize! s5-1 1.0) + (let ((f30-1 (vector-dot s5-1 s3-3))) + (vector-*! s4-1 s3-3 s5-1 f30-1) + (vector-xz-normalize! s5-1 20480.0) + (if (< 0.0 f30-1) + (vector-negate! arg1 s5-1) + (set! (-> arg1 quad) (-> s5-1 quad)) + ) + ) + ) + ) + (else + (set! (-> arg1 quad) (the-as uint128 0)) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 190 of type citizen +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod citizen-method-190 citizen ((obj citizen) (arg0 vector)) + (local-vars (sv-288 nav-poly) (sv-304 clamp-travel-vector-to-mesh-return-info) (sv-320 vector)) + (let ((s3-1 + (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) (the-as vector (-> obj cp-sphere))) + ) + (s4-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + ) + 0.0 + (set! (-> arg0 quad) (the-as uint128 0)) + (when (-> obj cp-valid?) + (set! (-> obj cp-valid?) #f) + (set! (-> s2-0 quad) (-> obj cp-vec quad)) + (set! (-> s2-0 y) 0.0) + (vector-xz-normalize! s2-0 1.0) + (vector-rotate90-around-y! s2-0 s2-0) + (set! (-> s3-1 y) 0.0) + (vector-*! s4-0 s3-1 s2-0 (vector-dot s3-1 s2-0)) + (let ((f30-0 (- 1.0 (/ (vector-length s4-0) (vector-length (-> obj cp-vec)))))) + (vector+! s4-0 s4-0 (the-as vector (-> obj cp-sphere))) + (let ((s0-0 (new 'stack-no-clear 'vector))) + (set! sv-320 (new 'stack-no-clear 'vector)) + (let ((s1-0 (new 'stack-no-clear 'vector))) + (set! sv-304 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + (set! sv-288 (-> obj nav state current-poly)) + (let ((f28-0 (+ (-> obj cp-sphere r) (-> obj nav-radius-backup)))) + (when sv-288 + (vector-normalize-copy! s0-0 s2-0 f28-0) + (vector-normalize-copy! sv-320 s2-0 (- f28-0)) + (clamp-vector-to-mesh-no-gaps (-> obj nav) s4-0 sv-288 s0-0 sv-304) + (let ((a0-12 (-> obj nav)) + (t9-7 (method-of-type nav-control clamp-vector-to-mesh-no-gaps)) + (a1-10 s4-0) + (a3-3 sv-320) + ) + (t9-7 a0-12 a1-10 sv-288 a3-3 sv-304) + ) + (let* ((v1-22 s0-0) + (f0-11 (sqrtf (+ (* (-> v1-22 x) (-> v1-22 x)) (* (-> v1-22 z) (-> v1-22 z))))) + (v1-24 sv-320) + (f1-10 (sqrtf (+ (* (-> v1-24 x) (-> v1-24 x)) (* (-> v1-24 z) (-> v1-24 z))))) + ) + (cond + ((< 0.0 (vector-dot s2-0 s3-1)) + (if (< 4096.0 f0-11) + (set! (-> s1-0 quad) (-> s0-0 quad)) + (set! (-> s1-0 quad) (-> sv-320 quad)) + ) + ) + ((< 4096.0 f1-10) + (set! (-> s1-0 quad) (-> sv-320 quad)) + ) + (else + (set! (-> s1-0 quad) (-> s0-0 quad)) + ) + ) + ) + (set! (-> arg0 quad) (-> s1-0 quad)) + (let ((a1-11 (new 'stack-no-clear 'vector))) + (set! (-> a1-11 quad) (-> obj root-override2 trans quad)) + (set! (-> a1-11 y) 0.0) + (let ((f0-15 (- f28-0 (vector-vector-xz-distance s4-0 a1-11)))) + (if (< f0-15 0.0) + (set! f0-15 0.0) + ) + (vector-normalize! arg0 (* (-> obj cp-factor) f0-15 f30-0)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition of type iter-seg +(deftype iter-seg (structure) + ((self citizen :offset-assert 0) + (score float :offset-assert 4) + (seg nav-segment :offset-assert 8) + (cp-plane plane :inline :offset-assert 16) + (desired-dir vector :inline :offset-assert 32) + ) + :method-count-assert 9 + :size-assert #x30 + :flag-assert #x900000030 + ) + +;; definition for method 3 of type iter-seg +(defmethod inspect iter-seg ((obj iter-seg)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'iter-seg) + (format #t "~1Tself: ~A~%" (-> obj self)) + (format #t "~1Tscore: ~f~%" (-> obj score)) + (format #t "~1Tseg: #~%" (-> obj seg)) + (format #t "~1Tcp-plane: #~%" (-> obj cp-plane)) + (format #t "~1Tdesired-dir: #~%" (-> obj desired-dir)) + (label cfg-4) + obj + ) + +;; definition for function iter-seg-clear-path +;; INFO: Used lq/sq +(defun iter-seg-clear-path ((arg0 iter-seg) (arg1 nav-segment)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((s2-0 (-> arg0 self)) + (a0-1 (-> arg1 branch src-node)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s4-0 quad) (-> a0-1 position quad)) + (set! (-> s4-0 w) 1.0) + (let ((a0-4 (-> arg1 branch dest-node)) + (s3-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s3-0 quad) (-> a0-4 position quad)) + (set! (-> s3-0 w) 1.0) + (set! (-> s4-0 y) 0.0) + (set! (-> s3-0 y) 0.0) + (set! (-> s4-0 w) 1.0) + (set! (-> s3-0 w) 1.0) + (when *citizen-debug* + ) + (cond + ((< 0.0 (vector4-dot (the-as vector (-> arg0 cp-plane)) s3-0)) + (let ((s0-1 (vector-! (new 'stack-no-clear 'vector) s3-0 s4-0)) + (s1-1 (vector-! (new 'stack-no-clear 'vector) (-> s2-0 root-override2 trans) s4-0)) + ) + (set! (-> s1-1 y) 0.0) + (vector-rotate90-around-y! s0-1 s0-1) + (vector-normalize! s0-1 1.0) + (let ((a1-3 s1-1)) + (let ((v1-16 s1-1)) + (let ((a0-12 s0-1)) + (let ((a2-2 (- (vector-dot s0-1 s1-1)))) + (.mov vf7 a2-2) + ) + (.lvf vf5 (&-> a0-12 quad)) + ) + (.lvf vf4 (&-> v1-16 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-3 quad) vf6) + ) + (vector+! s1-1 s1-1 s4-0) + (cond + ((< 0.0 (vector-dot (the-as vector (-> arg0 cp-plane)) (vector-! (new 'stack-no-clear 'vector) s3-0 s1-1))) + (vector-vector-xz-distance s3-0 (-> s2-0 cp-sphere)) + (let ((s1-3 (vector-! (new 'stack-no-clear 'vector) s3-0 (the-as vector (-> s2-0 cp-sphere)))) + (s0-2 (new 'stack-no-clear 'vector)) + ) + (set! (-> s0-2 quad) (-> s2-0 cp-vec quad)) + (set! (-> s0-2 y) 0.0) + (vector-normalize! s0-2 1.0) + (set! (-> s1-3 y) 0.0) + (let ((f0-16 (vector-dot s0-2 s1-3))) + (when (< (-> arg0 score) f0-16) + (set! (-> arg0 score) f0-16) + (set! (-> arg0 seg) arg1) + ) + ) + ) + (if *citizen-debug* + (add-debug-line #t (bucket-id debug-no-zbuf1) s4-0 s3-0 *color-black* #f *color-white*) + ) + ) + (else + (if *citizen-debug* + (add-debug-line #t (bucket-id debug-no-zbuf1) s1-1 s3-0 *color-red* #f (the-as rgba -1)) + ) + ) + ) + ) + ) + (else + #f + ) + ) + ) + ) + ) + ) + +;; definition for method 191 of type citizen +;; INFO: Used lq/sq +(defmethod gen-clear-path citizen ((obj citizen)) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'iter-seg)) + ) + (let ((s3-0 (new 'stack-no-clear 'vector))) + (set! (-> s3-0 quad) (-> obj cp-vec quad)) + (set! (-> s4-0 quad) (-> obj root-override2 trans quad)) + (set! (-> s4-0 w) 81920.0) + (set! (-> gp-0 seg) #f) + (set! (-> gp-0 score) 0.0) + (set! (-> s3-0 y) 0.0) + (vector-rotate90-around-y! s3-0 s3-0) + (vector-normalize! s3-0 1.0) + (set! (-> gp-0 cp-plane quad) (-> s3-0 quad)) + (set! (-> gp-0 cp-plane w) (- (vector-dot s3-0 (the-as vector (-> obj cp-sphere))))) + ) + (when (< (vector4-dot (the-as vector (-> gp-0 cp-plane)) (-> obj root-override2 trans)) 0.0) + (set! (-> gp-0 cp-plane x) (- (-> gp-0 cp-plane x))) + (set! (-> gp-0 cp-plane y) (- (-> gp-0 cp-plane y))) + (set! (-> gp-0 cp-plane z) (- (-> gp-0 cp-plane z))) + (set! (-> gp-0 cp-plane w) (- (-> gp-0 cp-plane w))) + ) + (set! (-> gp-0 self) obj) + (nav-segment-callback + obj + s4-0 + (the-as traffic-find-segment-struct gp-0) + (the-as (function traffic-find-segment-struct nav-segment none) iter-seg-clear-path) + ) + (when *citizen-debug* + (if (-> gp-0 seg) + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (the-as vector (-> gp-0 seg vertex)) + (-> gp-0 seg vertex 1) + *color-blue* + #f + *color-white* + ) + ) + ) + (-> gp-0 seg) + ) + ) + +;; definition for method 192 of type citizen +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod citizen-method-192 citizen ((obj citizen)) + (when (-> obj cp-valid?) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (set! (-> s4-0 quad) (-> obj cp-force quad)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (let ((a1-0 (-> obj nav state))) + (set! (-> s5-0 quad) (-> a1-0 heading quad)) + ) + (set! (-> s5-0 y) 0.0) + (vector-xz-normalize! s5-0 1.0) + (vector-xz-normalize! s4-0 1.0) + (when (< (fabs (vector-dot s4-0 s5-0)) (cos 14563.556)) + (vector-negate! (new 'stack-no-clear 'vector) s5-0) + (let ((a1-6 (gen-clear-path obj))) + (if a1-6 + (citizen-method-186 obj a1-6) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for function iter-seg-new-dir +;; INFO: Used lq/sq +;; WARN: Return type mismatch nav-segment vs none. +(defun iter-seg-new-dir ((arg0 iter-seg) (arg1 nav-segment)) + (-> arg0 self) + (let ((a1-1 (-> arg1 branch src-node)) + (v1-2 (new 'stack-no-clear 'vector)) + ) + (set! (-> v1-2 quad) (-> a1-1 position quad)) + (set! (-> v1-2 w) 1.0) + (let ((a2-0 (-> arg1 branch dest-node)) + (a0-4 (new 'stack-no-clear 'vector)) + ) + (set! (-> a0-4 quad) (-> a2-0 position quad)) + (set! (-> a0-4 w) 1.0) + (set! (-> v1-2 y) 0.0) + (set! (-> a0-4 y) 0.0) + (set! (-> v1-2 w) 1.0) + (set! (-> a0-4 w) 1.0) + (let ((s4-1 (vector-! (new 'stack-no-clear 'vector) a0-4 v1-2))) + 0.0 + (vector-normalize! s4-1 1.0) + (let ((f0-8 (vector-dot s4-1 (-> arg0 desired-dir)))) + (when (< (-> arg0 score) f0-8) + (set! (-> arg0 score) f0-8) + (set! (-> arg0 seg) arg1) + ) + ) + ) + ) + ) + (none) + ) + +;; definition for method 194 of type citizen +;; INFO: Used lq/sq +(defmethod gen-new-dir citizen ((obj citizen) (arg0 vector) (arg1 float)) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'iter-seg)) + ) + (set! (-> (new 'stack-no-clear 'vector) quad) (-> obj cp-vec quad)) + (set! (-> s4-0 quad) (-> obj root-override2 trans quad)) + (set! (-> s4-0 w) arg1) + (set! (-> gp-0 seg) #f) + (set! (-> gp-0 score) 0.0) + (set! (-> gp-0 desired-dir quad) (-> arg0 quad)) + (vector-normalize! (-> gp-0 desired-dir) 1.0) + (set! (-> gp-0 self) obj) + (nav-segment-callback + obj + s4-0 + (the-as traffic-find-segment-struct gp-0) + (the-as (function traffic-find-segment-struct nav-segment none) iter-seg-new-dir) + ) + (when *citizen-debug* + (if (-> gp-0 seg) + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (the-as vector (-> gp-0 seg vertex)) + (-> gp-0 seg vertex 1) + *color-blue* + #f + *color-white* + ) + ) + ) + (-> gp-0 seg) + ) + ) + +;; definition for method 195 of type citizen +;; WARN: Return type mismatch int vs symbol. +(defmethod citizen-method-195 citizen ((obj citizen) (arg0 vector)) + (dotimes (s4-0 6) + (let ((a1-2 (gen-new-dir obj arg0 (* 81920.0 (the float (+ s4-0 1)))))) + (when a1-2 + (citizen-method-186 obj a1-2) + (return (the-as symbol #f)) + ) + ) + ) + (the-as symbol 0) + ) + +;; definition for method 193 of type citizen +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod throw-off-vehicle citizen ((obj citizen)) + (with-pp + (let ((s4-0 (handle->process (-> obj vehicle)))) + (let ((v1-4 (-> obj root-override2 root-prim))) + (set! (-> v1-4 prim-core collide-as) (-> obj root-override2 backup-collide-as)) + (set! (-> v1-4 prim-core collide-with) (-> obj root-override2 backup-collide-with)) + ) + (when s4-0 + (let ((s5-1 (vector-! + (new 'stack-no-clear 'vector) + (-> obj root-override2 trans) + (-> (the-as vehicle s4-0) root-override-2 trans) + ) + ) + ) + (let ((s3-0 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> (the-as vehicle s4-0) root-override-2 quat))) + (v1-10 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> (the-as vehicle s4-0) root-override-2 quat))) + ) + (if (< 0.0 (vector-dot s5-1 s3-0)) + (vector+! s5-1 v1-10 s3-0) + (vector-! s5-1 v1-10 s3-0) + ) + ) + (vector-normalize! s5-1 32768.0) + (set! (-> s5-1 y) 71680.0) + (vector+! s5-1 s5-1 (-> (the-as vehicle s4-0) root-override-2 transv)) + (let ((a1-8 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-8 from) (process->ppointer pp)) + (set! (-> a1-8 num-params) 2) + (set! (-> a1-8 message) 'attack) + (set! (-> a1-8 param 0) (the-as uint #f)) + (let ((v1-16 (new 'static 'attack-info :mask (attack-info-mask vector id knock)))) + (let* ((a0-22 *game-info*) + (a2-1 (+ (-> a0-22 attack-id) 1)) + ) + (set! (-> a0-22 attack-id) a2-1) + (set! (-> v1-16 id) a2-1) + ) + (set! (-> v1-16 vector quad) (-> s5-1 quad)) + (set! (-> v1-16 knock) (the-as uint 7)) + (set! (-> a1-8 param 1) (the-as uint v1-16)) + ) + (send-event-function obj a1-8) + ) + ) + ) + ) + 0 + (none) + ) + ) + +;; failed to figure out what this is: +(defstate in-ditch (citizen) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior citizen) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self wait-time) (the-as time-frame (get-rand-int-range self 300 1500))) + (if (= (-> self water-anim) -1) + (go-inactive self) + ) + (when (logtest? (-> self focus-status) (focus-status touch-water)) + (let ((a1-3 (new 'stack-no-clear 'vector))) + (set! (-> a1-3 quad) (-> self root-override2 trans quad)) + (set! (-> a1-3 y) (+ 40.96 (-> self water-surface-height))) + (splash-spawn 0.2 a1-3 1) + ) + ) + (none) + ) + :exit (behavior () + '() + (none) + ) + :trans (the-as (function none :behavior citizen) #f) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (cond + ((logtest? (-> self focus-status) (focus-status touch-water)) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self water-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self water-anim))) frames num-frames) -1) + ) + 0.5 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> self root-override2 trans quad)) + (set! (-> gp-0 y) (+ 40.96 (-> self water-surface-height))) + (when (and (logtest? (-> self draw status) (draw-control-status on-screen)) (zero? (-> self draw cur-lod))) + (let ((f0-6 (y-angle (-> self root-override2)))) + (rings-water-spawn f0-6 gp-0 *null-vector* 3072.0 4096.0) + ) + ) + ) + (suspend) + (ja :num! (seek! max 0.5)) + ) + ) + #f + ) + (else + (until #f + (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 + ) + ) + 0.1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.1)) + ) + ) + #f + ) + ) + (none) + ) + :post (behavior () + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate wait (citizen) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior citizen) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :exit (behavior () + '() + (none) + ) + :trans (behavior () + (if (and (-> self wait-return-state) + (>= (- (-> self clock frame-counter) (-> self state-time)) (-> self wait-time)) + ) + (go (-> self wait-return-state)) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (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 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a1-1 + (vector-! (new 'stack-no-clear 'vector) (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + ) + (seek-toward-heading-vec! (-> self root-override2) a1-1 32768.0 (seconds 0.05)) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate active (citizen) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior citizen) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-165 self) + (let ((v1-10 (-> self nav state))) + (set! (-> v1-10 speed) 0.0) + ) + 0 + (let ((a0-16 (-> self nav state)) + (v1-13 *null-vector*) + ) + (set! (-> a0-16 velocity quad) (-> v1-13 quad)) + ) + 0 + (let ((v1-16 (-> self nav))) + (set! (-> v1-16 target-speed) (* (-> self speed-scale) (-> self speed-walk))) + ) + 0 + (set! (-> self wait-time) (the-as time-frame (get-rand-int-range self 1200 9000))) + (when (zero? (-> self controller branch)) + (format 0 "citizen has no branch in active enter state~%") + (citizen-method-195 self (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + ) + (none) + ) + :exit (behavior () + '() + (none) + ) + :trans (behavior () + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.5)) + (not (logtest? (-> self nav state flags) (nav-state-flag in-mesh))) + (< (-> self root-override2 trans y) 4096.0) + ) + (go-virtual in-ditch) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (-> self wait-time)) + (let ((f0-2 (-> self nav state speed))) + (set! (-> self nav target-speed) (seek f0-2 0.0 (* 12288.0 (-> self clock seconds-per-frame)))) + ) + 0 + (when (= (-> self nav state speed) 0.0) + (set! (-> self wait-return-state) (the-as (state citizen) (-> self state))) + (set! (-> self wait-time) (the-as time-frame (get-rand-int-range self 300 1500))) + (go-virtual wait) + ) + ) + (let ((f0-8 2867.2) + (v1-36 (-> self root-override2 transv)) + ) + (if (< f0-8 (sqrtf (+ (* (-> v1-36 x) (-> v1-36 x)) (* (-> v1-36 z) (-> v1-36 z))))) + (set! (-> self cp-next-time) (-> self clock frame-counter)) + ) + ) + (when (< (+ (-> self cp-next-time) (seconds 2)) (-> self clock frame-counter)) + (let ((a1-3 (vector-! + (new 'stack-no-clear 'vector) + (-> self controller path-prev-point) + (-> self controller turn-exit-point) + ) + ) + ) + (set! (-> self cp-next-time) (-> self clock frame-counter)) + (citizen-method-195 self a1-3) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 300) + (none) + ) + :post (behavior () + (if (and (nonzero? (-> self controller branch)) + (let ((f0-0 (vector-vector-xz-distance-squared (-> self root-override2 trans) (-> self controller turn-exit-point))) + (f1-0 16384.0) + ) + (or (< f0-0 (* f1-0 f1-0)) (logtest? (-> self nav state flags) (nav-state-flag at-target))) + ) + ) + (vehicle-controller-method-14 (-> self controller) (the-as vehicle self)) + ) + (let ((a0-5 (-> self nav state)) + (v1-11 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-5 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-5 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-5 target-post quad) (-> v1-11 quad)) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate inactive (citizen) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('nav-mesh-kill 'traffic-activate 'traffic-off-force 'traffic-off) + (general-event-handler self proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (when (-> self nav) + (citizen-nav-init! self) + (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 + ) + (logior! (-> self focus-status) (focus-status disable inactive)) + (let ((v1-10 (-> self root-override2 root-prim))) + (set! (-> v1-10 prim-core collide-as) (collide-spec)) + (set! (-> v1-10 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (logclear! (-> self root-override2 nav-flags) (nav-flags has-root-sphere has-extra-sphere)) + (vehicle-controller-method-11 (-> self controller)) + (none) + ) + :exit (behavior () + '() + (none) + ) + :code (the-as (function none :behavior citizen) sleep-code) + ) + +;; failed to figure out what this is: +(defstate knocked (citizen) + :virtual #t + :trans (behavior () + (let ((a1-1 (vector-y-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + (gp-0 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-from-two-vectors-max-angle! gp-0 a1-1 *up-vector* (* 7281.778 (-> self clock seconds-per-frame))) + (quaternion*! (-> self root-override2 quat) gp-0 (-> self root-override2 quat)) + ) + (let ((t9-3 (-> (method-of-type nav-enemy knocked) trans))) + (if t9-3 + (t9-3) + ) + ) + (none) + ) + ) diff --git a/test/decompiler/reference/jak2/levels/city/common/civilian_REF.gc b/test/decompiler/reference/jak2/levels/city/common/civilian_REF.gc new file mode 100644 index 0000000000..1709c999fb --- /dev/null +++ b/test/decompiler/reference/jak2/levels/city/common/civilian_REF.gc @@ -0,0 +1,2386 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type civilian-anim-info +(deftype civilian-anim-info (structure) + ((anim-index int32 2 :offset-assert 0) + (anim-index-front int32 :offset 0) + (anim-index-back int32 :offset 4) + ) + :pack-me + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +;; definition for method 3 of type civilian-anim-info +(defmethod inspect civilian-anim-info ((obj civilian-anim-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'civilian-anim-info) + (format #t "~1Tanim-index[2] @ #x~X~%" (-> obj anim-index)) + (format #t "~1Tanim-index-front: ~D~%" (-> obj anim-index-front)) + (format #t "~1Tanim-index-back: ~D~%" (-> obj anim-index-back)) + (label cfg-4) + obj + ) + +;; definition of type civilian-global-info +(deftype civilian-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (knocked int32 2 :offset-assert 8) + (anim-knocked-front int32 :offset 8) + (anim-knocked-back int32 :offset 12) + (knocked-land int32 2 :offset-assert 16) + (anim-knocked-front-land int32 :offset 16) + (anim-knocked-back-land int32 :offset 20) + (yellow-hit-anim civilian-anim-info 1 :inline :offset-assert 24) + (blue-hit-anim civilian-anim-info 3 :inline :offset-assert 32) + (anim-cover-head-start int32 :offset-assert 56) + (anim-cover-head-loop int32 :offset-assert 60) + (anim-cover-head-end int32 :offset-assert 64) + (car-stance-anim int32 :offset-assert 68) + (bike-stance-anim int32 :offset-assert 72) + (get-in-car-anim int32 :offset-assert 76) + (get-on-bike-anim int32 :offset-assert 80) + (seat-flag uint8 :offset-assert 84) + (speech-ambient int8 :offset-assert 85) + (speech-alert int8 :offset-assert 86) + (speech-cower int8 :offset-assert 87) + (speech-touched-by-player int8 :offset-assert 88) + (speech-shot-by-player int8 :offset-assert 89) + (speech-avoiding-player-vehicle int8 :offset-assert 90) + (speech-hit-by-player-vehicle int8 :offset-assert 91) + (speech-player-stealing-vehicle int8 :offset-assert 92) + ) + :method-count-assert 9 + :size-assert #x5d + :flag-assert #x90000005d + ) + +;; definition for method 3 of type civilian-global-info +(defmethod inspect civilian-global-info ((obj civilian-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 "~1Tknocked[2] @ #x~X~%" (-> obj knocked)) + (format #t "~1Tanim-knocked-front: ~D~%" (-> obj anim-knocked-front)) + (format #t "~1Tanim-knocked-back: ~D~%" (-> obj anim-knocked-back)) + (format #t "~1Tknocked-land[2] @ #x~X~%" (-> obj knocked-land)) + (format #t "~1Tanim-knocked-front-land: ~D~%" (-> obj anim-knocked-front-land)) + (format #t "~1Tanim-knocked-back-land: ~D~%" (-> obj anim-knocked-back-land)) + (format #t "~1Tyellow-hit-anim[1] @ #x~X~%" (-> obj yellow-hit-anim)) + (format #t "~1Tblue-hit-anim[3] @ #x~X~%" (-> obj blue-hit-anim)) + (format #t "~1Tanim-cover-head-start: ~D~%" (-> obj anim-cover-head-start)) + (format #t "~1Tanim-cover-head-loop: ~D~%" (-> obj anim-cover-head-loop)) + (format #t "~1Tanim-cover-head-end: ~D~%" (-> obj anim-cover-head-end)) + (format #t "~1Tcar-stance-anim: ~D~%" (-> obj car-stance-anim)) + (format #t "~1Tbike-stance-anim: ~D~%" (-> obj bike-stance-anim)) + (format #t "~1Tget-in-car-anim: ~D~%" (-> obj get-in-car-anim)) + (format #t "~1Tget-on-bike-anim: ~D~%" (-> obj get-on-bike-anim)) + (format #t "~1Tseat-flag: ~D~%" (-> obj seat-flag)) + (format #t "~1Tspeech-ambient: ~D~%" (-> obj speech-ambient)) + (format #t "~1Tspeech-alert: ~D~%" (-> obj speech-alert)) + (format #t "~1Tspeech-cower: ~D~%" (-> obj speech-cower)) + (format #t "~1Tspeech-touched-by-player: ~D~%" (-> obj speech-touched-by-player)) + (format #t "~1Tspeech-shot-by-player: ~D~%" (-> obj speech-shot-by-player)) + (format #t "~1Tspeech-avoiding-player-vehicle: ~D~%" (-> obj speech-avoiding-player-vehicle)) + (format #t "~1Tspeech-hit-by-player-vehicle: ~D~%" (-> obj speech-hit-by-player-vehicle)) + (format #t "~1Tspeech-player-stealing-vehicle: ~D~%" (-> obj speech-player-stealing-vehicle)) + (label cfg-4) + obj + ) + +;; definition of type civilian +(deftype civilian (citizen) + ((info civilian-global-info :offset-assert 964) + (anim-panic-run int32 :offset-assert 968) + (anim-on-ground int32 :offset-assert 972) + (anim-dive int32 :offset-assert 976) + (anim-get-up-front int32 :offset-assert 980) + (anim-get-up-back int32 :offset-assert 984) + (last-second-pos vector :inline :offset-assert 992) + (last-distance float :offset-assert 1008) + (next-time time-frame :offset-assert 1016) + (dive-target-point vector :inline :offset-assert 1024) + (dive-reaction float :offset-assert 1040) + (allow-dive symbol :offset-assert 1044) + (dive-finished? symbol :offset-assert 1048) + (hit-face uint32 :offset-assert 1052) + (seat int32 :offset-assert 1056) + ) + :heap-base #x3b0 + :method-count-assert 218 + :size-assert #x424 + :flag-assert #xda03b00424 + (:methods + (avoid-danger () _type_ :state 201) + (clear-path () _type_ :state 202) + (on-ground () _type_ :state 203) + (dive () _type_ :state 204) + (get-up-front () _type_ :state 205) + (get-up-back () _type_ :state 206) + (cower-ground () _type_ :state 207) + (wait-for-ride () _type_ :state 208) + (move-to-vehicle () _type_ :state 209) + (board-vehicle () _type_ :state 210) + (ride () _type_ :state 211) + (exit-vehicle (object object int symbol event-message-block) _type_ :state 212) + (wait-at-dest () _type_ :state 213) + (civilian-method-214 (_type_ nav-branch int vector float) float 214) + (civilian-method-215 (_type_ vector) none 215) + (go-dive (_type_) none 216) + (civilian-method-217 (_type_ vector) symbol 217) + ) + ) + +;; definition for method 3 of type civilian +(defmethod inspect civilian ((obj civilian)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type citizen inspect))) + (t9-0 obj) + ) + (format #t "~2Tinfo: ~A~%" (-> obj info)) + (format #t "~2Tanim-panic-run: ~D~%" (-> obj anim-panic-run)) + (format #t "~2Tanim-on-ground: ~D~%" (-> obj anim-on-ground)) + (format #t "~2Tanim-dive: ~D~%" (-> obj anim-dive)) + (format #t "~2Tanim-get-up-front: ~D~%" (-> obj anim-get-up-front)) + (format #t "~2Tanim-get-up-back: ~D~%" (-> obj anim-get-up-back)) + (format #t "~2Tlast-second-pos: #~%" (-> obj last-second-pos)) + (format #t "~2Tlast-distance: ~f~%" (-> obj last-distance)) + (format #t "~2Tnext-time: ~D~%" (-> obj next-time)) + (format #t "~2Tdive-target-point: #~%" (-> obj dive-target-point)) + (format #t "~2Tdive-reaction: ~f~%" (-> obj dive-reaction)) + (format #t "~2Tallow-dive: ~A~%" (-> obj allow-dive)) + (format #t "~2Tdive-finished?: ~A~%" (-> obj dive-finished?)) + (format #t "~2Thit-face: ~D~%" (-> obj hit-face)) + (format #t "~2Tseat: ~D~%" (-> obj seat)) + (label cfg-4) + obj + ) + +;; definition for method 196 of type civilian +(defmethod get-run-anim civilian ((obj civilian)) + (if (and (-> obj next-state) (= (-> obj next-state name) 'flee)) + (-> obj anim-panic-run) + (-> obj anim-run) + ) + ) + +;; definition for method 81 of type civilian +(defmethod enemy-method-81 civilian ((obj civilian)) + #f + ) + +;; definition for method 17 of type civilian +;; INFO: Used lq/sq +(defmethod cleanup-for-death civilian ((obj civilian)) + (cond + ((zero? (-> obj hit-points)) + (logclear! (-> obj flags) (citizen-flag persistent)) + (send-event (ppointer->process (-> obj parent)) 'child-killed) + (let ((a1-1 (new 'stack-no-clear 'traffic-danger-info))) + (set! (-> a1-1 sphere quad) (-> obj root-override2 trans quad)) + (set! (-> a1-1 sphere r) 40960.0) + (set! (-> a1-1 velocity quad) (-> obj root-override2 transv quad)) + (set! (-> a1-1 notify-radius) 122880.0) + (set! (-> a1-1 danger-level) 1.0) + (set! (-> a1-1 decay-rate) 0.0) + (set! (-> a1-1 flags) (traffic-danger-flags tdf0)) + (set! (-> a1-1 danger-type) (traffic-danger-type tdt7)) + (set! (-> a1-1 handle) (process->handle obj)) + (set! (-> a1-1 handle) (the-as handle #f)) + (add-danger (-> obj controller traffic) a1-1) + ) + (go-inactive obj) + ) + (else + (set! (-> obj hit-points) (-> obj enemy-info-override default-hit-points)) + (set! (-> obj hit-points) (rand-vu-int-range 1 4)) + (set! (-> obj fated-time) 0) + (logior! (-> obj enemy-flags) (enemy-flag enable-on-active checking-water)) + (logior! (-> obj focus-status) (focus-status dangerous)) + (logior! (-> obj enemy-flags) (enemy-flag check-water)) + (set! (-> obj enemy-flags) + (logior (enemy-flag check-water-backup no-initial-move-to-ground) (-> obj enemy-flags)) + ) + (logclear! (-> obj focus-status) (focus-status dead)) + (set! (-> obj mask) (logior (process-mask collectable) (-> obj mask))) + (logior! (-> obj enemy-flags) (enemy-flag look-at-move-dest)) + (if (zero? (-> obj hit-face)) + (go (method-of-object obj get-up-front)) + (go (method-of-object obj get-up-back)) + ) + ) + ) + (none) + ) + +;; definition for method 56 of type civilian +(defmethod damage-amount-from-attack civilian ((obj civilian) (arg0 process) (arg1 event-message-block)) + "@returns the amount of damage taken from an attack. This can come straight off the [[attack-info]] or via [[penetrate-using->damage]]" + (cond + ((= (scf-get-territory) 2) + (let ((a1-1 (-> arg1 param 1)) + (a0-1 arg0) + ) + (cond + (a0-1 + (let ((v1-0 (find-offending-process-focusable a0-1 (the-as attack-info a1-1)))) + (cond + (v1-0 + (cond + ((= (-> v1-0 type) target) + 0 + ) + ((or (logtest? (process-mask enemy) (-> v1-0 mask)) (logtest? (process-mask guard) (-> v1-0 mask))) + ((method-of-type nav-enemy damage-amount-from-attack) obj arg0 arg1) + ) + (else + 0 + ) + ) + ) + (else + 0 + ) + ) + ) + ) + (else + 0 + ) + ) + ) + ) + (else + ((method-of-type nav-enemy damage-amount-from-attack) obj arg0 arg1) + ) + ) + ) + +;; definition for method 108 of type civilian +(defmethod enemy-method-108 civilian ((obj civilian) (arg0 enemy) (arg1 event-message-block)) + 0 + ) + +;; definition for method 70 of type civilian +(defmethod go-hostile civilian ((obj civilian)) + (cleanup-for-death obj) + (none) + ) + +;; definition for method 73 of type civilian +;; WARN: Return type mismatch none vs object. +(defmethod kill-prefer-falling civilian ((obj civilian)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + (the-as object (cleanup-for-death obj)) + ) + +;; definition for method 199 of type civilian +;; WARN: Return type mismatch int vs none. +(defmethod set-behavior! civilian ((obj civilian) (arg0 traffic-object-spawn-params)) + (let ((v1-0 (-> arg0 behavior))) + (cond + ((zero? v1-0) + (go (method-of-object obj idle)) + ) + ((= v1-0 2) + (go (method-of-object obj active)) + ) + ((= v1-0 3) + (go (method-of-object obj hostile)) + ) + ((= v1-0 7) + (logior! (-> obj flags) (citizen-flag persistent)) + (go (method-of-object obj wait-for-ride)) + ) + (else + (go-inactive obj) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 181 of type civilian +;; WARN: Return type mismatch int vs none. +(defmethod citizen-init! civilian ((obj civilian)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type citizen citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj mask) (the-as process-mask (logior (process-mask civilian) (-> obj mask)))) + (set! (-> obj hit-points) (rand-vu-int-range 1 4)) + (set! (-> obj hit-points) 4) + (set! (-> obj fact-info-override pickup-type) (pickup-type none)) + (set! (-> obj fact-info-override pickup-amount) 0.0) + (set! (-> obj fact-info-override pickup-spawn-amount) 0.0) + 0 + (none) + ) + +;; definition for method 215 of type civilian +;; INFO: Used lq/sq +;; WARN: Return type mismatch nav-segment vs none. +(defmethod civilian-method-215 civilian ((obj civilian) (arg0 vector)) + (let ((v1-0 (new 'stack-no-clear 'vector))) + (set! (-> v1-0 quad) (-> obj root-override2 trans quad)) + (set! (-> v1-0 w) 81920.0) + (let ((s5-0 (find-segment obj v1-0 arg0))) + (if s5-0 + (citizen-method-186 obj s5-0) + ) + ) + ) + (none) + ) + +;; definition for method 74 of type civilian +;; INFO: Used lq/sq +;; WARN: Return type mismatch none vs object. +(defmethod general-event-handler civilian ((obj civilian) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (with-pp + (let ((v1-0 arg2)) + (the-as + object + (cond + ((= v1-0 'track) + #f + ) + ((= v1-0 'combo) + #f + ) + ((= v1-0 'touched) + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ((= v1-0 'panic) + (let ((a0-6 (-> arg3 param 0))) + (set! (-> obj danger-pos quad) (-> (the-as sphere (+ a0-6 0)) quad)) + ) + (if (and (-> obj next-state) (let ((v1-6 (-> obj next-state name))) + (or (= v1-6 'active) (= v1-6 'wait) (= v1-6 'avoid-danger)) + ) + ) + (go (method-of-object obj flee)) + ) + ) + ((= v1-0 'event-death) + (if (zero? (-> obj hit-points)) + (the-as object (do-effect (-> obj skel effect) 'death-default 0.0 -1)) + ) + ) + ((= v1-0 'avoid) + (set! (-> obj last-danger-time) (-> pp clock frame-counter)) + (let ((a0-15 (-> arg3 param 0))) + (set! (-> obj danger-pos quad) (-> (the-as vector (+ a0-15 0)) quad)) + ) + (if (and (-> obj next-state) (let ((v1-18 (-> obj next-state name))) + (or (= v1-18 'active) (= v1-18 'wait)) + ) + ) + (go (method-of-object obj avoid-danger)) + ) + ) + ((= v1-0 'clear-path) + (set! (-> obj last-danger-time) (-> pp clock frame-counter)) + (let ((v1-23 (the-as traffic-danger-info (-> arg3 param 0)))) + (set! (-> obj cp-valid?) #t) + (set! (-> obj cp-sphere quad) (-> v1-23 sphere quad)) + (set! (-> obj cp-vec quad) (-> v1-23 velocity quad)) + (case (-> v1-23 danger-type) + (((traffic-danger-type tdt0)) + (set! (-> obj allow-dive) #f) + (set! (-> obj cp-factor) 20.0) + ) + (((traffic-danger-type tdt1)) + (set! (-> obj allow-dive) #f) + (set! (-> obj cp-factor) 20.0) + ) + (((traffic-danger-type tdt2)) + (set! (-> obj allow-dive) #t) + (set! (-> obj cp-factor) 50.0) + ) + (((traffic-danger-type tdt3)) + (set! (-> obj allow-dive) #t) + (set! (-> obj cp-factor) 50.0) + ) + (((traffic-danger-type tdt4)) + (set! (-> obj allow-dive) #f) + (set! (-> obj cp-factor) 2.0) + ) + (((traffic-danger-type tdt5)) + (set! (-> obj allow-dive) #t) + (set! (-> obj cp-factor) 50.0) + ) + (((traffic-danger-type tdt6)) + (set! (-> obj allow-dive) #t) + (set! (-> obj cp-factor) 50.0) + ) + ) + ) + (let ((s5-1 (-> obj cp-plane))) + (set! (-> s5-1 quad) (-> obj cp-vec quad)) + (set! (-> s5-1 y) 0.0) + (vector-rotate90-around-y! s5-1 s5-1) + (vector-normalize! s5-1 1.0) + (set! (-> s5-1 w) (- (vector-dot (the-as vector s5-1) (the-as vector (-> obj cp-sphere))))) + ) + (set! (-> obj cp-exit-time) (+ (-> pp clock frame-counter) (seconds 4))) + (if (and (-> obj next-state) (let ((v1-54 (-> obj next-state name))) + (or (= v1-54 'active) (= v1-54 'wait) (= v1-54 'avoid-danger)) + ) + ) + (go (method-of-object obj clear-path)) + ) + ) + ((or (= v1-0 'hit) (= v1-0 'hit-flinch) (= v1-0 'hit-knocked)) + (speech-control-method-13 *speech-control* (the-as handle obj)) + (if (logtest? (-> obj flags) (citizen-flag female)) + (speech-control-method-12 + *speech-control* + obj + (speech-type speech-type-0 speech-type-1 speech-type-3 speech-type-4) + ) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-0 speech-type-1 speech-type-4)) + ) + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ((= v1-0 'end-task) + (let ((v0-0 (the-as object (logclear (-> obj flags) (citizen-flag persistent))))) + (set! (-> obj flags) (the-as citizen-flag v0-0)) + v0-0 + ) + ) + (else + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + ) + ) + +;; definition for method 214 of type civilian +;; INFO: Used lq/sq +(defmethod civilian-method-214 civilian ((obj civilian) (arg0 nav-branch) (arg1 int) (arg2 vector) (arg3 float)) + (when (nonzero? arg1) + (-> arg0 src-node) + (let* ((s3-0 (-> arg0 dest-node)) + (t9-0 vector-vector-xz-distance) + (a0-1 arg2) + (a2-1 s3-0) + (a1-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> a1-1 quad) (-> a2-1 position quad)) + (set! (-> a1-1 w) 1.0) + (let ((s1-0 (t9-0 a0-1 a1-1)) + (s2-0 (-> s3-0 branch-count)) + (f30-0 0.0) + ) + (dotimes (s0-0 s2-0) + (+! f30-0 (civilian-method-214 obj (-> s3-0 branch-array s0-0) (+ arg1 -1) arg2 s1-0)) + ) + (set! arg3 (+ s1-0 (the float (/ (the int f30-0) s2-0)))) + ) + ) + ) + arg3 + ) + +;; failed to figure out what this is: +(defstate wait (civilian) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type citizen wait) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + ) + +;; definition for function civilian-flee-post +;; INFO: Used lq/sq +(defbehavior civilian-flee-post civilian () + (let* ((gp-0 (-> self controller)) + (s4-0 (-> gp-0 branch dest-node)) + (s5-0 (the-as nav-branch #f)) + (s3-1 (vector-! + (new 'stack-no-clear 'vector) + (-> self controller turn-exit-point) + (-> self controller path-prev-point) + ) + ) + ) + 0.0 + (let ((s2-1 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (-> self controller turn-exit-point)) + ) + ) + (set! (-> s2-1 y) 0.0) + (set! (-> s3-1 y) 0.0) + (vector-xz-normalize! s3-1 1.0) + (let ((f0-4 (vector-dot s2-1 s3-1))) + (when (< -16384.0 f0-4) + (cond + ((zero? (-> s4-0 branch-count)) + ) + (else + (let ((s3-2 (-> s4-0 branch-count)) + (f30-0 0.0) + ) + (dotimes (s2-2 s3-2) + (let* ((s1-0 (-> s4-0 branch-array s2-2)) + (f0-5 (civilian-method-214 self s1-0 4 (-> self danger-pos) 0.0)) + ) + (when (< f30-0 f0-5) + (set! f30-0 f0-5) + (set! s5-0 s1-0) + ) + ) + ) + ) + ) + ) + (when s5-0 + (vehicle-controller-method-11 gp-0) + (let ((s4-1 (new 'stack-no-clear 'vector))) + (set! (-> s4-1 quad) (-> gp-0 turn-exit-point quad)) + (vehicle-controller-method-10 gp-0 (the-as traffic-tracker s5-0)) + (set! (-> gp-0 path-prev-point quad) (-> s4-1 quad)) + ) + (set! (-> gp-0 branch) s5-0) + (let ((a1-3 (-> s5-0 dest-node)) + (v1-23 (-> gp-0 turn-exit-point)) + ) + (set! (-> v1-23 quad) (-> a1-3 position quad)) + (set! (-> v1-23 w) 1.0) + ) + ) + ) + ) + ) + ) + (when (< (-> self cp-next-time) (-> self clock frame-counter)) + (set! (-> self cp-next-time) (+ (-> self clock frame-counter) (get-rand-int-range self 600 1200))) + (citizen-method-190 self (-> self cp-force)) + ) + (add-offset-to-target! (-> self nav state) (-> self cp-force)) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (-> self cp-force)) + *color-red* + #f + (the-as rgba -1) + ) + ) + (let ((a0-18 (-> self nav state)) + (v1-42 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-18 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-18 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-18 target-post quad) (-> v1-42 quad)) + ) + 0 + (set! (-> (new 'stack-no-clear 'vector) quad) (-> self nav state target-post quad)) + (nav-enemy-method-176 self) + (none) + ) + +;; failed to figure out what this is: +(defstate flee (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-166 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self speed-run))) + ) + 0 + (let ((a1-5 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (the-as vector (-> self danger-pos))) + ) + ) + (civilian-method-215 self a1-5) + ) + (if (zero? (-> self controller branch)) + (citizen-method-195 self (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + ) + (if (zero? (-> self controller branch)) + (go-dive self) + ) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.0 0.0 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + (when (and (logtest? (-> self draw status) (draw-control-status on-screen)) + (< (vector-vector-distance (-> self root-override2 trans) (camera-pos)) 204800.0) + ) + (if (logtest? (-> self flags) (citizen-flag female)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-3 speech-type-4)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-4)) + ) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.1)) + (not (logtest? (-> self nav state flags) (nav-state-flag in-mesh))) + (< (-> self root-override2 trans y) 4096.0) + ) + (go-virtual in-ditch) + ) + (citizen-method-192 self) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self anim-panic-run))) 30) + (none) + ) + :post (behavior () + (civilian-flee-post) + (none) + ) + ) + +;; definition for function civilian-avoid-danger-post +;; INFO: Used lq/sq +(defbehavior civilian-avoid-danger-post civilian () + (local-vars (sv-352 nav-poly)) + (let ((gp-1 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (the-as vector (-> self danger-pos))) + ) + ) + (let ((s5-1 + (vector-! (new 'stack-no-clear 'vector) (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + ) + (vector-! + (new 'stack-no-clear 'vector) + (-> self controller turn-exit-point) + (the-as vector (-> self danger-pos)) + ) + (let ((s1-1 (vector-! + (new 'stack-no-clear 'vector) + (-> self controller turn-exit-point) + (-> self controller path-prev-point) + ) + ) + ) + (set! (-> s5-1 y) 0.0) + (set! (-> s1-1 y) 0.0) + (vector-xz-normalize! s1-1 1.0) + (vector-rotate90-around-y! s1-1 s1-1) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (let ((v1-6 (-> self nav)) + (a0-8 (-> self danger-pos)) + (a1-5 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-5 point) (the-as vector a0-8) (-> v1-6 state mesh bounds)) + (set! (-> a1-5 y-threshold) (-> v1-6 nearest-y-threshold)) + (set! (-> a1-5 ignore) (the-as uint 2)) + (set! sv-352 (find-poly-containing-point-local (-> v1-6 state mesh) a1-5)) + ) + (when sv-352 + (vector-normalize-copy! s3-0 s1-1 40960.0) + (clamp-vector-to-mesh-no-gaps (-> self nav) (-> self danger-pos) sv-352 s3-0 s0-0) + (vector-normalize-copy! s2-0 s1-1 -40960.0) + (let ((a0-14 (-> self nav)) + (t9-7 (method-of-type nav-control clamp-vector-to-mesh-no-gaps)) + (a1-9 (-> self danger-pos)) + (a3-3 s2-0) + ) + (t9-7 a0-14 a1-9 sv-352 a3-3 s0-0) + ) + (let* ((v1-12 s3-0) + (f0-7 (sqrtf (+ (* (-> v1-12 x) (-> v1-12 x)) (* (-> v1-12 z) (-> v1-12 z))))) + (v1-14 s2-0) + (f1-7 (sqrtf (+ (* (-> v1-14 x) (-> v1-14 x)) (* (-> v1-14 z) (-> v1-14 z))))) + ) + (cond + ((< 0.0 (vector-dot s1-1 gp-1)) + (if (< 8192.0 f0-7) + (set! (-> s4-0 quad) (-> s3-0 quad)) + (set! (-> s4-0 quad) (-> s2-0 quad)) + ) + ) + ((< 8192.0 f1-7) + (set! (-> s4-0 quad) (-> s2-0 quad)) + ) + (else + (set! (-> s4-0 quad) (-> s3-0 quad)) + ) + ) + ) + (let* ((v1-24 gp-1) + (f0-13 (sqrtf (+ (* (-> v1-24 x) (-> v1-24 x)) (* (-> v1-24 z) (-> v1-24 z))))) + ) + (let ((f1-12 0.8) + (v1-27 s5-1) + ) + (* f1-12 (sqrtf (+ (* (-> v1-27 x) (-> v1-27 x)) (* (-> v1-27 z) (-> v1-27 z))))) + ) + (let ((f0-15 (/ (- (-> self danger-pos r) f0-13) (-> self danger-pos r)))) + (if (< f0-15 0.0) + (set! f0-15 0.0) + ) + (if (< 0.8 f0-15) + (set! f0-15 0.8) + ) + (set! (-> gp-1 quad) (-> s4-0 quad)) + (vector-xz-normalize! gp-1 (* 16384.0 f0-15)) + ) + ) + (vector-xz-normalize! s5-1 16384.0) + ) + ) + ) + (vector+! gp-1 gp-1 s5-1) + ) + (vector-xz-normalize! gp-1 4096.0) + (let ((a0-27 (-> self nav state)) + (v1-41 (vector+! (new 'stack-no-clear 'vector) gp-1 (-> self root-override2 trans))) + ) + (logclear! (-> a0-27 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-27 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-27 target-post quad) (-> v1-41 quad)) + ) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + +;; definition for function civilian-avoid-danger-post2 +;; INFO: Used lq/sq +(defbehavior civilian-avoid-danger-post2 civilian () + (let ((gp-0 (new 'stack-no-clear 'vector))) + (calc-danger-vec self (-> self danger-pos) gp-0) + (add-offset-to-target! (-> self nav state) gp-0) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) gp-0) + *color-blue* + #f + (the-as rgba -1) + ) + ) + ) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (citizen-method-188 self gp-1) + (add-offset-to-target! (-> self nav state) gp-1) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) gp-1) + *color-green* + #f + (the-as rgba -1) + ) + ) + ) + (let ((a0-6 (-> self nav state)) + (v1-23 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-6 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-6 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-6 target-post quad) (-> v1-23 quad)) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + +;; failed to figure out what this is: +(defstate avoid-danger (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-165 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self speed-walk))) + ) + 0 + (set! (-> self next-time) (+ (-> self clock frame-counter) (get-rand-int-range self 300 600))) + (set! (-> self last-second-pos quad) (-> self root-override2 trans quad)) + (set! (-> self last-distance) + (vector-vector-xz-distance (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.0 0.0 1.0 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + (if (< (+ (-> self last-danger-time) (seconds 1)) (-> self clock frame-counter)) + (go-virtual active) + ) + (when (citizen-method-187 self) + (cond + ((< (* 2.0 (-> self danger-pos r)) + (vector-vector-xz-distance (-> self danger-pos) (-> self controller turn-exit-point)) + ) + (go-virtual active) + ) + (else + (vehicle-controller-method-14 (-> self controller) (the-as vehicle self)) + (set! (-> self last-distance) + (vector-vector-xz-distance (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 60) + (none) + ) + :post (behavior () + (civilian-avoid-danger-post2) + (none) + ) + ) + +;; definition for function civilian-clear-path-post +;; INFO: Used lq/sq +(defbehavior civilian-clear-path-post civilian () + (local-vars (sv-304 nav-poly)) + (let ((s5-1 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (the-as vector (-> self cp-sphere))) + ) + (s1-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> gp-0 quad) (-> self cp-vec quad)) + (set! (-> gp-0 y) 0.0) + (vector-xz-normalize! gp-0 1.0) + (vector-rotate90-around-y! gp-0 gp-0) + (set! (-> s5-1 y) 0.0) + (vector-*! s1-0 s5-1 gp-0 (vector-dot s5-1 gp-0)) + (vector+! s1-0 s1-0 (the-as vector (-> self cp-sphere))) + (vector-xz-normalize! s5-1 1.0) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack 'clamp-travel-vector-to-mesh-return-info)) + ) + (set! sv-304 (-> self nav state current-poly)) + (let ((f30-0 (+ 4096.0 (-> self cp-sphere r)))) + (when sv-304 + (vector-normalize-copy! s3-0 gp-0 f30-0) + (vector-normalize-copy! s2-0 gp-0 (- f30-0)) + (clamp-vector-to-mesh-no-gaps (-> self nav) s1-0 sv-304 s3-0 s0-0) + (let ((a0-12 (-> self nav)) + (t9-8 (method-of-type nav-control clamp-vector-to-mesh-no-gaps)) + (a3-3 s2-0) + ) + (t9-8 a0-12 s1-0 sv-304 a3-3 s0-0) + ) + (let* ((v1-14 s3-0) + (f0-9 (sqrtf (+ (* (-> v1-14 x) (-> v1-14 x)) (* (-> v1-14 z) (-> v1-14 z))))) + (v1-16 s2-0) + (f1-8 (sqrtf (+ (* (-> v1-16 x) (-> v1-16 x)) (* (-> v1-16 z) (-> v1-16 z))))) + ) + (cond + ((< 0.0 (vector-dot gp-0 s5-1)) + (if (< 4096.0 f0-9) + (set! (-> s4-0 quad) (-> s3-0 quad)) + (set! (-> s4-0 quad) (-> s2-0 quad)) + ) + ) + ((< 4096.0 f1-8) + (set! (-> s4-0 quad) (-> s2-0 quad)) + ) + (else + (set! (-> s4-0 quad) (-> s3-0 quad)) + ) + ) + ) + (set! (-> gp-0 quad) (-> s4-0 quad)) + ) + ) + ) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) gp-0) + *color-blue* + #f + (the-as rgba -1) + ) + ) + (let ((a0-21 (-> self nav state)) + (v1-34 (vector+! (new 'stack-no-clear 'vector) gp-0 (-> self root-override2 trans))) + ) + (logclear! (-> a0-21 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-21 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-21 target-post quad) (-> v1-34 quad)) + ) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + +;; definition for function civilian-clear-path-post2 +;; INFO: Used lq/sq +(defbehavior civilian-clear-path-post2 civilian () + (citizen-method-192 self) + (when (< (-> self cp-next-time) (-> self clock frame-counter)) + (citizen-method-190 self (-> self cp-force)) + (set! (-> self cp-next-time) (+ (-> self clock frame-counter) (get-rand-int-range self 1200 2400))) + ) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (citizen-method-188 self gp-1) + (add-offset-to-target! (-> self nav state) gp-1) + ) + (if *citizen-debug* + (add-debug-line + #t + (bucket-id debug-no-zbuf1) + (-> self root-override2 trans) + (vector+! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (-> self cp-force)) + *color-blue* + #f + (the-as rgba -1) + ) + ) + (add-offset-to-target! (-> self nav state) (-> self cp-force)) + (let ((a0-9 (-> self nav state)) + (v1-25 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-9 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-9 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-9 target-post quad) (-> v1-25 quad)) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + +;; failed to figure out what this is: +(defstate clear-path (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-165 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self speed-walk))) + ) + 0 + (set! (-> self cp-next-time) (+ (-> self clock frame-counter) (get-rand-int-range self 1200 2400))) + (set! (-> self cp-force quad) (the-as uint128 0)) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.0 1.0 0.0 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + (when (citizen-method-187 self) + (vehicle-controller-method-14 (-> self controller) (the-as vehicle self)) + (set! (-> self last-distance) + (vector-vector-xz-distance (-> self controller turn-exit-point) (-> self root-override2 trans)) + ) + ) + (let ((v1-8 + (vector-! (new 'stack-no-clear 'vector) (-> self root-override2 trans) (the-as vector (-> self cp-sphere))) + ) + ) + (cond + ((< (* 0.5 (vector-length (-> self cp-vec))) (vector-length v1-8)) + (let ((a0-10 (-> self nav))) + (set! (-> a0-10 target-speed) (* (-> self speed-scale) (-> self speed-walk))) + ) + 0 + (let ((a0-12 (-> self nav))) + (set! (-> a0-12 acceleration) (-> self enemy-info-override walk-acceleration)) + ) + 0 + (let ((a0-14 (-> self nav))) + (set! (-> a0-14 turning-acceleration) (-> self enemy-info-override walk-turning-acceleration)) + ) + 0 + ) + (else + (let ((a0-16 (-> self nav))) + (set! (-> a0-16 target-speed) (* (-> self speed-scale) (-> self speed-run))) + ) + 0 + (let ((a0-18 (-> self nav))) + (set! (-> a0-18 acceleration) (-> self enemy-info-override run-acceleration)) + ) + 0 + (let ((a0-20 (-> self nav))) + (set! (-> a0-20 turning-acceleration) (-> self enemy-info-override run-turning-acceleration)) + ) + 0 + ) + ) + (if (and (-> self allow-dive) + (< (vector-length v1-8) (* (-> self dive-reaction) (vector-length (-> self cp-vec)))) + (< (fabs (vector4-dot (-> self root-override2 trans) (the-as vector (-> self cp-plane)))) + (* 0.5 (-> self cp-sphere r)) + ) + ) + (go-dive self) + ) + ) + (if (< (-> self cp-exit-time) (-> self clock frame-counter)) + (go-virtual active) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 30) + (none) + ) + :post (behavior () + (civilian-clear-path-post2) + (none) + ) + ) + +;; definition for method 216 of type civilian +;; WARN: Return type mismatch object vs none. +(defmethod go-dive civilian ((obj civilian)) + (if (< (-> obj nav state speed) 8192.0) + (go (method-of-object obj on-ground)) + (go (method-of-object obj dive)) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate on-ground (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((v1-8 (-> self root-override2 root-prim))) + (set! (-> v1-8 prim-core collide-as) (collide-spec)) + (set! (-> v1-8 prim-core collide-with) (collide-spec)) + ) + 0 + (logclear! (-> self root-override2 nav-flags) (nav-flags has-root-sphere has-extra-sphere)) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.5 0.5 1.0 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-5 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (logior! (-> self root-override2 nav-flags) (nav-flags has-root-sphere)) + (none) + ) + :trans (behavior () + (if (< (+ (-> self last-danger-time) (seconds 1)) (-> self clock frame-counter)) + (go-virtual get-up-front) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-on-ground)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-on-ground))) frames num-frames) -1) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (until #f + (suspend) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate dive (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (let ((v1-8 (-> self root-override2 root-prim))) + (set! (-> v1-8 prim-core collide-as) (collide-spec)) + (set! (-> v1-8 prim-core collide-with) (collide-spec)) + ) + 0 + (logclear! (-> self root-override2 nav-flags) (nav-flags has-root-sphere has-extra-sphere)) + (let ((v1-12 (-> self nav))) + (set! (-> v1-12 sphere-mask) (the-as uint 0)) + ) + 0 + (let ((v1-14 (-> self nav))) + (set! (-> v1-14 target-speed) 32768.0) + ) + 0 + (let ((v1-16 (-> self nav))) + (set! (-> v1-16 acceleration) 32768.0) + ) + 0 + (let ((gp-0 (new 'stack-no-clear 'vector))) + (let ((a1-4 (-> self nav state))) + (set! (-> gp-0 quad) (-> a1-4 heading quad)) + ) + (vector-normalize! gp-0 614400.0) + (vector+! (-> self dive-target-point) (-> self root-override2 trans) gp-0) + (set! (-> self dive-target-point quad) (-> gp-0 quad)) + ) + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.5 0.5 1.0 1.0) + ) + (set! (-> self dive-finished?) #f) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-5 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (logior! (-> self root-override2 nav-flags) (nav-flags has-root-sphere)) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 sphere-mask) (the-as uint #x800fe)) + ) + 0 + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-dive)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-dive))) frames num-frames) -1) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (add-offset-to-target! (-> self nav state) (-> self dive-target-point)) + (if (>= (ja-frame-num 0) 6.0) + (vector-v*float++! (-> self dive-target-point) (-> self dive-target-point) -20.0) + ) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (set! (-> self dive-finished?) #t) + (set! (-> self root-override2 transv quad) (the-as uint128 0)) + (go-virtual cower-ground) + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 *null-vector*) + ) + (logior! (-> a0-0 flags) (nav-state-flag directional-mode)) + (set! (-> a0-0 travel quad) (-> v1-1 quad)) + ) + 0 + (if (-> self dive-finished?) + (track-target! self) + (nav-enemy-method-176 self) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate cower-ground (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((v1-8 (-> self root-override2 root-prim))) + (set! (-> v1-8 prim-core collide-as) (collide-spec)) + (set! (-> v1-8 prim-core collide-with) (collide-spec)) + ) + 0 + (logclear! (-> self root-override2 nav-flags) (nav-flags has-root-sphere has-extra-sphere)) + (let ((v1-12 (-> self nav))) + (set! (-> v1-12 sphere-mask) (the-as uint 0)) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 0.2 0.2 0.2 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-5 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (logior! (-> self root-override2 nav-flags) (nav-flags has-root-sphere)) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 sphere-mask) (the-as uint #x800fe)) + ) + 0 + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self info anim-cover-head-start)) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self info anim-cover-head-start))) + frames + num-frames + ) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self info anim-cover-head-loop)) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self info anim-cover-head-loop))) + frames + num-frames + ) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (if (< (+ (-> self last-danger-time) (seconds 1)) (-> self clock frame-counter)) + (goto cfg-9) + ) + ) + #f + (label cfg-9) + (ja-no-eval :group! (-> self draw art-group data (-> self info anim-cover-head-end)) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self info anim-cover-head-end))) + frames + num-frames + ) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (go-virtual get-up-front) + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 *null-vector*) + ) + (logior! (-> a0-0 flags) (nav-state-flag directional-mode)) + (set! (-> a0-0 travel quad) (-> v1-1 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate get-up-front (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.5 0.5 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-get-up-front)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-get-up-front))) frames num-frames) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (go-virtual flee) + (none) + ) + :post (behavior () + (enemy-method-49 self) + (let ((a0-1 (-> self nav state)) + (v1-3 *null-vector*) + ) + (logior! (-> a0-1 flags) (nav-state-flag directional-mode)) + (set! (-> a0-1 travel quad) (-> v1-3 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate get-up-back (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.5 0.5 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-get-up-back)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-get-up-back))) frames num-frames) -1) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (go-virtual flee) + (none) + ) + :post (behavior () + (enemy-method-49 self) + (let ((a0-1 (-> self nav state)) + (v1-3 *null-vector*) + ) + (logior! (-> a0-1 flags) (nav-state-flag directional-mode)) + (set! (-> a0-1 travel quad) (-> v1-3 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +;; definition for function civilian-falling-post +;; INFO: Used lq/sq +(defbehavior civilian-falling-post civilian () + (set! (-> self enemy-flags) (logior (enemy-flag directed) (-> self enemy-flags))) + (let ((gp-0 (-> self root-override2))) + (cond + ((logtest? (-> self focus-status) (focus-status under-water)) + (enemy-method-47 self (-> gp-0 transv)) + ) + (else + (let ((a1-1 (new-stack-vector0))) + (vector-v++! + (-> gp-0 transv) + (compute-acc-due-to-gravity gp-0 a1-1 (-> self enemy-info-override slip-factor)) + ) + ) + ) + ) + (let ((a2-1 (new 'stack-no-clear 'collide-query))) + (set! (-> a2-1 collide-with) (-> gp-0 root-prim prim-core collide-with)) + (set! (-> a2-1 ignore-process0) self) + (set! (-> a2-1 ignore-process1) (-> self vehicle process 0)) + (set! (-> a2-1 ignore-pat) (logior (new 'static 'pat-surface :noendlessfall #x1) (-> gp-0 pat-ignore-mask))) + (set! (-> a2-1 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide gp-0 (-> gp-0 transv) a2-1 (meters 0)) + ) + ) + (enemy-method-111 self) + (track-target! self) + (none) + ) + +;; failed to figure out what this is: +(defstate knocked (civilian) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type citizen knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self hit-face) + (the-as uint (if (< (vector-dot + (-> self root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat)) + ) + 0.0 + ) + 1 + 0 + ) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (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)) + ) + (let ((t9-0 (-> (method-of-type nav-enemy knocked) exit))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type citizen knocked) trans))) + (if t9-0 + (t9-0) + ) + ) + (enemy-method-49 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate wait-for-ride (civilian) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('board-vehicle) + (let ((a0-1 (the-as vehicle (-> event param 0)))) + (when a0-1 + (let ((v0-0 (the-as object (process->handle a0-1)))) + (set! (-> self vehicle) (the-as handle v0-0)) + v0-0 + ) + ) + ) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (logior! (-> self flags) (citizen-flag persistent)) + (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 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((a0-5 (-> self nav state)) + (v1-10 *null-vector*) + ) + (logior! (-> a0-5 flags) (nav-state-flag directional-mode)) + (set! (-> a0-5 travel quad) (-> v1-10 quad)) + ) + 0 + (set! (-> self vehicle) (the-as handle #f)) + (none) + ) + :exit (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (none) + ) + :trans (behavior () + (if (and (not (logtest? (-> self nav state flags) (nav-state-flag in-mesh))) + (< (-> self root-override2 trans y) 4096.0) + ) + (go-virtual in-ditch) + ) + (when (-> self vehicle) + (case (-> (the-as vehicle (handle->process (-> self vehicle))) info-override object-type) + ((14 15 16 11 12 13) + (go-virtual move-to-vehicle) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (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 + ) + ) + 0.1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.1)) + ) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-simple-post) + (none) + ) + ) + +;; definition for method 217 of type civilian +(defmethod civilian-method-217 civilian ((obj civilian) (arg0 vector)) + (let ((s3-0 (handle->process (-> obj vehicle))) + (s4-0 (new 'stack 'collide-query)) + ) + (compute-seat-position (the-as vehicle s3-0) arg0 (-> obj seat)) + (vector-! arg0 arg0 (-> (the-as vehicle s3-0) root-override-2 trans)) + (vector-normalize! arg0 (+ 14336.0 (vector-length arg0))) + (vector+! arg0 arg0 (-> (the-as vehicle s3-0) root-override-2 trans)) + (when (enemy-above-ground? obj s4-0 arg0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> arg0 y) (-> s4-0 best-other-tri intersect y)) + (let ((v1-14 (-> obj nav)) + (a1-10 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-10 point) arg0 (-> v1-14 state mesh bounds)) + (set! (-> a1-10 y-threshold) (-> v1-14 nearest-y-threshold)) + (set! (-> a1-10 ignore) (the-as uint 2)) + (if (find-poly-containing-point-local (-> v1-14 state mesh) a1-10) + (return #t) + ) + ) + ) + ) + #f + ) + +;; definition for function do-spline2 +(defun do-spline2 ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 vector) (arg4 vector) (arg5 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let* ((f1-1 (* arg5 arg5)) + (f0-2 (* arg5 f1-1)) + ) + (let ((f2-3 (- (+ 1.0 (* -3.0 arg5) (* 3.0 f1-1)) f0-2)) + (f3-7 (+ (* 3.0 f0-2) (* -6.0 f1-1) (* 3.0 arg5))) + (f1-3 (+ (* -3.0 f0-2) (* 3.0 f1-1))) + ) + (vector-float*! arg0 arg1 f2-3) + (let ((t2-0 arg0)) + (let ((v1-10 arg0)) + (let ((t1-3 (vector+! (new 'stack-no-clear 'vector) arg1 arg2))) + (let ((a1-1 f3-7)) + (.mov vf7 a1-1) + ) + (.lvf vf5 (&-> t1-3 quad)) + ) + (.lvf vf4 (&-> v1-10 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 (&-> t2-0 quad) vf6) + ) + (let ((a2-1 arg0)) + (let ((v1-11 arg0)) + (let ((a1-3 (vector+! (new 'stack-no-clear 'vector) arg3 arg4))) + (let ((t0-1 f1-3)) + (.mov vf7 t0-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 (&-> a2-1 quad) vf6) + ) + ) + (let ((v0-0 arg0)) + (let ((v1-12 arg0)) + (let ((a0-1 arg3)) + (let ((a1-4 f0-2)) + (.mov vf7 a1-4) + ) + (.lvf vf5 (&-> a0-1 quad)) + ) + (.lvf vf4 (&-> v1-12 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 (&-> v0-0 quad) vf6) + v0-0 + ) + ) + ) + ) + +;; failed to figure out what this is: +(defstate move-to-vehicle (civilian) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (enemy-event-handler proc arg1 event-type event) + ) + :enter (behavior () + (logior! (-> self flags) (citizen-flag persistent)) + (set! (-> self state-time) (-> self clock frame-counter)) + (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 + (nav-enemy-method-166 self) + (let ((v1-12 (-> self nav state))) + (set! (-> v1-12 speed) 0.0) + ) + 0 + (let ((v1-14 (-> self nav))) + (set! (-> v1-14 sphere-mask) (the-as uint #x800f8)) + ) + 0 + (none) + ) + :exit (behavior () + (let ((v1-0 (-> self nav))) + (set! (-> v1-0 sphere-mask) (the-as uint #x800fe)) + ) + 0 + (logclear! (-> self flags) (citizen-flag persistent)) + (none) + ) + :trans (behavior () + (let ((gp-0 (new 'stack-no-clear 'vector))) + (new 'stack-no-clear 'vector) + (let ((s0-0 (handle->process (-> self vehicle)))) + (cond + (s0-0 + (set! (-> self seat) (get-best-seat-for-vehicle + (the-as vehicle s0-0) + (-> self root-override2 trans) + (the-as int (-> self info seat-flag)) + 1 + ) + ) + (cond + ((!= (-> self seat) -1) + (compute-seat-position (the-as vehicle s0-0) gp-0 (-> self seat)) + (let ((s2-0 (new 'stack-no-clear 'vector)) + (s4-0 (new 'stack-no-clear 'vector)) + (s1-0 (new 'stack-no-clear 'vector)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (let ((s3-0 (new 'stack-no-clear 'vector))) + (new 'stack-no-clear 'vector) + (set! (-> s2-0 quad) (-> self root-override2 trans quad)) + (set! (-> s1-0 quad) (-> gp-0 quad)) + (vector-! s5-0 gp-0 (-> (the-as vehicle s0-0) root-override-2 trans)) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (let ((f30-1 (* 0.5 (vector-vector-xz-distance s2-0 s1-0)))) + (vector-normalize! s4-0 (* 2.0 f30-1)) + (vector-normalize! s5-0 (* 4.0 f30-1)) + ) + (do-spline2 s3-0 s2-0 s4-0 s1-0 s5-0 0.8) + (let ((v1-21 (-> self nav state))) + (logclear! (-> v1-21 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-21 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-21 target-post quad) (-> s3-0 quad)) + ) + ) + 0 + (if (and (< (vector-dot (vector-normalize! s4-0 1.0) (vector-normalize! s5-0 1.0)) -0.5) + (< (vector-vector-xz-distance gp-0 (-> self root-override2 trans)) 18432.0) + (< (fabs (- (-> gp-0 y) (-> self root-override2 trans y))) 20480.0) + ) + (go-virtual board-vehicle) + ) + ) + ) + (else + (go-virtual wait-for-ride) + ) + ) + ) + (else + (go-virtual wait-for-ride) + ) + ) + ) + (if (< 73728.0 (vector-vector-xz-distance gp-0 (-> self root-override2 trans))) + (go-virtual wait-for-ride) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 60) + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate board-vehicle (civilian) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('vehicle-crash) + #f + ) + (('end-task) + (kill-prefer-falling self) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + :enter (behavior () + (logior! (-> self flags) (citizen-flag persistent)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 prim-core collide-with) (collide-spec)) + ) + 0 + (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 + (none) + ) + :exit (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (logclear! (-> self focus-status) (focus-status pilot)) + (none) + ) + :trans (behavior () + (let ((v1-1 (handle->process (-> self vehicle)))) + (if (or (not v1-1) (logtest? (-> (the-as vehicle v1-1) flags) (rigid-body-object-flag dead))) + (throw-off-vehicle self) + ) + ) + (none) + ) + :code (behavior () + (local-vars (sv-128 float) (sv-144 float)) + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) :num! min) + (let ((f30-0 0.0)) + (while (< f30-0 1.0) + (ja :num-func num-func-identity + :frame-num (lerp-scale 0.0 1.0 (+ (* -2.0 f30-0 f30-0 f30-0) (* 3.0 f30-0 f30-0)) 0.0 1.0) + ) + (suspend) + (+! f30-0 (* 3.0 (-> self clock seconds-per-frame))) + ) + ) + (let ((gp-2 (new 'stack-no-clear 'vector))) + (set! (-> gp-2 quad) (-> self root-override2 trans quad)) + (let ((s5-0 (quaternion-copy! (new 'stack-no-clear 'quaternion) (-> self root-override2 quat)))) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) + :num! (seek! (ja-aframe 5.0 0) 0.86956525) + :frame-num (ja-aframe 1.0 0) + ) + (until (ja-done? 0) + (let ((s2-0 (handle->process (-> self vehicle))) + (s1-0 (new 'stack-no-clear 'vector)) + (s4-1 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'quaternion)) + ) + (if (not s2-0) + (go-virtual wait-for-ride) + ) + (quaternion-copy! s3-0 (-> (the-as vehicle s2-0) root-override-2 quat)) + (compute-seat-position (the-as vehicle s2-0) s1-0 (-> self seat)) + (vector-! s4-1 s1-0 gp-2) + (let ((s2-1 lerp-scale) + (s1-1 0.0) + (s0-0 1.0) + ) + (set! sv-128 (ja-aframe-num 0)) + (set! sv-144 (ja-aframe 1.0 0)) + (let* ((t0-1 (ja-aframe 5.0 0)) + (f30-1 (s2-1 s1-1 s0-0 sv-128 sv-144 t0-1)) + ) + (quaternion-rotate-local-y! s3-0 s3-0 (* f30-1 (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + ) + (quaternion-slerp! (-> self root-override2 quat) s5-0 s3-0 f30-1) + (vector+float*! (-> self root-override2 trans) gp-2 s4-1 f30-1) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 5.0 0) 0.86956525)) + ) + ) + ) + (quaternion-copy! (new 'stack-no-clear 'quaternion) (-> self root-override2 quat)) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) + :num! (seek! (ja-aframe 12.0 0) 0.4) + :frame-num (ja-aframe 5.0 0) + ) + (until (ja-done? 0) + (let ((s5-1 (handle->process (-> self vehicle))) + (gp-4 (new 'stack-no-clear 'quaternion)) + ) + (if (not s5-1) + (go-virtual wait-for-ride) + ) + (quaternion-copy! gp-4 (-> (the-as vehicle s5-1) root-override-2 quat)) + (compute-seat-position (the-as vehicle s5-1) (-> self root-override2 trans) (-> self seat)) + (let ((f0-22 (lerp-scale 0.0 1.0 (ja-aframe-num 0) (ja-aframe 7.0 0) (ja-aframe 10.0 0)))) + (quaternion-rotate-local-y! (-> self root-override2 quat) gp-4 (* (- 1.0 f0-22) (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 12.0 0) 0.4)) + ) + (put-rider-in-seat (the-as vehicle (handle->process (-> self vehicle))) (-> self seat) self) + (go-virtual ride) + (none) + ) + :post (behavior () + (track-target! self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate ride (civilian) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (let ((v1-0 event-type) + (t0-0 'exit-vehicle) + ) + (cond + ((= v1-0 t0-0) + (let ((a0-1 (the-as object (-> event param 0)))) + (set! (-> self event-param-point quad) (-> (the-as vector a0-1) quad)) + ) + (let ((v1-3 (-> self clock frame-counter)) + (a0-3 (-> self state-time)) + ) + (if (>= (- v1-3 a0-3) (seconds 1)) + (go-virtual + exit-vehicle + a0-3 + arg1 + (the-as int event-type) + (the-as symbol event) + (the-as event-message-block t0-0) + ) + ) + ) + ) + ((= v1-0 'end-task) + (kill-prefer-falling self) + ) + (else + (enemy-event-handler proc arg1 event-type event) + ) + ) + ) + ) + :enter (behavior () + (logior! (-> self flags) (citizen-flag persistent)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-5 (-> self root-override2 root-prim))) + (set! (-> v1-5 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 prim-core collide-with) (collide-spec)) + ) + 0 + (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 focus-status) (logior (focus-status pilot-riding pilot) (-> self focus-status))) + (none) + ) + :exit (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (logclear! (-> self focus-status) (focus-status pilot-riding pilot)) + (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 (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :trans (behavior () + (let ((v1-1 (handle->process (-> self vehicle)))) + (if (or (not v1-1) (logtest? (-> (the-as vehicle v1-1) flags) (rigid-body-object-flag dead))) + (throw-off-vehicle self) + ) + ) + (none) + ) + :code (behavior () + (until #f + (suspend) + ) + #f + (none) + ) + :post (behavior () + (track-target! self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate exit-vehicle (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) enemy-event-handler) + :enter (behavior ((arg0 object) (arg1 object) (arg2 int) (arg3 symbol) (arg4 event-message-block)) + (change-to (find-nearest-nav-mesh (-> self root-override2 trans) (the-as float #x7f800000)) self) + (if (not (-> self nav)) + (go-inactive self) + ) + (let ((v1-8 (-> self nav state))) + (set! (-> v1-8 current-poly) (the-as nav-poly #f)) + ) + 0 + (citizen-method-195 + self + (vector-negate-in-place! (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + ) + (let ((a0-8 (-> self nav state)) + (v1-14 (-> self controller turn-exit-point)) + ) + (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-14 quad)) + ) + 0 + (citizen-nav-init! self) + (set! (-> self gnd-height) (-> self root-override2 gspot-pos y)) + (logior! (-> self flags) (citizen-flag persistent)) + (set! (-> self focus-status) (logior (focus-status pilot-riding pilot) (-> self focus-status))) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-28 (-> self root-override2 root-prim))) + (set! (-> v1-28 prim-core collide-as) (collide-spec)) + (set! (-> v1-28 prim-core collide-with) (collide-spec)) + ) + 0 + (let ((v1-30 self)) + (set! (-> v1-30 enemy-flags) (the-as enemy-flag (logclear (-> v1-30 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-30 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-33 self)) + (set! (-> v1-33 enemy-flags) (the-as enemy-flag (logclear (-> v1-33 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :exit (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (logclear! (-> self focus-status) (focus-status pilot-riding pilot)) + (none) + ) + :trans (behavior () + (let ((v1-1 (handle->process (-> self vehicle)))) + (if (or (not v1-1) (logtest? (-> (the-as vehicle v1-1) flags) (rigid-body-object-flag dead))) + (throw-off-vehicle self) + ) + ) + (none) + ) + :code (behavior ((arg0 object) (arg1 object) (arg2 int) (arg3 symbol) (arg4 event-message-block)) + (local-vars (sv-128 float) (sv-144 float)) + (ja-channel-push! 1 (seconds 0.1)) + (remove-rider (the-as vehicle (handle->process (-> self vehicle))) self) + (logclear! (-> self focus-status) (focus-status pilot-riding pilot)) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) + :num! (seek! (ja-aframe 5.0 0) 0.5) + :frame-num (ja-aframe 12.0 0) + ) + (until (ja-done? 0) + (let ((s5-0 (handle->process (-> self vehicle))) + (gp-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-copy! gp-1 (-> (the-as vehicle s5-0) root-override-2 quat)) + (compute-seat-position (the-as vehicle s5-0) (-> self root-override2 trans) (-> self seat)) + (let ((f0-3 (lerp-scale 0.0 1.0 (ja-aframe-num 0) (ja-aframe 10.0 0) (ja-aframe 7.0 0)))) + (quaternion-rotate-local-y! (-> self root-override2 quat) gp-1 (* f0-3 (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 5.0 0) 0.5)) + ) + (let ((gp-3 (new 'stack-no-clear 'vector)) + (s5-2 (new 'stack-no-clear 'quaternion)) + ) + (while (not (civilian-method-217 self gp-3)) + (let ((s4-1 (handle->process (-> self vehicle))) + (s3-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-copy! s3-1 (-> (the-as vehicle s4-1) root-override-2 quat)) + (compute-seat-position (the-as vehicle s4-1) (-> self root-override2 trans) (-> self seat)) + (quaternion-rotate-local-y! (-> self root-override2 quat) s3-1 (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + ) + (suspend) + ) + (let ((v1-43 (handle->process (-> self vehicle)))) + (quaternion-copy! s5-2 (-> (the-as vehicle v1-43) root-override-2 quat)) + ) + (ja-no-eval :group! (-> self draw art-group data (-> self info get-in-car-anim)) + :num! (seek! (ja-aframe 1.0 0) 0.5) + :frame-num (ja-aframe 5.0 0) + ) + (until (ja-done? 0) + (let ((a0-47 (handle->process (-> self vehicle))) + (s2-1 (new 'stack-no-clear 'vector)) + (s4-3 (new 'stack-no-clear 'vector)) + (s3-2 (new 'stack-no-clear 'quaternion)) + ) + (compute-seat-position (the-as vehicle a0-47) s2-1 (-> self seat)) + (vector-! s4-3 s2-1 gp-3) + (let ((s2-2 lerp-scale) + (s1-1 0.0) + (s0-0 1.0) + ) + (set! sv-128 (ja-aframe-num 0)) + (set! sv-144 (ja-aframe 5.0 0)) + (let* ((t0-2 (ja-aframe 1.0 0)) + (f0-12 (s2-2 s1-1 s0-0 sv-128 sv-144 t0-2)) + (f30-0 (- 1.0 f0-12)) + ) + (quaternion-rotate-local-y! s3-2 s5-2 (if (zero? (-> self seat)) + -16384.0 + 16384.0 + ) + ) + (quaternion-copy! (-> self root-override2 quat) s3-2) + (vector+float*! (-> self root-override2 trans) gp-3 s4-3 f30-0) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 1.0 0) 0.5)) + ) + ) + (let ((v1-74 (-> self root-override2 root-prim))) + (set! (-> v1-74 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-74 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (go-virtual active) + (none) + ) + :post (behavior () + (track-target! self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate wait-at-dest (civilian) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior civilian) enemy-event-handler) + :enter (behavior () + (logclear! (-> self flags) (citizen-flag persistent)) + (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 + (let ((v1-7 self)) + (set! (-> v1-7 enemy-flags) (the-as enemy-flag (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (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 + ) + ) + 0.1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max 0.1)) + ) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-simple-post) + (none) + ) + ) diff --git a/test/decompiler/reference/jak2/levels/city/common/ctywide-tasks_REF.gc b/test/decompiler/reference/jak2/levels/city/common/ctywide-tasks_REF.gc index 3348b83250..73b40f1149 100644 --- a/test/decompiler/reference/jak2/levels/city/common/ctywide-tasks_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/ctywide-tasks_REF.gc @@ -715,7 +715,7 @@ (set! (-> s5-0 nav-mesh) #f) (set! (-> s5-0 nav-branch) #f) (set! (-> s5-0 proc) #f) - (set! (-> s5-0 handle) (the-as uint (process->handle *target*))) + (set! (-> s5-0 handle) (process->handle *target*)) (set! (-> s5-0 user-data) (the-as uint 0)) (set! (-> s5-0 flags) (the-as uint 0)) (set! (-> s5-0 guard-type) (the-as uint 1)) diff --git a/test/decompiler/reference/jak2/levels/city/common/guard_REF.gc b/test/decompiler/reference/jak2/levels/city/common/guard_REF.gc new file mode 100644 index 0000000000..2d52711221 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/city/common/guard_REF.gc @@ -0,0 +1,4240 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defskelgroup skel-crimson-guard crimson-guard crimson-guard-lod0-jg -1 + ((crimson-guard-lod0-mg (meters 20)) (crimson-guard-lod2-mg (meters 999999))) + :bounds (static-spherem 0 0 0 5) + :shadow crimson-guard-shadow-mg + :origin-joint-index 3 + ) + +;; definition of type guard-anim-info +(deftype guard-anim-info (structure) + ((anim-index int32 2 :offset-assert 0) + (anim-index-front int32 :offset 0) + (anim-index-back int32 :offset 4) + ) + :pack-me + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +;; definition for method 3 of type guard-anim-info +(defmethod inspect guard-anim-info ((obj guard-anim-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'guard-anim-info) + (format #t "~1Tanim-index[2] @ #x~X~%" (-> obj anim-index)) + (format #t "~1Tanim-index-front: ~D~%" (-> obj anim-index-front)) + (format #t "~1Tanim-index-back: ~D~%" (-> obj anim-index-back)) + (label cfg-4) + obj + ) + +;; definition of type guard-global-info +(deftype guard-global-info (basic) + ((prev-yellow-hit int8 :offset-assert 4) + (prev-blue-hit int8 :offset-assert 5) + (knocked int32 2 :offset-assert 8) + (knocked-land int32 2 :offset-assert 16) + (anim-knocked-front int32 :offset 8) + (anim-knocked-back int32 :offset 12) + (anim-knocked-front-land int32 :offset 16) + (anim-knocked-back-land int32 :offset 20) + (yellow-hit-anim guard-anim-info 2 :inline :offset-assert 24) + (yellow-land-anim guard-anim-info 2 :inline :offset-assert 40) + (blue-hit-anim int32 :offset-assert 56) + ) + :method-count-assert 9 + :size-assert #x3c + :flag-assert #x90000003c + ) + +;; definition for method 3 of type guard-global-info +(defmethod inspect guard-global-info ((obj guard-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 "~1Tknocked[2] @ #x~X~%" (-> obj knocked)) + (format #t "~1Tknocked-land[2] @ #x~X~%" (-> obj knocked-land)) + (format #t "~1Tanim-knocked-front: ~D~%" (-> obj anim-knocked-front)) + (format #t "~1Tanim-knocked-back: ~D~%" (-> obj anim-knocked-back)) + (format #t "~1Tanim-knocked-front-land: ~D~%" (-> obj anim-knocked-front-land)) + (format #t "~1Tanim-knocked-back-land: ~D~%" (-> obj anim-knocked-back-land)) + (format #t "~1Tyellow-hit-anim[2] @ #x~X~%" (-> obj yellow-hit-anim)) + (format #t "~1Tyellow-land-anim[2] @ #x~X~%" (-> obj yellow-land-anim)) + (format #t "~1Tblue-hit-anim[1] @ #x~X~%" (&-> obj blue-hit-anim)) + (label cfg-4) + obj + ) + +;; definition of type guard-shoot-info +(deftype guard-shoot-info (structure) + ((anim-index int32 :offset-assert 0) + (start float :offset-assert 4) + (end float :offset-assert 8) + ) + :pack-me + :method-count-assert 9 + :size-assert #xc + :flag-assert #x90000000c + ) + +;; definition for method 3 of type guard-shoot-info +(defmethod inspect guard-shoot-info ((obj guard-shoot-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'guard-shoot-info) + (format #t "~1Tanim-index: ~D~%" (-> obj anim-index)) + (format #t "~1Tstart: ~f~%" (-> obj start)) + (format #t "~1Tend: ~f~%" (-> obj end)) + (label cfg-4) + obj + ) + +;; definition for symbol *crimson-guard-global-info*, type guard-global-info +(define *crimson-guard-global-info* + (new 'static 'guard-global-info + :knocked (new 'static 'array int32 2 31 8) + :knocked-land (new 'static 'array int32 2 32 9) + :yellow-hit-anim (new 'static 'inline-array guard-anim-info 2 + (new 'static 'guard-anim-info :anim-index (new 'static 'array int32 2 13 15)) + (new 'static 'guard-anim-info :anim-index (new 'static 'array int32 2 15 13)) + ) + :yellow-land-anim (new 'static 'inline-array guard-anim-info 2 + (new 'static 'guard-anim-info :anim-index (new 'static 'array int32 2 14 16)) + (new 'static 'guard-anim-info :anim-index (new 'static 'array int32 2 16 14)) + ) + :blue-hit-anim 10 + ) + ) + +;; definition for symbol *crimson-guard-nav-enemy-info*, type nav-enemy-info +(define *crimson-guard-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 idle-control-frame 4 + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x4 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + (new 'static 'idle-control-frame) + ) + :idle-anim 4 + :notice-anim 4 + :hostile-anim -1 + :hit-anim 4 + :knocked-anim 8 + :knocked-land-anim 9 + :die-anim 17 + :die-falling-anim 8 + :victory-anim 4 + :jump-wind-up-anim 7 + :jump-in-air-anim 4 + :jump-land-anim 7 + :neck-joint 27 + :look-at-joint 6 + :bullseye-joint 5 + :sound-hit (static-sound-name "guard-hit") + :sound-die (static-sound-name "guard-die") + :notice-distance (meters 100) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 100) + :default-hit-points 4 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.5 + :attack-shove-back (meters 3) + :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 0.5) + :jump-height-factor 0.1 + :knocked-seek-ry-clamp 6371.5557 + :knocked-soft-vxz-lo 32768.0 + :knocked-soft-vxz-hi 53248.0 + :knocked-soft-vy-lo 61440.0 + :knocked-soft-vy-hi 61440.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 40960.0 + :knocked-hard-vxz-hi 61440.0 + :knocked-hard-vy-lo 98304.0 + :knocked-hard-vy-hi 106496.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 20480.0 + :knocked-yellow-vxz-hi 24576.0 + :knocked-yellow-vy-lo 28672.0 + :knocked-yellow-vy-hi 40960.0 + :knocked-red-vxz-lo 65536.0 + :knocked-red-vxz-hi 81920.0 + :knocked-red-vy-lo 61440.0 + :knocked-red-vy-hi 61440.0 + :knocked-blue-vxz-lo 32768.0 + :knocked-blue-vxz-hi 65536.0 + :knocked-blue-vy-lo 16384.0 + :knocked-blue-vy-hi 32768.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 #f + :use-pacing #f + :walk-anim 5 + :turn-anim 5 + :run-anim 6 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 2) + :run-turning-acceleration (meters 30) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 8) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 3) + :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! (-> *crimson-guard-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition of type crimson-guard +(deftype crimson-guard (citizen) + ((info guard-global-info :offset-assert 964) + (hit-face uint32 :offset-assert 968) + (anim-get-up-front int32 :offset-assert 972) + (anim-get-up-back int32 :offset-assert 976) + (small-hit int32 :offset-assert 980) + (yellow-anim uint32 :offset-assert 984) + (guard-type uint8 :offset-assert 988) + (settings traffic-guard-type-settings :offset-assert 992) + (next-time time-frame :offset-assert 1000) + (last-time-see-target time-frame :offset-assert 1008) + (joint joint-mod :offset-assert 1016) + (joint-enable symbol :offset-assert 1020) + (already-shot symbol :offset-assert 1024) + (miss-amount float :offset-assert 1028) + (l-control lightning-control :offset-assert 1032) + (next-shot int64 :offset-assert 1040) + (anim-shoot guard-shoot-info 3 :inline :offset-assert 1048) + (transport handle :offset-assert 1088) + (transport-side uint32 :offset-assert 1096) + (target-flags uint8 :offset-assert 1100) + (target-pos vector :inline :offset-assert 1104) + (target-pos-predict vector :inline :offset-assert 1120) + (target-pos-predict-miss vector :inline :offset-assert 1136) + (target-vel-vec vector :inline :offset-assert 1152) + (target-vel float :offset-assert 1168) + (target-self vector :inline :offset-assert 1184) + (target-self-xz vector :inline :offset-assert 1200) + (target-self-dist float :offset-assert 1216) + (target-self-xz-dist float :offset-assert 1220) + (target-y-angle degrees :offset-assert 1224) + (last-visible-target-pos vector :inline :offset-assert 1232) + (lazer-sound uint32 :offset-assert 1248) + (move-position vector :inline :offset-assert 1264) + (move-index int32 :offset-assert 1280) + (traffic-target-status traffic-target-status :inline :offset-assert 1296) + (minimap connection-minimap :offset-assert 1376) + (other-side symbol :offset-assert 1380) + ) + :heap-base #x4f0 + :method-count-assert 227 + :size-assert #x568 + :flag-assert #xe304f00568 + (:methods + (get-up-front () _type_ :state 201) + (get-up-back () _type_ :state 202) + (search () _type_ :state 203) + (attack () _type_ :state 204) + (arrest () _type_ :state 205) + (gun-shoot () _type_ :state 206) + (exit-transport () _type_ :state 207) + (waiting-ambush () _type_ :state 208) + (close-attack () _type_ :state 209) + (knocked-off-vehicle () _type_ :state 210) + (roll-right () _type_ :state 211) + (roll-left () _type_ :state 212) + (close-attack-active () _type_ :state 213) + (crimson-guard-method-214 (_type_) none 214) + (crimson-guard-method-215 (_type_) symbol 215) + (crimson-guard-method-216 (_type_) symbol 216) + (crimson-guard-method-217 (_type_ vector vector vector) int 217) + (crimson-guard-method-218 (_type_ vector) none 218) + (crimson-guard-method-219 (_type_) none 219) + (crimson-guard-method-220 (_type_) none 220) + (crimson-guard-method-221 (_type_) none 221) + (crimson-guard-method-222 (_type_) none 222) + (crimson-guard-method-223 (_type_ float) none 223) + (crimson-guard-method-224 (_type_ vector) float 224) + (crimson-guard-method-225 (_type_ uint symbol) none 225) + (crimson-guard-method-226 (_type_) none 226) + ) + ) + +;; definition for method 3 of type crimson-guard +(defmethod inspect crimson-guard ((obj crimson-guard)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type citizen inspect))) + (t9-0 obj) + ) + (format #t "~2Tinfo: ~A~%" (-> obj info)) + (format #t "~2Thit-face: ~D~%" (-> obj hit-face)) + (format #t "~2Tanim-get-up-front: ~D~%" (-> obj anim-get-up-front)) + (format #t "~2Tanim-get-up-back: ~D~%" (-> obj anim-get-up-back)) + (format #t "~2Tsmall-hit: ~D~%" (-> obj small-hit)) + (format #t "~2Tyellow-anim: ~D~%" (-> obj yellow-anim)) + (format #t "~2Tguard-type: ~D~%" (-> obj guard-type)) + (format #t "~2Tsettings: #~%" (-> obj settings)) + (format #t "~2Tnext-time: ~D~%" (-> obj next-time)) + (format #t "~2Tlast-time-see-target: ~D~%" (-> obj last-time-see-target)) + (format #t "~2Tjoint: ~A~%" (-> obj joint)) + (format #t "~2Tjoint-enable: ~A~%" (-> obj joint-enable)) + (format #t "~2Talready-shot: ~A~%" (-> obj already-shot)) + (format #t "~2Tmiss-amount: ~f~%" (-> obj miss-amount)) + (format #t "~2Tl-control: ~A~%" (-> obj l-control)) + (format #t "~2Tnext-shot: ~D~%" (-> obj next-shot)) + (format #t "~2Tanim-shoot[3] @ #x~X~%" (-> obj anim-shoot)) + (format #t "~2Ttransport: ~D~%" (-> obj transport)) + (format #t "~2Ttransport-side: ~D~%" (-> obj transport-side)) + (format #t "~2Ttarget-flags: ~D~%" (-> obj target-flags)) + (format #t "~2Ttarget-pos: #~%" (-> obj target-pos)) + (format #t "~2Ttarget-pos-predict: #~%" (-> obj target-pos-predict)) + (format #t "~2Ttarget-pos-predict-miss: #~%" (-> obj target-pos-predict-miss)) + (format #t "~2Ttarget-vel-vec: #~%" (-> obj target-vel-vec)) + (format #t "~2Ttarget-vel: ~f~%" (-> obj target-vel)) + (format #t "~2Ttarget-self: #~%" (-> obj target-self)) + (format #t "~2Ttarget-self-xz: #~%" (-> obj target-self-xz)) + (format #t "~2Ttarget-self-dist: ~f~%" (-> obj target-self-dist)) + (format #t "~2Ttarget-self-xz-dist: ~f~%" (-> obj target-self-xz-dist)) + (format #t "~2Ttarget-y-angle: ~f~%" (-> obj target-y-angle)) + (format #t "~2Tlast-visible-target-pos: #~%" (-> obj last-visible-target-pos)) + (format #t "~2Tlazer-sound: ~D~%" (-> obj lazer-sound)) + (format #t "~2Tmove-position: #~%" (-> obj move-position)) + (format #t "~2Tmove-index: ~D~%" (-> obj move-index)) + (format #t "~2Ttraffic-target-status: #~%" (-> obj traffic-target-status)) + (format #t "~2Tminimap: #~%" (-> obj minimap)) + (format #t "~2Tother-side: ~A~%" (-> obj other-side)) + (label cfg-4) + obj + ) + +;; definition for method 218 of type crimson-guard +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod crimson-guard-method-218 crimson-guard ((obj crimson-guard) (arg0 vector)) + (local-vars + (sv-240 vector) + (sv-256 (function vector vector vector)) + (sv-272 vector) + (sv-288 vector) + (sv-304 vector) + (sv-320 vector) + ) + (with-pp + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (set! sv-240 arg0) + (let ((s0-0 (new 'stack-no-clear 'vector))) + (let ((v1-1 (-> obj root-override2 trans))) + (let ((a0-1 *y-vector*)) + (let ((a1-2 8192.0)) + (.mov vf7 a1-2) + ) + (.lvf vf5 (&-> a0-1 quad)) + ) + (.lvf vf4 (&-> v1-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 (&-> s0-0 quad) vf6) + (set! sv-320 (new 'stack-no-clear 'vector)) + (set! sv-304 (new 'stack-no-clear 'vector)) + (let ((s1-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (-> obj node-list data 4 bone transform) + (let ((s4-0 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (s3-0 (vector-y-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat)) + (set! (-> s0-0 quad) (-> obj root-override2 trans quad)) + (cond + ((logtest? (enemy-flag dislike-combo) (-> obj enemy-flags)) + (let ((a1-6 s0-0)) + (let ((v1-14 s0-0)) + (let ((a0-9 s4-0)) + (let ((a2-1 4096.0)) + (.mov vf7 a2-1) + ) + (.lvf vf5 (&-> a0-9 quad)) + ) + (.lvf vf4 (&-> v1-14 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-6 quad) vf6) + ) + ) + (else + (let ((a1-7 s0-0)) + (let ((v1-15 s0-0)) + (let ((a0-10 s4-0)) + (let ((a2-3 2048.0)) + (.mov vf7 a2-3) + ) + (.lvf vf5 (&-> a0-10 quad)) + ) + (.lvf vf4 (&-> v1-15 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-7 quad) vf6) + ) + ) + ) + (let ((a1-8 s0-0)) + (let ((v1-16 s0-0)) + (let ((a0-11 s3-0)) + (let ((a2-5 8540.16)) + (.mov vf7 a2-5) + ) + (.lvf vf5 (&-> a0-11 quad)) + ) + (.lvf vf4 (&-> v1-16 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-8 quad) vf6) + ) + (vector-normalize! (vector-! sv-320 sv-240 s0-0) 1.0) + (set! sv-288 (new 'stack-no-clear 'vector)) + (let ((v1-20 (-> sv-240 quad))) + (set! (-> sv-288 quad) v1-20) + ) + (set! sv-256 vector-rotate90-around-y!) + (set! sv-272 (new 'stack-no-clear 'vector)) + (let* ((a1-13 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) sv-288 s0-0) -2998.272)) + (v0-5 (sv-256 sv-272 a1-13)) + ) + (vector+! sv-288 sv-288 v0-5) + ) + (vector-normalize! (vector-! sv-320 sv-288 s0-0) 1.0) + (vector-z-quaternion! sv-304 (-> obj root-override2 quat)) + (rot-zxy-from-vector! s2-0 sv-304) + (rot-zxy-from-vector! s1-0 sv-320) + (set! (-> s5-0 x) (fmax -14563.556 (fmin 14563.556 (deg- (-> s1-0 x) (-> s2-0 x))))) + (set! (-> s5-0 y) (fmax -14563.556 (fmin 14563.556 (deg- (-> s1-0 y) (-> s2-0 y))))) + (set! (-> s5-0 z) 0.0) + (let ((s2-1 (new 'stack-no-clear 'quaternion))) + (let ((s1-1 (new 'stack-no-clear 'quaternion))) + (quaternion-vector-angle! s2-1 s4-0 (-> s5-0 x)) + (quaternion-vector-angle! s1-1 s3-0 (-> s5-0 y)) + (quaternion*! s2-1 s1-1 s2-1) + ) + (quaternion-pseudo-seek (-> obj joint quat) (-> obj joint quat) s2-1 (-> pp clock seconds-per-frame)) + ) + ) + ) + ) + 0 + (none) + ) + ) + ) + +;; definition for method 219 of type crimson-guard +;; WARN: Return type mismatch int vs none. +(defmethod crimson-guard-method-219 crimson-guard ((obj crimson-guard)) + (with-pp + (quaternion-pseudo-seek + (-> obj joint quat) + (-> obj joint quat) + *unity-quaternion* + (-> pp clock seconds-per-frame) + ) + 0 + (none) + ) + ) + +;; definition for symbol *guard-min-id-hack*, type int +(define *guard-min-id-hack* 255) + +;; definition for method 55 of type crimson-guard +(defmethod track-target! crimson-guard ((obj crimson-guard)) + "Does a lot of various things relating to interacting with the target +- tracks when the enemy was last drawn +- looks at the target and handles attacking +@TODO Not extremely well understood yet" + (let ((t9-0 (method-of-type citizen track-target!))) + (t9-0 obj) + ) + (update-transforms (-> obj root-override2)) + (if (< (-> obj traffic-id) *guard-min-id-hack*) + (set! *guard-min-id-hack* (-> obj traffic-id)) + ) + (if (-> obj joint-enable) + (crimson-guard-method-218 obj (-> obj target-pos-predict-miss)) + (crimson-guard-method-219 obj) + ) + (none) + ) + +;; definition for method 73 of type crimson-guard +(defmethod kill-prefer-falling crimson-guard ((obj crimson-guard)) + "If available in `enemy-info`, [[go]] to the [[die-falling]] state, if not, [[die]]" + ((method-of-type nav-enemy kill-prefer-falling) obj) + ) + +;; definition for method 72 of type crimson-guard +(defmethod react-to-focus crimson-guard ((obj crimson-guard)) + "@TODO - flesh out docs" + (if (not (logtest? (-> obj flags) (citizen-flag hostile))) + (go (method-of-object obj active)) + (go-hostile obj) + ) + (none) + ) + +;; definition for method 56 of type crimson-guard +(defmethod damage-amount-from-attack crimson-guard ((obj crimson-guard) (arg0 process) (arg1 event-message-block)) + "@returns the amount of damage taken from an attack. This can come straight off the [[attack-info]] or via [[penetrate-using->damage]]" + (let ((v0-0 ((method-of-type nav-enemy damage-amount-from-attack) obj arg0 arg1))) + (-> arg1 param 1) + v0-0 + ) + ) + +;; definition for method 74 of type crimson-guard +;; INFO: Used lq/sq +;; WARN: Return type mismatch none vs object. +;; WARN: disable def twice: 122. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. +(defmethod general-event-handler crimson-guard ((obj crimson-guard) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (with-pp + (let ((v1-0 arg2)) + (the-as + object + (cond + ((or (= v1-0 'hit) (= v1-0 'hit-flinch) (= v1-0 'hit-knocked)) + (speech-control-method-13 *speech-control* (the-as handle obj)) + (logior! (-> obj flags) (citizen-flag hostile)) + (let* ((s0-0 (handle->process (-> obj incoming attacker-handle))) + (s1-0 (if (type? s0-0 process-focusable) + s0-0 + ) + ) + ) + (when s1-0 + (speech-control-method-12 *speech-control* obj (speech-type speech-type-0 speech-type-1 speech-type-3)) + (trigger-alert obj 1 (the-as target s1-0)) + ) + ) + ((method-of-type nav-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ((= v1-0 'event-death) + (if (zero? (-> obj hit-points)) + (the-as object (do-effect (-> obj skel effect) 'death-default 0.0 -1)) + ) + ) + ((= v1-0 'bouncing-off) + (when (or (and (-> obj next-state) (= (-> obj next-state name) 'active)) + (and (-> obj next-state) (= (-> obj next-state name) 'wait)) + ) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-1 speech-type-2 speech-type-3)) + (go (method-of-object obj close-attack-active)) + ) + ) + ((= v1-0 'combo) + (and (not (and (-> obj next-state) (= (-> obj next-state name) 'inactive))) + (and (not (logtest? (enemy-flag multi-focus) (-> obj enemy-flags))) (nonzero? (-> obj hit-points))) + ) + ) + ((= v1-0 'avoid) + #f + ) + ((= v1-0 'panic) + (set! (-> obj last-danger-time) (-> pp clock frame-counter)) + (let ((v1-38 (the-as traffic-danger-info (-> arg3 param 0)))) + (case (-> v1-38 danger-type) + (((traffic-danger-type tdt7)) + (set! (-> obj cp-factor) 20.0) + (let ((s5-1 (method-of-object obj trigger-alert)) + (s4-1 1) + (s3-1 (handle->process (-> v1-38 handle))) + ) + (the-as object (s5-1 obj s4-1 (the-as target (if (type? s3-1 process-focusable) + s3-1 + ) + ) + ) + ) + ) + ) + ) + ) + ) + ((= v1-0 'clear-path) + (set! (-> obj last-danger-time) (-> pp clock frame-counter)) + (let ((v1-44 (the-as traffic-danger-info (-> arg3 param 0)))) + (set! (-> obj cp-valid?) #t) + (set! (-> obj cp-sphere quad) (-> v1-44 sphere quad)) + (set! (-> obj cp-vec quad) (-> v1-44 velocity quad)) + (case (-> v1-44 danger-type) + (((traffic-danger-type tdt0)) + (trigger-alert obj 1 *target*) + ) + (((traffic-danger-type tdt1)) + ) + (((traffic-danger-type tdt2)) + ) + (((traffic-danger-type tdt3)) + ) + (((traffic-danger-type tdt4)) + ) + (((traffic-danger-type tdt5)) + ) + (((traffic-danger-type tdt6)) + ) + (((traffic-danger-type tdt7)) + (trigger-alert obj 1 *target*) + ) + ) + ) + (let ((s5-2 (-> obj cp-plane))) + (set! (-> s5-2 quad) (-> obj cp-vec quad)) + (set! (-> s5-2 y) 0.0) + (vector-rotate90-around-y! s5-2 s5-2) + (vector-normalize! s5-2 1.0) + (set! (-> s5-2 w) (- (vector-dot (the-as vector s5-2) (the-as vector (-> obj cp-sphere))))) + ) + (let ((v0-4 (the-as object (+ (-> pp clock frame-counter) (seconds 1))))) + (set! (-> obj cp-exit-time) (the-as time-frame v0-4)) + v0-4 + ) + ) + ((= v1-0 'end-pursuit) + (when *debug-segment* + (when (logtest? (-> obj focus-status) (focus-status inactive)) + (format 0 "guard::event end-pursuit recieved by inactive process ~d~%" (-> obj pid)) + (break!) + 0 + ) + ) + (when (not (logtest? (-> obj focus-status) (focus-status dead))) + (when (logtest? (-> obj flags) (citizen-flag hostile)) + (logclear! (-> obj flags) (citizen-flag persistent in-pursuit hostile)) + (citizen-method-195 obj (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (go (method-of-object obj active)) + ) + ) + ) + ((= v1-0 'alert-begin) + (when *debug-segment* + (when (logtest? (-> obj focus-status) (focus-status inactive)) + (format 0 "guard::event alert-begin recieved by inactive process ~d~%" (-> obj pid)) + (break!) + 0 + ) + ) + (when (not (logtest? (-> obj focus-status) (focus-status dead))) + (when (not (logtest? (-> obj flags) (citizen-flag hostile))) + (let ((a1-27 (the-as object (-> arg3 param 0)))) + (when (and (the-as uint a1-27) + (zero? (logand (-> (the-as process-focusable a1-27) focus-status) (focus-status disable dead inactive))) + ) + (set! (-> obj traffic-target-status handle) (process->handle (the-as process-focusable a1-27))) + (try-update-focus (-> obj focus) (the-as process-focusable a1-27) obj) + (if (and (not (and (-> obj next-state) (= (-> obj next-state name) 'jump))) + (not (and (-> obj next-state) (= (-> obj next-state name) 'exit-transport))) + ) + (the-as object (go-hostile obj)) + ) + ) + ) + ) + ) + ) + ((= v1-0 'alert-end) + (when *debug-segment* + (when (logtest? (-> obj focus-status) (focus-status inactive)) + (format 0 "guard::event alert-end recieved by inactive process ~d~%" (-> obj pid)) + (break!) + 0 + ) + ) + (when (not (logtest? (-> obj focus-status) (focus-status dead))) + (when (logtest? (-> obj flags) (citizen-flag hostile)) + (logclear! (-> obj flags) (citizen-flag persistent in-pursuit hostile)) + (speech-control-method-12 *speech-control* obj (speech-type speech-type-0 speech-type-2)) + (citizen-method-195 obj (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (go (method-of-object obj active)) + ) + ) + ) + ((= v1-0 'track) + (if (and (-> obj next-state) (let ((v1-129 (-> obj next-state name))) + (or (= v1-129 'exit-transport) (= v1-129 'jump)) + ) + ) + #f + #t + ) + ) + ((= v1-0 'notify) + (let ((a0-84 (-> arg3 param 0)) + (v1-130 (the-as object (-> arg3 param 1))) + ) + (when (= a0-84 'attack) + (when (logtest? (-> (the-as process-focusable v1-130) mask) (process-mask target)) + (when (logtest? (-> (the-as process-focusable v1-130) focus-status) (focus-status dead)) + (format #t "guard killed player~%") + (the-as object (speech-control-method-12 *speech-control* obj (speech-type speech-type-1 speech-type-3))) + ) + ) + ) + ) + ) + (else + ((method-of-type citizen general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + ) + ) + +;; definition for method 26 of type crimson-guard +(defmethod get-inv-mass crimson-guard ((obj crimson-guard)) + 0.6666667 + ) + +;; failed to figure out what this is: +(defstate get-up-front (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.5 0.5 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (set! (-> self hit-face) (the-as uint -1)) + (let ((v1-6 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-6) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core collide-as) (collide-spec enemy)) + (set! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian hit-by-others-list player-list) + ) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-get-up-front)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-get-up-front))) frames num-frames) + -1 + ) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (set! (-> self hit-face) (the-as uint -1)) + (react-to-focus self) + (none) + ) + :post (behavior () + (enemy-method-49 self) + (let ((a0-1 (-> self nav state)) + (v1-3 *null-vector*) + ) + (logior! (-> a0-1 flags) (nav-state-flag directional-mode)) + (set! (-> a0-1 travel quad) (-> v1-3 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate get-up-back (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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 (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 0.5 0.5 1.0) + ) + (none) + ) + :exit (behavior () + (if *citizen-debug* + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + ) + (set! (-> self hit-face) (the-as uint -1)) + (let ((v1-6 (-> self root-override2 root-prim))) + (logclear! (-> (the-as collide-shape-prim-group v1-6) child 0 prim-core action) (collide-action no-standon)) + (logior! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core action) (collide-action no-standon)) + (set! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core collide-as) (collide-spec enemy)) + (set! (-> (the-as collide-shape-prim-group v1-6) child 1 prim-core collide-with) + (collide-spec backgnd jak civilian hit-by-others-list player-list) + ) + ) + (none) + ) + :trans (behavior () + '() + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-get-up-back)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-get-up-back))) frames num-frames) -1) + ) + (-> self speed-scale) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (-> self speed-scale))) + ) + (set! (-> self hit-face) (the-as uint -1)) + (react-to-focus self) + (none) + ) + :post (behavior () + (enemy-method-49 self) + (let ((a0-1 (-> self nav state)) + (v1-3 *null-vector*) + ) + (logior! (-> a0-1 flags) (nav-state-flag directional-mode)) + (set! (-> a0-1 travel quad) (-> v1-3 quad)) + ) + 0 + (track-target! self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate knocked (crimson-guard) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy knocked) enter))) + (if t9-0 + (t9-0) + ) + ) + (let ((v1-5 (the-as collide-shape-prim-group (-> self root-override2 root-prim)))) + (logior! (-> v1-5 child 0 prim-core action) (collide-action no-standon)) + (logclear! (-> v1-5 child 1 prim-core action) (collide-action no-standon)) + (set! (-> v1-5 child 1 prim-core collide-as) (collide-spec)) + (set! (-> v1-5 child 1 prim-core collide-with) (collide-spec)) + ) + 0 + (if (zero? (-> self hit-points)) + (set! (-> self root-override2 penetrated-by) (the-as penetrate -1)) + ) + (set! (-> self hit-face) + (the-as uint (if (< (vector-dot + (-> self root-override2 transv) + (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat)) + ) + 0.0 + ) + 1 + 0 + ) + ) + ) + (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)) + ) + (let ((t9-0 (-> (method-of-type nav-enemy knocked) exit))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy knocked) trans))) + (if t9-0 + (t9-0) + ) + ) + (enemy-method-49 self) + (none) + ) + ) + +;; definition for method 77 of type crimson-guard +(defmethod enemy-method-77 crimson-guard ((obj crimson-guard) (arg0 (pointer float))) + (cond + ((logtest? (-> obj flags) (citizen-flag knocked-out-car)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 42))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 42)) 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 42)) num-func-seek!) + ) + (logclear! (-> obj flags) (citizen-flag knocked-out-car)) + ) + ((logtest? (-> obj flags) (citizen-flag knocked-out-bike)) + (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 43))) + (set! (-> a0-5 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 43)) 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 43)) num-func-seek!) + ) + (logclear! (-> obj flags) (citizen-flag knocked-out-bike)) + ) + ((begin + (let ((v1-37 (-> obj root-override2 transv))) + (cond + ((< (sqrtf (+ (* (-> v1-37 x) (-> v1-37 x)) (* (-> v1-37 z) (-> v1-37 z)))) 32768.0) + (set! (-> obj small-hit) 1) + ) + (else + (set! (-> obj small-hit) 0) + 0 + ) + ) + ) + (<= (-> obj hit-points) 0) + ) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a1-6 (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + (a0-11 (-> obj skel root-channel 0)) + ) + (set! (-> a0-11 frame-group) (the-as art-joint-anim a1-6)) + (set! (-> a0-11 param 0) (the float (+ (-> (the-as art-joint-anim a1-6) 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 a1-6) num-func-seek!) + ) + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-5) (knocked-type knocked-type-7)) + (ja-channel-push! 1 (seconds 0.01)) + (cond + ((= (-> obj small-hit) 1) + (set! (-> obj yellow-anim) (the-as uint (get-rand-int obj 2))) + (let ((a1-12 (-> obj + draw + art-group + data + (-> (the-as + guard-global-info + (+ (+ (* (-> obj hit-face) 4) (* (-> obj yellow-anim) 8)) (the-as uint (-> obj info))) + ) + yellow-hit-anim + 0 + anim-index-front + ) + ) + ) + (a0-23 (-> obj skel root-channel 0)) + ) + (set! (-> a0-23 frame-group) (the-as art-joint-anim a1-12)) + (set! (-> a0-23 param 0) (the float (+ (-> (the-as art-joint-anim a1-12) frames num-frames) -1))) + (set! (-> a0-23 param 1) (-> arg0 0)) + (set! (-> a0-23 frame-num) 0.0) + (joint-control-channel-group! a0-23 (the-as art-joint-anim a1-12) num-func-seek!) + ) + ) + (else + (let ((a1-13 (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + (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) (-> arg0 0)) + (set! (-> a0-27 frame-num) 0.0) + (joint-control-channel-group! a0-27 (the-as art-joint-anim a1-13) num-func-seek!) + ) + ) + ) + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-30 (-> obj skel root-channel 0))) + (set! (-> a0-30 frame-group) (the-as art-joint-anim (-> obj draw art-group data 10))) + (set! (-> a0-30 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 10)) 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 (-> obj draw art-group data 10)) num-func-seek!) + ) + ) + (((knocked-type knocked-type-2)) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-17 (-> obj draw art-group data (-> obj info knocked (-> obj hit-face))))) + (set! (-> arg0 0) (* 0.5 (-> arg0 0))) + (let ((a0-36 (-> obj skel root-channel 0))) + (set! (-> a0-36 frame-group) (the-as art-joint-anim a1-17)) + (set! (-> a0-36 param 0) (the float (+ (-> (the-as art-joint-anim a1-17) frames num-frames) -1))) + (set! (-> a0-36 param 1) (-> arg0 0)) + (set! (-> a0-36 frame-num) 0.0) + (joint-control-channel-group! a0-36 (the-as art-joint-anim a1-17) num-func-seek!) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-19 (-> obj draw art-group data (-> obj info knocked (-> obj hit-face)))) + (a0-41 (-> obj skel root-channel 0)) + ) + (set! (-> a0-41 frame-group) (the-as art-joint-anim a1-19)) + (set! (-> a0-41 param 0) (the float (+ (-> (the-as art-joint-anim a1-19) frames num-frames) -1))) + (set! (-> a0-41 param 1) (-> arg0 0)) + (set! (-> a0-41 frame-num) 0.0) + (joint-control-channel-group! a0-41 (the-as art-joint-anim a1-19) num-func-seek!) + ) + ) + ) + ) + ) + #t + ) + +;; definition for method 78 of type crimson-guard +(defmethod enemy-method-78 crimson-guard ((obj crimson-guard) (arg0 (pointer float))) + (cond + ((<= (-> obj hit-points) 0) + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-2 (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + (a0-5 (-> obj skel root-channel 0)) + ) + (set! (-> a0-5 frame-group) (the-as art-joint-anim a1-2)) + (set! (-> a0-5 param 0) (the float (+ (-> (the-as art-joint-anim a1-2) frames num-frames) -1))) + (set! (-> a0-5 param 1) (-> arg0 0)) + (set! (-> a0-5 frame-num) 0.0) + (joint-control-channel-group! a0-5 (the-as art-joint-anim a1-2) num-func-seek!) + ) + (set! (-> obj hit-face) (the-as uint -1)) + #t + ) + (else + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4) (knocked-type knocked-type-5) (knocked-type knocked-type-7)) + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((= (-> obj small-hit) 1) + (let ((a1-7 (-> obj + draw + art-group + data + (-> (the-as + guard-global-info + (+ (+ (* (-> obj hit-face) 4) (* (-> obj yellow-anim) 8)) (the-as uint (-> obj info))) + ) + yellow-land-anim + 0 + anim-index-front + ) + ) + ) + (a0-16 (-> obj skel root-channel 0)) + ) + (set! (-> a0-16 frame-group) (the-as art-joint-anim a1-7)) + (set! (-> a0-16 param 0) (the float (+ (-> (the-as art-joint-anim a1-7) frames num-frames) -1))) + (set! (-> a0-16 param 1) (-> arg0 0)) + (set! (-> a0-16 frame-num) 0.0) + (joint-control-channel-group! a0-16 (the-as art-joint-anim a1-7) num-func-seek!) + ) + (set! (-> obj hit-face) (the-as uint -1)) + #t + ) + (else + (let ((a1-8 (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face)))) + (a0-20 (-> obj skel root-channel 0)) + ) + (set! (-> a0-20 frame-group) (the-as art-joint-anim a1-8)) + (set! (-> a0-20 param 0) (the float (+ (-> (the-as art-joint-anim a1-8) frames num-frames) -1))) + (set! (-> a0-20 param 1) (-> arg0 0)) + (set! (-> a0-20 frame-num) 0.0) + (joint-control-channel-group! a0-20 (the-as art-joint-anim a1-8) num-func-seek!) + ) + #t + ) + ) + ) + (((knocked-type knocked-type-6)) + (ja-channel-push! 1 (seconds 0.01)) + (let ((a0-23 (-> obj skel root-channel 0))) + (set! (-> a0-23 frame-group) (the-as art-joint-anim (-> obj draw art-group data 11))) + (set! (-> a0-23 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 11)) frames num-frames) -1)) + ) + (set! (-> a0-23 param 1) (-> arg0 0)) + (set! (-> a0-23 frame-num) 0.0) + (joint-control-channel-group! a0-23 (the-as art-joint-anim (-> obj draw art-group data 11)) num-func-seek!) + ) + (set! (-> obj hit-face) (the-as uint -1)) + #t + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (let ((a1-12 (-> obj draw art-group data (-> obj info knocked-land (-> obj hit-face))))) + (set! (-> arg0 0) 1.0) + (let ((a0-28 (-> obj skel root-channel 0))) + (set! (-> a0-28 frame-group) (the-as art-joint-anim a1-12)) + (set! (-> a0-28 param 0) (the float (+ (-> (the-as art-joint-anim a1-12) frames num-frames) -1))) + (set! (-> a0-28 param 1) (-> arg0 0)) + (set! (-> a0-28 frame-num) 0.0) + (joint-control-channel-group! a0-28 (the-as art-joint-anim a1-12) num-func-seek!) + ) + ) + #t + ) + ) + ) + ) + ) + +;; definition for method 199 of type crimson-guard +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod set-behavior! crimson-guard ((obj crimson-guard) (arg0 traffic-object-spawn-params)) + (let ((a1-1 (-> arg0 guard-type))) + (if (or (and (!= a1-1 7) (!= a1-1 (-> obj guard-type))) (= (-> arg0 behavior) 11)) + (crimson-guard-method-225 obj a1-1 (= (-> arg0 behavior) 11)) + ) + ) + (case (-> arg0 behavior) + ((5) + (logior! (-> obj flags) (citizen-flag persistent hostile)) + (let ((s4-0 (-> obj focus)) + (s3-0 (method-of-type enemy-focus enemy-focus-method-13)) + (s5-1 (handle->process (-> arg0 handle))) + ) + (s3-0 + s4-0 + (the-as process-focusable (if (type? s5-1 process-focusable) + s5-1 + ) + ) + (enemy-aware enemy-aware-3) + ) + ) + (go (method-of-object obj arrest)) + ) + ((6) + (logior! (-> obj flags) (citizen-flag persistent)) + (logior! (-> obj flags) (citizen-flag hostile)) + (set! (-> obj transport) (-> arg0 handle)) + (set! (-> obj transport-side) (-> arg0 user-data)) + (crimson-guard-method-223 obj 0.0) + (let* ((s4-1 (-> obj controller traffic)) + (s5-2 (get-target s4-1)) + ) + (if (and (>= (the-as uint (get-alert-level s4-1)) (the-as uint 1)) s5-2) + (try-update-focus (-> obj focus) s5-2 obj) + ) + ) + (go (method-of-object obj exit-transport)) + ) + ((9) + (logior! (-> obj flags) (citizen-flag persistent)) + (set! (-> obj focus handle) (-> arg0 handle)) + (set! (-> obj traffic-target-status handle) (-> arg0 handle)) + (go (method-of-object obj waiting-ambush)) + ) + ((3) + (set! (-> obj focus handle) (-> arg0 handle)) + (set! (-> obj traffic-target-status handle) (-> arg0 handle)) + (go (method-of-object obj hostile)) + ) + ((11) + (set! (-> obj root-override2 trans quad) (-> arg0 position quad)) + (quaternion-copy! (-> obj root-override2 quat) (-> arg0 rotation)) + (set! (-> obj vehicle) (-> arg0 handle)) + (ja-channel-set! 1) + (case (-> (the-as vehicle (handle->process (-> obj vehicle))) info-override object-type) + ((11 12 13 18) + (logior! (-> obj flags) (citizen-flag knocked-out-bike)) + (let ((v1-64 (-> obj skel root-channel 0))) + (set! (-> v1-64 frame-group) (the-as art-joint-anim (-> obj draw art-group data 35))) + ) + ) + ((14 15 16 19) + (logior! (-> obj flags) (citizen-flag knocked-out-car)) + (let ((v1-70 (-> obj skel root-channel 0))) + (set! (-> v1-70 frame-group) (the-as art-joint-anim (-> obj draw art-group data 36))) + ) + ) + ) + (ja-post) + (go (method-of-object obj knocked-off-vehicle)) + ) + (else + ((method-of-type citizen set-behavior!) obj arg0) + ) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate knocked-off-vehicle (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + '() + (none) + ) + :code (behavior () + (suspend) + (throw-off-vehicle self) + (none) + ) + ) + +;; definition for method 70 of type crimson-guard +;; WARN: Return type mismatch int vs none. +(defmethod go-hostile crimson-guard ((obj crimson-guard)) + (cond + ((handle->process (-> obj focus handle)) + (logior! (-> obj flags) (citizen-flag hostile)) + (let ((v1-6 (-> obj hit-face))) + (cond + ((zero? v1-6) + (go (method-of-object obj get-up-front)) + ) + ((= v1-6 1) + (go (method-of-object obj get-up-back)) + ) + (else + (go (method-of-object obj hostile)) + ) + ) + ) + ) + (else + (go (method-of-object obj active)) + ) + ) + 0 + (none) + ) + +;; definition for method 214 of type crimson-guard +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod crimson-guard-method-214 crimson-guard ((obj crimson-guard)) + (let* ((s4-0 (-> obj target-pos-predict-miss)) + (s5-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 14))) + (v1-2 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 15))) + (v1-3 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s4-0 v1-2) 1.0)) + (s4-1 (new 'stack-no-clear 'projectile-init-by-other-params)) + ) + (set! (-> s4-1 ent) (-> obj entity)) + (set! (-> s4-1 charge) 1.0) + (set! (-> s4-1 options) (projectile-options)) + (set! (-> s4-1 notify-handle) (process->handle obj)) + (set! (-> s4-1 owner-handle) (the-as handle #f)) + (set! (-> s4-1 ignore-handle) (process->handle obj)) + (let* ((a0-13 *game-info*) + (a1-12 (+ (-> a0-13 attack-id) 1)) + ) + (set! (-> a0-13 attack-id) a1-12) + (set! (-> s4-1 attack-id) a1-12) + ) + (set! (-> s4-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s4-1 pos quad) (-> s5-0 quad)) + (set! (-> s4-1 vel quad) (-> v1-3 quad)) + (vector-normalize! (-> s4-1 vel) 819200.0) + (spawn-projectile guard-shot s4-1 obj *default-dead-pool*) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate active (crimson-guard) + :virtual #t + :enter (behavior () + (when (not (-> self nav)) + (format #t "++++++++++++++ guard::active : nav = #f +++++++++++++++~%") + (go-virtual inactive) + ) + (let ((t9-2 (-> (method-of-type citizen active) enter))) + (if t9-2 + (t9-2) + ) + ) + (logclear! (-> self flags) (citizen-flag in-pursuit hostile)) + (set! (-> self already-shot) #f) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type citizen active) trans))) + (if t9-0 + (t9-0) + ) + ) + (if (logtest? (-> self draw status) (draw-control-status on-screen)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0)) + ) + (when (logtest? (-> self controller traffic alert-state flags) (traffic-alert-flag guard-multi-focus)) + (let ((gp-0 (find-closest-to-with-collide-lists (-> self controller traffic) self (-> self focus collide-with)))) + (when gp-0 + (try-update-focus (-> self focus) gp-0 self) + (set! (-> self traffic-target-status handle) (process->handle gp-0)) + (go-hostile self) + ) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate close-attack-active (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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 + (let* ((v1-5 *game-info*) + (a0-8 (+ (-> v1-5 attack-id) 1)) + ) + (set! (-> v1-5 attack-id) a0-8) + (set! (-> self attack-id) a0-8) + ) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) 0.0) + ) + 0 + (logior! (-> self focus-status) (focus-status dangerous)) + (none) + ) + :exit (behavior () + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3))) + (logclear! (-> v1-3 prim-core action) (collide-action deadly)) + ) + (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 () + (ja-channel-push! 1 (seconds 0.2)) + (let ((gp-0 #f)) + (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) + (when (and (< 7.0 (ja-frame-num 0)) (not gp-0)) + (let ((v1-22 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3))) + (logior! (-> v1-22 prim-core action) (collide-action deadly)) + ) + (set! gp-0 #t) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (go-virtual active) + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate inactive (crimson-guard) + :virtual #t + :enter (behavior () + (when (-> self minimap) + (logior! (-> self minimap flags) (minimap-flag fade-out)) + (set! (-> self minimap) #f) + ) + (let ((t9-0 (-> (method-of-type citizen inactive) enter))) + (if t9-0 + (t9-0) + ) + ) + (logclear! (-> self flags) (citizen-flag in-pursuit hostile)) + (set! (-> self already-shot) #f) + (none) + ) + ) + +;; definition for method 217 of type crimson-guard +;; INFO: Used lq/sq +(defmethod crimson-guard-method-217 crimson-guard ((obj crimson-guard) (arg0 vector) (arg1 vector) (arg2 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-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 + ) + (return 1) + ) + (else + ) + ) + ) + (else + (vector-! (-> s5-0 move-dist) arg1 arg0) + ) + ) + ) + (set! (-> s5-0 start-pos quad) (-> arg0 quad)) + (let ((a0-19 (-> s5-0 start-pos))) + (let ((v1-15 (-> s5-0 move-dist))) + (let ((a1-10 -0.1)) + (.mov vf7 a1-10) + ) + (.lvf vf5 (&-> v1-15 quad)) + ) + (.lvf vf4 (&-> arg0 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) + ) + (let ((a1-11 (-> s5-0 move-dist))) + (let ((v1-16 (-> s5-0 move-dist))) + (let ((a0-20 (-> s5-0 move-dist))) + (let ((a2-4 0.1)) + (.mov vf7 a2-4) + ) + (.lvf vf5 (&-> a0-20 quad)) + ) + (.lvf vf4 (&-> v1-16 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-11 quad) vf6) + ) + (let ((v1-17 s5-0)) + (set! (-> v1-17 radius) f30-0) + (set! (-> v1-17 collide-with) (collide-spec civilian enemy obstacle hit-by-player-list hit-by-others-list)) + (set! (-> v1-17 ignore-process0) obj) + (set! (-> v1-17 ignore-process1) (handle->process (-> obj focus handle))) + (set! (-> v1-17 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-17 action-mask) (collide-action solid)) + ) + ) + (cond + ((< (fill-and-probe-using-line-sphere *collide-cache* s5-0) 0.0) + 0 + ) + (else + (let ((s4-1 (-> s5-0 best-other-tri collide-ptr))) + (if (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 + ) + ) + 2 + 0 + ) + ) + ) + ) + ) + ) + ) + +;; definition for method 220 of type crimson-guard +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod crimson-guard-method-220 crimson-guard ((obj crimson-guard)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (cond + ((logtest? (-> obj controller traffic alert-state flags) (traffic-alert-flag guard-multi-focus)) + (set! (-> obj enemy-flags) (logior (enemy-flag trackable) (-> obj enemy-flags))) + (when (not (logtest? (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (let ((a0-4 (find-closest-to-with-collide-lists (-> obj controller traffic) obj (-> obj focus collide-with)))) + (if a0-4 + (set! (-> obj traffic-target-status handle) (process->handle a0-4)) + (set! (-> obj traffic-target-status handle) (the-as handle #f)) + ) + ) + ) + ) + (else + (when (logtest? (enemy-flag trackable) (-> obj enemy-flags)) + (logclear! (-> obj enemy-flags) (enemy-flag trackable)) + (let* ((s5-0 (handle->process (-> obj traffic-target-status handle))) + (v1-21 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (if (and v1-21 (!= (-> v1-21 type) target)) + (set! (-> obj traffic-target-status handle) (the-as handle #f)) + ) + ) + ) + ) + ) + (let ((a1-3 (new 'stack-no-clear 'vector))) + (set! (-> a1-3 quad) (-> obj root-override2 trans quad)) + (set! (-> a1-3 y) (+ 8192.0 (-> a1-3 y))) + (let ((s5-1 + (traffic-engine-method-49 (-> obj controller traffic) a1-3 (-> obj traffic-id) (-> obj traffic-target-status)) + ) + ) + (let* ((s4-0 obj) + (s3-0 (method-of-object s4-0 enemy-method-63)) + (s2-0 (handle->process (-> obj traffic-target-status handle))) + ) + (s3-0 + s4-0 + (the-as process-focusable (if (type? s2-0 process-focusable) + s2-0 + ) + ) + (the-as enemy-aware #f) + ) + ) + (let ((s4-1 (handle->process (-> obj focus handle)))) + (cond + ((and s4-1 + (zero? (logand (-> (the-as process-focusable s4-1) focus-status) (focus-status disable dead inactive))) + ) + (when (logtest? (-> s5-1 flags) (traffic-target-flag updated)) + (logclear! (-> obj flags) (citizen-flag target-in-sight)) + (if (crimson-guard-method-215 obj) + (logior! (-> obj flags) (citizen-flag target-in-sight)) + ) + ) + (set! (-> obj target-flags) (the-as uint (-> s5-1 flags))) + (set! (-> obj target-pos quad) (-> (get-trans (the-as process-focusable s4-1) 3) quad)) + (set! (-> obj target-vel-vec quad) (-> (the-as process-focusable s4-1) root-override transv quad)) + (set! (-> obj target-vel) (vector-length (-> obj target-vel-vec))) + (let ((s5-4 (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) (-> obj target-pos)))) + (let* ((f0-3 (vector-length s5-4)) + (f0-4 (* 0.0000012207031 f0-3)) + (a1-9 (-> obj target-pos-predict)) + ) + (let ((v1-62 (-> obj target-pos))) + (let ((a0-36 (-> obj target-vel-vec))) + (let ((a2-3 f0-4)) + (.mov vf7 a2-3) + ) + (.lvf vf5 (&-> a0-36 quad)) + ) + (.lvf vf4 (&-> v1-62 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-9 quad) vf6) + ) + (set! (-> s5-4 y) 0.0) + (vector-rotate90-around-y! s5-4 s5-4) + (if (-> obj other-side) + (vector-negate! s5-4 s5-4) + ) + (vector-normalize! s5-4 (-> obj miss-amount)) + (vector+! (-> obj target-pos-predict-miss) (-> obj target-pos-predict) s5-4) + ) + (vector-! (-> obj target-self) (-> obj target-pos) (-> obj root-override2 trans)) + (set! (-> obj target-self-xz quad) (-> obj target-self quad)) + (set! (-> obj target-self-xz y) 0.0) + (set! (-> obj target-self-dist) (vector-length (-> obj target-self))) + (set! (-> obj target-self-xz-dist) (vector-length (-> obj target-self-xz))) + (set! (-> obj target-y-angle) + (deg-diff (quaternion-y-angle (-> obj root-override2 quat)) (vector-y-angle (-> obj target-self))) + ) + ) + (else + (set! (-> obj traffic-target-status handle) (the-as handle #f)) + (logclear! (-> obj flags) (citizen-flag persistent in-pursuit hostile)) + (citizen-method-195 obj (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (go (method-of-object obj active)) + ) + ) + ) + ) + ) + 0 + (none) + ) + ) + +;; definition for method 221 of type crimson-guard +;; INFO: Used lq/sq +(defmethod crimson-guard-method-221 crimson-guard ((obj crimson-guard)) + (let ((a1-0 (new 'stack-no-clear 'traffic-danger-info))) + (set! (-> a1-0 sphere quad) (-> obj root-override2 trans quad)) + (set! (-> a1-0 sphere r) 40960.0) + (set! (-> a1-0 velocity quad) (-> obj root-override2 transv quad)) + (set! (-> a1-0 notify-radius) 122880.0) + (set! (-> a1-0 danger-level) 1.0) + (set! (-> a1-0 decay-rate) 0.0) + (set! (-> a1-0 flags) (traffic-danger-flags tdf0)) + (set! (-> a1-0 danger-type) (traffic-danger-type tdt0)) + (add-danger (-> obj controller traffic) a1-0) + ) + (none) + ) + +;; definition for method 215 of type crimson-guard +;; INFO: Used lq/sq +(defmethod crimson-guard-method-215 crimson-guard ((obj crimson-guard)) + (let ((s5-0 (get-trans obj 3)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> s4-0 quad) (-> obj target-pos quad)) + (let ((s3-1 (vector-! (new 'stack-no-clear 'vector) s4-0 s5-0))) + (vector-normalize! s3-1 409600.0) + (zero? (crimson-guard-method-217 obj s5-0 (vector+! (new 'stack-no-clear 'vector) s5-0 s3-1) s4-0)) + ) + ) + ) + +;; definition for method 216 of type crimson-guard +;; INFO: Used lq/sq +(defmethod crimson-guard-method-216 crimson-guard ((obj crimson-guard)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> obj target-pos-predict-miss quad)) + (let* ((s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 14))) + (a0-3 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 15))) + (s3-1 (vector-! (new 'stack-no-clear 'vector) s5-0 a0-3)) + ) + (vector-normalize! s3-1 409600.0) + (and (crimson-guard-method-215 obj) + (zero? (crimson-guard-method-217 obj s4-0 (vector+! (new 'stack-no-clear 'vector) s4-0 s3-1) s5-0)) + ) + ) + ) + ) + +;; failed to figure out what this is: +(defstate search (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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 + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (nav-enemy-method-166 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self enemy-info-override run-travel-speed))) + ) + 0 + (if (zero? (-> self controller branch)) + (citizen-method-195 self (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + ) + (none) + ) + :exit (behavior () + '() + (none) + ) + :trans (behavior () + (-> self target-flags) + (crimson-guard-method-220 self) + (cond + ((logtest? (-> self target-flags) 1) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-1)) + (go-hostile self) + ) + (else + (speech-control-method-12 *speech-control* self (speech-type speech-type-2)) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 60) + (none) + ) + :post (behavior () + (if (and (nonzero? (-> self controller branch)) + (let ((f0-0 (vector-vector-xz-distance-squared (-> self root-override2 trans) (-> self controller turn-exit-point))) + (f1-0 16384.0) + ) + (< f0-0 (* f1-0 f1-0)) + ) + ) + (vehicle-controller-method-14 (-> self controller) (the-as vehicle self)) + ) + (let ((a0-2 (-> self nav state)) + (v1-9 (-> self controller turn-exit-point)) + ) + (logclear! (-> a0-2 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-2 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-2 target-post quad) (-> v1-9 quad)) + ) + 0 + (nav-enemy-method-176 self) + (none) + ) + ) + +;; definition for function do-spline +(defun do-spline ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 vector) (arg4 vector) (arg5 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let* ((f1-1 (* arg5 arg5)) + (f0-2 (* arg5 f1-1)) + ) + (let ((f2-3 (- (+ 1.0 (* -3.0 arg5) (* 3.0 f1-1)) f0-2)) + (f3-7 (+ (* 3.0 f0-2) (* -6.0 f1-1) (* 3.0 arg5))) + (f1-3 (+ (* -3.0 f0-2) (* 3.0 f1-1))) + ) + (vector-float*! arg0 arg1 f2-3) + (let ((t2-0 arg0)) + (let ((v1-10 arg0)) + (let ((t1-3 (vector+! (new 'stack-no-clear 'vector) arg1 arg2))) + (let ((a1-1 f3-7)) + (.mov vf7 a1-1) + ) + (.lvf vf5 (&-> t1-3 quad)) + ) + (.lvf vf4 (&-> v1-10 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 (&-> t2-0 quad) vf6) + ) + (let ((a2-1 arg0)) + (let ((v1-11 arg0)) + (let ((a1-3 (vector+! (new 'stack-no-clear 'vector) arg3 arg4))) + (let ((t0-1 f1-3)) + (.mov vf7 t0-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 (&-> a2-1 quad) vf6) + ) + ) + (let ((v0-0 arg0)) + (let ((v1-12 arg0)) + (let ((a0-1 arg3)) + (let ((a1-4 f0-2)) + (.mov vf7 a1-4) + ) + (.lvf vf5 (&-> a0-1 quad)) + ) + (.lvf vf4 (&-> v1-12 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 (&-> v0-0 quad) vf6) + v0-0 + ) + ) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (when *debug-segment* + (when (not (-> self nav)) + (format 0 "guard::enter hostile with nav=#f ~d~%" (-> self pid)) + (break!) + 0 + ) + ) + (let ((t9-1 (-> (method-of-type nav-enemy hostile) enter))) + (if t9-1 + (t9-1) + ) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((v1-11 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-11 enemy-flags))) + (set! (-> v1-11 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-11 enemy-flags)))) + ) + (set! (-> v1-11 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-11 enemy-flags)))) + (set! (-> v1-11 nav callback-info) (-> v1-11 enemy-info-override callback-info)) + ) + 0 + (let ((v1-14 self)) + (set! (-> v1-14 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-14 enemy-flags)))) + ) + 0 + (nav-enemy-method-166 self) + (when (-> self nav) + (let ((v1-20 (-> self nav))) + (set! (-> v1-20 target-speed) (* (-> self speed-scale) (-> self enemy-info-override run-travel-speed))) + ) + 0 + ) + (logior! (-> self flags) (citizen-flag persistent in-pursuit)) + (set! (-> self root-override2 nav-radius) 6144.0) + (none) + ) + :exit (behavior () + (when (-> self nav) + ) + (none) + ) + :trans (behavior () + (crimson-guard-method-220 self) + (when (and (not (logtest? (-> self draw status) (draw-control-status on-screen))) + (= (-> self controller traffic sync-mask-16) (ash 1 (logand (-> self traffic-id) 15))) + (zero? (logand (-> self flags) (citizen-flag sticky-weapon))) + ) + (let ((a1-4 (get-traffic-guard-change-to-type (-> self controller traffic) (the-as int (-> self guard-type))))) + (if (!= a1-4 (-> self guard-type)) + (crimson-guard-method-225 self a1-4 #f) + ) + ) + ) + (let* ((s5-0 (-> self traffic-target-status)) + (s4-0 (handle->process (-> s5-0 handle))) + (gp-0 (if (type? s4-0 process-focusable) + (the-as process-focusable s4-0) + ) + ) + ) + (if (or (logtest? (-> gp-0 focus-status) (focus-status inactive)) + (logtest? (-> gp-0 focus-status) (focus-status disable)) + ) + (set! gp-0 (the-as process-focusable #f)) + ) + (cond + ((not gp-0) + (go-virtual active) + ) + (else + (if (and (not (logtest? (-> s5-0 flags) (traffic-target-flag visible-recently))) + (logtest? (-> s5-0 flags) (traffic-target-flag visible-ever)) + ) + (speech-control-method-12 *speech-control* self (speech-type speech-type-1)) + ) + (when (and (logtest? (-> self nav state flags) (nav-state-flag at-target)) + (zero? (logand (-> s5-0 flags) (traffic-target-flag visible-recently))) + ) + (logclear! (-> self flags) (citizen-flag persistent)) + (citizen-method-195 self (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + (go-virtual search) + ) + (when (or (logtest? (-> s5-0 flags) (traffic-target-flag visible-recently)) + (zero? (logand (-> gp-0 mask) (process-mask target))) + ) + (speech-control-method-15 *speech-control* self) + (cond + ((logtest? (focus-status arrestable) (-> gp-0 focus-status)) + (if (and (< (-> self target-self-xz-dist) 28672.0) + (< (fabs (-> self target-y-angle)) 7281.778) + (>= 8192.0 (fabs (- (-> (get-trans gp-0 1) y) (-> self root-override2 trans y)))) + ) + (go-virtual arrest) + ) + ) + (else + (if (and (< (-> self target-self-xz-dist) 16384.0) + (and (< (fabs (-> self target-y-angle)) 7281.778) + (and gp-0 (zero? (logand (-> gp-0 focus-status) (focus-status disable dead ignore grabbed)))) + (logtest? (-> self flags) (citizen-flag target-in-sight)) + ) + ) + (go-virtual close-attack) + ) + (let ((v1-78 (-> self guard-type))) + (cond + ((= v1-78 1) + (when (and (< (-> self target-self-xz-dist) 163840.0) + (or (< 40960.0 (-> self target-self-xz-dist)) (>= 2 (the-as int (-> self focus aware)))) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) + (the int (* 300.0 (get-rand-float-range self 1.0 3.0))) + ) + (logtest? (-> self flags) (citizen-flag target-in-sight)) + ) + (go-virtual gun-shoot) + ) + ) + ) + ((zero? v1-78) + (if (or (< (-> self target-self-xz-dist) 28672.0) (>= 2 (the-as int (-> self focus aware)))) + (go-virtual attack) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (citizen-travel-anim (the-as int (-> self draw art-group data (-> self enemy-info-override walk-anim))) 60) + (none) + ) + :post (behavior () + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (handle->process (-> self focus handle)) + (let ((v1-5 (new 'stack-no-clear 'vector))) + (if (< 32768.0 (-> self target-self-xz-dist)) + (set! (-> v1-5 quad) (-> self move-position quad)) + (set! (-> v1-5 quad) (-> self traffic-target-status position quad)) + ) + (cond + ((< 8192000.0 (-> self target-self-xz-dist)) + (let ((s5-0 (-> self root-override2 trans)) + (s4-0 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (new 'stack-no-clear 'vector) + (set! (-> s3-0 quad) (-> v1-5 quad)) + (vector-z-quaternion! s4-0 (-> self root-override2 quat)) + (let ((f30-0 (* 182.04445 (* 60.0 (the float (- (-> self traffic-id) *guard-min-id-hack*)))))) + (set-vector! s2-0 (cos f30-0) 0.0 (sin f30-0) 1.0) + ) + (let ((a1-6 s3-0)) + (let ((v1-13 s3-0)) + (let ((a0-15 s2-0)) + (let ((a2-1 12288.0)) + (.mov vf7 a2-1) + ) + (.lvf vf5 (&-> a0-15 quad)) + ) + (.lvf vf4 (&-> v1-13 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-6 quad) vf6) + ) + (let ((f30-2 (* 0.5 (vector-vector-xz-distance s5-0 s3-0)))) + (vector-normalize! s4-0 (* 0.5 f30-2)) + (vector-normalize! s2-0 (* 2.0 f30-2)) + ) + (do-spline gp-0 s5-0 s4-0 s3-0 s2-0 0.9) + (let ((v1-19 (-> self nav state))) + (logclear! (-> v1-19 flags) (nav-state-flag directional-mode)) + (logior! (-> v1-19 flags) (nav-state-flag target-poly-dirty)) + (set! (-> v1-19 target-post quad) (-> gp-0 quad)) + ) + ) + 0 + ) + (else + (let ((a0-26 (-> self nav state))) + (logclear! (-> a0-26 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-26 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-26 target-post quad) (-> v1-5 quad)) + ) + 0 + ) + ) + ) + (nav-enemy-method-176 self) + (none) + ) + ) + ) + +;; failed to figure out what this is: +(defstate close-attack (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) 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)) + (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 (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let* ((v1-9 *game-info*) + (a0-17 (+ (-> v1-9 attack-id) 1)) + ) + (set! (-> v1-9 attack-id) a0-17) + (set! (-> self attack-id) a0-17) + ) + (let ((v1-10 (-> self nav))) + (set! (-> v1-10 target-speed) 0.0) + ) + 0 + (none) + ) + :exit (behavior () + (let ((v1-3 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3))) + (logclear! (-> v1-3 prim-core action) (collide-action deadly)) + ) + (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 () + (crimson-guard-method-220 self) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (let ((gp-0 #f)) + (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) + (when (and (< 7.0 (ja-frame-num 0)) (not gp-0)) + (let ((v1-22 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 3))) + (logior! (-> v1-22 prim-core action) (collide-action deadly)) + ) + (set! gp-0 #t) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (go-virtual hostile) + (none) + ) + :post (behavior () + (nav-enemy-method-176 self) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate gun-shoot (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (set! (-> self other-side) (if (< (rand-vu) 0.5) + #t + #f + ) + ) + (nav-enemy-method-166 self) + (let ((v1-6 self)) + (set! (-> v1-6 enemy-flags) (the-as enemy-flag (logclear (-> v1-6 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-6 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-9 self)) + (set! (-> v1-9 enemy-flags) (the-as enemy-flag (logclear (-> v1-9 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (let ((v1-12 (-> self nav state))) + (set! (-> v1-12 speed) 0.0) + ) + 0 + (let ((a0-9 (-> self nav state)) + (v1-15 *null-vector*) + ) + (set! (-> a0-9 velocity quad) (-> v1-15 quad)) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self last-time-see-target) (-> self clock frame-counter)) + (crimson-guard-method-220 self) + (set! (-> self miss-amount) (lerp-scale 0.0 16384.0 (-> self target-self-dist) 40960.0 122880.0)) + (set! (-> self miss-amount) 16384.0) + (let ((v1-27 (handle->process (-> self focus handle)))) + (if (and v1-27 (logtest? (process-mask enemy) (-> v1-27 mask))) + (set! (-> self miss-amount) 0.0) + ) + ) + (set! (-> self next-shot) (the-as int (-> self clock frame-counter))) + (set! (-> self joint-enable) #t) + (none) + ) + :exit (behavior () + (set! (-> self joint-enable) #f) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (crimson-guard-method-220 self) + (let ((gp-0 (handle->process (-> self focus handle)))) + (when gp-0 + (when (not (and gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (set! (-> self miss-amount) (lerp-scale 0.0 16384.0 (-> self target-self-dist) 40960.0 122880.0)) + (set! (-> self miss-amount) 16384.0) + ) + (if (and (< (-> self target-self-xz-dist) 16384.0) + (and (< (fabs (-> self target-y-angle)) 7281.778) + gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + ) + (go-virtual close-attack) + ) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1)) + (or (not (logtest? (-> self flags) (citizen-flag target-in-sight))) + (< 184320.0 (-> self target-self-xz-dist)) + (< 10922.667 (fabs (-> self target-y-angle))) + ) + ) + (go-hostile self) + ) + ) + ) + (none) + ) + :code (behavior () + (local-vars (v1-35 object)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-3)) + (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 anim-shoot 0 anim-index)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-shoot 0 anim-index))) frames num-frames) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (label cfg-3) + (when (crimson-guard-method-216 self) + (set! v1-35 #t) + (goto cfg-10) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1)) + (set! v1-35 #f) + (goto cfg-10) + ) + (suspend) + (b! (not #f) cfg-3 :delay (set! v1-35 #f)) + (label cfg-10) + (when v1-35 + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((gp-0 3)) + (until #f + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-shoot 1 anim-index)) :num! min) + (set! (-> self already-shot) #t) + (lerp-scale 1.0 0.2 (-> self target-self-dist) 20480.0 122880.0) + (let ((f0-8 1.0)) + (cond + ((logtest? (-> self draw status) (draw-control-status on-screen)) + (let ((v1-58 (handle->process (-> self focus handle)))) + (when v1-58 + (if (or (< (-> self target-vel) 40.96) + (and (logtest? (focus-status pilot) (-> (the-as process-focusable v1-58) focus-status)) + (< (-> self target-pos y) 49152.0) + ) + ) + (set! (-> self miss-amount) (- (-> self miss-amount) (* 12288.0 f0-8))) + (set! (-> self miss-amount) (- (-> self miss-amount) (* 4096.0 f0-8))) + ) + ) + ) + ) + (else + (set! (-> self miss-amount) (- (-> self miss-amount) (* 3276.8 f0-8))) + ) + ) + ) + (if (< (-> self miss-amount) 0.0) + (set! (-> self miss-amount) 0.0) + ) + (crimson-guard-method-214 self) + (until (ja-done? 0) + (ja :num! (seek!)) + (suspend) + ) + (+! gp-0 -1) + (if (< gp-0 0) + (goto cfg-40) + ) + ) + ) + #f + ) + (label cfg-40) + (let ((f30-1 (get-rand-float-range self 0.9 1.1))) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data (-> self anim-shoot 2 anim-index)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self anim-shoot 2 anim-index))) frames num-frames) + -1 + ) + ) + f30-1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (crimson-guard-method-226 self) + (none) + ) + :post (behavior () + (citizen-method-200 self) + (nav-enemy-method-176 self) + (none) + ) + ) + +;; definition for method 226 of type crimson-guard +(defmethod crimson-guard-method-226 crimson-guard ((obj crimson-guard)) + (let ((s4-0 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (s5-0 (-> obj root-override2)) + (s3-0 (lambda ((arg0 crimson-guard) (arg1 collide-shape-moving) (arg2 vector)) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'vector)) + ) + (vector+! s3-0 (-> arg1 trans) arg2) + (cloest-point-on-mesh (-> arg0 nav) s4-0 s3-0 (the-as nav-poly #f)) + (cond + ((< 409.6 (vector-vector-distance s3-0 s4-0)) + #f + ) + ((let ((a1-4 (new 'stack-no-clear 'vector))) + (set! (-> a1-4 quad) (-> s4-0 quad)) + (set! (-> a1-4 w) (-> arg0 root-override2 nav-radius)) + (add-root-sphere-to-hash! (-> arg0 nav) a1-4 #x8046e) + ) + #f + ) + (else + (let ((a1-5 (new 'stack-no-clear 'collide-query))) + (set! (-> a1-5 start-pos quad) (-> arg1 trans quad)) + (vector-! (-> a1-5 move-dist) s4-0 (-> a1-5 start-pos)) + (let ((v1-10 a1-5)) + (set! (-> v1-10 radius) 2048.0) + (set! (-> v1-10 collide-with) (-> arg1 root-prim prim-core collide-with)) + (set! (-> v1-10 ignore-process0) arg0) + (set! (-> v1-10 ignore-process1) #f) + (set! (-> v1-10 ignore-pat) (-> arg1 pat-ignore-mask)) + (set! (-> v1-10 action-mask) (collide-action solid)) + ) + (if (>= (fill-and-probe-using-line-sphere *collide-cache* a1-5) 0.0) + #f + #t + ) + ) + ) + ) + ) + ) + ) + ) + (cond + ((s3-0 obj s5-0 (vector-normalize-copy! (new 'stack-no-clear 'vector) s4-0 24576.0)) + (go (method-of-object obj roll-right)) + ) + ((s3-0 obj s5-0 (vector-normalize-copy! (new 'stack-no-clear 'vector) s4-0 -24576.0)) + (go (method-of-object obj roll-left)) + ) + (else + (go-hostile obj) + ) + ) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate roll-right (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :code (behavior () + (vector-reset! (-> self root-override2 transv)) + (vector-x-quaternion! (-> self root-override2 transv) (-> self root-override2 quat)) + (set! (-> self root-override2 transv y) 24576.0) + (vector-xz-normalize! (-> self root-override2 transv) 40960.0) + (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 + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (ja-no-eval :group! (-> self draw art-group data 40) + :num! (seek! (ja-aframe 6.0 0)) + :frame-num (ja-aframe 0.0 0) + ) + (until (ja-done? 0) + (let ((a0-20 (handle->process (-> self focus handle)))) + (if a0-20 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable a0-20) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 6.0 0))) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 41) + :num! (seek! (ja-aframe 9.0 0)) + :frame-num (ja-aframe 0.0 0) + ) + (until (ja-done? 0) + (let ((a0-33 (handle->process (-> self focus handle)))) + (if a0-33 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable a0-33) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 9.0 0))) + ) + ) + ) + (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 + (cond + ((logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (ja-no-eval :group! (-> self draw art-group data 40) + :num! (seek! (ja-aframe 11.0 0)) + :frame-num (ja-aframe 6.0 0) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 11.0 0))) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 41) + :num! (seek! (ja-aframe 11.0 0)) + :frame-num (ja-aframe 9.0 0) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 11.0 0))) + ) + ) + ) + (go-virtual gun-shoot) + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (when (logtest? (enemy-flag enemy-flag36) (-> a0-0 enemy-flags)) + (vector-v++! + (-> self root-override2 transv) + (compute-acc-due-to-gravity (-> self root-override2) (new 'stack-no-clear 'vector) 0.0) + ) + (let ((a2-1 (new 'stack-no-clear 'collide-query)) + (a0-5 (-> self root-override2)) + ) + (set! (-> a2-1 collide-with) (-> a0-5 root-prim prim-core collide-with)) + (set! (-> a2-1 ignore-process0) self) + (set! (-> a2-1 ignore-process1) #f) + (set! (-> a2-1 ignore-pat) (-> a0-5 pat-ignore-mask)) + (set! (-> a2-1 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide a0-5 (-> self root-override2 transv) a2-1 (meters 0)) + ) + ) + ) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate roll-left (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :code (behavior () + (vector-reset! (-> self root-override2 transv)) + (vector-x-quaternion! (-> self root-override2 transv) (-> self root-override2 quat)) + (set! (-> self root-override2 transv y) 24576.0) + (vector-xz-normalize! (-> self root-override2 transv) -40960.0) + (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 + (ja-channel-push! 1 (seconds 0.1)) + (cond + ((logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (ja-no-eval :group! (-> self draw art-group data 41) + :num! (seek! (ja-aframe 9.0 0)) + :frame-num (ja-aframe 0.0 0) + ) + (until (ja-done? 0) + (let ((a0-20 (handle->process (-> self focus handle)))) + (if a0-20 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable a0-20) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 9.0 0))) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 40) + :num! (seek! (ja-aframe 6.0 0)) + :frame-num (ja-aframe 0.0 0) + ) + (until (ja-done? 0) + (let ((a0-33 (handle->process (-> self focus handle)))) + (if a0-33 + (seek-toward-heading-vec! + (-> self root-override2) + (vector-! + (new 'stack-no-clear 'vector) + (get-trans (the-as process-focusable a0-33) 0) + (-> self root-override2 trans) + ) + 32768.0 + (seconds 0.05) + ) + ) + ) + (suspend) + (ja :num! (seek! (ja-aframe 6.0 0))) + ) + ) + ) + (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 + (cond + ((logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (ja-no-eval :group! (-> self draw art-group data 41) + :num! (seek! (ja-aframe 11.0 0)) + :frame-num (ja-aframe 9.0 0) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 11.0 0))) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 40) + :num! (seek! (ja-aframe 11.0 0)) + :frame-num (ja-aframe 6.0 0) + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 11.0 0))) + ) + ) + ) + (go-virtual gun-shoot) + (none) + ) + :post (-> (method-of-type crimson-guard roll-right) post) + ) + +;; failed to figure out what this is: +(defstate arrest (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (nav-enemy-method-167 self) + (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 (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (vector-reset! (-> self root-override2 transv)) + (let ((a0-9 (-> self nav state)) + (v1-12 *null-vector*) + ) + (set! (-> a0-9 velocity quad) (-> v1-12 quad)) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self last-time-see-target) (-> self clock frame-counter)) + (set! (-> self miss-amount) 0.0) + (set! (-> self next-shot) (the-as int (-> self clock frame-counter))) + (set! (-> self joint-enable) #t) + (crimson-guard-method-221 self) + (none) + ) + :exit (behavior () + (set! (-> self joint-enable) #f) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (crimson-guard-method-220 self) + (send-event (handle->process (-> self focus handle)) 'arrest) + (none) + ) + :code (behavior () + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-2 speech-type-3)) + (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 19) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 19)) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (until #f + (if (or (not (logtest? (-> self flags) (citizen-flag target-in-sight))) + (< 49152.0 (-> self target-self-xz-dist)) + (< 10922.667 (fabs (-> self target-y-angle))) + ) + (goto cfg-17) + ) + (ja-no-eval :group! (-> self draw art-group data 20) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 20)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (label cfg-17) + (let ((f30-1 (get-rand-float-range self 0.9 1.1))) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data 24) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 24)) frames num-frames) -1)) + f30-1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (citizen-method-200 self) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate waiting-ambush (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (nav-enemy-method-167 self) + (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 (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (vector-reset! (-> self root-override2 transv)) + (let ((a0-9 (-> self nav state)) + (v1-12 *null-vector*) + ) + (set! (-> a0-9 velocity quad) (-> v1-12 quad)) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self miss-amount) 0.0) + (set! (-> self next-shot) (the-as int (-> self clock frame-counter))) + (set! (-> self joint-enable) #t) + (crimson-guard-method-221 self) + (none) + ) + :exit (behavior () + (set! (-> self joint-enable) #f) + (logclear! (-> self enemy-flags) (enemy-flag actor-pause-backup)) + (none) + ) + :trans (behavior () + (crimson-guard-method-220 self) + (if (logtest? (-> self flags) (citizen-flag target-in-sight)) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-1)) + ) + (none) + ) + :code (behavior () + (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 19) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 19)) frames num-frames) -1)) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (while (not (logtest? (-> self flags) (citizen-flag target-in-sight))) + (ja-no-eval :group! (-> self draw art-group data 20) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 20)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (let ((f30-1 (get-rand-float-range self 0.9 1.1))) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data 24) + :num! (seek! + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 24)) frames num-frames) -1)) + f30-1 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-1)) + ) + ) + (go-hostile self) + (none) + ) + :post (behavior () + (seek-toward-heading-vec! (-> self root-override2) (-> self target-self-xz) 65536.0 (seconds 0.02)) + (nav-enemy-simple-post) + (none) + ) + ) + +;; definition for function spread-lightning-lazer +;; INFO: Used lq/sq +;; WARN: Return type mismatch symbol vs none. +(defun spread-lightning-lazer ((arg0 lightning-control) (arg1 vector) (arg2 vector) (arg3 vector)) + (local-vars (sv-640 int) (sv-656 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set! (-> s5-0 quad) (-> arg1 quad)) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (set! (-> s4-0 quad) (-> arg2 quad)) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s2-0 (new 'stack-no-clear 'quaternion)) + ) + (vector-length arg2) + (let ((s1-0 (new 'stack-no-clear 'vector))) + (set! (-> s1-0 quad) (-> arg3 quad)) + (let ((s0-0 (new 'stack-no-clear 'collide-query))) + (set! sv-640 0) + (while (< sv-640 6) + (let ((v1-6 s0-0)) + (set! (-> v1-6 radius) 2867.2) + (set! (-> v1-6 collide-with) + (collide-spec jak bot civilian enemy vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> v1-6 ignore-process0) #f) + (set! (-> v1-6 ignore-process1) #f) + (set! (-> v1-6 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-6 action-mask) (collide-action solid)) + ) + (set! (-> s0-0 start-pos quad) (-> s5-0 quad)) + (set! (-> s0-0 move-dist quad) (-> s4-0 quad)) + (set-from-point-offset-pad! (-> s0-0 bbox) (-> s0-0 start-pos) (-> s0-0 move-dist) (-> s0-0 radius)) + (fill-using-bounding-box *collide-cache* s0-0) + (set! (-> s0-0 radius) 409.6) + (let ((f0-4 (probe-using-line-sphere *collide-cache* s0-0))) + (cond + ((>= f0-4 0.0) + (let ((a1-4 s3-0)) + (let ((v1-13 (-> s0-0 start-pos))) + (let ((a0-12 (-> s0-0 move-dist))) + (let ((a2-2 f0-4)) + (.mov vf7 a2-2) + ) + (.lvf vf5 (&-> a0-12 quad)) + ) + (.lvf vf4 (&-> v1-13 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-4 quad) vf6) + ) + (set! (-> s5-0 quad) (-> s3-0 quad)) + ) + (else + (vector+! (-> s0-0 start-pos) s5-0 s4-0) + (let ((a1-7 (-> s0-0 start-pos))) + (let ((v1-16 (-> s0-0 start-pos))) + (let ((a0-16 s1-0)) + (let ((a2-4 -2048.0)) + (.mov vf7 a2-4) + ) + (.lvf vf5 (&-> a0-16 quad)) + ) + (.lvf vf4 (&-> v1-16 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-7 quad) vf6) + ) + (vector-negate! (-> s0-0 move-dist) s4-0) + (set! f0-4 (probe-using-line-sphere *collide-cache* s0-0)) + (when (>= f0-4 0.0) + (let ((a1-10 s3-0)) + (let ((v1-19 (-> s0-0 start-pos))) + (let ((a0-19 (-> s0-0 move-dist))) + (let ((a2-5 f0-4)) + (.mov vf7 a2-5) + ) + (.lvf vf5 (&-> a0-19 quad)) + ) + (.lvf vf4 (&-> v1-19 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-10 quad) vf6) + ) + (let ((a1-11 s3-0)) + (let ((v1-20 s3-0)) + (let ((a0-20 s1-0)) + (let ((a2-7 2048.0)) + (.mov vf7 a2-7) + ) + (.lvf vf5 (&-> a0-20 quad)) + ) + (.lvf vf4 (&-> v1-20 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-11 quad) vf6) + ) + (set! (-> s5-0 quad) (-> s3-0 quad)) + ) + ) + ) + (cond + ((>= f0-4 0.0) + (+! (-> s3-0 x) (rand-vu-float-range -819.2 819.2)) + (+! (-> s3-0 y) (rand-vu-float-range -819.2 819.2)) + (+! (-> s3-0 z) (rand-vu-float-range -819.2 819.2)) + (set-point! arg0 (-> arg0 state points-to-draw) s3-0) + (+! (-> arg0 state points-to-draw) 1) + (set! sv-656 (-> s0-0 best-other-tri normal)) + (quaternion-from-two-vectors! s2-0 s1-0 sv-656) + (vector-orient-by-quat! s4-0 s4-0 s2-0) + (set! (-> s1-0 quad) (-> sv-656 quad)) + (vector-flatten! s4-0 s4-0 sv-656) + ) + (else + (vector+! s5-0 s5-0 s4-0) + (when (< sv-640 6) + (set-point! arg0 (-> arg0 state points-to-draw) s5-0) + (+! (-> arg0 state points-to-draw) 1) + ) + ) + ) + ) + (set! sv-640 (+ sv-640 1)) + ) + ) + ) + ) + ) + ) + (none) + ) + ) + +;; definition for method 222 of type crimson-guard +;; INFO: Used lq/sq +(defmethod crimson-guard-method-222 crimson-guard ((obj crimson-guard)) + (local-vars (sv-800 vector)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let* ((s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 14))) + (v0-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 15))) + (s2-0 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) s4-0 v0-1) 16384.0)) + (s1-0 + (vector-normalize! (vector-! (new 'stack-no-clear 'vector) (-> obj target-pos-predict-miss) s4-0) 16384.0) + ) + (s5-0 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'collide-query)) + ) + (when (< 1820.4445 (vector-vector-angle-safe s2-0 s1-0)) + (let* ((a1-9 (vector-normalize! (vector-cross! (new 'stack-no-clear 'vector) s2-0 s1-0) 1.0)) + (a2-1 (quaternion-vector-angle! (new 'stack-no-clear 'quaternion) a1-9 1820.4445)) + ) + (vector-orient-by-quat! s1-0 s2-0 a2-1) + ) + ) + (let ((a0-12 s4-0)) + (let ((v1-8 s4-0)) + (let ((a1-12 0.2)) + (.mov vf7 a1-12) + ) + (.lvf vf5 (&-> s2-0 quad)) + (.lvf vf4 (&-> v1-8 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-12 quad) vf6) + ) + (vector+! s5-0 s4-0 s1-0) + (let ((v1-10 s3-0)) + (set! (-> v1-10 radius) 409.6) + (set! (-> v1-10 collide-with) + (collide-spec jak bot civilian enemy vehicle-sphere hit-by-others-list player-list) + ) + (set! (-> v1-10 ignore-process0) #f) + (set! (-> v1-10 ignore-process1) #f) + (set! (-> v1-10 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)) + (set! (-> v1-10 action-mask) (collide-action solid)) + ) + (set! (-> s3-0 start-pos quad) (-> s4-0 quad)) + (set! (-> s3-0 move-dist quad) (-> s1-0 quad)) + (set! (-> obj l-control state points-to-draw) 0) + (let ((f0-3 (fill-and-probe-using-line-sphere *collide-cache* s3-0)) + (s2-1 (new 'stack-no-clear 'vector)) + ) + (cond + ((>= f0-3 0.0) + (vector-float*! s1-0 (-> s3-0 move-dist) f0-3) + (vector+! s5-0 s4-0 s1-0) + (point-in-plane-<-point+normal! s2-1 s5-0 (-> s3-0 best-other-tri normal)) + (vector-! s2-1 s2-1 s5-0) + (let ((s1-1 quaternion-vector-angle!) + (s0-0 (new 'stack-no-clear 'quaternion)) + ) + (set! sv-800 (-> s3-0 best-other-tri normal)) + (let* ((a2-3 (rand-vu-float-range 0.0 65536.0)) + (a2-4 (s1-1 s0-0 sv-800 a2-3)) + ) + (vector-orient-by-quat! s2-1 s2-1 a2-4) + ) + ) + (let ((s1-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when s1-2 + (let ((t9-14 (method-of-type part-tracker activate))) + (t9-14 (the-as part-tracker s1-2) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-15 run-function-in-process) + (a0-33 s1-2) + (a1-24 part-tracker-init) + (a2-9 (-> *part-group-id-table* 140)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> s4-0 quad)) + ((the-as (function object object object object object object object object none) t9-15) + a0-33 + a1-24 + a2-9 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> s1-2 ppointer) + ) + ) + (let ((s1-3 (get-process *default-dead-pool* part-tracker #x4000))) + (when s1-3 + (let ((t9-17 (method-of-type part-tracker activate))) + (t9-17 (the-as part-tracker s1-3) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-18 run-function-in-process) + (a0-36 s1-3) + (a1-27 part-tracker-init) + (a2-14 (-> *part-group-id-table* 140)) + (a3-3 0) + (t0-1 #f) + (t1-1 #f) + (t2-1 #f) + (t3-1 *launch-matrix*) + ) + (set! (-> t3-1 trans quad) (-> s5-0 quad)) + ((the-as (function object object object object object object object object none) t9-18) + a0-36 + a1-27 + a2-14 + a3-3 + t0-1 + t1-1 + t2-1 + t3-1 + ) + ) + (-> s1-3 ppointer) + ) + ) + (set-point! (-> obj l-control) 0 s4-0) + (set-point! (-> obj l-control) 1 s5-0) + (set! (-> obj l-control spec) (-> *lightning-spec-id-table* 13)) + (+! (-> obj l-control state points-to-draw) 2) + (let* ((s1-4 (-> s3-0 best-other-tri collide-ptr)) + (v1-43 (if (type? s1-4 collide-shape-prim) + s1-4 + ) + ) + (s1-5 #t) + ) + (when v1-43 + (set! s1-5 #f) + (let ((s0-1 (new 'stack-no-clear 'projectile-init-by-other-params))) + (set! (-> s0-1 ent) (-> obj entity)) + (set! (-> s0-1 charge) 1.0) + (set! (-> s0-1 options) (projectile-options)) + (set! (-> s0-1 notify-handle) (process->handle obj)) + (set! (-> s0-1 owner-handle) (the-as handle #f)) + (set! (-> s0-1 ignore-handle) (process->handle obj)) + (set! (-> s0-1 attack-id) (-> obj attack-id)) + (set! (-> s0-1 timeout) (new 'static 'handle :process #x4b0 :u64 #x4b0)) + (set! (-> s0-1 pos quad) (-> s4-0 quad)) + (vector-! (-> s0-1 vel) s5-0 s4-0) + (vector-normalize! (-> s0-1 vel) 131072.0) + (spawn-projectile guard-lazer-shot s0-1 obj *default-dead-pool*) + ) + ) + ) + (spread-lightning-lazer (-> obj l-control) s5-0 s2-1 (-> s3-0 best-other-tri normal)) + ) + (else + (let ((s3-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s3-1 + (let ((t9-26 (method-of-type part-tracker activate))) + (t9-26 (the-as part-tracker s3-1) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-27 run-function-in-process) + (a0-59 s3-1) + (a1-36 part-tracker-init) + (a2-23 (-> *part-group-id-table* 140)) + (a3-7 0) + (t0-3 #f) + (t1-2 #f) + (t2-2 #f) + (t3-2 *launch-matrix*) + ) + (set! (-> t3-2 trans quad) (-> s4-0 quad)) + ((the-as (function object object object object object object object object none) t9-27) + a0-59 + a1-36 + a2-23 + a3-7 + t0-3 + t1-2 + t2-2 + t3-2 + ) + ) + (-> s3-1 ppointer) + ) + ) + (let ((s3-2 (get-process *default-dead-pool* part-tracker #x4000))) + (when s3-2 + (let ((t9-29 (method-of-type part-tracker activate))) + (t9-29 (the-as part-tracker s3-2) obj (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-30 run-function-in-process) + (a0-62 s3-2) + (a1-39 part-tracker-init) + (a2-28 (-> *part-group-id-table* 140)) + (a3-9 0) + (t0-4 #f) + (t1-3 #f) + (t2-3 #f) + (t3-3 *launch-matrix*) + ) + (set! (-> t3-3 trans quad) (-> s5-0 quad)) + ((the-as (function object object object object object object object object none) t9-30) + a0-62 + a1-39 + a2-28 + a3-9 + t0-4 + t1-3 + t2-3 + t3-3 + ) + ) + (-> s3-2 ppointer) + ) + ) + (set! (-> obj l-control state points-to-draw) 9) + (set! (-> obj l-control spec) (-> *lightning-spec-id-table* 14)) + (let ((v1-77 s4-0)) + (set! (-> obj l-control state meet data 0 quad) (-> v1-77 quad)) + ) + (let ((a0-68 (-> obj l-control)) + (v1-79 s5-0) + ) + (set! (-> a0-68 state meet data (+ (-> a0-68 state points-to-draw) -1) quad) (-> v1-79 quad)) + ) + ) + ) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate attack (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (set! (-> self joint-enable) #t) + (logior! (-> self focus-status) (focus-status dangerous)) + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logclear (-> v1-5 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-5 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-8 self)) + (set! (-> v1-8 enemy-flags) (the-as enemy-flag (logclear (-> v1-8 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self miss-amount) 0.0) + (set! (-> self state-time) (-> self clock frame-counter)) + (set! (-> self lazer-sound) (the-as uint 0)) + 0 + (none) + ) + :exit (behavior () + (if (nonzero? (-> self lazer-sound)) + (sound-stop (the-as sound-id (-> self lazer-sound))) + ) + (iterate-prims + (-> self root-override2) + (lambda ((arg0 collide-shape-prim)) (logclear! (-> arg0 prim-core action) (collide-action deadly)) (none)) + ) + (let ((v1-5 (-> self l-control)) + (a0-2 0) + ) + (let ((a1-2 (!= a0-2 (-> v1-5 state mode)))) + (case a0-2 + ((3) + (if a1-2 + (set! (-> v1-5 state counter) 0.0) + ) + ) + ((1) + (set! (-> v1-5 state start-color) (-> v1-5 spec start-color)) + (set! (-> v1-5 state end-color) (-> v1-5 spec end-color)) + ) + ) + ) + (set! (-> v1-5 state mode) (the-as lightning-mode a0-2)) + ) + (set! (-> self joint-enable) #f) + (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 () + (crimson-guard-method-220 self) + (if (and (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 1)) + (or (< 32768.0 (-> self target-self-xz-dist)) (zero? (logand (-> self flags) (citizen-flag target-in-sight)))) + ) + (go-hostile self) + ) + (let ((v1-14 (handle->process (-> self focus handle)))) + (if (or (logtest? (-> (the-as process-focusable v1-14) focus-status) (focus-status inactive)) + (logtest? (-> (the-as process-focusable v1-14) focus-status) (focus-status disable)) + ) + (set! v1-14 (the-as process #f)) + ) + (if (not v1-14) + (go-virtual active) + ) + ) + (none) + ) + :code (behavior () + (local-vars (v1-94 symbol)) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data 19) :num! (seek! (ja-aframe 7.0 0)) :frame-num 0.0) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! (ja-aframe 7.0 0))) + ) + (let ((gp-2 #t)) + (until #f + (while (or (< 7281.778 (fabs (-> self target-y-angle))) (>= (-> self next-shot) (-> self clock frame-counter))) + (when gp-2 + ) + (speech-control-method-12 *speech-control* self (speech-type speech-type-0 speech-type-3)) + (cond + ((< 7281.778 (fabs (-> self target-y-angle))) + (ja-channel-push! 1 (seconds 0.1)) + (while (< 7281.778 (fabs (-> self target-y-angle))) + (let ((f0-6 (the-as float (-> self target-y-angle))) + (f30-0 16384.0) + ) + (if (< (the-as degrees f0-6) 0.0) + (set! f30-0 (- f30-0)) + ) + (if (logtest? (enemy-flag dislike-combo) (-> self enemy-flags)) + (set! f0-6 (- (the-as degrees f0-6))) + ) + (cond + ((< f0-6 0.0) + (ja-no-eval :group! (-> self draw art-group data 25) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 25)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (quaternion-rotate-local-y! + (-> self root-override2 quat) + (-> self root-override2 quat) + (* f30-0 (-> self clock seconds-per-frame)) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 25) + :num! (seek! 0.0) + :frame-num (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 25)) frames num-frames) -1)) + ) + (until (ja-done? 0) + (quaternion-rotate-local-y! + (-> self root-override2 quat) + (-> self root-override2 quat) + (* f30-0 (-> self clock seconds-per-frame)) + ) + (suspend) + (ja :num! (seek! 0.0)) + ) + ) + ) + ) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 20) :num! (loop!)) + (until v1-94 + (suspend) + (ja :num! (loop!)) + (set! v1-94 + (or (< (-> self clock frame-counter) (-> self next-shot)) + (< (-> self target-self-xz-dist) 16384.0) + (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) + ) + ) + ) + ) + (>= (fabs (-> self target-y-angle)) 7281.778) + ) + ) + ) + ) + ) + (when (< (-> self target-self-xz-dist) 16384.0) + (set! (-> self next-shot) 0) + 0 + ) + ) + (cond + ((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) + ) + ) + ) + (cond + ((< (-> self target-self-xz-dist) 16384.0) + (go-virtual close-attack) + ) + (else + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 21) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 21)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (crimson-guard-method-221 self) + (set! (-> self next-shot) (the-as int (+ (-> self clock frame-counter) (seconds 0.1)))) + (let ((v1-155 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 2))) + (logior! (-> v1-155 prim-core action) (collide-action deadly)) + ) + (let* ((v1-156 *game-info*) + (a0-52 (+ (-> v1-156 attack-id) 1)) + ) + (set! (-> v1-156 attack-id) a0-52) + (set! (-> self attack-id) a0-52) + ) + (set! (-> self lazer-sound) (the-as uint (sound-play "guard-zap"))) + (let ((v1-158 (-> self l-control)) + (a0-56 1) + ) + (let ((a1-31 (!= a0-56 (-> v1-158 state mode)))) + (case a0-56 + ((3) + (if a1-31 + (set! (-> v1-158 state counter) 0.0) + ) + ) + ((1) + (set! (-> v1-158 state start-color) (-> v1-158 spec start-color)) + (set! (-> v1-158 state end-color) (-> v1-158 spec end-color)) + ) + ) + ) + (set! (-> v1-158 state mode) (the-as lightning-mode a0-56)) + ) + (let ((s5-1 (-> self clock frame-counter)) + (s4-1 150) + (f30-1 1.0) + ) + (ja-no-eval :group! (-> self draw art-group data 22) :num! (loop! f30-1) :frame-num 0.0) + (until (>= (- (-> self clock frame-counter) s5-1) s4-1) + (crimson-guard-method-222 self) + (suspend) + (ja :num! (loop! f30-1)) + ) + ) + (let ((v1-181 (-> (the-as collide-shape-prim-group (-> self root-override2 root-prim)) child 2))) + (logclear! (-> v1-181 prim-core action) (collide-action deadly)) + ) + (let ((v1-182 (-> self l-control)) + (a0-62 3) + ) + (let ((a1-44 (!= a0-62 (-> v1-182 state mode)))) + (case a0-62 + ((3) + (if a1-44 + (set! (-> v1-182 state counter) 0.0) + ) + ) + ((1) + (set! (-> v1-182 state start-color) (-> v1-182 spec start-color)) + (set! (-> v1-182 state end-color) (-> v1-182 spec end-color)) + ) + ) + ) + (set! (-> v1-182 state mode) (the-as lightning-mode a0-62)) + ) + (ja-no-eval :group! (-> self draw art-group data 23) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 23)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + ) + (else + (set! (-> self next-shot) (the-as int (+ (-> self clock frame-counter) (seconds 1)))) + (suspend) + 0 + ) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (citizen-method-200 self) + (nav-enemy-method-176 self) + (none) + ) + ) + +;; definition for method 223 of type crimson-guard +;; WARN: Return type mismatch int vs none. +(defmethod crimson-guard-method-223 crimson-guard ((obj crimson-guard) (arg0 float)) + (let* ((s3-0 (handle->process (-> obj transport))) + (s4-0 (if (type? s3-0 process-focusable) + (the-as process-focusable s3-0) + ) + ) + ) + (when s4-0 + (let ((s2-0 (matrix<-transformq! (new 'stack-no-clear 'matrix) (the-as transformq (-> s4-0 root-override trans)))) + (s3-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> s3-1 x) (if (zero? (-> obj transport-side)) + -8192.0 + 8192.0 + ) + ) + (set! (-> s3-1 y) 12288.0) + (set! (-> s3-1 z) (lerp-scale -16384.0 -49152.0 arg0 0.0 1.0)) + (set! (-> s3-1 w) 1.0) + (quaternion-rotate-local-y! (-> obj root-override2 quat) (-> s4-0 root-override quat) 32768.0) + (vector-matrix*! (-> obj root-override2 trans) s3-1 s2-0) + ) + ) + ) + (let ((f0-5 (fmax 0.0 (fmin 1.0 (* 3.3333333 arg0))))) + (set-vector! (-> obj draw color-mult) f0-5 f0-5 f0-5 1.0) + ) + 0 + (none) + ) + +;; definition for method 224 of type crimson-guard +;; INFO: Used lq/sq +;; ERROR: Unsupported inline assembly instruction kind - [mula.s f0, f3] +;; ERROR: Unsupported inline assembly instruction kind - [madda.s f1, f4] +;; ERROR: Unsupported inline assembly instruction kind - [madd.s f0, f2, f5] +(defmethod crimson-guard-method-224 crimson-guard ((obj crimson-guard) (arg0 vector)) + (local-vars + (f0-8 float) + (sv-768 vector) + (sv-784 vector) + (sv-800 nav-control) + (sv-816 nav-poly) + (sv-832 vector) + ) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + (vf7 :class vf) + ) + (init-vf0-vector) + (let ((s4-0 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + (f30-0 0.0) + ) + (dotimes (s3-0 2) + (vector-normalize! s4-0 (* 4096.0 (+ 4.0 (* 2.0 (the float s3-0))))) + (dotimes (s2-0 6) + (set! sv-768 (new 'stack-no-clear 'vector)) + (let ((s1-0 (new 'stack-no-clear 'vector)) + (s0-0 (new 'stack 'collide-query)) + ) + (vector-rotate-around-y! sv-768 s4-0 (* 182.04445 (the float (+ (* 23 s2-0) -70)))) + (let ((v1-10 s1-0)) + (let ((a0-6 (-> obj root-override2 trans))) + (let ((a1-5 sv-768)) + (let ((a2-2 1.0)) + (.mov vf7 a2-2) + ) + (.lvf vf5 (&-> a1-5 quad)) + ) + (.lvf vf4 (&-> a0-6 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-10 quad) vf6) + ) + (if (enemy-above-ground? obj s0-0 s1-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> s1-0 y) (-> s0-0 best-other-tri intersect y)) + ) + (let ((v1-14 (-> obj nav)) + (a0-8 s1-0) + (a1-7 (new 'stack-no-clear 'nav-find-poly-parms)) + ) + (vector-! (-> a1-7 point) a0-8 (-> v1-14 state mesh bounds)) + (set! (-> a1-7 y-threshold) (-> v1-14 nearest-y-threshold)) + (set! (-> a1-7 ignore) (the-as uint 2)) + (set! sv-816 (find-poly-containing-point-local (-> v1-14 state mesh) a1-7)) + ) + (when sv-816 + (let* ((v1-18 s4-0) + (f0-7 (-> sv-768 x)) + (f1-4 (-> sv-768 y)) + (f2-2 (-> sv-768 z)) + (f3-2 (-> v1-18 x)) + (f4-0 (-> v1-18 y)) + (f5-0 (-> v1-18 z)) + ) + (.mula.s f0-7 f3-2) + (.madda.s f1-4 f4-0) + (.madd.s f0-8 f2-2 f5-0) + ) + (let ((f28-0 f0-8)) + (new 'stack-no-clear 'vector) + (let ((a1-8 (new 'stack-no-clear 'vector))) + (set! (-> a1-8 quad) (-> s1-0 quad)) + (set! (-> a1-8 w) 8192.0) + (when (not (add-root-sphere-to-hash! (-> obj nav) a1-8 32)) + (when (< f30-0 f28-0) + (set! f30-0 f28-0) + (set! sv-784 (new 'stack-no-clear 'vector)) + (let ((a3-3 (new 'stack-no-clear 'vector))) + (set! sv-800 (-> obj nav)) + (set! sv-832 sv-784) + (let* ((v1-29 s1-0) + (a0-18 (-> sv-800 state mesh)) + (t9-7 (method-of-object a0-18 project-point-onto-plane-of-poly-local)) + (a2-7 sv-832) + (t0-2 (vector-! (new 'stack-no-clear 'vector) v1-29 (-> sv-800 state mesh bounds))) + ) + (t9-7 a0-18 sv-816 a2-7 a3-3 t0-2) + ) + ) + (let ((v1-30 sv-832)) + (let ((a0-21 (-> sv-800 state mesh bounds))) + (.mov.vf vf6 vf0 :mask #b1000) + (.lvf vf4 (&-> sv-832 quad)) + (.lvf vf5 (&-> a0-21 quad)) + ) + (.add.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> v1-30 quad) vf6) + ) + 0 + (set! (-> s1-0 y) (-> sv-784 y)) + (if (enemy-above-ground? obj s0-0 s1-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + (set! (-> s1-0 y) (-> s0-0 best-other-tri intersect y)) + ) + (set! (-> arg0 quad) (-> s1-0 quad)) + ) + ) + ) + ) + ) + ) + ) + ) + f30-0 + ) + ) + ) + +;; definition for method 93 of type crimson-guard +;; INFO: Used lq/sq +;; WARN: Return type mismatch object vs none. +(defmethod enemy-method-93 crimson-guard ((obj crimson-guard)) + (let ((s5-0 (-> obj nav state)) + (v1-2 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (set! (-> s5-0 heading quad) (-> v1-2 quad)) + ) + 0 + (let ((s5-1 (-> obj nav state)) + (v1-7 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (logior! (-> s5-1 flags) (nav-state-flag directional-mode)) + (set! (-> s5-1 travel quad) (-> v1-7 quad)) + ) + 0 + (let ((s5-2 (-> obj nav state)) + (v1-12 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> obj root-override2 quat))) + ) + (set! (-> s5-2 velocity quad) (-> v1-12 quad)) + ) + 0 + (crimson-guard-method-220 obj) + (set! (-> obj move-position quad) (-> obj target-pos quad)) + (go (method-of-object obj hostile)) + (none) + ) + +;; definition for method 89 of type crimson-guard +(defmethod enemy-method-89 crimson-guard ((obj crimson-guard) (arg0 enemy-jump-info)) + #f + ) + +;; definition for method 87 of type crimson-guard +(defmethod enemy-method-87 crimson-guard ((obj crimson-guard) (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!) + ) + (ja-channel-push! 1 (seconds 0.1)) + (let ((s4-0 (-> obj skel root-channel 0))) + (set! (-> s4-0 frame-group) (the-as art-joint-anim (-> obj draw art-group data 38))) + (set! (-> s4-0 param 0) (ja-aframe 3.0 0)) + (set! (-> s4-0 param 1) (-> arg0 anim-speed)) + (set! (-> s4-0 frame-num) (ja-aframe 0.0 0)) + (joint-control-channel-group! s4-0 (the-as art-joint-anim (-> obj draw art-group data 38)) num-func-seek!) + ) + #t + ) + +;; definition for method 88 of type crimson-guard +(defmethod enemy-method-88 crimson-guard ((obj crimson-guard) (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!) + ) + (ja-channel-push! 1 (seconds 0.01)) + (let ((s4-0 (-> obj skel root-channel 0))) + (set! (-> s4-0 frame-group) (the-as art-joint-anim (-> obj draw art-group data 38))) + (set! (-> s4-0 param 0) (ja-aframe 9.0 0)) + (set! (-> s4-0 param 1) (-> arg0 anim-speed)) + (set! (-> s4-0 frame-num) (ja-aframe 4.0 0)) + (joint-control-channel-group! s4-0 (the-as art-joint-anim (-> obj draw art-group data 38)) num-func-seek!) + ) + #t + ) + +;; definition for method 90 of type crimson-guard +(defmethod enemy-method-90 crimson-guard ((obj crimson-guard) (arg0 int) (arg1 enemy-jump-info)) + (local-vars (s5-0 symbol)) + (let ((v1-0 arg0)) + (cond + ((zero? v1-0) + (not (enemy-method-89 obj arg1)) + ) + ((= v1-0 1) + (set! s5-0 (ja-done? 0)) + (let ((s4-1 (-> obj skel root-channel 0))) + (set! (-> s4-1 param 0) (ja-aframe 3.0 0)) + (set! (-> s4-1 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! s4-1 (the-as art-joint-anim #f) num-func-seek!) + ) + (ja-blend-eval) + s5-0 + ) + ((= v1-0 2) + (enemy-method-87 obj arg1) + #f + ) + ((= v1-0 3) + (set! s5-0 (ja-done? 0)) + (let ((s4-2 (-> obj skel root-channel 0))) + (set! (-> s4-2 param 0) (ja-aframe 3.0 0)) + (set! (-> s4-2 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! s4-2 (the-as art-joint-anim #f) num-func-seek!) + ) + (ja-blend-eval) + s5-0 + ) + ((= v1-0 4) + (not (enemy-method-88 obj arg1)) + ) + ((= v1-0 5) + (set! s5-0 (ja-done? 0)) + (let ((s4-3 (-> obj skel root-channel 0))) + (set! (-> s4-3 param 0) (ja-aframe 9.0 0)) + (set! (-> s4-3 param 1) (-> arg1 anim-speed)) + (joint-control-channel-group-eval! s4-3 (the-as art-joint-anim #f) num-func-seek!) + ) + (ja-blend-eval) + s5-0 + ) + (else + #t + ) + ) + ) + ) + +;; failed to figure out what this is: +(defstate exit-transport (crimson-guard) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior crimson-guard) enemy-event-handler) + :enter (behavior () + (set! (-> self state-time) (-> self clock frame-counter)) + (logior! (-> self nav flags) (nav-control-flag output-sphere-hash)) + (logclear! (-> self flags) (citizen-flag hostile)) + (nav-enemy-method-166 self) + (let ((v1-9 (-> self nav))) + (set! (-> v1-9 target-speed) (* (-> self speed-scale) (-> self enemy-info-override run-travel-speed))) + ) + 0 + (set! (-> self already-shot) #f) + (none) + ) + :exit (behavior () + (set-vector! (-> self draw color-mult) 1.0 1.0 1.0 1.0) + (logclear! (-> self nav flags) (nav-control-flag output-sphere-hash)) + (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) + (when (not (-> self already-shot)) + (crimson-guard-method-223 self 1.0) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 quad) (-> self root-override2 trans quad)) + (let ((s4-0 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root-override2 quat))) + (s5-0 (new 'stack 'collide-query)) + ) + (let ((a0-3 gp-0)) + (let ((v1-8 gp-0)) + (let ((a1-4 20480.0)) + (.mov vf7 a1-4) + ) + (.lvf vf5 (&-> s4-0 quad)) + (.lvf vf4 (&-> v1-8 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-3 quad) vf6) + ) + (if (enemy-above-ground? 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)) + ) + ) + ) + (when (!= (crimson-guard-method-224 self (-> self event-param-point)) 0.0) + (let* ((v1-16 (-> self nav)) + (a1-7 (-> self event-param-point)) + (f0-3 (-> v1-16 extra-nav-sphere w)) + ) + (set! (-> v1-16 extra-nav-sphere quad) (-> a1-7 quad)) + (set! (-> v1-16 extra-nav-sphere w) f0-3) + ) + 0 + (let ((v1-19 (-> self nav))) + (set! (-> v1-19 extra-nav-sphere w) (-> self nav-radius-backup)) + ) + 0 + (let ((v1-21 (-> self nav))) + (logior! (-> v1-21 shape nav-flags) (nav-flags has-extra-sphere)) + ) + 0 + (set! (-> self already-shot) #t) + ) + (crimson-guard-method-223 self 0.0) + ) + (none) + ) + ) + :code (behavior () + (while (not (-> self already-shot)) + (suspend) + ) + (set! (-> self state-time) (-> self clock frame-counter)) + (ja-channel-set! 1) + (let ((gp-0 (-> self clock frame-counter)) + (s5-0 150) + (f30-0 2.0) + ) + (ja-no-eval :group! (-> self draw art-group data 6) :num! (loop! f30-0) :frame-num 0.0) + (until (>= (- (-> self clock frame-counter) gp-0) s5-0) + (crimson-guard-method-223 + self + (* 0.006666667 (the float (- (-> self clock frame-counter) (-> self state-time)))) + ) + (suspend) + (ja :num! (loop! f30-0)) + ) + ) + (set! (-> self enemy-flags) (the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag vulnerable)))) + (send-event self 'jump 0 (-> self event-param-point)) + (until #f + (suspend) + ) + #f + (none) + ) + :post (behavior () + (ja-post) + (none) + ) + ) + +;; definition for method 114 of type crimson-guard +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! crimson-guard ((obj crimson-guard)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 4) 0))) + (set! (-> s5-0 total-prims) (the-as uint 5)) + (set! (-> s4-0 prim-core collide-as) (collide-spec civilian)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak civilian enemy 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 8192.0 0.0 24576.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 civilian)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak civilian hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (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 civilian)) + (set! (-> v1-15 prim-core collide-with) (collide-spec backgnd jak civilian hit-by-others-list player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 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 civilian)) + (set! (-> v1-17 prim-core collide-with) (collide-spec jak civilian enemy hit-by-others-list player-list)) + (set! (-> v1-17 transform-index) 14) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 2048.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 civilian)) + (set! (-> v1-19 prim-core collide-with) (collide-spec jak civilian enemy hit-by-others-list player-list)) + (set! (-> v1-19 transform-index) 14) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 -12288.0 6144.0) + ) + (set! (-> s5-0 nav-radius) 6144.0) + (let ((v1-21 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-21 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-21 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 crimson-guard +;; WARN: Return type mismatch process-drawable vs crimson-guard. +(defmethod relocate crimson-guard ((obj crimson-guard) (arg0 int)) + (if (nonzero? (-> obj joint)) + (&+! (-> obj joint) arg0) + ) + (if (nonzero? (-> obj l-control)) + (&+! (-> obj l-control) arg0) + ) + (the-as + crimson-guard + ((the-as (function process-drawable int process-drawable) (find-parent-method crimson-guard 7)) obj arg0) + ) + ) + +;; definition for method 115 of type crimson-guard +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! crimson-guard ((obj crimson-guard)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-crimson-guard" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (set! (-> obj joint) (new 'process 'joint-mod (joint-mod-mode joint-set*-world) obj 4)) + (set! (-> obj info) *crimson-guard-global-info*) + (init-enemy-behaviour-and-stats! obj *crimson-guard-nav-enemy-info*) + (let ((v1-7 (-> obj nav))) + (set! (-> v1-7 speed-scale) 1.0) + ) + 0 + (set! (-> obj draw lod-set lod 0 dist) 143360.0) + (set! (-> obj draw lod-set lod 1 dist) 491520.0) + (set! (-> obj anim-shuffle) 5) + (set! (-> obj anim-walk) 5) + (set! (-> obj speed-walk) 12288.0) + (set! (-> obj dist-walk-anim) 12288.0) + (set! (-> obj dist-run-anim) 34078.72) + (set! (-> obj anim-run) 6) + (set! (-> obj speed-run) 49152.0) + (set! (-> obj anim-get-up-front) 33) + (set! (-> obj anim-get-up-back) 34) + (set! (-> obj l-control) (new 'process 'lightning-control (-> *lightning-spec-id-table* 13) obj 0.0)) + (set! (-> obj l-control state points-to-draw) 0) + (set! (-> obj water-anim) -1) + (set! (-> obj minimap) #f) + 0 + (none) + ) + +;; definition for method 225 of type crimson-guard +;; WARN: Return type mismatch int vs none. +(defmethod crimson-guard-method-225 crimson-guard ((obj crimson-guard) (arg0 uint) (arg1 symbol)) + (set! (-> obj guard-type) arg0) + (set! (-> obj settings) + (get-traffic-guard-type-settings (-> obj controller traffic) (the-as int (-> obj guard-type))) + ) + (setup-masks (-> obj draw) 0 30) + (cond + ((zero? (-> obj guard-type)) + (setup-masks (-> obj draw) 16 0) + (set! (-> obj root-override2 nav-radius) 8192.0) + ) + (else + (setup-masks (-> obj draw) 8 0) + (set! (-> obj root-override2 nav-radius) 6144.0) + ) + ) + (cond + ((and (not arg1) (logtest? (-> obj flags) (citizen-flag dark-guard))) + (setup-masks (-> obj draw) 5 0) + (set-vector! (-> obj root-override2 scale) 1.1 1.1 1.1 1.0) + (set-vector! (-> obj joint scale) 1.1 1.0 1.1 1.0) + (let* ((a0-16 (-> obj neck)) + (t9-5 (method-of-object a0-16 trs-set!)) + (a1-6 #f) + (a2-5 #f) + (a3-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> a3-0 x) 0.9090909) + (set! (-> a3-0 y) 1.0) + (set! (-> a3-0 z) 0.9090909) + (set! (-> a3-0 w) 1.0) + (t9-5 a0-16 (the-as vector a1-6) (the-as quaternion a2-5) a3-0) + ) + (mode-set! (-> obj neck) (joint-mod-mode rotate2)) + (set! (-> obj joint parented-scale?) #t) + (set! (-> obj neck parented-scale?) #t) + ) + (else + (setup-masks (-> obj draw) 3 0) + (set-vector! (-> obj root-override2 scale) 1.0 1.0 1.0 1.0) + (set-vector! (-> obj joint scale) 1.0 1.0 1.0 1.0) + (let* ((a0-29 (-> obj neck)) + (t9-8 (method-of-object a0-29 trs-set!)) + (a1-9 #f) + (a2-7 #f) + (a3-1 (new 'stack-no-clear 'vector)) + ) + (set! (-> a3-1 x) 1.0) + (set! (-> a3-1 y) 1.0) + (set! (-> a3-1 z) 1.0) + (set! (-> a3-1 w) 1.0) + (t9-8 a0-29 (the-as vector a1-9) (the-as quaternion a2-7) a3-1) + ) + (mode-set! (-> obj neck) (joint-mod-mode reset)) + ) + ) + 0 + (none) + ) + +;; definition for method 181 of type crimson-guard +;; WARN: Return type mismatch int vs none. +(defmethod citizen-init! crimson-guard ((obj crimson-guard)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type citizen citizen-init!))) + (t9-0 obj) + ) + (if (logtest? (-> obj flags) (citizen-flag dark-guard)) + (set! (-> obj hit-points) (the int (* 2.0 (the float (-> obj enemy-info-override default-hit-points))))) + ) + (set! (-> obj hit-face) (the-as uint -1)) + (crimson-guard-method-225 obj (get-guard-type-for-traffic-obj (-> obj controller traffic) 6) #f) + (let ((v1-12 (-> obj nav))) + (set! (-> v1-12 sphere-mask) (the-as uint #x800de)) + ) + 0 + (set! (-> obj joint-enable) #f) + (logclear! (-> obj mask) (process-mask enemy)) + (set! (-> obj mask) (logior (process-mask guard) (-> obj mask))) + (set! (-> obj fact-info-override pickup-type) (pickup-type ammo-random)) + (set! (-> obj fact-info-override pickup-amount) 10.0) + (set! (-> obj fact-info-override pickup-spawn-amount) 1.0) + (set! (-> obj traffic-target-status handle) (the-as handle #f)) + (let ((v1-24 (get-rand-int obj 2))) + (cond + ((zero? v1-24) + (set! (-> obj anim-shoot 0 anim-index) 19) + (set! (-> obj anim-shoot 0 start) 1.0) + (set! (-> obj anim-shoot 0 end) 12.0) + (set! (-> obj anim-shoot 1 anim-index) 26) + (set! (-> obj anim-shoot 1 start) 12.0) + (set! (-> obj anim-shoot 1 end) 22.0) + (set! (-> obj anim-shoot 2 anim-index) 24) + (set! (-> obj anim-shoot 2 start) 20.0) + (set! (-> obj anim-shoot 2 end) 30.0) + ) + ((= v1-24 1) + (set! (-> obj anim-shoot 0 anim-index) 27) + (set! (-> obj anim-shoot 0 start) 2.0) + (set! (-> obj anim-shoot 0 end) 9.0) + (set! (-> obj anim-shoot 1 anim-index) 29) + (set! (-> obj anim-shoot 1 start) 18.0) + (set! (-> obj anim-shoot 1 end) 26.0) + (set! (-> obj anim-shoot 2 anim-index) 30) + (set! (-> obj anim-shoot 2 start) 26.0) + (set! (-> obj anim-shoot 2 end) 35.0) + ) + ) + ) + (set-vector! (-> obj draw color-mult) 1.0 1.0 1.0 1.0) + (if (logtest? (-> obj controller traffic alert-state flags) (traffic-alert-flag target-jak)) + (reset-to-collide-spec + (-> obj focus) + (collide-spec jak enemy hit-by-others-list player-list bot-targetable jak-vehicle) + ) + (reset-to-collide-spec (-> obj focus) (collide-spec enemy hit-by-others-list bot-targetable)) + ) + (if (not (-> obj minimap)) + (set! (-> obj minimap) (add-icon! *minimap* obj (the-as uint 32) (the-as int #f) (the-as vector #t) 0)) + ) + (set! (-> obj move-index) -1) + (ja-channel-set! 0) + 0 + (none) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/city/common/metalhead-flitter_REF.gc b/test/decompiler/reference/jak2/levels/city/common/metalhead-flitter_REF.gc new file mode 100644 index 0000000000..d310087630 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/city/common/metalhead-flitter_REF.gc @@ -0,0 +1,1251 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type metalhead-flitter +(deftype metalhead-flitter (citizen-enemy) + ((move-angle float :offset-assert 980) + (heading symbol :offset-assert 984) + (change-dir-time time-frame :offset-assert 992) + (last-change-dir uint64 :offset-assert 1000) + (off-screen-timer uint64 :offset-assert 1008) + (amb-sound-timer uint64 :offset-assert 1016) + (attack-time time-frame :offset-assert 1024) + (target-pos vector :inline :offset-assert 1040) + (attack-pos vector :inline :offset-assert 1056) + (base-height float :offset-assert 1072) + ) + :heap-base #x3c0 + :method-count-assert 210 + :size-assert #x434 + :flag-assert #xd203c00434 + (:methods + (attack () _type_ :state 203) + (ambush-jumping () _type_ :state 204) + (metalhead-flitter-method-205 (_type_) none 205) + (metalhead-flitter-method-206 (_type_) none 206) + (metalhead-flitter-method-207 (_type_ process-focusable) symbol 207) + (metalhead-flitter-method-208 (_type_ symbol) none 208) + (metalhead-flitter-method-209 (_type_) float 209) + ) + ) + +;; definition for method 3 of type metalhead-flitter +(defmethod inspect metalhead-flitter ((obj metalhead-flitter)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type citizen-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tmove-angle: ~f~%" (-> obj move-angle)) + (format #t "~2Theading: ~A~%" (-> obj heading)) + (format #t "~2Tchange-dir-time: ~D~%" (-> obj change-dir-time)) + (format #t "~2Tlast-change-dir: ~D~%" (-> obj last-change-dir)) + (format #t "~2Toff-screen-timer: ~D~%" (-> obj off-screen-timer)) + (format #t "~2Tamb-sound-timer: ~D~%" (-> obj amb-sound-timer)) + (format #t "~2Tattack-time: ~D~%" (-> obj attack-time)) + (format #t "~2Ttarget-pos: #~%" (-> obj target-pos)) + (format #t "~2Tattack-pos: #~%" (-> obj attack-pos)) + (format #t "~2Tbase-height: ~f~%" (-> obj base-height)) + (label cfg-4) + obj + ) + +;; definition for symbol *metalhead-flitter-nav-enemy-info*, type nav-enemy-info +(define *metalhead-flitter-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 idle-control-frame 16 + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x3 :param1 #x6) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x6 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x7 :param0 #xf :param1 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x2 :param1 #x4) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #xa :param1 #x14) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x2) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #xf :param1 #x1e) + (new 'static 'idle-control-frame) + ) + :idle-anim 5 + :notice-anim 12 + :hostile-anim 14 + :hit-anim 5 + :knocked-anim 20 + :knocked-land-anim 21 + :die-anim 19 + :die-falling-anim 18 + :victory-anim 5 + :jump-wind-up-anim 5 + :jump-in-air-anim 5 + :jump-land-anim 5 + :neck-joint -1 + :look-at-joint 28 + :bullseye-joint 3 + :sound-hit (static-sound-name "flitter-hit") + :sound-die (static-sound-name "flitter-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 20) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak civilian enemy vehicle-sphere hit-by-others-list player-list) + :penetrate-knocked (penetrate + generic-attack + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + knocked + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 6) + :attack-shove-up (meters 3) + :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 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 275251.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 28 + :gem-seg #x2 + :gem-no-seg #x4 + :gem-offset (new 'static 'sphere :y 696.32 :z 1843.2 :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim 13 + :turn-anim 15 + :run-anim 14 + :taunt-anim -1 + :run-travel-speed (meters 12) + :run-acceleration (meters 8) + :run-turning-acceleration (meters 120) + :walk-travel-speed (meters 4) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 5) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 5) + :frustration-distance (meters 12) + :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! (-> *metalhead-flitter-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 207 of type metalhead-flitter +(defmethod metalhead-flitter-method-207 metalhead-flitter ((obj metalhead-flitter) (arg0 process-focusable)) + (and (logtest? (-> obj draw status) (draw-control-status on-screen)) + (let ((s4-0 (camera-matrix))) + (camera-pos) + (let* ((s3-0 (get-trans arg0 0)) + (s5-1 (vector-normalize-copy! (new 'stack-no-clear 'vector) (-> s4-0 vector 2) 1.0)) + (v1-7 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) (-> obj root-override2 trans) s3-0) 1.0)) + ) + (< 0.0 (vector-dot s5-1 v1-7)) + ) + ) + ) + ) + +;; definition for method 77 of type metalhead-flitter +(defmethod enemy-method-77 metalhead-flitter ((obj metalhead-flitter) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (let ((a0-2 (-> obj skel root-channel 0))) + (set! (-> a0-2 frame-group) (the-as art-joint-anim (-> obj draw art-group data 20))) + (set! (-> a0-2 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 20)) 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 20)) num-func-seek!) + ) + #t + ) + (((knocked-type knocked-type-6)) + (let ((v1-17 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-17 (= v1-17 (-> obj draw art-group data 21))) + (ja-channel-push! 1 (seconds 0.17)) + (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 (-> obj draw art-group data 23))) + (set! (-> a0-10 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 23)) 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 (-> obj draw art-group data 23)) num-func-seek!) + ) + #t + ) + (else + ((method-of-type nav-enemy enemy-method-77) obj arg0) + ) + ) + ) + +;; definition for method 78 of type metalhead-flitter +(defmethod enemy-method-78 metalhead-flitter ((obj metalhead-flitter) (arg0 (pointer float))) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-6)) + (when (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (let ((v1-4 (-> obj skel root-channel 0))) + (set! (-> v1-4 frame-group) (the-as art-joint-anim (-> obj draw art-group data 22))) + (set! (-> v1-4 param 0) + (the float (+ (-> (the-as art-joint-anim (-> obj draw art-group data 22)) frames num-frames) -1)) + ) + (set! (-> v1-4 param 1) 1.0) + (set! (-> v1-4 frame-num) 0.0) + (joint-control-channel-group! v1-4 (the-as art-joint-anim (-> obj draw art-group data 22)) num-func-seek!) + ) + #t + ) + ) + (else + ((method-of-type citizen-enemy enemy-method-78) obj arg0) + ) + ) + ) + +;; definition for method 68 of type metalhead-flitter +;; WARN: Return type mismatch object vs none. +(defmethod go-stare2 metalhead-flitter ((obj metalhead-flitter)) + (if (and (= (-> obj focus aware) (enemy-aware enemy-aware-2)) (not (nav-enemy-method-163 obj))) + (go (method-of-object obj pacing)) + (go (method-of-object obj stare)) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate ambush (metalhead-flitter) + :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) + ) + ) + ) + ) + (set! (-> self base-height) (-> self root-override2 trans y)) + (let ((v1-13 (-> self root-override2 root-prim))) + (set! (-> v1-13 prim-core collide-as) (collide-spec)) + (set! (-> v1-13 prim-core collide-with) (collide-spec)) + ) + 0 + (let ((a0-4 (handle->process (-> self focus handle)))) + (when a0-4 + (let* ((gp-1 (-> self root-override2)) + (s3-0 + (vector-normalize! + (vector-! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable a0-4) 0) (-> gp-1 trans)) + 1.0 + ) + ) + (f0-1 (deg-diff (quaternion-y-angle (-> gp-1 quat)) (vector-y-angle s3-0))) + ) + (quaternion-rotate-y! (-> gp-1 quat) (-> gp-1 quat) f0-1) + ) + ) + ) + (none) + ) + :code (behavior () + (case (-> self level name) + (('ruins) + (let ((gp-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-0 + (let ((t9-1 (method-of-type part-tracker activate))) + (t9-1 + (the-as part-tracker gp-0) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-2 run-function-in-process) + (a0-4 gp-0) + (a1-2 part-tracker-init) + (a2-4 (-> *part-group-id-table* 163)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-2) + a0-4 + a1-2 + a2-4 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> gp-0 ppointer) + ) + ) + ) + (('strip) + (let ((gp-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-1 + (let ((t9-4 (method-of-type part-tracker activate))) + (t9-4 + (the-as part-tracker gp-1) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-5 run-function-in-process) + (a0-8 gp-1) + (a1-5 part-tracker-init) + (a2-9 (-> *part-group-id-table* 164)) + (a3-3 0) + (t0-1 #f) + (t1-1 #f) + (t2-1 #f) + (t3-1 *launch-matrix*) + ) + (set! (-> t3-1 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-5) + a0-8 + a1-5 + a2-9 + a3-3 + t0-1 + t1-1 + t2-1 + t3-1 + ) + ) + (-> gp-1 ppointer) + ) + ) + ) + ) + (let ((gp-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-2) (seconds 0.6)) + (suspend) + ) + ) + (set! (-> self root-override2 trans y) (+ -8192.0 (-> self root-override2 trans y))) + (logior! (-> self draw status) (draw-control-status no-draw)) + (let ((gp-3 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-3) (the int (* 300.0 (get-rand-float-range self 0.0 0.6)))) + (suspend) + ) + ) + (logclear! (-> self draw status) (draw-control-status no-draw)) + (go-virtual ambush-jumping) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate ambush-jumping (metalhead-flitter) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-flitter) + enemy-event-handler + ) + :enter (behavior () + (let ((v1-0 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-0 enemy-flags))) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-0 enemy-flags)))) + ) + (set! (-> v1-0 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-0 enemy-flags)))) + (set! (-> v1-0 nav callback-info) (-> v1-0 enemy-info-override callback-info)) + ) + 0 + (let ((v1-3 self)) + (set! (-> v1-3 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-3 enemy-flags)))) + ) + 0 + (look-at-target! self (enemy-flag lock-focus)) + (set! (-> self state-time) (-> self clock frame-counter)) + (let ((gp-0 (-> self root-override2))) + (vector-reset! (-> gp-0 transv)) + (set! (-> gp-0 transv y) (* 4096.0 (get-rand-float-range self 34.0 38.0))) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (ja-no-eval :group! (-> self draw art-group data 10) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 10)) frames num-frames) -1))) + ) + (until #f + (when (< (-> self base-height) (-> self root-override2 trans y)) + (let ((gp-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-0 + (let ((t9-3 (method-of-type part-tracker activate))) + (t9-3 + (the-as part-tracker gp-0) + *entity-pool* + (symbol->string (-> part-tracker symbol)) + (the-as pointer #x70004000) + ) + ) + (let ((t9-4 run-function-in-process) + (a0-4 gp-0) + (a1-4 part-tracker-init) + (a2-5 (-> *part-group-id-table* 144)) + (a3-1 0) + (t0-0 #f) + (t1-0 #f) + (t2-0 #f) + (t3-0 *launch-matrix*) + ) + (set! (-> t3-0 trans quad) (-> self root-override2 trans quad)) + ((the-as (function object object object object object object object object none) t9-4) + a0-4 + a1-4 + a2-5 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> gp-0 ppointer) + ) + ) + (goto cfg-10) + ) + (suspend) + (ja :num! (seek!)) + ) + #f + (until #f + (when (< (+ 204.8 (-> self base-height)) (-> self root-override2 trans y)) + (let ((v1-40 (-> self root-override2 root-prim))) + (set! (-> v1-40 prim-core collide-as) (-> self root-override2 backup-collide-as)) + (set! (-> v1-40 prim-core collide-with) (-> self root-override2 backup-collide-with)) + ) + (goto cfg-11) + ) + (label cfg-10) + (suspend) + (ja :num! (seek!)) + ) + #f + (until #f + (label cfg-11) + (if (or (and (>= 0.0 (-> self root-override2 transv y)) + (>= (+ 1638.4 (-> self base-height)) (-> self root-override2 trans y)) + ) + (logtest? (-> self root-override2 status) (collide-status on-ground)) + ) + (goto cfg-26) + ) + (suspend) + (if (not (ja-done? 0)) + (ja :num! (seek!)) + ) + ) + #f + (label cfg-26) + (ja-no-eval :group! (-> self draw art-group data 11) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 11)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (until #f + (if (logtest? (-> self root-override2 status) (collide-status on-ground)) + (goto cfg-33) + ) + (suspend) + ) + #f + (label cfg-33) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior metalhead-flitter) nav-enemy-falling-post) + ) + +;; definition for method 99 of type metalhead-flitter +(defmethod enemy-method-99 metalhead-flitter ((obj metalhead-flitter) (arg0 process-focusable)) + (logtest? (focus-status mech) (-> arg0 focus-status)) + ) + +;; definition for method 205 of type metalhead-flitter +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defmethod metalhead-flitter-method-205 metalhead-flitter ((obj metalhead-flitter)) + (with-pp + (let* ((s5-0 (handle->process (-> obj focus handle))) + (s3-0 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (when s3-0 + (let* ((s5-1 (get-trans (the-as process-focusable s3-0) 0)) + (s4-1 (vector-! (new 'stack-no-clear 'vector) s5-1 (-> obj root-override2 trans))) + (f30-0 (vector-length s4-1)) + ) + (cond + ((enemy-method-99 obj (the-as process-focusable s3-0)) + (go-flee obj) + ) + ((and (< f30-0 32768.0) (not (metalhead-flitter-method-207 obj (the-as process-focusable s3-0)))) + (go (method-of-object obj circling)) + ) + ((< f30-0 (-> obj enemy-info-override notice-nav-radius)) + (set! (-> obj target-pos quad) (-> s5-1 quad)) + (let ((s3-1 (new 'stack-no-clear 'vector))) + (set! (-> s3-1 quad) (-> s4-1 quad)) + (let ((s5-2 (new 'stack-no-clear 'vector))) + (set! (-> s5-2 quad) (-> obj root-override2 transv quad)) + (vector-normalize! s5-2 f30-0) + (if (>= (vector-dot s3-1 s5-2) 0.98) + (go (method-of-object obj attack)) + ) + ) + ) + ) + ((< f30-0 32768.0) + (set! (-> obj target-pos quad) (-> s5-1 quad)) + ) + ((or (>= (- (-> pp clock frame-counter) (the-as int (-> obj last-change-dir))) (-> obj change-dir-time)) + (< (vector-vector-distance-squared (-> obj root-override2 trans) (-> obj target-pos)) 0.1) + ) + (set! (-> obj last-change-dir) (the-as uint (-> pp clock frame-counter))) + (set! (-> obj change-dir-time) (rand-vu-int-range (seconds 0.5) (seconds 0.7))) + (let ((s3-2 (new 'stack-no-clear 'vector)) + (f0-9 (* 0.5 f30-0 (tan (-> obj move-angle)))) + (s2-0 (new 'stack-no-clear 'vector)) + ) + (if (-> obj heading) + (set-vector! s3-2 (-> s4-1 z) (-> s4-1 y) (- (-> s4-1 x)) 1.0) + (set-vector! s3-2 (- (-> s4-1 z)) (-> s4-1 y) (-> s4-1 x) 1.0) + ) + (set! (-> obj heading) (not (-> obj heading))) + (let ((f28-1 (rand-vu-float-range (* 0.75 f0-9) f0-9)) + (s4-2 (vector-normalize-copy! (new 'stack-no-clear 'vector) s4-1 (* -0.6 f30-0))) + ) + (vector-normalize! s3-2 f28-1) + (vector+! s3-2 s3-2 s4-2) + ) + (clamp-vector-to-mesh-cross-gaps (-> obj nav state) s3-2) + (vector+! s2-0 s5-1 s3-2) + (set! (-> obj target-pos quad) (-> s2-0 quad)) + ) + ) + ) + ) + 0 + ) + ) + 0 + (none) + ) + ) + +;; definition for method 206 of type metalhead-flitter +;; WARN: Return type mismatch time-frame vs none. +(defmethod metalhead-flitter-method-206 metalhead-flitter ((obj metalhead-flitter)) + (with-pp + (when (>= (- (-> pp clock frame-counter) (the-as int (-> obj amb-sound-timer))) + (the int (* 300.0 (rand-vu-float-range 1.5 3.0))) + ) + (sound-play "flitter-amb" :position (-> obj root-override2 trans)) + (set! (-> obj amb-sound-timer) (the-as uint (-> pp clock frame-counter))) + ) + (none) + ) + ) + +;; definition for function metalhead-flitter-fall-and-play-death-anim +;; WARN: Return type mismatch int vs none. +(defbehavior metalhead-flitter-fall-and-play-death-anim metalhead-flitter ((arg0 int) (arg1 float) (arg2 time-frame)) + (local-vars (v1-29 symbol)) + (stop-looking-at-target! self) + (set! (-> self skel root-channel 0 frame-group) (the-as art-joint-anim arg0)) + (let ((s4-1 (enemy-method-50 self (new 'stack-no-clear 'vector))) + (s3-0 (-> self root-override2)) + ) + (when (if (type? s3-0 collide-shape-moving) + s3-0 + ) + (set! (-> self root-override2 transv y) 33775.48) + (ja :num-func num-func-identity :frame-num 0.0) + (set! (-> self state-time) (-> self clock frame-counter)) + (logclear! (-> self root-override2 status) (collide-status on-surface on-ground touch-surface)) + (until v1-29 + (let ((f0-2 102400.0)) + (set! (-> self root-override2 transv x) (* (-> s4-1 x) f0-2)) + (set! (-> self root-override2 transv z) (* (-> s4-1 z) f0-2)) + ) + (suspend) + (ja :num! (seek! max arg1)) + (set! v1-29 (or (ja-done? 0) (>= (- (-> self clock frame-counter) (-> self state-time)) arg2))) + ) + ) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate active (metalhead-flitter) + :virtual #t + :post (behavior () + (let ((a0-0 self)) + (metalhead-flitter-method-206 a0-0) + (let ((t9-1 (-> (method-of-type citizen-enemy active) post))) + (if t9-1 + ((the-as (function citizen-enemy none) t9-1) (the-as citizen-enemy a0-0)) + ) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate stare (metalhead-flitter) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (until #f + (when (not (enemy-method-96 self 2730.6667 #t)) + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! (-> self draw art-group data 15)) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 1820.4445 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-25 self)) + (set! (-> v1-25 enemy-flags) (the-as enemy-flag (logclear (-> v1-25 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (let ((v1-29 (ja-group))) + (if (not (and v1-29 (= v1-29 (-> self draw art-group data (-> self enemy-info-override idle-anim))))) + (ja-channel-push! 1 (seconds 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)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (metalhead-flitter-method-206 a0-0) + (let ((t9-1 (-> (method-of-type citizen-enemy stare) post))) + (if t9-1 + ((the-as (function nav-enemy none) t9-1) (the-as nav-enemy a0-0)) + ) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (metalhead-flitter) + :virtual #t + :enter (behavior () + (set! (-> self last-change-dir) (the-as uint (-> self clock frame-counter))) + (set! (-> self change-dir-time) 0) + (set! (-> self attack-time) (+ (-> self clock frame-counter) (seconds 0.35))) + (let ((t9-0 (-> (method-of-type citizen-enemy hostile) enter))) + (if t9-0 + (t9-0) + ) + ) + (none) + ) + :trans (behavior () + (let ((t9-0 (-> (method-of-type citizen-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (metalhead-flitter-method-205 self) + (none) + ) + :post (behavior () + (let ((a0-0 (-> self nav state)) + (v1-1 (-> self target-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 die (metalhead-flitter) + :virtual #t + :enter (behavior () + (sound-play "flitter-die") + (let ((t9-2 (-> (method-of-type citizen-enemy die) enter))) + (if t9-2 + (t9-2) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (metalhead-flitter-fall-and-play-death-anim + (the-as int (-> self draw art-group data (-> self enemy-info-override die-anim))) + 1.0 + (seconds 2) + ) + (send-event self 'death-end) + (cleanup-for-death self) + (none) + ) + ) + +;; definition for method 209 of type metalhead-flitter +(defmethod metalhead-flitter-method-209 metalhead-flitter ((obj metalhead-flitter)) + (lerp-scale 0.0 1.0 (- (-> obj attack-pos y) (-> obj root-override2 trans y)) 13926.4 25600.0) + ) + +;; failed to figure out what this is: +(defstate attack (metalhead-flitter) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-flitter) + 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 + (sound-play "flitter-attack") + (set! (-> self amb-sound-timer) (the-as uint 0)) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-8 *game-info*) + (v0-2 (+ (-> v1-8 attack-id) 1)) + ) + (set! (-> v1-8 attack-id) v0-2) + (set! (-> self attack-id) v0-2) + ) + (none) + ) + :exit (behavior () + (metalhead-flitter-method-208 self #f) + (if (logtest? (-> self enemy-flags) (enemy-flag check-water)) + (logior! (-> self focus-status) (focus-status dangerous)) + (logclear! (-> self focus-status) (focus-status dangerous)) + ) + (none) + ) + :trans (behavior () + (local-vars (s5-2 vector)) + (let* ((s5-0 (handle->process (-> self focus handle))) + (gp-0 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (set! s5-2 + (cond + ((and gp-0 + (< (- (-> self clock frame-counter) (-> self state-time)) (seconds 1.5)) + gp-0 + (zero? (logand (-> (the-as process-focusable gp-0) focus-status) (focus-status disable dead ignore grabbed))) + ) + (let ((s5-1 (-> self nav state)) + (v1-10 (get-trans (the-as process-focusable gp-0) 0)) + ) + (logclear! (-> s5-1 flags) (nav-state-flag directional-mode)) + (logior! (-> s5-1 flags) (nav-state-flag target-poly-dirty)) + (set! (-> s5-1 target-post quad) (-> v1-10 quad)) + ) + 0 + (set! s5-2 (-> self attack-pos)) + (set! (-> s5-2 quad) (the-as uint128 (the-as vector (-> (get-trans (the-as process-focusable gp-0) 3) quad)))) + s5-2 + ) + (else + (the-as vector (go-stare self)) + ) + ) + ) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 2 (seconds 0.1)) + (let ((f30-0 (metalhead-flitter-method-209 self))) + (ja-no-eval :group! (-> self draw art-group data 16) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 16)) frames num-frames) -1)) 0.8) + :frame-num 0.0 + ) + (let ((a0-3 (-> self skel root-channel 1))) + (set! (-> a0-3 frame-interp 1) f30-0) + (set! (-> a0-3 frame-interp 0) f30-0) + (set! (-> a0-3 frame-group) (the-as art-joint-anim (-> self draw art-group data 17))) + (set! (-> a0-3 param 0) 0.0) + (set! (-> a0-3 frame-num) 0.0) + (joint-control-channel-group! a0-3 (the-as art-joint-anim (-> self draw art-group data 17)) num-func-chan) + ) + (until (ja-done? 0) + (suspend) + (set! f30-0 (seek f30-0 (metalhead-flitter-method-209 self) (* 0.2 (-> self clock seconds-per-frame)))) + (ja :num! (seek! max 0.8)) + (let ((a0-7 (-> self skel root-channel 1))) + (set! (-> a0-7 frame-interp 1) f30-0) + (set! (-> a0-7 frame-interp 0) f30-0) + (set! (-> a0-7 param 0) 0.0) + (joint-control-channel-group-eval! a0-7 (the-as art-joint-anim #f) num-func-chan) + ) + ) + ) + (let ((v1-40 self)) + (set! (-> v1-40 enemy-flags) (the-as enemy-flag (logclear (-> v1-40 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-40 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (ja-channel-push! 1 (seconds 0.1)) + (metalhead-flitter-method-208 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)) + ) + (dotimes (gp-1 (get-rand-int self 3)) + (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 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (react-to-focus self) + (none) + ) + :post (the-as (function none :behavior metalhead-flitter) nav-enemy-travel-post) + ) + +;; failed to figure out what this is: +(defstate victory (metalhead-flitter) + :virtual #t + :post (behavior () + (metalhead-flitter-method-206 self) + (nav-enemy-simple-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate stare (metalhead-flitter) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (let ((f30-0 (get-rand-float-range self 0.8 1.2))) + (until #f + (when (not (enemy-method-96 self 2730.6667 #t)) + (let ((v1-5 self)) + (set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags)))) + ) + 0 + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (ja :group! (-> self draw art-group data 15)) + (ja :num-func num-func-identity :frame-num 0.0) + (until (enemy-method-96 self 1820.4445 #t) + (ja-blend-eval) + (suspend) + (ja :num! (loop! 0.75)) + ) + (let ((v1-25 self)) + (set! (-> v1-25 enemy-flags) (the-as enemy-flag (logclear (-> v1-25 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + ) + (let ((v1-29 (ja-group))) + (if (not (and v1-29 (= v1-29 (-> self draw art-group data (-> self enemy-info-override idle-anim))))) + (ja-channel-push! 1 (seconds 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)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (let ((a0-0 self)) + (metalhead-flitter-method-206 a0-0) + (let ((t9-1 (-> (method-of-type nav-enemy stare) post))) + (if t9-1 + ((the-as (function nav-enemy none) t9-1) (the-as nav-enemy a0-0)) + ) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate circling (metalhead-flitter) + :virtual #t + :enter (behavior () + (let ((t9-0 (-> (method-of-type nav-enemy circling) enter))) + (if t9-0 + (t9-0) + ) + ) + (set! (-> self off-screen-timer) (the-as uint (-> self clock frame-counter))) + (none) + ) + :trans (behavior () + (let ((gp-0 (handle->process (-> self focus handle)))) + (if gp-0 + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable gp-0) 0) quad)) + ) + (when (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.1)) + (let ((v1-11 (-> self focus aware))) + (cond + ((= v1-11 (enemy-aware enemy-aware-3)) + (cond + ((when gp-0 + (let* ((gp-1 self) + (s5-1 (method-of-object gp-1 metalhead-flitter-method-207)) + (s4-0 (handle->process (-> self focus handle))) + ) + (s5-1 gp-1 (the-as process-focusable (if (type? s4-0 process-focusable) + s4-0 + ) + ) + ) + ) + ) + (if (and (get-enemy-target self) + (>= (- (-> self clock frame-counter) (the-as int (-> self off-screen-timer))) (seconds 0.3)) + ) + (go-hostile self) + ) + ) + (else + (set! (-> self off-screen-timer) (the-as uint (-> self clock frame-counter))) + ) + ) + ) + ((= v1-11 (enemy-aware enemy-aware-2)) + (go-stare self) + ) + ((>= 1 (the-as int v1-11)) + (go-virtual active) + ) + ) + ) + (if (or (nav-enemy-method-163 self) (logtest? (enemy-flag enemy-flag41) (-> self enemy-flags))) + (go-stare2 self) + ) + ) + ) + (none) + ) + :code (behavior () + (nav-enemy-method-166 self) + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override run-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override run-anim))) + frames + num-frames + ) + -1 + ) + ) + (get-rand-float-range self 0.9 1.1) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max (get-rand-float-range self 0.9 1.1))) + ) + ) + #f + (none) + ) + ) + +;; definition for method 208 of type metalhead-flitter +;; WARN: Return type mismatch int vs none. +(defmethod metalhead-flitter-method-208 metalhead-flitter ((obj metalhead-flitter) (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)) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 114 of type metalhead-flitter +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! metalhead-flitter ((obj metalhead-flitter)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 3) 0))) + (set! (-> s5-0 total-prims) (the-as uint 4)) + (set! (-> s4-0 prim-core collide-as) (collide-spec enemy)) + (set! (-> s4-0 prim-core collide-with) + (collide-spec backgnd jak bot crate civilian enemy obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid can-ride deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 10240.0 0.0 15360.0) + (set! (-> s5-0 root-prim) s4-0) + ) + (let ((v1-12 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-12 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-12 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-12 prim-core action) (collide-action solid can-ride deadly no-standon)) + (set-vector! (-> v1-12 local-sphere) 0.0 5734.4 0.0 5734.4) + ) + (let ((v1-14 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-14 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-14 prim-core collide-with) (collide-spec jak bot crate civilian hit-by-others-list player-list)) + (set! (-> v1-14 prim-core action) (collide-action deadly)) + (set! (-> v1-14 transform-index) 34) + (set-vector! (-> v1-14 local-sphere) 0.0 0.0 0.0 3481.6) + ) + (let ((v1-16 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-16 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-16 prim-core collide-with) (collide-spec jak bot crate civilian hit-by-others-list player-list)) + (set! (-> v1-16 prim-core action) (collide-action deadly)) + (set! (-> v1-16 transform-index) 35) + (set-vector! (-> v1-16 local-sphere) 0.0 0.0 0.0 3481.6) + ) + (set! (-> s5-0 nav-radius) 3686.4) + (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-priority) (the-as uint 8)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 115 of type metalhead-flitter +;; WARN: Return type mismatch symbol vs none. +(defmethod init-enemy! metalhead-flitter ((obj metalhead-flitter)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-flitter" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *metalhead-flitter-nav-enemy-info*) + (set! (-> obj move-angle) 10922.667) + (set! (-> obj heading) (if (= (rand-vu-int-range 0 1) 1) + #t + #f + ) + ) + (set! (-> obj change-dir-time) 0) + (set! (-> obj off-screen-timer) (the-as uint 0)) + (set! (-> obj amb-sound-timer) (the-as uint 0)) + (add-connection + *part-engine* + obj + 28 + obj + 318 + (new 'static 'vector :x 942.08 :y -860.16 :z 1269.76 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 28 + obj + 318 + (new 'static 'vector :x -942.08 :y -860.16 :z 1269.76 :w 163840.0) + ) + (set-gravity-length (-> obj root-override2 dynam) 491520.0) + (set! (-> obj minimap) #f) + (none) + ) + +;; definition for method 181 of type metalhead-flitter +;; WARN: Return type mismatch int vs none. +(defmethod citizen-init! metalhead-flitter ((obj metalhead-flitter)) + "Initialize [[citizen]] defaults." + (let ((t9-0 (method-of-type citizen-enemy citizen-init!))) + (t9-0 obj) + ) + (set! (-> obj speed-walk) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj dist-walk-anim) (-> obj enemy-info-override walk-travel-speed)) + (set! (-> obj dist-run-anim) (-> obj enemy-info-override run-travel-speed)) + (set! (-> obj speed-run) (-> obj enemy-info-override walk-travel-speed)) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/city/common/metalhead-grunt_REF.gc b/test/decompiler/reference/jak2/levels/city/common/metalhead-grunt_REF.gc new file mode 100644 index 0000000000..2830587f6a --- /dev/null +++ b/test/decompiler/reference/jak2/levels/city/common/metalhead-grunt_REF.gc @@ -0,0 +1,1474 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol *metalhead-grunt-nav-enemy-info*, type nav-enemy-info +(define *metalhead-grunt-nav-enemy-info* + (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #t + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #t + :hover-if-no-ground #f + :idle-anim-script (new 'static 'array idle-control-frame 36 + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x6 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x7 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x3c) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x6 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x7 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #xa :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #xa :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x6 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x7 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x8 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x9 :param0 #x1e :param1 #x69) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #xa :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x3) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x1e) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x1e :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame :command (ic-cmd push) :param0 #x3c) + (new 'static 'idle-control-frame :command (ic-cmd play) :anim #x5 :param0 #x1 :param1 #x1) + (new 'static 'idle-control-frame) + ) + :idle-anim 5 + :notice-anim 13 + :hostile-anim -1 + :hit-anim 34 + :knocked-anim -1 + :knocked-land-anim -1 + :die-anim 19 + :die-falling-anim 32 + :victory-anim -1 + :jump-wind-up-anim 45 + :jump-in-air-anim 46 + :jump-land-anim 47 + :neck-joint 5 + :look-at-joint 6 + :bullseye-joint 18 + :sound-hit (static-sound-name "grunt-hit") + :sound-die (static-sound-name "grunt-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 20) + :default-hit-points 5 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak civilian enemy vehicle-sphere hit-by-others-list player-list) + :penetrate-knocked (penetrate + touch + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech + mech-punch + mech-bonk + dark-skin + dark-punch + dark-bomb + dark-giant + shield + explode + jak-yellow-shot + jak-red-shot + jak-blue-shot + jak-dark-shot + enemy-yellow-shot + enemy-dark-shot + eco-yellow + eco-red + eco-blue + eco-green + knocked + penetrate-33 + penetrate-34 + penetrate-35 + penetrate-36 + penetrate-37 + penetrate-38 + penetrate-39 + penetrate-40 + penetrate-41 + penetrate-42 + penetrate-43 + penetrate-44 + penetrate-45 + penetrate-46 + penetrate-47 + penetrate-48 + penetrate-49 + penetrate-50 + penetrate-51 + penetrate-52 + penetrate-53 + penetrate-54 + penetrate-55 + penetrate-56 + penetrate-57 + penetrate-58 + penetrate-59 + penetrate-60 + penetrate-61 + penetrate-62 + penetrate-63 + ) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 5) + :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 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 614.4 :z -3276.8 :r 327680.0) + :callback-info #f + :use-momentum #t + :use-frustration #t + :use-stop-chase #t + :use-circling #f + :use-pacing #f + :walk-anim 11 + :turn-anim -1 + :run-anim 14 + :taunt-anim 20 + :run-travel-speed (meters 7) + :run-acceleration (meters 6) + :run-turning-acceleration (meters 50) + :walk-travel-speed (meters 4) + :walk-acceleration (meters 6) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 360.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! (-> *metalhead-grunt-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition of type metalhead-grunt +(deftype metalhead-grunt (citizen-enemy) + ((patrol-anim grunt-anim-info :offset-assert 980) + (charge-anim grunt-anim-info :offset-assert 984) + (attack-anim grunt-anim-info :offset-assert 988) + (knocked-anim grunt-anim-info :offset-assert 992) + (yellow-hit-anim grunt-anim-info :offset-assert 996) + (blue-hit-anim grunt-anim-info :offset-assert 1000) + (intro-path path-control :offset-assert 1004) + (pad-jh1b23jhb13 uint32 :offset-assert 1008) + (use-charge-anim-index int8 :offset-assert 1012) + (knocked-anim-index int8 :offset-assert 1013) + (jumping-ambush-path-pt int8 :offset-assert 1014) + (grunt-flags uint8 :offset-assert 1015) + (state-timeout2 uint64 :offset-assert 1016) + (next-warn-time time-frame :offset-assert 1024) + (dest vector :inline :offset-assert 1040) + (pad-kj1n23kj1n23 uint32 4 :offset-assert 1056) + ) + :heap-base #x3b0 + :method-count-assert 212 + :size-assert #x430 + :flag-assert #xd403b00430 + (:methods + (attack () _type_ :state 203) + (falling-ambush () _type_ :state 204) + (jumping-ambush () _type_ :state 205) + (jumping-ambush-cont () _type_ :state 206) + (wait-for-focus () _type_ :state 207) + (spin-attack () _type_ :state 208) + (metalhead-grunt-method-209 (_type_ float) process-focusable 209) + (get-nav-info (_type_) nav-enemy-info 210) + (metalhead-grunt-method-211 (_type_) none 211) + ) + ) + +;; definition for method 3 of type metalhead-grunt +(defmethod inspect metalhead-grunt ((obj metalhead-grunt)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type citizen-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tpatrol-anim: #~%" (-> obj patrol-anim)) + (format #t "~2Tcharge-anim: #~%" (-> obj charge-anim)) + (format #t "~2Tattack-anim: #~%" (-> obj attack-anim)) + (format #t "~2Tknocked-anim: #~%" (-> obj knocked-anim)) + (format #t "~2Tyellow-hit-anim: #~%" (-> obj yellow-hit-anim)) + (format #t "~2Tblue-hit-anim: #~%" (-> obj blue-hit-anim)) + (format #t "~2Tintro-path: ~A~%" (-> obj intro-path)) + (format #t "~2Tcircle-radial-dist: ~f~%" (-> obj desired-angle)) + (format #t "~2Tuse-charge-anim-index: ~D~%" (-> obj use-charge-anim-index)) + (format #t "~2Tknocked-anim-index: ~D~%" (-> obj knocked-anim-index)) + (format #t "~2Tjumping-ambush-path-pt: ~D~%" (-> obj jumping-ambush-path-pt)) + (format #t "~2Tgrunt-flags: ~D~%" (-> obj grunt-flags)) + (format #t "~2Tstate-timeout2: ~D~%" (-> obj state-timeout2)) + (format #t "~2Tnext-warn-time: ~D~%" (-> obj next-warn-time)) + (format #t "~2Tdest: #~%" (-> obj dest)) + (format #t "~2Tfocus-pos: #~%" (-> obj focus-pos)) + (label cfg-4) + obj + ) + +;; definition for method 74 of type metalhead-grunt +(defmethod general-event-handler metalhead-grunt ((obj metalhead-grunt) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + "Handles various events for the enemy +@TODO - unsure if there is a pattern for the events and this should have a more specific name" + (case arg2 + (('hit 'hit-knocked) + (logclear! (-> obj mask) (process-mask actor-pause)) + (logclear! (-> obj focus-status) (focus-status dangerous)) + (logclear! (-> obj enemy-flags) (enemy-flag enable-on-notice)) + (logior! (-> obj enemy-flags) (enemy-flag chase-startup)) + (logior! (-> obj focus-status) (focus-status hit)) + (if (zero? (-> obj hit-points)) + (logior! (-> obj focus-status) (focus-status dead)) + ) + (logclear! (-> obj enemy-flags) (enemy-flag actor-pause-backup)) + (enemy-method-62 obj) + (set! (-> obj enemy-flags) (logior (enemy-flag actor-pause-backup) (-> obj enemy-flags))) + (process-contact-action arg0) + (send-event arg0 'get-attack-count 1) + (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)) + ) + ) + (kill-prefer-falling 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 citizen-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + +;; definition for method 66 of type metalhead-grunt +(defmethod go-ambush metalhead-grunt ((obj metalhead-grunt)) + (cond + ((logtest? (-> obj fact-info-override enemy-options) (enemy-option user10)) + (go (method-of-object obj falling-ambush)) + ) + ((logtest? (-> obj fact-info-override enemy-options) (enemy-option user11)) + (go (method-of-object obj jumping-ambush)) + ) + (else + (format 0 "ERROR: ~A doesn't specify which ambush behavior to use.~%" (-> obj name)) + (go-hostile obj) + ) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate falling-ambush (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :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* ((gp-1 *target*) + (a0-4 (if (type? gp-1 process-focusable) + gp-1 + ) + ) + ) + (when a0-4 + (let* ((gp-2 (-> self root-override2)) + (s3-0 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) (get-trans a0-4 0) (-> gp-2 trans)) 1.0)) + (f0-0 (deg-diff (quaternion-y-angle (-> gp-2 quat)) (vector-y-angle s3-0))) + ) + (quaternion-rotate-y! (-> gp-2 quat) (-> gp-2 quat) f0-0) + ) + ) + ) + (logclear! (-> self draw status) (draw-control-status no-draw)) + (let* ((v1-17 *game-info*) + (v0-9 (+ (-> v1-17 attack-id) 1)) + ) + (set! (-> v1-17 attack-id) v0-9) + (set! (-> self attack-id) v0-9) + ) + (none) + ) + :code (behavior () + (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 + ) + ) + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (sound-play "grunt-notice") + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior metalhead-grunt) nav-enemy-falling-post) + ) + +;; definition for method 93 of type metalhead-grunt +(defmethod enemy-method-93 metalhead-grunt ((obj metalhead-grunt)) + (case (-> obj jump-why) + ((2) + (go (method-of-object obj jumping-ambush-cont)) + ) + (else + ((method-of-type citizen-enemy enemy-method-93) obj) + ) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate jumping-ambush (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :enter (behavior () + ((-> (method-of-type nav-enemy ambush) enter)) + (when (zero? (-> self intro-path)) + (format 0 "ERROR: ~A has no intro path, skipping jumping-ambush~%" (-> self name)) + (go-virtual notice) + ) + (get-point-in-path! (-> self intro-path) (-> self root-override2 trans) 0.0 'interp) + (none) + ) + :code (behavior () + (set! (-> self jumping-ambush-path-pt) 1) + (until #f + (let ((gp-0 (new 'stack-no-clear 'vector))) + (get-point-in-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-5 (process->ppointer self))) + (set! (-> a1-1 from) v1-5) + ) + (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) + ) + ) + +;; failed to figure out what this is: +(defstate jumping-ambush-cont (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :code (behavior () + (let ((a0-0 (-> self intro-path)) + (v1-1 (+ (-> self jumping-ambush-path-pt) 1)) + ) + (if (< v1-1 (-> a0-0 curve num-cverts)) + (set! (-> self jumping-ambush-path-pt) v1-1) + (react-to-focus self) + ) + ) + (until #f + (let ((gp-0 (new 'stack-no-clear 'vector))) + (get-point-in-path! (-> self intro-path) gp-0 (the float (-> self jumping-ambush-path-pt)) '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-9 (process->ppointer self))) + (set! (-> a1-1 from) v1-9) + ) + (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) + ) + ) + +;; failed to figure out what this is: +(defstate active (metalhead-grunt) + :virtual #t + :code (behavior () + (let ((v1-2 (ja-group))) + (when (or (and v1-2 (or (= v1-2 (-> self draw art-group data 14)) + (= v1-2 (-> self draw art-group data 15)) + (= v1-2 (-> self draw art-group data 16)) + ) + ) + (let ((v1-8 (ja-group))) + (and v1-8 (or (= v1-8 (-> self draw art-group data 11)) + (= v1-8 (-> self draw art-group data 12)) + (= v1-8 (-> self draw art-group data 14)) + (= v1-8 (-> self draw art-group data 15)) + ) + ) + ) + ) + (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 + (set! (-> self patrol-anim) (-> *grunt-global-info* patrol-anim (get-rand-int self 4))) + (let ((v1-28 (-> self nav))) + (set! (-> v1-28 target-speed) (-> self patrol-anim travel-speed)) + ) + 0 + (let ((gp-0 (-> self draw art-group data (-> self patrol-anim anim-index))) + (s5-0 (get-rand-int-range self 1 8)) + ) + (let ((v1-37 (ja-group))) + (if (not (and v1-37 (= v1-37 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 (nonzero? (-> self patrol-anim anim-index)) + (ja-no-eval :num! (loop!)) + (ja-channel-push! 1 (seconds 0.2)) + (set! (-> self patrol-anim) (the-as grunt-anim-info (-> *grunt-global-info* patrol-anim))) + (let ((v1-67 (-> self nav))) + (set! (-> v1-67 target-speed) (-> self patrol-anim travel-speed)) + ) + 0 + (let ((gp-1 (-> self draw art-group data (-> self patrol-anim anim-index))) + (s5-1 (get-rand-int-range self 2 5)) + ) + (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) + (ja-blend-eval) + (suspend) + (ja :num! (seek! max f30-0)) + ) + (dotimes (s4-1 s5-1) + (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)) + ) + ) + ) + ) + (when (zero? (get-rand-int self 3)) + (let ((v1-107 self)) + (set! (-> v1-107 enemy-flags) + (the-as enemy-flag (logclear (-> v1-107 enemy-flags) (enemy-flag enemy-flag36))) + ) + (set! (-> v1-107 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (nav-enemy-method-167 self) + (ja-channel-push! 1 (seconds 0.3)) + (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)) + ) + (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-171 self)) + (if (not (logtest? (enemy-flag enemy-flag36) (-> v1-171 enemy-flags))) + (set! (-> v1-171 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-171 enemy-flags)))) + ) + (set! (-> v1-171 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-171 enemy-flags)))) + (set! (-> v1-171 nav callback-info) (-> v1-171 enemy-info-override callback-info)) + ) + 0 + ) + ) + ) + #f + (none) + ) + ) + +;; definition for method 209 of type metalhead-grunt +(defmethod metalhead-grunt-method-209 metalhead-grunt ((obj metalhead-grunt) (arg0 float)) + (local-vars (v1-5 float)) + (rlet ((acc :class vf) + (vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (let ((gp-0 (get-enemy-target obj))) + (when gp-0 + (let ((v1-3 (get-trans gp-0 0)) + (s4-0 (new 'stack-no-clear 'vector)) + ) + (vector-! s4-0 v1-3 (-> obj root-override2 trans)) + (.lvf vf1 (&-> s4-0 quad)) + (.add.w.vf vf2 vf0 vf0 :mask #b1) + (.mul.vf vf1 vf1 vf1) + (.mul.x.vf acc vf2 vf1 :mask #b1) + (.add.mul.y.vf acc vf2 vf1 acc :mask #b1) + (.add.mul.z.vf vf1 vf2 vf1 acc :mask #b1) + (.mov v1-5 vf1) + (let* ((f30-0 v1-5) + (f0-0 arg0) + (f28-0 (* f0-0 f0-0)) + (f0-2 12288.0) + ) + (when (or (>= (* f0-2 f0-2) f30-0) (>= f28-0 f30-0)) + (let ((f26-0 (quaternion-y-angle (-> obj root-override2 quat))) + (f0-7 (atan (-> s4-0 x) (-> s4-0 z))) + (f1-0 1228.8) + ) + (cond + ((and (< (* f1-0 f1-0) f30-0) (>= f28-0 f30-0) (>= 8192.0 (fabs (deg- f26-0 f0-7)))) + (go (method-of-object obj attack)) + ) + ((let ((f0-10 12288.0)) + (< f30-0 (* f0-10 f0-10)) + ) + (go (method-of-object obj spin-attack)) + ) + ) + ) + ) + ) + ) + ) + gp-0 + ) + ) + ) + +;; failed to figure out what this is: +(defstate hostile (metalhead-grunt) + :virtual #t + :trans (behavior () + (let ((t9-0 (-> (method-of-type citizen-enemy hostile) trans))) + (if t9-0 + (t9-0) + ) + ) + (let ((a0-1 (metalhead-grunt-method-209 self 13312.0)) + (gp-0 (-> self clock frame-counter)) + ) + (when (and (>= gp-0 (-> self next-warn-time)) + (zero? (logand (-> self draw status) (draw-control-status on-screen))) + ) + (when (and a0-1 + (let ((f0-0 65536.0)) + (>= (* f0-0 f0-0) (vector-vector-xz-distance-squared (get-trans a0-1 0) (-> self root-override2 trans))) + ) + ) + (sound-play "grunt-warn") + (set! (-> self next-warn-time) (+ gp-0 (get-rand-int-range self 300 360))) + ) + ) + ) + (none) + ) + :code (behavior () + (let ((v1-2 (ja-group))) + (when (and v1-2 (or (= v1-2 (-> self draw art-group data 14)) + (= v1-2 (-> self draw art-group data 15)) + (= v1-2 (-> self draw art-group data 16)) + ) + ) + (let ((v1-6 (-> self nav))) + (set! (-> v1-6 target-speed) (-> self charge-anim travel-speed)) + ) + 0 + (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))) + (let ((v1-19 (-> self use-charge-anim-index))) + (cond + ((>= v1-19 0) + (set! (-> self charge-anim) (-> *grunt-global-info* charge-anim v1-19)) + (set! (-> self use-charge-anim-index) -1) + ) + (else + (set! (-> self charge-anim) (-> *grunt-global-info* charge-anim (get-rand-int self 3))) + ) + ) + ) + (until #f + (metalhead-grunt-method-209 self 22528.0) + (let ((gp-0 (-> self draw art-group data (-> self charge-anim anim-index)))) + (let ((v1-37 (ja-group))) + (when (not (and v1-37 (= v1-37 gp-0))) + (ja-channel-push! 1 (seconds 0.1)) + (let ((v1-41 (-> self nav))) + (set! (-> v1-41 target-speed) (-> self charge-anim travel-speed)) + ) + 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)) + ) + ) + ) + #f + (none) + ) + :post (the-as (function none :behavior metalhead-grunt) nav-enemy-chase-post) + ) + +;; failed to figure out what this is: +(defstate attack (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :enter (behavior () + (let ((v1-1 (-> self nav state))) + (set! (-> v1-1 speed) (-> self enemy-info-override run-travel-speed)) + ) + 0 + (set! (-> self enemy-flags) (logior (enemy-flag actor-pause-backup) (-> self enemy-flags))) + (logior! (-> self focus-status) (focus-status dangerous)) + (set! (-> self root-override2 penetrate-using) (penetrate generic-attack lunge)) + (enemy-method-49 self) + (let* ((v1-10 *game-info*) + (a0-5 (+ (-> v1-10 attack-id) 1)) + ) + (set! (-> v1-10 attack-id) a0-5) + (set! (-> self attack-id) a0-5) + ) + (let* ((a0-6 self) + (t9-1 (method-of-object a0-6 metalhead-grunt-method-211)) + ) + #t + (t9-1 a0-6) + ) + (none) + ) + :exit (behavior () + (let* ((a0-0 self) + (t9-0 (method-of-object a0-0 metalhead-grunt-method-211)) + ) + (t9-0 a0-0) + ) + (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) + (when (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) + (logclear! (-> self enemy-flags) (enemy-flag look-at-focus)) + (sound-play "grunt-hit") + ) + (none) + ) + :code (behavior () + (set! (-> self attack-anim) (-> *grunt-global-info* attack-anim (get-rand-int self 2))) + (let ((v1-5 (-> self nav))) + (set! (-> v1-5 target-speed) (-> self attack-anim travel-speed)) + ) + 0 + (let ((v1-7 (-> self nav))) + (set! (-> v1-7 turning-acceleration) 49152.0) + ) + 0 + (let ((gp-0 (-> self draw art-group data (-> self attack-anim anim-index))) + (f30-0 (get-rand-float-range self 0.9 1.1)) + ) + (let ((v1-17 (ja-group))) + (if (not (and v1-17 (= v1-17 gp-0))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (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)) + ) + ) + (let ((v1-36 (-> self nav))) + (set! (-> v1-36 target-speed) (-> self charge-anim travel-speed)) + ) + 0 + (let ((v1-38 (-> self nav))) + (set! (-> v1-38 turning-acceleration) (-> self enemy-info-override run-turning-acceleration)) + ) + 0 + (let ((gp-1 (-> self draw art-group data (-> self charge-anim anim-index)))) + (ja-channel-push! 1 (seconds 0.1)) + (set! (-> self skel root-channel 0 frame-group) (the-as art-joint-anim gp-1)) + ) + (ja :num-func num-func-identity :frame-num (ja-aframe 3.0 0)) + (let ((gp-3 (-> self focus aware))) + (if (or (not (get-enemy-target self)) (!= gp-3 3)) + (go-stare self) + ) + ) + (let ((v1-57 0)) + (let ((a0-22 (the-as object (-> *grunt-global-info* charge-anim))) + (a1-7 (-> self charge-anim)) + ) + (dotimes (a2-3 3) + (when (= a0-22 a1-7) + (set! v1-57 a2-3) + (goto cfg-21) + ) + (set! a0-22 (&+ (the-as grunt-anim-info a0-22) 8)) + ) + ) + (label cfg-21) + (set! (-> self use-charge-anim-index) v1-57) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior metalhead-grunt) nav-enemy-chase-post) + ) + +;; failed to figure out what this is: +(defstate spin-attack (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + 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 ((gp-0 (handle->process (-> self focus handle)))) + (if (not gp-0) + (go-stare self) + ) + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable gp-0) 0) quad)) + ) + (logior! (-> self focus-status) (focus-status dangerous)) + (let* ((v1-21 *game-info*) + (a0-13 (+ (-> v1-21 attack-id) 1)) + ) + (set! (-> v1-21 attack-id) a0-13) + (set! (-> self attack-id) a0-13) + ) + (let* ((a0-14 self) + (t9-3 (method-of-object a0-14 metalhead-grunt-method-211)) + ) + #t + (t9-3 a0-14) + ) + (none) + ) + :exit (behavior () + (let* ((a0-0 self) + (t9-0 (method-of-object a0-0 metalhead-grunt-method-211)) + ) + (t9-0 a0-0) + ) + (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 "grunt-hit") + ) + (none) + ) + :code (behavior () + (set! (-> self attack-anim) (-> *grunt-global-info* attack-anim (get-rand-int self 2))) + (let ((gp-0 (-> self draw art-group data (-> self attack-anim anim-index))) + (f30-0 (get-rand-float-range self 0.9 1.1)) + ) + (let ((v1-13 (ja-group))) + (if (not (and v1-13 (= v1-13 gp-0))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (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) + (let ((a0-9 (handle->process (-> self focus handle)))) + (if a0-9 + (set! (-> self focus-pos quad) (-> (get-trans (the-as process-focusable a0-9) 0) quad)) + ) + ) + (seek-to-point-toward-point! (-> self root-override2) (-> self focus-pos) 546133.3 (seconds 0.1)) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (let ((gp-3 (-> self focus aware))) + (if (or (not (get-enemy-target self)) (!= gp-3 3)) + (go-stare self) + ) + ) + (go-virtual hostile) + (none) + ) + :post (the-as (function none :behavior metalhead-grunt) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate stop-chase (metalhead-grunt) + :virtual #t + :code (behavior () + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (set! (-> self patrol-anim) (-> *grunt-global-info* patrol-anim (get-rand-int self 4))) + (let ((v1-14 (-> self nav))) + (set! (-> v1-14 target-speed) (-> self patrol-anim travel-speed)) + ) + 0 + (let ((f30-0 (get-rand-float-range self 0.9 1.1)) + (gp-0 (-> self draw art-group data (-> self patrol-anim anim-index))) + ) + (let ((v1-24 (ja-group))) + (if (not (and v1-24 (= v1-24 gp-0))) + (ja-channel-push! 1 (seconds 0.2)) + ) + ) + (until #f + (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)) + ) + ) + ) + #f + (none) + ) + ) + +;; definition for method 77 of type metalhead-grunt +(defmethod enemy-method-77 metalhead-grunt ((obj metalhead-grunt) (arg0 (pointer float))) + (local-vars (v1-72 int) (a2-3 int) (a2-5 int)) + (case (-> obj incoming knocked-type) + (((knocked-type knocked-type-4)) + (let ((v1-2 (ash 1 (-> *grunt-global-info* prev-yellow-hit-anim-index))) + (a0-7 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and a0-7 (or (= a0-7 (-> obj draw art-group data 16)) + (= a0-7 (-> obj draw art-group data 38)) + (= a0-7 (-> obj draw art-group data 39)) + (= a0-7 (-> obj draw art-group data 40)) + ) + ) + (set! a2-3 (logior v1-2 4)) + (set! a2-3 (logior v1-2 8)) + ) + ) + (let ((s4-0 (enemy-method-120 obj 4 a2-3))) + (set! (-> *grunt-global-info* prev-yellow-hit-anim-index) s4-0) + (set! (-> obj yellow-hit-anim) (-> *grunt-global-info* yellow-hit-anim s4-0)) + (let ((v1-11 (get-rand-int obj 3))) + (if (= s4-0 3) + (set! v1-11 2) + ) + (set! (-> obj use-charge-anim-index) v1-11) + ) + ) + (let ((s4-1 (-> obj draw art-group data (-> obj yellow-hit-anim anim-index)))) + (ja-channel-push! 1 0) + (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 + ) + (((knocked-type knocked-type-6)) + (let* ((v1-24 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + (s4-2 (and v1-24 (or (= v1-24 (-> obj draw art-group data 16)) + (= v1-24 (-> obj draw art-group data 38)) + (= v1-24 (-> obj draw art-group data 39)) + (= v1-24 (-> obj draw art-group data 40)) + ) + ) + ) + ) + (if (>= (-> obj incoming blue-juggle-count) (the-as uint 2)) + (logior! (-> obj grunt-flags) 2) + ) + (cond + ((and (not s4-2) (logtest? (-> obj grunt-flags) 2)) + (set! s4-2 #t) + (ja-channel-push! 1 (seconds 0.17)) + ) + (else + (let ((v1-36 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (if (and v1-36 (= v1-36 (-> obj draw art-group data 44))) + (ja-channel-push! 1 (seconds 0.17)) + (ja-channel-push! 1 (seconds 0.02)) + ) + ) + ) + ) + (let ((v1-42 (ash 1 (-> *grunt-global-info* prev-blue-hit-anim-index)))) + (if s4-2 + (set! a2-5 (logior v1-42 56)) + (set! a2-5 (logior v1-42 7)) + ) + ) + (let ((v1-46 (enemy-method-120 obj 6 a2-5))) + (set! (-> *grunt-global-info* prev-blue-hit-anim-index) v1-46) + (set! (-> obj blue-hit-anim) (-> *grunt-global-info* blue-hit-anim v1-46)) + ) + (let ((a2-6 0)) + (when (not (logtest? (-> obj grunt-flags) 2)) + (if s4-2 + (set! a2-6 (logior a2-6 3)) + (set! a2-6 (logior a2-6 4)) + ) + ) + (set! (-> obj use-charge-anim-index) (enemy-method-120 obj 3 a2-6)) + ) + ) + (let ((a1-26 (-> obj draw art-group data (-> obj blue-hit-anim anim-index))) + (a0-51 (-> obj skel root-channel 0)) + ) + (set! (-> a0-51 frame-group) (the-as art-joint-anim a1-26)) + (set! (-> a0-51 param 0) (the float (+ (-> (the-as art-joint-anim a1-26) frames num-frames) -1))) + (set! (-> a0-51 param 1) (-> arg0 0)) + (set! (-> a0-51 frame-num) 0.0) + (joint-control-channel-group! a0-51 (the-as art-joint-anim a1-26) num-func-seek!) + ) + #t + ) + (else + 0 + (cond + ((or (= (-> obj incoming knocked-type) (knocked-type knocked-type-2)) + (= (-> obj incoming knocked-type) (knocked-type knocked-type-3)) + ) + (set! v1-72 3) + ) + (else + (let ((s4-3 (ash 1 (-> *grunt-global-info* prev-knocked-anim-index)))) + (let ((s3-0 (-> obj root-override2))) + (if (>= 16384.0 (fabs (deg- (quaternion-y-angle (-> s3-0 quat)) (atan (-> s3-0 transv x) (-> s3-0 transv z))))) + (set! s4-3 (logior s4-3 4)) + ) + ) + (set! v1-72 (enemy-method-120 obj 3 s4-3)) + ) + ) + ) + (set! (-> *grunt-global-info* prev-knocked-anim-index) v1-72) + (set! (-> obj knocked-anim-index) v1-72) + (set! (-> obj knocked-anim) (-> *grunt-global-info* knocked-anim v1-72)) + (let ((s4-4 (-> obj draw art-group data (-> obj knocked-anim anim-index)))) + (ja-channel-push! 1 0) + (let ((a0-68 (-> obj skel root-channel 0))) + (set! (-> a0-68 frame-group) (the-as art-joint-anim s4-4)) + (set! (-> a0-68 param 0) (the float (+ (-> (the-as art-joint-anim s4-4) frames num-frames) -1))) + (set! (-> a0-68 param 1) (-> arg0 0)) + (set! (-> a0-68 frame-num) 0.0) + (joint-control-channel-group! a0-68 (the-as art-joint-anim s4-4) num-func-seek!) + ) + ) + #t + ) + ) + ) + +;; definition for method 78 of type metalhead-grunt +(defmethod enemy-method-78 metalhead-grunt ((obj metalhead-grunt) (arg0 (pointer float))) + (cond + ((= (-> obj incoming knocked-type) (knocked-type knocked-type-6)) + (when (or (logtest? (-> obj grunt-flags) 2) (let ((v1-7 (if (> (-> obj skel active-channels) 0) + (-> obj skel root-channel 0 frame-group) + ) + ) + ) + (not (and v1-7 (or (= v1-7 (-> obj draw art-group data 16)) + (= v1-7 (-> obj draw art-group data 38)) + (= v1-7 (-> obj draw art-group data 39)) + (= v1-7 (-> obj draw art-group data 40)) + ) + ) + ) + ) + ) + (let ((s4-0 (-> obj draw art-group data 44))) + (ja-channel-push! 1 (seconds 0.17)) + (let ((a0-16 (-> obj skel root-channel 0))) + (set! (-> a0-16 frame-group) (the-as art-joint-anim s4-0)) + (set! (-> a0-16 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1))) + (set! (-> a0-16 param 1) (-> arg0 0)) + (set! (-> a0-16 frame-num) 0.0) + (joint-control-channel-group! a0-16 (the-as art-joint-anim s4-0) num-func-seek!) + ) + ) + (set! (-> obj grunt-flags) (logand -3 (-> obj grunt-flags))) + #t + ) + ) + ((!= (-> obj incoming knocked-type) (knocked-type knocked-type-4)) + (let ((a1-6 + (-> obj draw art-group data (-> *grunt-global-info* knocked-land-anim (-> obj knocked-anim-index) anim-index)) + ) + (a0-23 (-> obj skel root-channel 0)) + ) + (set! (-> a0-23 frame-group) (the-as art-joint-anim a1-6)) + (set! (-> a0-23 param 0) (the float (+ (-> (the-as art-joint-anim a1-6) frames num-frames) -1))) + (set! (-> a0-23 param 1) (-> arg0 0)) + (set! (-> a0-23 frame-num) 0.0) + (joint-control-channel-group! a0-23 (the-as art-joint-anim a1-6) num-func-seek!) + ) + #t + ) + ) + ) + +;; failed to figure out what this is: +(defstate wait-for-focus (metalhead-grunt) + :virtual #t + :event (the-as + (function process int symbol event-message-block object :behavior metalhead-grunt) + enemy-event-handler + ) + :enter (-> (method-of-type nav-enemy idle) enter) + :trans (behavior () + (let ((s5-0 (handle->process (-> self focus handle)))) + (when s5-0 + (let ((gp-0 (get-trans (the-as process-focusable s5-0) 0))) + (when (and (or (not (logtest? (-> self enemy-flags) (enemy-flag enable-on-notice))) + (>= 163840.0 (vector-vector-distance (-> self root-override2 trans) gp-0)) + ) + (or (not (logtest? (-> self fact-info-override enemy-options) (enemy-option user8))) + (and (not (logtest? (-> (the-as process-focusable s5-0) focus-status) (focus-status in-air))) + (>= 4096.0 (fabs (- (-> gp-0 y) (-> self root-override2 trans y)))) + ) + ) + ) + (cond + ((and (logtest? (-> self fact-info-override enemy-options) (enemy-option user9)) + (logtest? (-> self enemy-flags) (enemy-flag enable-on-notice)) + ) + (let ((s5-1 (new 'stack-no-clear 'vector))) + (vector-! s5-1 gp-0 (-> self root-override2 trans)) + (let ((f0-2 32768.0) + (v1-26 s5-1) + ) + (if (or (>= f0-2 (sqrtf (+ (* (-> v1-26 x) (-> v1-26 x)) (* (-> v1-26 z) (-> v1-26 z))))) + (>= 20024.889 (fabs (deg- (y-angle (-> self root-override2)) (atan (-> s5-1 x) (-> s5-1 z))))) + ) + (go-virtual notice) + ) + ) + ) + ) + (else + (go-virtual notice) + ) + ) + ) + ) + ) + ) + (none) + ) + :code (-> (method-of-type nav-enemy idle) code) + :post (-> (method-of-type nav-enemy idle) post) + ) + +;; definition for method 211 of type metalhead-grunt +;; WARN: Return type mismatch int vs none. +(defmethod metalhead-grunt-method-211 metalhead-grunt ((obj metalhead-grunt)) + 0 + (none) + ) + +;; definition for method 7 of type metalhead-grunt +;; WARN: Return type mismatch citizen-enemy vs metalhead-grunt. +(defmethod relocate metalhead-grunt ((obj metalhead-grunt) (arg0 int)) + (if (nonzero? (-> obj intro-path)) + (&+! (-> obj intro-path) arg0) + ) + (the-as metalhead-grunt ((method-of-type citizen-enemy relocate) obj arg0)) + ) + +;; definition for method 114 of type metalhead-grunt +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! metalhead-grunt ((obj metalhead-grunt)) + "Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly" + (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player)))) + (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s5-0 reaction) cshape-reaction-default) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s5-0 penetrated-by) (penetrate + generic-attack + lunge + flop + punch + spin + roll + uppercut + bonk + tube + vehicle + flut-attack + board + mech-punch + dark-punch + dark-giant + ) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 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 civilian enemy obstacle hit-by-others-list player-list) + ) + (set! (-> s4-0 prim-core action) (collide-action solid can-ride deadly no-standon)) + (set-vector! (-> s4-0 local-sphere) 0.0 6144.0 0.0 17408.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 hit-by-others-list player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid can-ride deadly 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-with) (collide-spec backgnd jak hit-by-others-list player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid)) + (set-vector! (-> v1-15 local-sphere) 0.0 9830.4 0.0 4915.2) + ) + (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 civilian hit-by-others-list player-list)) + (set! (-> v1-17 prim-core action) (collide-action semi-solid)) + (set! (-> v1-17 transform-index) 4) + (set-vector! (-> v1-17 local-sphere) 0.0 0.0 0.0 4915.2) + ) + (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 civilian hit-by-others-list player-list)) + (set! (-> v1-19 prim-core action) (collide-action semi-solid)) + (set! (-> v1-19 transform-index) 18) + (set-vector! (-> v1-19 local-sphere) 0.0 0.0 0.0 2252.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 civilian hit-by-others-list 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 2048.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 civilian hit-by-others-list player-list)) + (set! (-> v1-23 prim-core action) (collide-action deadly)) + (set! (-> v1-23 transform-index) 12) + (set-vector! (-> v1-23 local-sphere) 0.0 0.0 0.0 2048.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 civilian hit-by-others-list player-list)) + (set! (-> v1-25 prim-core action) (collide-action semi-solid)) + (set! (-> v1-25 transform-index) 6) + (set-vector! (-> v1-25 local-sphere) 0.0 0.0 0.0 2048.0) + ) + (set! (-> s5-0 nav-radius) 8192.0) + (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! (-> s5-0 event-priority) (the-as uint 8)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 210 of type metalhead-grunt +(defmethod get-nav-info metalhead-grunt ((obj metalhead-grunt)) + *metalhead-grunt-nav-enemy-info* + ) + +;; definition for method 115 of type metalhead-grunt +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! metalhead-grunt ((obj metalhead-grunt)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-grunt" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj (get-nav-info obj)) + (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) 11832.889 11832.889 0.0 1.0) + (set! (-> v1-6 ignore-angle) 30947.555) + ) + (let ((v1-8 (-> obj nav))) + (set! (-> v1-8 speed-scale) 1.0) + ) + 0 + (set-gravity-length (-> obj root-override2 dynam) 573440.0) + (let ((s5-2 *grunt-global-info*)) + (set! (-> obj patrol-anim) (-> s5-2 patrol-anim (get-rand-int obj 4))) + (set! (-> obj charge-anim) (-> s5-2 charge-anim (get-rand-int obj 3))) + (set! (-> obj attack-anim) (-> s5-2 attack-anim (get-rand-int obj 2))) + ) + (set! (-> obj use-charge-anim-index) -1) + (if (zero? (get-rand-int obj 2)) + (logior! (-> obj grunt-flags) 1) + ) + (if (zero? (get-rand-int obj 2)) + (logior! (-> obj grunt-flags) 4) + ) + (set! (-> obj intro-path) (new 'process 'path-control obj 'intro 0.0 (the-as entity #f) #t)) + (add-connection + *part-engine* + obj + 6 + obj + 318 + (new 'static 'vector :x 1433.6 :y 2785.28 :z -1761.28 :w 163840.0) + ) + (add-connection + *part-engine* + obj + 6 + obj + 318 + (new 'static 'vector :x -1433.6 :y 2785.28 :z -1761.28 :w 163840.0) + ) + (set! (-> obj water-anim) -1) + (set! (-> obj minimap) #f) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/city/common/traffic-engine-h_REF.gc b/test/decompiler/reference/jak2/levels/city/common/traffic-engine-h_REF.gc index 9a0898eeb7..01cd41cc6a 100644 --- a/test/decompiler/reference/jak2/levels/city/common/traffic-engine-h_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/traffic-engine-h_REF.gc @@ -757,7 +757,7 @@ (new-suppression-box (_type_ traffic-suppression-params) none 46) (remove-suppression-box (_type_ traffic-suppression-params) none 47) (update-suppression-box (_type_ traffic-suppression-params) none 48) - (traffic-engine-method-49 (_type_ object int traffic-target-status) traffic-target-status 49) + (traffic-engine-method-49 (_type_ vector int traffic-target-status) traffic-target-status 49) (find-closest-to-with-collide-lists (_type_ process-drawable collide-spec) process-focusable 50) (for-all-active-processes (_type_ (function process-focusable traffic-object-type-info none)) none 51) (send-alert-events (_type_) none 52) diff --git a/test/decompiler/reference/jak2/levels/city/common/traffic-engine_REF.gc b/test/decompiler/reference/jak2/levels/city/common/traffic-engine_REF.gc index 111fc3c76d..6d7142ba90 100644 --- a/test/decompiler/reference/jak2/levels/city/common/traffic-engine_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/traffic-engine_REF.gc @@ -698,7 +698,7 @@ Process is recycled and moved to reserved, if it deactivates." (let ((gp-0 (-> arg0 object-type))) (set! (-> arg0 proc) #f) (when (> (-> obj traffic object-type-info-array gp-0 inactive-count) 0) - (set! sv-16 (get-from-inactive-by-handle obj gp-0 (the-as handle (-> arg0 handle)))) + (set! sv-16 (get-from-inactive-by-handle obj gp-0 (-> arg0 handle))) (let ((s3-0 (handle->process sv-16))) (when s3-0 (cond @@ -1385,7 +1385,7 @@ Process is recycled and moved to reserved, if it deactivates." (let ((s5-0 *target*)) (when s5-0 (let ((v1-1 (-> obj danger-sphere-array))) - (set! (-> v1-1 0 handle) (the-as uint (process->handle s5-0))) + (set! (-> v1-1 0 handle) (process->handle s5-0)) (let ((a0-4 (-> s5-0 focus-status)) (f0-0 0.0) (f1-0 0.0) @@ -2290,33 +2290,35 @@ Process is recycled and moved to reserved, if it deactivates." ;; WARN: Stack slot offset 216 signed mismatch ;; WARN: Stack slot offset 216 signed mismatch ;; WARN: Stack slot offset 216 signed mismatch -;; WARN: Stack slot offset 216 signed mismatch -;; WARN: Stack slot offset 216 signed mismatch -(defmethod traffic-engine-method-49 traffic-engine ((obj traffic-engine) (arg0 object) (arg1 int) (arg2 traffic-target-status)) - (local-vars (sv-192 (array crimson-guard)) (sv-196 (array float)) (sv-200 int) (sv-208 int) (sv-216 number)) +(defmethod traffic-engine-method-49 traffic-engine ((obj traffic-engine) (los vector) (arg2 int) (target-status traffic-target-status)) + (local-vars + (guards (array crimson-guard)) + (guard-target-dists (array float)) + (guard-idx int) + (sv-208 int) + (sv-216 float) + ) (with-pp - (logclear! (-> arg2 flags) (traffic-target-flag visible-now updated)) + (logclear! (-> target-status flags) (traffic-target-flag visible-now updated)) (cond - ((= (-> obj sync-mask-16) (ash 1 (logand arg1 15))) - (logior! (-> arg2 flags) (traffic-target-flag updated)) - (let ((s3-0 (handle->process (-> arg2 handle))) - (s5-0 (new 'stack-no-clear 'vector)) + ((= (-> obj sync-mask-16) (ash 1 (logand arg2 15))) + (logior! (-> target-status flags) (traffic-target-flag updated)) + (let ((target-proc (handle->process (-> target-status handle))) + (target-pos (new 'stack-no-clear 'vector)) ) - (when s3-0 - (set! (-> s5-0 quad) (-> (get-trans (the-as process-focusable s3-0) 3) quad)) + (when target-proc + (set! (-> target-pos quad) (-> (get-trans (the-as process-focusable target-proc) 3) quad)) (cond - ((= (-> (the-as process-focusable s3-0) type) target) + ((= (-> (the-as process-focusable target-proc) type) target) (let ((s1-1 (-> obj alert-state target-status-array))) (logclear! (-> s1-1 0 flags) (traffic-target-flag visible-now updated)) (logior! (-> s1-1 0 flags) (traffic-target-flag updated)) (cond - ((or (logtest? (-> s1-1 0 flags) (traffic-target-flag force-visible)) - (traffic-los-clear? (the-as vector arg0) s5-0) - ) + ((or (logtest? (-> s1-1 0 flags) (traffic-target-flag force-visible)) (traffic-los-clear? los target-pos)) (logior! (-> s1-1 0 flags) (traffic-target-flag visible-now visible-recently visible-ever)) (set! (-> s1-1 0 last-seen-time) (-> pp clock frame-counter)) - (set! (-> s1-1 0 position quad) (-> s5-0 quad)) - (set! (-> s1-1 0 velocity quad) (-> (get-transv (the-as process-focusable s3-0)) quad)) + (set! (-> s1-1 0 position quad) (-> target-pos quad)) + (set! (-> s1-1 0 velocity quad) (-> (get-transv (the-as process-focusable target-proc)) quad)) ) (else (if (>= (- (-> pp clock frame-counter) (-> s1-1 0 last-seen-time)) (seconds 2)) @@ -2324,36 +2326,38 @@ Process is recycled and moved to reserved, if it deactivates." ) ) ) - (mem-copy! (the-as pointer arg2) (the-as pointer s1-1) 80) + (mem-copy! (the-as pointer target-status) (the-as pointer s1-1) 80) ) 0 ) (else - (logior! (-> arg2 flags) (traffic-target-flag visible-now visible-recently visible-ever)) - (set! (-> arg2 last-seen-time) (-> pp clock frame-counter)) - (set! (-> arg2 position quad) (-> s5-0 quad)) - (set! (-> arg2 velocity quad) (-> (get-transv (the-as process-focusable s3-0)) quad)) + (logior! (-> target-status flags) (traffic-target-flag visible-now visible-recently visible-ever)) + (set! (-> target-status last-seen-time) (-> pp clock frame-counter)) + (set! (-> target-status position quad) (-> target-pos quad)) + (set! (-> target-status velocity quad) (-> (get-transv (the-as process-focusable target-proc)) quad)) ) ) - (set! (-> s5-0 quad) (-> arg2 position quad)) - (when (not (update-guard-status-spots s5-0)) + (set! (-> target-pos quad) (-> target-status position quad)) + (when (not (update-guard-status-spots target-pos)) ) - (when (update-guard-status-spots s5-0) - (set! sv-192 (the-as (array crimson-guard) (new 'stack 'array crimson-guard 16))) - (set! sv-196 (the-as (array float) (new 'stack 'array float 16))) - (set! sv-200 0) - (dotimes (s3-1 (the-as int (-> obj vehicle-tracker-array active-object-count))) - (case (-> obj vehicle-tracker-array active-object-type-list s3-1) + (when (update-guard-status-spots target-pos) + (set! guards (the-as (array crimson-guard) (new 'stack 'array crimson-guard 16))) + (set! guard-target-dists (the-as (array float) (new 'stack 'array float 16))) + (set! guard-idx 0) + (dotimes (guard-count (the-as int (-> obj vehicle-tracker-array active-object-count))) + (case (-> obj vehicle-tracker-array active-object-type-list guard-count) (((traffic-type crimson-guard-1)) - (let ((s2-3 (handle->process (-> obj vehicle-tracker-array active-object-list s3-1)))) - (when (and s2-3 - (not (logtest? (-> (the-as process-focusable s2-3) focus-status) (focus-status dead inactive))) - (= (-> (the-as crimson-guard s2-3) traffic-target-status handle) (-> arg2 handle)) + (let ((guard (handle->process (-> obj vehicle-tracker-array active-object-list guard-count)))) + (when (and guard + (not (logtest? (-> (the-as process-focusable guard) focus-status) (focus-status dead inactive))) + (= (-> (the-as crimson-guard guard) traffic-target-status handle) (-> target-status handle)) ) - (set! (-> sv-192 sv-200) (the-as crimson-guard s2-3)) - (set! (-> sv-196 sv-200) (vector-vector-distance (-> (the-as crimson-guard s2-3) root-override2 trans) s5-0)) - (set! sv-200 (+ sv-200 1)) - (set! (-> (the-as crimson-guard s2-3) move-index) -1) + (set! (-> guards guard-idx) (the-as crimson-guard guard)) + (set! (-> guard-target-dists guard-idx) + (vector-vector-distance (-> (the-as crimson-guard guard) root-override2 trans) target-pos) + ) + (set! guard-idx (+ guard-idx 1)) + (set! (-> (the-as crimson-guard guard) move-index) -1) ) ) ) @@ -2362,32 +2366,32 @@ Process is recycled and moved to reserved, if it deactivates." (let ((a0-35 #t)) (while a0-35 (set! a0-35 #f) - (dotimes (v1-77 (+ sv-200 -1)) - (when (< (-> sv-196 (+ v1-77 1)) (-> sv-196 v1-77)) - (let ((a0-38 (-> sv-192 v1-77)) - (f0-2 (-> sv-196 v1-77)) + (dotimes (v1-77 (+ guard-idx -1)) + (when (< (-> guard-target-dists (+ v1-77 1)) (-> guard-target-dists v1-77)) + (let ((a0-38 (-> guards v1-77)) + (f0-2 (-> guard-target-dists v1-77)) ) - (set! (-> sv-192 v1-77) (-> sv-192 (+ v1-77 1))) - (set! (-> sv-192 (+ v1-77 1)) a0-38) - (set! (-> sv-196 v1-77) (-> sv-196 (+ v1-77 1))) - (set! (-> sv-196 (+ v1-77 1)) f0-2) + (set! (-> guards v1-77) (-> guards (+ v1-77 1))) + (set! (-> guards (+ v1-77 1)) a0-38) + (set! (-> guard-target-dists v1-77) (-> guard-target-dists (+ v1-77 1))) + (set! (-> guard-target-dists (+ v1-77 1)) f0-2) ) (set! a0-35 #t) ) ) ) ) - (dotimes (s4-1 sv-200) - (let ((s3-2 (-> (the-as (array crimson-guard) sv-192) s4-1))) - (when (= (-> s3-2 move-index) -1) + (dotimes (s4-1 guard-idx) + (let ((crimson-guard (-> (the-as (array crimson-guard) guards) s4-1))) + (when (= (-> crimson-guard move-index) -1) (set! sv-208 -1) - (set! sv-216 (gpr->fpr #x7f800000)) + (set! sv-216 (the-as float (gpr->fpr #x7f800000))) (dotimes (s2-4 (-> *guard-target-spots* length)) (when (= (-> *guard-status-spots* s2-4) 1) - (let* ((a0-53 (vector+! (new 'stack-no-clear 'vector) s5-0 (-> *guard-target-spots* s2-4))) - (f0-4 (vector-vector-distance a0-53 (-> s3-2 root-override2 trans))) + (let* ((a0-53 (vector+! (new 'stack-no-clear 'vector) target-pos (-> *guard-target-spots* s2-4))) + (f0-4 (vector-vector-distance a0-53 (-> crimson-guard root-override2 trans))) ) - (when (or (= sv-208 -1) (< f0-4 (the-as float (gpr->fpr sv-216)))) + (when (or (= sv-208 -1) (< f0-4 sv-216)) (set! sv-208 s2-4) (set! sv-216 f0-4) ) @@ -2397,10 +2401,10 @@ Process is recycled and moved to reserved, if it deactivates." (cond ((!= sv-208 -1) (set! (-> *guard-status-spots* sv-208) 0) - (vector+! (-> s3-2 move-position) s5-0 (-> *guard-target-spots* sv-208)) + (vector+! (-> crimson-guard move-position) target-pos (-> *guard-target-spots* sv-208)) ) (else - (set! (-> s3-2 move-position quad) (-> s5-0 quad)) + (set! (-> crimson-guard move-position quad) (-> target-pos quad)) ) ) ) @@ -2411,24 +2415,24 @@ Process is recycled and moved to reserved, if it deactivates." ) ) (else - (let ((s5-1 (handle->process (-> arg2 handle))) + (let ((s5-1 (handle->process (-> target-status handle))) (s3-3 (new 'stack-no-clear 'vector)) ) (when s5-1 (set! (-> s3-3 quad) (-> (get-trans (the-as process-focusable s5-1) 3) quad)) (cond ((= (-> s5-1 type) target) - (mem-copy! (the-as pointer arg2) (the-as pointer (-> obj alert-state target-status-array)) 80) + (mem-copy! (the-as pointer target-status) (the-as pointer (-> obj alert-state target-status-array)) 80) ) (else ) ) ) ) - (logclear! (-> arg2 flags) (traffic-target-flag updated)) + (logclear! (-> target-status flags) (traffic-target-flag updated)) ) ) - arg2 + target-status ) ) @@ -4047,7 +4051,3 @@ Process is recycled and moved to reserved, if it deactivates." 0 (none) ) - - - - diff --git a/test/decompiler/reference/jak2/levels/city/common/traffic-manager_REF.gc b/test/decompiler/reference/jak2/levels/city/common/traffic-manager_REF.gc index f440b0d9de..af4763b015 100644 --- a/test/decompiler/reference/jak2/levels/city/common/traffic-manager_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/traffic-manager_REF.gc @@ -452,7 +452,7 @@ (set! (-> s5-1 nav-mesh) #f) (set! (-> s5-1 nav-branch) #f) (set! (-> s5-1 proc) #f) - (set! (-> s5-1 handle) (the-as uint #f)) + (set! (-> s5-1 handle) (the-as handle #f)) (set! (-> s5-1 user-data) (the-as uint 0)) (set! (-> s5-1 flags) (the-as uint 2)) (set! (-> s5-1 guard-type) (the-as uint 7)) diff --git a/test/decompiler/reference/jak2/levels/city/common/transport_REF.gc b/test/decompiler/reference/jak2/levels/city/common/transport_REF.gc index 4e12a7f774..5b9deb07bc 100644 --- a/test/decompiler/reference/jak2/levels/city/common/transport_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/transport_REF.gc @@ -515,7 +515,7 @@ (set! (-> s5-0 nav-mesh) (-> obj nav-mesh)) (set! (-> s5-0 nav-branch) #f) (set! (-> s5-0 proc) #f) - (set! (-> s5-0 handle) (the-as uint (process->handle obj))) + (set! (-> s5-0 handle) (process->handle obj)) (set! (-> s5-0 user-data) (-> obj spawn-side)) (set! (-> s5-0 flags) (the-as uint 0)) (set! (-> s5-0 guard-type) (the-as uint 7)) diff --git a/test/decompiler/reference/jak2/levels/city/common/vehicle-guard_REF.gc b/test/decompiler/reference/jak2/levels/city/common/vehicle-guard_REF.gc index 8895d67606..14cf2d7b38 100644 --- a/test/decompiler/reference/jak2/levels/city/common/vehicle-guard_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/vehicle-guard_REF.gc @@ -966,7 +966,7 @@ (set! (-> a1-2 decay-rate) 0.0) (set! (-> a1-2 flags) (traffic-danger-flags tdf0)) (set! (-> a1-2 danger-type) (traffic-danger-type tdt6)) - (set! (-> a1-2 handle) (the-as uint #f)) + (set! (-> a1-2 handle) (the-as handle #f)) (add-danger (-> obj controller traffic) a1-2) ) ) @@ -1199,7 +1199,7 @@ ((9) (vehicle-method-128 obj) (set! (-> obj flags) (logior (rigid-body-object-flag persistent alert) (-> obj flags))) - (set! (-> obj pursuit-target) (the-as handle (-> arg0 handle))) + (set! (-> obj pursuit-target) (-> arg0 handle)) (go (method-of-object obj waiting-ambush)) ) (else diff --git a/test/decompiler/reference/jak2/levels/city/common/vehicle-rider_REF.gc b/test/decompiler/reference/jak2/levels/city/common/vehicle-rider_REF.gc index a6fc5b154c..7fc10fbf6f 100644 --- a/test/decompiler/reference/jak2/levels/city/common/vehicle-rider_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/vehicle-rider_REF.gc @@ -179,7 +179,7 @@ ) (set! (-> gp-0 nav-branch) #f) (set! (-> gp-0 proc) #f) - (set! (-> gp-0 handle) (the-as uint (process->handle (-> self parent-override 0)))) + (set! (-> gp-0 handle) (process->handle (-> self parent-override 0))) (set! (-> gp-0 user-data) (-> self draw seg-mask)) (set! (-> gp-0 flags) (the-as uint 0)) (set! (-> gp-0 guard-type) (the-as uint 7)) diff --git a/test/decompiler/reference/jak2/levels/city/misc/delivery/delivery-task_REF.gc b/test/decompiler/reference/jak2/levels/city/misc/delivery/delivery-task_REF.gc index aaa21a77d1..8b6375e0cf 100644 --- a/test/decompiler/reference/jak2/levels/city/misc/delivery/delivery-task_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/misc/delivery/delivery-task_REF.gc @@ -278,7 +278,7 @@ This commonly includes things such as: (set! (-> s5-0 nav-mesh) #f) (set! (-> s5-0 nav-branch) #f) (set! (-> s5-0 proc) #f) - (set! (-> s5-0 handle) (the-as uint (process->handle *target*))) + (set! (-> s5-0 handle) (process->handle *target*)) (set! (-> s5-0 user-data) (the-as uint 0)) (set! (-> s5-0 flags) (the-as uint 2)) (set! (-> s5-0 guard-type) (the-as uint 1)) @@ -351,7 +351,7 @@ This commonly includes things such as: (set! (-> s5-0 nav-mesh) #f) (set! (-> s5-0 nav-branch) #f) (set! (-> s5-0 proc) #f) - (set! (-> s5-0 handle) (the-as uint (process->handle *target*))) + (set! (-> s5-0 handle) (process->handle *target*)) (set! (-> s5-0 user-data) (the-as uint 0)) (set! (-> s5-0 flags) (the-as uint 2)) (set! (-> s5-0 guard-type) (the-as uint 1)) diff --git a/test/decompiler/reference/jak2/levels/common/guard-projectile_REF.gc b/test/decompiler/reference/jak2/levels/common/guard-projectile_REF.gc index 633cbe2ac6..0cfb9debdf 100644 --- a/test/decompiler/reference/jak2/levels/common/guard-projectile_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/guard-projectile_REF.gc @@ -588,7 +588,7 @@ (set! (-> v1-5 decay-rate) 0.0) (set! (-> v1-5 flags) (traffic-danger-flags tdf0)) (set! (-> v1-5 danger-type) (traffic-danger-type tdt0)) - (set! (-> v1-5 handle) (the-as uint #f)) + (set! (-> v1-5 handle) (the-as handle #f)) (send-event *traffic-manager* 'add-danger-sphere v1-5) ) ) diff --git a/test/offline/config/jak2/config.jsonc b/test/offline/config/jak2/config.jsonc index ddf2811315..8cb5702f55 100644 --- a/test/offline/config/jak2/config.jsonc +++ b/test/offline/config/jak2/config.jsonc @@ -299,7 +299,8 @@ "(method 11 pal-grind-ring-center)", // same thing defined twice "(method 49 traffic-engine)", // float stuff "(method 14 nav-graph)", - "target-pilot-init" + "target-pilot-init", + "(method 224 crimson-guard)" // .mula.s ], "skip_compile_states": {