diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index 4887d066c..96676ac4a 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -31757,7 +31757,7 @@ (temp-edge-list (inline-array mysql-nav-edge) :offset-assert 8) (level-node-index int32 :offset-assert 12) (cam-dist float :offset-assert 16) - (visible basic :offset-assert 20) + (visible symbol :offset-assert 20) (nav_node_id uint32 :offset-assert 24) (nav_graph_id uint32 :offset-assert 28) (position vector :inline :offset-assert 32) @@ -35842,7 +35842,6 @@ ;; hover-nav-edit ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype hover-nav-bsp-point (list-node) ((index int32 :offset-assert 8) (pos vector :inline :offset-assert 16) @@ -35851,9 +35850,7 @@ :size-assert #x20 :flag-assert #x900000020 ) -|# -#| (deftype hover-nav-bsp-node (structure) ((split-plane vector :inline :offset-assert 0) (point-list hover-nav-bsp-point :offset-assert 16) @@ -35864,13 +35861,11 @@ :size-assert #x1c :flag-assert #xb0000001c (:methods - (hover-nav-bsp-node-method-9 () none 9) - (hover-nav-bsp-node-method-10 () none 10) + (hover-nav-bsp-node-method-9 (_type_) none 9) + (hover-nav-bsp-node-method-10 (_type_ int) none 10) ) ) -|# -#| (deftype hover-nav-bsp (structure) ((root hover-nav-bsp-node :offset-assert 0) ) @@ -35878,16 +35873,15 @@ :size-assert #x4 :flag-assert #x900000004 ) -|# -;; (define-extern probe-for-clear-collision? function) -;; (define-extern hover-nav-graph-process-points function) -;; (define-extern hover-nav-graph-output function) -;; (define-extern *axes-table* array) -;; (define-extern *hover-bsp* object) -;; (define-extern hover-nav-graph-output-bsp function) -;; (define-extern hover-nav-network-build-bsp function) -;; (define-extern hover-nav-bsp-output function) +(define-extern probe-for-clear-collision? (function vector vector symbol)) +(define-extern hover-nav-graph-process-points (function none)) +(define-extern hover-nav-graph-output (function none)) +(define-extern *axes-table* (array vector)) +(define-extern *hover-bsp* hover-nav-bsp) +(define-extern hover-nav-graph-output-bsp (function hover-nav-bsp)) +(define-extern hover-nav-network-build-bsp (function hover-nav-bsp-node none)) +(define-extern hover-nav-bsp-output (function hover-nav-bsp none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; wasp-part ;; @@ -36050,9 +36044,8 @@ ;; forest-obs ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -#| (deftype forest-hover-manager (hover-enemy-manager) - ((transport-actor UNKNOWN 2 :offset-assert 164) + ((transport-actor entity-actor 2 :offset-assert 168) ) :method-count-assert 19 :size-assert #xb0 @@ -36060,19 +36053,18 @@ (:methods ) ) -|# -#| (deftype forest-youngsamos (process-focusable) - ((init-quat quaternion :inline :offset-assert 204) - (desired-pos vector :inline :offset-assert 220) - (hit-dir vector :inline :offset-assert 236) - (hit-points float :offset-assert 252) - (incoming-attack-id uint32 :offset-assert 256) - (falling? basic :offset-assert 260) - (focus-disable-timer uint64 :offset-assert 268) - (hud uint64 :offset-assert 276) - (sound-id uint32 :offset-assert 284) + ((root-override2 collide-shape-moving :offset 128 :score 999) + (init-quat quaternion :inline :offset-assert 208) + (desired-pos vector :inline :offset-assert 224) + (hit-dir vector :inline :offset-assert 240) + (hit-points float :offset-assert 256) + (incoming-attack-id uint32 :offset-assert 260) + (falling? basic :offset-assert 264) + (focus-disable-timer uint64 :offset-assert 272) + (hud handle :offset-assert 280) + (sound-id uint32 :offset-assert 288) ) :method-count-assert 31 :size-assert #x124 @@ -36084,14 +36076,13 @@ (dormant () _type_ :state 30) ) ) -|# -;; (define-extern *forest-protect-battle* array) -;; (define-extern forest-youngsamos-post function) -;; (define-extern forest-youngsamos-bounce-reaction function) -;; (define-extern forest-login function) -;; (define-extern forest-deactivate function) -;; (define-extern forest-activate function) +(define-extern *forest-protect-battle* (array hover-enemy-battle-command)) +(define-extern forest-youngsamos-post (function none :behavior forest-youngsamos)) +(define-extern forest-youngsamos-bounce-reaction (function control-info collide-query vector vector collide-status)) +(define-extern forest-login (function none)) +(define-extern forest-deactivate (function none)) +(define-extern forest-activate (function level none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; pegasus ;; @@ -45368,7 +45359,7 @@ (:methods (idle () _type_ :state 27) (stad-force-field-method-28 (_type_) none 28) - (stad-force-field-method-29 (_type_ vector) none 29)) + (stad-force-field-method-29 (_type_ touching-shapes-entry) int 29)) ) (deftype stad-c-force-field (stad-force-field) @@ -46877,27 +46868,6 @@ :flag-assert #x10003000b0 ) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; helldog ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -#| -(deftype helldog (hellcat) - ((current-level basic :offset-assert 1076) - ) - :method-count-assert 159 - :size-assert #x43c - :flag-assert #x9f03c0043c - (:methods - ) - ) -|# - -;; (define-extern *helldog-constants* object) -;; (define-extern *helldog-front-turret-control-info* object) -;; (define-extern *helldog-top-turret-control-info* object) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; gun-dummy ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -50961,6 +50931,24 @@ (define-extern *hellcat-constants* rigid-body-vehicle-constants) (define-extern *hellcat-front-turret-control-info* turret-control-info) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; helldog ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype helldog (hellcat) + ((current-level level :offset-assert 1080) + ) + :method-count-assert 159 + :size-assert #x43c + :flag-assert #x9f03c0043c + (:methods + ) + ) + +(define-extern *helldog-constants* rigid-body-vehicle-constants) +(define-extern *helldog-front-turret-control-info* turret-control-info) +(define-extern *helldog-top-turret-control-info* turret-control-info) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; test-bike ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/decompiler/config/jak2/anonymous_function_types.jsonc b/decompiler/config/jak2/anonymous_function_types.jsonc index b35737ce1..5b77501cb 100644 --- a/decompiler/config/jak2/anonymous_function_types.jsonc +++ b/decompiler/config/jak2/anonymous_function_types.jsonc @@ -1390,5 +1390,19 @@ [20, "(function object ashelin-tanker symbol)"], [21, "(function ashelin-tanker none)"], [22, "(function object ashelin-tanker symbol)"] + ], + "forest-obs": [ + [3, "(function none :behavior task-manager)"], + [4, "(function none :behavior task-manager)"], + [5, "(function none :behavior task-manager)"], + [6, "(function none :behavior task-manager)"] + ], + "helldog": [ + [0, "(function none :behavior task-manager)"], + [1, "(function none :behavior task-manager)"], + [2, "(function none :behavior task-manager)"], + [3, "(function none :behavior task-manager)"], + [4, "(function none :behavior task-manager)"], + [5, "(function none :behavior task-manager)"] ] } diff --git a/decompiler/config/jak2/label_types.jsonc b/decompiler/config/jak2/label_types.jsonc index 90dde6648..e99b94236 100644 --- a/decompiler/config/jak2/label_types.jsonc +++ b/decompiler/config/jak2/label_types.jsonc @@ -1679,5 +1679,7 @@ "race-mesh": [["L111", "(pointer rgba)", 16]], "racebike": [["L11", "vector"]], "race-manager": [["L459", "attack-info"]], - "palcab-obs": [["L146", "attack-info"]] + "palcab-obs": [["L146", "attack-info"]], + "forest-obs": [["L240", "(pointer int32)", 4]], + "helldog": [["L72", "vector"]] } diff --git a/decompiler/config/jak2/stack_structures.jsonc b/decompiler/config/jak2/stack_structures.jsonc index 99d1569bf..2a2ba676e 100644 --- a/decompiler/config/jak2/stack_structures.jsonc +++ b/decompiler/config/jak2/stack_structures.jsonc @@ -2198,7 +2198,10 @@ [80, "vector"] ], "(method 23 pal-rot-gun)": [[16, "projectile-init-by-other-params"]], - "(method 31 propa)": [ - [16, ["array", "collide-shape", 64]] + "(method 31 propa)": [[16, ["array", "collide-shape", 64]]], + "forest-youngsamos-bounce-reaction": [[16, ["array", "sound-name", 2]]], + "(method 29 stad-force-field)": [ + [144, "vector"], + [160, "vector"] ] } diff --git a/decompiler/config/jak2/type_casts.jsonc b/decompiler/config/jak2/type_casts.jsonc index f5067dc72..508fe79e8 100644 --- a/decompiler/config/jak2/type_casts.jsonc +++ b/decompiler/config/jak2/type_casts.jsonc @@ -10116,7 +10116,7 @@ [215, "v0", "city-lurker"], [174, "v0", "paddywagon"] ], - "(method 238 kid-escort)": [[[19, 79], "s5", "vehicle"]], + "(method 238 kid-escort)": [[[19, 79], "s5", "vehicle"]], "(method 78 kid-escort)": [[17, "a1", "art-joint-anim"]], "(method 97 kid-escort)": [[78, "s4", "process-focusable"]], "(method 74 kid-escort)": [ @@ -10532,16 +10532,37 @@ [[76, 84], "a0", "dma-packet"], [[85, 92], "v1", "dma-packet"] ], - "sprite-glow-add-sprite": [ - [[0, 33], "v1", "sprite-glow-cnt-template"] - ], + "sprite-glow-add-sprite": [[[0, 33], "v1", "sprite-glow-cnt-template"]], "sprite-glow-add-simple-sprite": [ [[0, 33], "v1", "sprite-glow-ref-template"] ], - "add-shader-to-dma": [ - [[6, 8], "v1", "(pointer uint32)"] + "add-shader-to-dma": [[[6, 8], "v1", "(pointer uint32)"]], + "(method 11 cty-guard-turret)": [[[100, 109], "v1", "handle"]], + "(event idle forest-youngsamos)": [ + [29, "s3", "process-focusable"], + [[32, 81], "s5", "attack-info"], + [60, "gp", "process-focusable"] ], - "(method 11 cty-guard-turret)" : [ - [[100, 109], "v1", "handle"] - ] + "(code idle forest-youngsamos)": [[14, "v1", "art-joint-anim"]], + "(code hit forest-youngsamos)": [ + [53, "v1", "art-joint-anim"], + [109, "v1", "art-joint-anim"], + [162, "v1", "art-joint-anim"] + ], + "(code die forest-youngsamos)": [ + [64, "v1", "art-joint-anim"], + [116, "v1", "art-joint-anim"] + ], + "(method 10 forest-youngsamos)": [ + [40, "t9", "(function process-focusable none)"] + ], + "forest-youngsamos-bounce-reaction": [[18, "v0", "(array sound-name)"]], + "defend-stadium-rift-rider-handler": [ + [96, "s4", "process-drawable"], + [97, "a1", "collide-shape"], + [57, "v1", "vector"] + ], + "(method 9 hover-nav-bsp-node)": [[[22, 28], "v1", "hover-nav-bsp-point"]], + "(method 0 hover-nav-bsp-node)": [[[6, 9], "v0", "hover-nav-bsp-node"]], + "(method 0 hover-nav-bsp-point)": [[[6, 8], "v0", "hover-nav-bsp-point"]] } diff --git a/decompiler/config/jak2_ntsc_v1.jsonc b/decompiler/config/jak2_ntsc_v1.jsonc index 144fd552c..27f7d35a6 100644 --- a/decompiler/config/jak2_ntsc_v1.jsonc +++ b/decompiler/config/jak2_ntsc_v1.jsonc @@ -8,7 +8,7 @@ // if you want to filter to only some object names. // it will make the decompiler much faster. "allowed_objects": [], - "banned_objects": ["hal", "tomb-beetle"], + "banned_objects": [], //////////////////////////// // CODE ANALYSIS OPTIONS diff --git a/goal_src/jak2/engine/debug/nav/mysql-nav-graph.gc b/goal_src/jak2/engine/debug/nav/mysql-nav-graph.gc index b879397a1..5924424be 100644 --- a/goal_src/jak2/engine/debug/nav/mysql-nav-graph.gc +++ b/goal_src/jak2/engine/debug/nav/mysql-nav-graph.gc @@ -89,7 +89,7 @@ (temp-edge-list (inline-array mysql-nav-edge) :offset-assert 8) (level-node-index int32 :offset-assert 12) (cam-dist float :offset-assert 16) - (visible basic :offset-assert 20) + (visible symbol :offset-assert 20) (nav_node_id uint32 :offset-assert 24) (nav_graph_id uint32 :offset-assert 28) (position vector :inline :offset-assert 32) diff --git a/goal_src/jak2/engine/game/task/task-control.gc b/goal_src/jak2/engine/game/task/task-control.gc index 0fb96351b..8253752d5 100644 --- a/goal_src/jak2/engine/game/task/task-control.gc +++ b/goal_src/jak2/engine/game/task/task-control.gc @@ -1827,7 +1827,7 @@ ) (defbehavior task-manager-init-by-other task-manager ((arg0 game-task-node-info) (arg1 symbol)) - (stack-size-set! (-> self main-thread) 1024) + (stack-size-set! (-> self main-thread) 2048) (add-connection *task-manager-engine* self nothing self arg0 #f) (set! (-> self node-info) arg0) (set! (-> self lev-name) arg1) diff --git a/goal_src/jak2/levels/forest/forest-obs.gc b/goal_src/jak2/levels/forest/forest-obs.gc index cc4c7ffa3..012c6e715 100644 --- a/goal_src/jak2/levels/forest/forest-obs.gc +++ b/goal_src/jak2/levels/forest/forest-obs.gc @@ -7,3 +7,1065 @@ ;; DECOMP BEGINS +(define *forest-protect-battle* + (new 'static 'boxed-array :type hover-enemy-battle-command + (new 'static 'hover-enemy-battle-command :command 'wait :time (seconds 20)) + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 30)) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 25)) + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 20)) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 20)) + ) + ) + +(deftype forest-hover-manager (hover-enemy-manager) + ((transport-actor entity-actor 2 :offset-assert 168) + ) + :heap-base #x30 + :method-count-assert 19 + :size-assert #xb0 + :flag-assert #x13003000b0 + ) + + +;; WARN: Return type mismatch object vs none. +(defmethod init-from-entity! forest-hover-manager ((obj forest-hover-manager) (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" + (set! (-> obj entity) arg0) + (hover-enemy-manager-init! obj *forest-protect-battle*) + (set! (-> obj transport-actor 0) (entity-actor-lookup arg0 'alt-actor 0)) + (set! (-> obj transport-actor 1) (entity-actor-lookup arg0 'alt-actor 1)) + (let ((t9-3 (method-of-type hover-formation-control new)) + (a0-4 'process) + (a1-4 hover-formation-control) + (a2-2 obj) + (t0-0 122880.0) + (t1-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> t1-0 x) 0.0) + (set! (-> t1-0 y) 24576.0) + (set! (-> t1-0 z) 61440.0) + (set! (-> t1-0 w) 1.0) + (let ((a3-0 arg0)) + (set! (-> obj formation) (t9-3 a0-4 a1-4 a2-2 a3-0 t0-0 t1-0 5461.3335 (the-as handle #f))) + (let ((v1-8 (logior (-> obj formation flags) 4)) + (a0-5 (-> obj formation)) + ) + (set! (-> a0-5 flags) v1-8) + (go (method-of-object obj spawning) a0-5 (the-as object a1-4) (the-as process a2-2) (the-as pointer a3-0)) + ) + ) + ) + (none) + ) + +(deftype forest-youngsamos (process-focusable) + ((root-override2 collide-shape-moving :offset 128) + (init-quat quaternion :inline :offset-assert 208) + (desired-pos vector :inline :offset-assert 224) + (hit-dir vector :inline :offset-assert 240) + (hit-points float :offset-assert 256) + (incoming-attack-id uint32 :offset-assert 260) + (falling? basic :offset-assert 264) + (focus-disable-timer uint64 :offset-assert 272) + (hud handle :offset-assert 280) + (sound-id uint32 :offset-assert 288) + ) + :heap-base #xb0 + :method-count-assert 31 + :size-assert #x124 + :flag-assert #x1f00b00124 + (:methods + (idle () _type_ :state 27) + (hit () _type_ :state 28) + (die () _type_ :state 29) + (dormant () _type_ :state 30) + ) + ) + + +(defskelgroup skel-forest-youngsamos youngsamos-highres youngsamos-highres-lod0-jg youngsamos-highres-idle-ja + ((youngsamos-highres-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 4) + :shadow youngsamos-highres-shadow-mg + ) + +(defbehavior forest-youngsamos-post forest-youngsamos () + (let ((a1-0 (new 'stack-no-clear 'collide-query))) + (find-ground (-> self root-override2) a1-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + ) + (let ((v1-3 (vector-! (new 'stack-no-clear 'vector) (-> self desired-pos) (-> self root-override2 trans)))) + (let ((a0-3 (-> self root-override2 transv))) + (if (not (-> self falling?)) + (vector+float*! a0-3 a0-3 v1-3 (* 3.0 (-> self clock seconds-per-frame))) + ) + ) + (vector-float*! (-> self root-override2 transv) (-> self root-override2 transv) 0.975) + (let ((gp-1 (vector-float*! (new 'stack-no-clear 'vector) v1-3 0.000024414063)) + (s4-0 (-> self init-quat)) + (s5-0 (-> self root-override2 quat)) + ) + (vector-inv-orient-by-quat! gp-1 gp-1 s4-0) + (quaternion-rotate-local-z! s5-0 s4-0 (* 8192.0 (-> gp-1 x))) + (quaternion-rotate-local-x! s5-0 s5-0 (* -8192.0 (-> gp-1 z))) + ) + ) + (if (-> self falling?) + (vector-v++! + (-> self root-override2 transv) + (compute-acc-due-to-gravity (-> self root-override2) (new-stack-vector0) 1.0) + ) + (spawn (-> self part) (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data 3))) + ) + (let ((gp-4 (-> self root-override2))) + (let ((a2-7 (new 'stack-no-clear 'collide-query))) + (set! (-> a2-7 collide-with) (-> gp-4 root-prim prim-core collide-with)) + (set! (-> a2-7 ignore-process0) self) + (set! (-> a2-7 ignore-process1) #f) + (set! (-> a2-7 ignore-pat) (-> gp-4 pat-ignore-mask)) + (set! (-> a2-7 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide gp-4 (-> gp-4 transv) a2-7 (meters 0)) + ) + (when (logtest? (-> gp-4 status) (collide-status touch-surface)) + (let ((f0-9 (fmax 0.0 (+ 1.0 (* -11.999999 (-> self clock seconds-per-frame)))))) + (vector-float*! (-> gp-4 transv) (-> gp-4 transv) f0-9) + ) + ) + ) + (when (and (nonzero? (-> self focus-disable-timer)) + (< (the-as time-frame (-> self focus-disable-timer)) (-> self clock frame-counter)) + ) + (logclear! (-> self focus-status) (focus-status disable)) + (set! (-> self focus-disable-timer) (the-as uint 0)) + 0 + ) + (let ((a0-20 *target*)) + (when (and a0-20 (< 614400.0 (vector-vector-distance (get-trans a0-20 0) (-> self root-override2 trans)))) + (let ((a1-19 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-19 from) (process->ppointer self)) + (set! (-> a1-19 num-params) 0) + (set! (-> a1-19 message) 'fail) + (let ((t9-11 send-event-function) + (v1-45 (-> *game-info* sub-task-list 200)) + ) + (t9-11 + (handle->process (if (-> v1-45 info) + (-> v1-45 info manager) + (the-as handle #f) + ) + ) + a1-19 + ) + ) + ) + (go-virtual dormant) + ) + ) + (set! (-> *game-info* bot-health 0) (* 0.11111111 (-> self hit-points))) + (transform-post) + (none) + ) + +(defstate idle (forest-youngsamos) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('touched) + (send-event proc 'touch (-> event param 0)) + ) + (('attack) + (let ((s4-0 *target*) + (s3-0 proc) + ) + (when (!= (if (type? s3-0 process-focusable) + (the-as process-focusable s3-0) + ) + s4-0 + ) + (let ((s5-1 (the-as attack-info (-> event param 1)))) + (case (-> s5-1 mode) + (('eco-red 'eco-yellow 'eco-blue 'eco-dark) + #f + ) + (else + (when (!= (-> s5-1 id) (-> self incoming-attack-id)) + (set! (-> self incoming-attack-id) (-> s5-1 id)) + (let ((v1-10 (if (type? proc process-focusable) + (the-as process-focusable proc) + ) + ) + ) + (cond + (v1-10 + (vector-! (-> self hit-dir) (-> self root-override2 trans) (-> v1-10 root-override trans)) + (vector-normalize! (-> self hit-dir) 1.0) + ) + ((logtest? (attack-info-mask attacker-velocity) (-> s5-1 mask)) + (vector-normalize-copy! (-> self hit-dir) (-> s5-1 attacker-velocity) 1.0) + ) + (else + (vector-reset! (-> self hit-dir)) + ) + ) + ) + (set! (-> self hit-points) (+ -1.0 (-> self hit-points))) + (if (>= 0.0 (-> self hit-points)) + (go-virtual die) + (go-virtual hit) + ) + ) + ) + ) + ) + ) + ) + ) + (('die-fast) + (cleanup-for-death self) + (go empty-state) + ) + ) + ) + :enter (behavior () + (set! (-> self falling?) #f) + (send-event (handle->process (-> self hud)) 'force-show) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (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!)) + ) + ) + #f + (none) + ) + :post (behavior () + (sound-play "samos-hover" :id (the-as sound-id (-> self sound-id))) + (forest-youngsamos-post) + (none) + ) + ) + +(defstate hit (forest-youngsamos) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('die-fast) + (cleanup-for-death self) + (go empty-state) + ) + ) + ) + :enter (behavior () + (sound-play "samos-impact") + (set! (-> self falling?) (the-as basic #t)) + (logior! (-> self focus-status) (focus-status disable)) + (set! (-> self focus-disable-timer) (the-as uint (+ (-> self clock frame-counter) (seconds 3.5)))) + (none) + ) + :code (behavior () + (set! (-> self root-override2 transv quad) (-> self hit-dir quad)) + (let ((f30-0 (rand-vu-float-range 0.0 1.0)) + (gp-0 (-> self root-override2 transv)) + ) + (vector-float*! gp-0 gp-0 (lerp 24576.0 65536.0 f30-0)) + (set! (-> gp-0 y) (lerp 20480.0 40960.0 f30-0)) + ) + (ja-channel-push! 1 (seconds 0.2)) + (let ((v1-5 + (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) (-> self hit-dir) (-> self root-override2 quat)) + ) + ) + (cond + ((< (-> v1-5 x) (-> v1-5 z)) + (ja-no-eval :group! (-> self draw art-group data 12) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 12)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ((< (-> v1-5 x) 0.0) + (ja-no-eval :group! (-> self draw art-group data 13) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 13)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 14) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 14)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + ) + (go-virtual idle) + (none) + ) + :post forest-youngsamos-post + ) + +(defstate die (forest-youngsamos) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('die-fast) + (cleanup-for-death self) + (go empty-state) + ) + ) + ) + :enter (behavior () + (set! (-> self falling?) (the-as basic #t)) + (none) + ) + :code (behavior () + (speech-control-method-12 *speech-control* self (speech-type speech-type-1 speech-type-3)) + (send-event *camera* 'change-target self) + (set! (-> self root-override2 transv quad) (-> self hit-dir quad)) + (let ((f30-0 (rand-vu-float-range 0.0 1.0)) + (gp-0 (-> self root-override2 transv)) + ) + (vector-float*! gp-0 gp-0 (lerp 24576.0 65536.0 f30-0)) + (set! (-> gp-0 y) (lerp 20480.0 40960.0 f30-0)) + ) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data 15) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 15)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (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))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((a1-10 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-10 from) (process->ppointer self)) + (set! (-> a1-10 num-params) 0) + (set! (-> a1-10 message) 'fail) + (let ((t9-12 send-event-function) + (v1-62 (-> *game-info* sub-task-list 200)) + ) + (t9-12 + (handle->process (if (-> v1-62 info) + (-> v1-62 info manager) + (the-as handle #f) + ) + ) + a1-10 + ) + ) + ) + (let ((gp-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-1) (seconds 2)) + (suspend) + ) + ) + (send-event *camera* 'change-target #f) + (cleanup-for-death self) + (none) + ) + :post forest-youngsamos-post + ) + +(defstate dormant (forest-youngsamos) + :virtual #t + :code (the-as (function none :behavior forest-youngsamos) sleep-code) + ) + +(defun forest-youngsamos-bounce-reaction ((arg0 control-info) (arg1 collide-query) (arg2 vector) (arg3 vector)) + (let ((s3-0 (new 'static 'array int32 4 0 0 0 0))) + (let ((t9-0 (method-of-type array new)) + (a0-1 (new 'stack-no-clear 'array 'sound-name 2)) + (a1-1 array) + (a2-1 sound-name) + (a3-1 2) + ) + (make-u128 #x316c6c (the-as uint #x61662d736f6d6173)) + (make-u128 #x326c6c (the-as uint #x61662d736f6d6173)) + (let ((v1-3 (the-as (array sound-name) (t9-0 (the-as symbol a0-1) a1-1 a2-1 a3-1)))) + (sound-play-by-name (-> v1-3 (-> s3-0 0)) (new-sound-id) 1024 0 0 (sound-group sfx) #t) + ) + ) + (+! (-> s3-0 0) 1) + ) + (cshape-reaction-update-state arg0 arg1 arg3) + (let ((f30-0 (vector-dot arg3 (-> arg0 surface-normal))) + (s2-1 (new 'stack-no-clear 'vector)) + ) + (vector-float*! s2-1 (-> arg0 surface-normal) (* f30-0 (rand-vu-float-range 1.6 2.2))) + (vector-! arg2 arg3 s2-1) + ) + (-> arg0 status) + ) + +(defmethod deactivate forest-youngsamos ((obj forest-youngsamos)) + (if (valid? (-> obj hud) (the-as type #f) (the-as symbol "") #t 0) + (send-event (handle->process (-> obj hud)) 'hide-and-die) + ) + (sound-stop (the-as sound-id (-> obj sound-id))) + ((the-as (function process-focusable none) (find-parent-method forest-youngsamos 10)) obj) + (none) + ) + +;; WARN: Return type mismatch object vs none. +(defmethod init-from-entity! forest-youngsamos ((obj forest-youngsamos) (arg0 entity-actor)) + "Typically the method that does the initial setup on the process, potentially using the [[entity-actor]] provided as part of that. +This commonly includes things such as: +- stack size +- collision information +- loading the skeleton group / bones +- sounds" + (let ((s4-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-others)))) + (set! (-> s4-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-0 reaction) forest-youngsamos-bounce-reaction) + (set! (-> s4-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s4-0 penetrated-by) (penetrate jak-yellow-shot jak-red-shot jak-blue-shot jak-dark-shot)) + (let ((s3-0 (new 'process 'collide-shape-prim-group s4-0 (the-as uint 3) 0))) + (set! (-> s4-0 total-prims) (the-as uint 4)) + (set! (-> s3-0 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> s3-0 prim-core collide-with) (collide-spec backgnd jak obstacle player-list)) + (set! (-> s3-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s3-0 local-sphere) 0.0 4505.6 0.0 5734.4) + (set! (-> s4-0 root-prim) s3-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak obstacle player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 2457.6 0.0 2457.6) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> v1-15 prim-core collide-with) (collide-spec backgnd jak obstacle player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid)) + (set-vector! (-> v1-15 local-sphere) 0.0 4505.6 0.0 2457.6) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> v1-17 prim-core collide-with) (collide-spec backgnd jak obstacle player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-17 local-sphere) 0.0 6553.6 0.0 2457.6) + ) + (set! (-> s4-0 nav-radius) 6144.0) + (let ((v1-19 (-> s4-0 root-prim))) + (set! (-> s4-0 backup-collide-as) (-> v1-19 prim-core collide-as)) + (set! (-> s4-0 backup-collide-with) (-> v1-19 prim-core collide-with)) + ) + (set! (-> s4-0 event-self) 'touched) + (set! (-> obj root-override2) s4-0) + ) + (set! (-> obj entity) arg0) + (process-drawable-from-entity! obj (-> obj entity)) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-forest-youngsamos" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (process-entity-status! obj (entity-perm-status no-kill) #t) + (set! (-> obj desired-pos quad) (-> obj root-override2 trans quad)) + (quaternion-copy! (-> obj init-quat) (-> obj root-override2 quat)) + (set! (-> obj desired-pos y) (+ 8192.0 (-> obj desired-pos y))) + (vector-reset! (-> obj hit-dir)) + (set! (-> obj hit-points) 9.0) + (set! (-> obj incoming-attack-id) (the-as uint -1)) + (vector-reset! (-> obj root-override2 transv)) + (set! (-> obj focus-disable-timer) (the-as uint 0)) + (set! (-> obj hud) (ppointer->handle (process-spawn hud-samos-young :init hud-init-by-other :to obj))) + (set! (-> obj sound-id) (the-as uint (new-sound-id))) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 494) obj)) + (go (method-of-object obj idle)) + (none) + ) + +(set-subtask-hook! + *game-info* + 200 + 0 + (the-as + (function object) + (lambda :behavior task-manager + () + (set-setting! 'airlock #f 0 0) + (set-setting! 'sound-mode #f 0 1) + (set-setting! 'sound-excitement 'abs #x3f4ccccd 0) + (set-setting! 'extra-bank '((forest2 forest4) (forest3 forest5)) 0 0) + (speech-control-method-10 + *speech-control* + 6 + (new 'static 'speech-type-info + :min-delay #x4b0 + :max-delay #x960 + :list (new 'static 'boxed-array :type string + "kg001" + "kg002" + "kg004" + "kg006" + "kg001a" + "kg013" + "kg016" + "kg018" + "kg019" + "kg023" + "kg024" + "kg002a" + "kg004a" + "kg078a" + "kg079a" + "kg080a" + "kg081a" + "kg004a" + "kg082a" + "kg083a" + "kg084a" + "kg085a" + "kg086a" + "kg087a" + "kg088a" + "kg091a" + "kg023a" + "kg006a" + "kg092a" + "kg093a" + "kg094a" + "kg095a" + "kg103a" + "kg104a" + "kg112a" + "kg024a" + "kg134" + "kg136" + "kg137" + "kg138" + "kg139" + "kg140" + "kg141" + "kg130" + "kg135" + "kg156" + "kg157" + ) + ) + ) + (speech-control-method-10 + *speech-control* + 9 + (new 'static 'speech-type-info + :priority #x9 + :max-delay #x12c + :list (new 'static 'boxed-array :type string + "kg133" + "kg137" + "kg142" + "kg144" + "kg145" + "kg146" + "kg147" + "kg148" + "kg149" + "kg150" + "kg138" + "kg151" + "kg152" + "kg153" + "kg154" + "kg155" + "kg159" + "kg163" + "kg164" + ) + ) + ) + (speech-control-method-10 + *speech-control* + 10 + (new 'static 'speech-type-info :priority #xa :max-delay #x12c :list (new 'static 'boxed-array :type string + "kg165" + "kg166" + "kg167" + "kg168" + "kg169" + "kg170" + "kg171" + "kg172" + "kg173" + "kg174" + "kg175" + "kg176" + ) + ) + ) + (none) + ) + ) + ) + +(set-subtask-hook! + *game-info* + 200 + 2 + (the-as (function object) (lambda :behavior task-manager + () + (if (!= (level-status *level* 'forestb) 'active) + (go-virtual fail) + ) + (none) + ) + ) + ) + +(set-subtask-hook! + *game-info* + 200 + 3 + (the-as (function object) (lambda :behavior task-manager + () + (set! (-> self start-time) (-> self clock frame-counter)) + (let ((gp-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-0) (seconds 0.5)) + (suspend) + ) + ) + (let ((s5-0 (entity-by-name "transport-level-1")) + (gp-1 (entity-by-name "transport-level-2")) + ) + (let ((s4-0 (entity-by-name "forest-hover-manager-1"))) + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) (process->ppointer self)) + (set! (-> a1-0 num-params) 1) + (set! (-> a1-0 message) 'spawn-time) + (set! (-> a1-0 param 0) (the-as uint 150)) + (let ((t9-3 send-event-function) + (v1-11 s5-0) + ) + (t9-3 + (if v1-11 + (-> v1-11 extra process) + ) + a1-0 + ) + ) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer self)) + (set! (-> a1-1 num-params) 1) + (set! (-> a1-1 message) 'spawn-time) + (set! (-> a1-1 param 0) (the-as uint 150)) + (let ((t9-4 send-event-function) + (v1-18 gp-1) + ) + (t9-4 + (if v1-18 + (-> v1-18 extra process) + ) + a1-1 + ) + ) + ) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer self)) + (set! (-> a1-2 num-params) 1) + (set! (-> a1-2 message) 'guards-alive) + (set! (-> a1-2 param 0) (the-as uint 0)) + (let ((t9-5 send-event-function) + (v1-24 s5-0) + ) + (t9-5 + (if v1-24 + (-> v1-24 extra process) + ) + a1-2 + ) + ) + ) + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) (process->ppointer self)) + (set! (-> a1-3 num-params) 1) + (set! (-> a1-3 message) 'guards-alive) + (set! (-> a1-3 param 0) (the-as uint 3)) + (let ((t9-6 send-event-function) + (v1-31 gp-1) + ) + (t9-6 + (if v1-31 + (-> v1-31 extra process) + ) + a1-3 + ) + ) + ) + (let ((s3-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s3-0) (seconds 15)) + (suspend) + ) + ) + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) (process->ppointer self)) + (set! (-> a1-4 num-params) 1) + (set! (-> a1-4 message) 'guards-alive) + (set! (-> a1-4 param 0) (the-as uint 3)) + (let ((t9-7 send-event-function) + (v1-43 s5-0) + ) + (t9-7 + (if v1-43 + (-> v1-43 extra process) + ) + a1-4 + ) + ) + ) + (let ((a1-5 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-5 from) (process->ppointer self)) + (set! (-> a1-5 num-params) 1) + (set! (-> a1-5 message) 'guards-alive) + (set! (-> a1-5 param 0) (the-as uint 0)) + (let ((t9-8 send-event-function) + (v1-49 gp-1) + ) + (t9-8 + (if v1-49 + (-> v1-49 extra process) + ) + a1-5 + ) + ) + ) + (dotimes (s3-1 3) + (let ((s2-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s2-0) (seconds 10)) + (suspend) + ) + ) + (let ((a1-6 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-6 from) (process->ppointer self)) + (set! (-> a1-6 num-params) 1) + (set! (-> a1-6 message) 'guards-alive) + (set! (-> a1-6 param 0) (the-as uint 0)) + (let ((t9-9 send-event-function) + (v1-60 s5-0) + ) + (t9-9 + (if v1-60 + (-> v1-60 extra process) + ) + a1-6 + ) + ) + ) + (let ((a1-7 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-7 from) (process->ppointer self)) + (set! (-> a1-7 num-params) 1) + (set! (-> a1-7 message) 'guards-alive) + (set! (-> a1-7 param 0) (the-as uint 4)) + (let ((t9-10 send-event-function) + (v1-67 gp-1) + ) + (t9-10 + (if v1-67 + (-> v1-67 extra process) + ) + a1-7 + ) + ) + ) + (let ((s2-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s2-1) (seconds 10)) + (suspend) + ) + ) + (let ((a1-8 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-8 from) (process->ppointer self)) + (set! (-> a1-8 num-params) 1) + (set! (-> a1-8 message) 'guards-alive) + (set! (-> a1-8 param 0) (the-as uint 4)) + (let ((t9-11 send-event-function) + (v1-79 s5-0) + ) + (t9-11 + (if v1-79 + (-> v1-79 extra process) + ) + a1-8 + ) + ) + ) + (let ((a1-9 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-9 from) (process->ppointer self)) + (set! (-> a1-9 num-params) 1) + (set! (-> a1-9 message) 'guards-alive) + (set! (-> a1-9 param 0) (the-as uint 0)) + (let ((t9-12 send-event-function) + (v1-85 gp-1) + ) + (t9-12 + (if v1-85 + (-> v1-85 extra process) + ) + a1-9 + ) + ) + ) + ) + (let ((s3-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s3-2) (seconds 10)) + (suspend) + ) + ) + (let ((a1-10 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-10 from) (process->ppointer self)) + (set! (-> a1-10 num-params) 1) + (set! (-> a1-10 message) 'guards-alive) + (set! (-> a1-10 param 0) (the-as uint 2)) + (let ((t9-13 send-event-function) + (v1-99 s5-0) + ) + (t9-13 + (if v1-99 + (-> v1-99 extra process) + ) + a1-10 + ) + ) + ) + (let ((a1-11 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-11 from) (process->ppointer self)) + (set! (-> a1-11 num-params) 1) + (set! (-> a1-11 message) 'guards-alive) + (set! (-> a1-11 param 0) (the-as uint 2)) + (let ((t9-14 send-event-function) + (v1-106 gp-1) + ) + (t9-14 + (if v1-106 + (-> v1-106 extra process) + ) + a1-11 + ) + ) + ) + (let ((s3-3 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s3-3) (seconds 10)) + (suspend) + ) + ) + (dotimes (s3-4 10) + (let ((v1-114 s4-0)) + (if (not (if v1-114 + (-> v1-114 extra process) + ) + ) + (goto cfg-74) + ) + ) + (let ((s2-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s2-2) (seconds 1)) + (suspend) + ) + ) + ) + (label cfg-74) + (let ((a1-12 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-12 from) (process->ppointer self)) + (set! (-> a1-12 num-params) 0) + (set! (-> a1-12 message) 'stop-spawning) + (let ((t9-15 send-event-function) + (v1-128 s5-0) + ) + (t9-15 + (if v1-128 + (-> v1-128 extra process) + ) + a1-12 + ) + ) + ) + (let ((a1-13 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-13 from) (process->ppointer self)) + (set! (-> a1-13 num-params) 0) + (set! (-> a1-13 message) 'stop-spawning) + (let ((t9-16 send-event-function) + (v1-133 gp-1) + ) + (t9-16 + (if v1-133 + (-> v1-133 extra process) + ) + a1-13 + ) + ) + ) + (while (let ((v1-141 s4-0)) + (or (if v1-141 + (-> v1-141 extra process) + ) + (let ((a1-14 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-14 from) (process->ppointer self)) + (set! (-> a1-14 num-params) 0) + (set! (-> a1-14 message) 'guards-alive-count) + (let ((t9-17 send-event-function) + (v1-146 s5-0) + ) + (> (the-as uint (t9-17 + (if v1-146 + (-> v1-146 extra process) + ) + a1-14 + ) + ) + 0 + ) + ) + ) + (let ((a1-15 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-15 from) (process->ppointer self)) + (set! (-> a1-15 num-params) 0) + (set! (-> a1-15 message) 'guards-alive-count) + (let ((t9-18 send-event-function) + (v1-151 gp-1) + ) + (> (the-as uint (t9-18 + (if v1-151 + (-> v1-151 extra process) + ) + a1-15 + ) + ) + 0 + ) + ) + ) + ) + ) + (let ((s3-5 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s3-5) (seconds 1)) + (suspend) + ) + ) + ) + ) + (let ((s4-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s4-1) (seconds 0.5)) + (suspend) + ) + ) + (set-setting! 'entity-name "camera-260" 0 0) + (set-setting! 'process-mask 'set 0 (process-mask movie enemy)) + (process-grab? *target* #f) + (let ((s4-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s4-2) (seconds 0.5)) + (suspend) + ) + ) + (send-event + (if s5-0 + (-> s5-0 extra process) + ) + 'leave + ) + (let ((s5-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s5-1) (seconds 0.2)) + (suspend) + ) + ) + (send-event + (if gp-1 + (-> gp-1 extra process) + ) + 'leave + ) + ) + (let ((gp-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-2) (seconds 3)) + (suspend) + ) + ) + (remove-setting! 'entity-name) + (remove-setting! 'process-mask) + (process-release? *target*) + (let ((gp-3 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-3) (seconds 3)) + (suspend) + ) + ) + (go-virtual complete) + (while *target* + (suspend) + ) + (go-virtual fail) + (none) + ) + ) + ) + +(set-subtask-hook! + *game-info* + 200 + 1 + (the-as (function object) (lambda :behavior task-manager + () + (let ((a0-1 (process-by-name "transport-level-1" *active-pool*))) + (if a0-1 + (send-event a0-1 'leave) + ) + ) + (let ((a0-3 (process-by-name "transport-level-2" *active-pool*))) + (if a0-3 + (send-event a0-3 'leave) + ) + ) + (speech-control-method-9 *speech-control*) + (none) + ) + ) + ) + +(defun forest-login () + (set! *nav-network* (new 'loading-level 'nav-network)) + (nav-network-method-9 *nav-network*) + 0 + (none) + ) + +(defun forest-deactivate () + (set! *nav-network* (the-as nav-network 0)) + 0 + (none) + ) + +(defun forest-activate ((arg0 level)) + (nav-network-method-10 *nav-network* arg0 *forest-adjacency*) + 0 + (none) + ) diff --git a/goal_src/jak2/levels/mars_tomb/tomb-beetle.gc b/goal_src/jak2/levels/mars_tomb/tomb-beetle.gc index 6ff2a2f67..0db4ed9bc 100644 --- a/goal_src/jak2/levels/mars_tomb/tomb-beetle.gc +++ b/goal_src/jak2/levels/mars_tomb/tomb-beetle.gc @@ -7,10 +7,10 @@ ;; DECOMP BEGINS -(defskelgroup skel-tomb-beetle tomb-beetle 0 -1 - ((1 (meters 999999))) +(defskelgroup skel-tomb-beetle tomb-beetle tomb-beetle-lod0-jg -1 + ((tomb-beetle-lod0-mg (meters 999999))) :bounds (static-spherem 0 0.6 0 2) - :shadow 2 + :shadow tomb-beetle-shadow-mg ) (deftype tomb-beetle-fly-info (structure) @@ -88,7 +88,35 @@ :proximity-notice-distance (meters 40) :default-hit-points 1 :gnd-collide-with (collide-spec backgnd) - :penetrate-knocked #x11fffdffa + :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 3) @@ -163,6 +191,8 @@ (set! (-> *tomb-beetle-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) (defmethod general-event-handler tomb-beetle ((obj tomb-beetle) (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 (new 'static 'array int64 2 -1 0))) (case arg2 @@ -339,8 +369,8 @@ :code (behavior () (ja-channel-push! 1 (seconds 0.1)) (until #f - (ja-no-eval :group! (-> self draw art-group data 3) - :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 3)) frames num-frames) -1))) + (ja-no-eval :group! tomb-beetle-falling-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-falling-ja) frames num-frames) -1))) :frame-num 0.0 ) (until (ja-done? 0) @@ -369,8 +399,8 @@ (none) ) :code (behavior () - (ja-no-eval :group! (-> self draw art-group data 4) - :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 4)) frames num-frames) -1))) + (ja-no-eval :group! tomb-beetle-land-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-land-ja) frames num-frames) -1))) :frame-num 0.0 ) (until (ja-done? 0) @@ -381,14 +411,14 @@ (s5-0 (the int (* 300.0 (rand-vu-float-range 1.1 2.3)))) (f30-1 (rand-vu-float-range 0.8 1.4)) ) - (ja-no-eval :group! (-> self draw art-group data 5) :num! (loop! f30-1) :frame-num 0.0) + (ja-no-eval :group! tomb-beetle-wiggle-ja :num! (loop! f30-1) :frame-num 0.0) (until (>= (- (-> self clock frame-counter) gp-0) s5-0) (suspend) (ja :num! (loop! f30-1)) ) ) - (ja-no-eval :group! (-> self draw art-group data 6) - :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 6)) frames num-frames) -1))) + (ja-no-eval :group! tomb-beetle-flip-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-flip-ja) frames num-frames) -1))) :frame-num 0.0 ) (until (ja-done? 0) @@ -455,11 +485,8 @@ (f30-0 (rand-vu-float-range 1.8 1.2)) ) (dotimes (s5-0 gp-0) - (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)) - f30-0 - ) + (ja-no-eval :group! tomb-beetle-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-run0-ja) frames num-frames) -1)) f30-0) :frame-num 0.0 ) (until (ja-done? 0) @@ -467,11 +494,8 @@ (ja :num! (seek! max f30-0)) ) ) - (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)) - f30-0 - ) + (ja-no-eval :group! tomb-beetle-run1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-run1-ja) frames num-frames) -1)) f30-0) :frame-num 0.0 ) (until (ja-done? 0) @@ -507,15 +531,15 @@ (none) ) :trans (behavior () - (if (>= (- (-> self clock frame-counter) (-> self state-time)) (the-as time-frame (-> self state-timeout))) + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (-> self state-timeout)) (go-virtual active) ) (none) ) :code (behavior () (until #f - (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))) + (ja-no-eval :group! tomb-beetle-stand0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-stand0-ja) frames num-frames) -1))) :frame-num 0.0 ) (until (ja-done? 0) @@ -533,7 +557,7 @@ :virtual #t :enter (behavior () (let ((s5-0 (-> self fly-info)) - (gp-0 (the-as (inline-array tomb-beetle-fly-info) (&-> self stack 544))) + (gp-0 (the-as (inline-array tomb-beetle-fly-info) (-> self fly-info 1))) ) (set! (-> s5-0 0 dst quad) (the-as uint128 (the-as vector (-> self root-override2 trans quad)))) (set! (-> gp-0 0 dst quad) (-> self entity extra trans quad)) @@ -567,14 +591,14 @@ ) :code (behavior () (set! (-> self state-timeout) - (the-as time-frame (+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 0.0 0.8))))) + (+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 0.0 0.8)))) ) (let ((v1-6 (ja-group))) (cond - ((and v1-6 (= v1-6 (-> self draw art-group data 9))) + ((and v1-6 (= v1-6 tomb-beetle-stand0-ja)) (ja-no-eval :num! (seek!)) (while (not (ja-done? 0)) - (if (>= (-> self clock frame-counter) (the-as time-frame (-> self state-timeout))) + (if (>= (-> self clock frame-counter) (-> self state-timeout)) (goto cfg-20) ) (suspend) @@ -587,12 +611,12 @@ ) ) (until #f - (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))) + (ja-no-eval :group! tomb-beetle-stand0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-stand0-ja) frames num-frames) -1))) :frame-num 0.0 ) (until (ja-done? 0) - (if (>= (-> self clock frame-counter) (the-as time-frame (-> self state-timeout))) + (if (>= (-> self clock frame-counter) (-> self state-timeout)) (goto cfg-20) ) (suspend) @@ -602,7 +626,7 @@ #f (label cfg-20) (ja-channel-push! 1 (seconds 0.075)) - (ja-no-eval :group! (-> self draw art-group data 10) :num! (seek! 6.0) :frame-num 0.0) + (ja-no-eval :group! tomb-beetle-fly-takeoff-ja :num! (seek! 6.0) :frame-num 0.0) (until (ja-done? 0) (suspend) (ja :num! (seek! 6.0)) @@ -614,8 +638,8 @@ (ja-eval) ) (until #f - (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))) + (ja-no-eval :group! tomb-beetle-fly-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-fly-ja) frames num-frames) -1))) :frame-num 0.0 ) (until (ja-done? 0) @@ -663,7 +687,7 @@ (quaternion-smooth-seek! (-> self root-override2 quat) (-> self root-override2 quat) - (the-as quaternion (&-> self stack 560)) + (-> self fly-info 1 dst-quat) (* 12.0 (-> self clock seconds-per-frame)) ) ) @@ -809,7 +833,7 @@ 0 (set! (-> self flying?) #f) (let ((s5-0 (-> self fly-info)) - (gp-0 (the-as (inline-array tomb-beetle-fly-info) (&-> self stack 544))) + (gp-0 (the-as (inline-array tomb-beetle-fly-info) (-> self fly-info 1))) ) (cond ((nonzero? (-> self actor-group-count)) @@ -878,8 +902,8 @@ (-> self fly-info (-> self dest-index) threshold) ) (when (= (-> self dest-index) 1) - (set! (-> self root-override2 trans quad) (-> (the-as vector (&-> self stack 544)) quad)) - (quaternion-copy! (-> self root-override2 quat) (the-as quaternion (&-> self stack 560))) + (set! (-> self root-override2 trans quad) (-> (the-as vector (-> self fly-info 1)) quad)) + (quaternion-copy! (-> self root-override2 quat) (-> self fly-info 1 dst-quat)) (go-virtual key) ) (set! (-> self speed) 81920.0) @@ -891,7 +915,7 @@ ) :code (behavior () (ja-channel-push! 1 (seconds 0.075)) - (ja-no-eval :group! (-> self draw art-group data 10) :num! (seek! 6.0) :frame-num 0.0) + (ja-no-eval :group! tomb-beetle-fly-takeoff-ja :num! (seek! 6.0) :frame-num 0.0) (until (ja-done? 0) (suspend) (ja :num! (seek! 6.0)) @@ -903,8 +927,8 @@ (ja-eval) ) (until #f - (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))) + (ja-no-eval :group! tomb-beetle-fly-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-fly-ja) frames num-frames) -1))) :frame-num 0.0 ) (until (ja-done? 0) @@ -981,8 +1005,8 @@ ) :trans (the-as (function none :behavior tomb-beetle) ja-post) :code (behavior () - (ja-no-eval :group! (-> self draw art-group data 12) - :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 12)) frames num-frames) -1))) + (ja-no-eval :group! tomb-beetle-fly-land-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-fly-land-ja) frames num-frames) -1))) :frame-num 0.0 ) (until (ja-done? 0) @@ -995,7 +1019,7 @@ ) (defmethod init-enemy-collision! tomb-beetle ((obj tomb-beetle)) - "@abstract" + "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) @@ -1043,7 +1067,7 @@ ) (defmethod init-enemy! tomb-beetle ((obj tomb-beetle)) - "@abstract" + "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-tomb-beetle" (the-as (pointer uint32) #f))) diff --git a/goal_src/jak2/levels/undefined/hal.gc b/goal_src/jak2/levels/undefined/hal.gc index daa817fa5..2ac011401 100644 --- a/goal_src/jak2/levels/undefined/hal.gc +++ b/goal_src/jak2/levels/undefined/hal.gc @@ -273,7 +273,7 @@ ) (defmethod init-enemy-collision! hal ((obj hal)) - "@abstract" + "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 hit-by-player)))) (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) (set! (-> s5-0 reaction) cshape-reaction-default) @@ -312,7 +312,7 @@ ) (defmethod init-enemy! hal ((obj hal)) - "@abstract" + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" (init! obj) (initialize-skeleton obj @@ -386,6 +386,8 @@ ;; WARN: Return type mismatch none vs object. (defmethod general-event-handler hal ((obj hal) (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" (the-as object (case arg2 diff --git a/test/decompiler/reference/jak2/engine/debug/nav/mysql-nav-graph_REF.gc b/test/decompiler/reference/jak2/engine/debug/nav/mysql-nav-graph_REF.gc index 4a9e132ff..bfbccae62 100644 --- a/test/decompiler/reference/jak2/engine/debug/nav/mysql-nav-graph_REF.gc +++ b/test/decompiler/reference/jak2/engine/debug/nav/mysql-nav-graph_REF.gc @@ -11,7 +11,7 @@ (temp-edge-list (inline-array mysql-nav-edge) :offset-assert 8) (level-node-index int32 :offset-assert 12) (cam-dist float :offset-assert 16) - (visible basic :offset-assert 20) + (visible symbol :offset-assert 20) (nav_node_id uint32 :offset-assert 24) (nav_graph_id uint32 :offset-assert 28) (position vector :inline :offset-assert 32) diff --git a/test/decompiler/reference/jak2/engine/game/idle-control_REF.gc b/test/decompiler/reference/jak2/engine/game/idle-control_REF.gc index 0eda21086..c6e4fd3e0 100644 --- a/test/decompiler/reference/jak2/engine/game/idle-control_REF.gc +++ b/test/decompiler/reference/jak2/engine/game/idle-control_REF.gc @@ -177,3 +177,7 @@ 0 (none) ) + + + + diff --git a/test/decompiler/reference/jak2/levels/city/common/nav-graph_REF.gc b/test/decompiler/reference/jak2/levels/city/common/nav-graph_REF.gc index 433d5d6c9..bd4ac35fd 100644 --- a/test/decompiler/reference/jak2/levels/city/common/nav-graph_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/nav-graph_REF.gc @@ -1469,3 +1469,7 @@ and patched at runtime after loading." ) (none) ) + + + + diff --git a/test/decompiler/reference/jak2/levels/forest/forest-obs_REF.gc b/test/decompiler/reference/jak2/levels/forest/forest-obs_REF.gc new file mode 100644 index 000000000..c45bc9730 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/forest/forest-obs_REF.gc @@ -0,0 +1,1126 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol *forest-protect-battle*, type (array hover-enemy-battle-command) +(define *forest-protect-battle* + (new 'static 'boxed-array :type hover-enemy-battle-command + (new 'static 'hover-enemy-battle-command :command 'wait :time (seconds 20)) + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 30)) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 25)) + (new 'static 'hover-enemy-battle-command :command 'spawn :time (seconds 20)) + (new 'static 'hover-enemy-battle-command :command 'spawn :wave #x2 :time (seconds 20)) + ) + ) + +;; definition of type forest-hover-manager +(deftype forest-hover-manager (hover-enemy-manager) + ((transport-actor entity-actor 2 :offset-assert 168) + ) + :heap-base #x30 + :method-count-assert 19 + :size-assert #xb0 + :flag-assert #x13003000b0 + ) + +;; definition for method 3 of type forest-hover-manager +(defmethod inspect forest-hover-manager ((obj forest-hover-manager)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type hover-enemy-manager inspect))) + (t9-0 obj) + ) + (format #t "~2Ttransport-actor[2] @ #x~X~%" (-> obj transport-actor)) + (label cfg-4) + obj + ) + +;; definition for method 11 of type forest-hover-manager +;; WARN: Return type mismatch object vs none. +(defmethod init-from-entity! forest-hover-manager ((obj forest-hover-manager) (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" + (set! (-> obj entity) arg0) + (hover-enemy-manager-init! obj *forest-protect-battle*) + (set! (-> obj transport-actor 0) (entity-actor-lookup arg0 'alt-actor 0)) + (set! (-> obj transport-actor 1) (entity-actor-lookup arg0 'alt-actor 1)) + (let ((t9-3 (method-of-type hover-formation-control new)) + (a0-4 'process) + (a1-4 hover-formation-control) + (a2-2 obj) + (t0-0 122880.0) + (t1-0 (new 'stack-no-clear 'vector)) + ) + (set! (-> t1-0 x) 0.0) + (set! (-> t1-0 y) 24576.0) + (set! (-> t1-0 z) 61440.0) + (set! (-> t1-0 w) 1.0) + (let ((a3-0 arg0)) + (set! (-> obj formation) (t9-3 a0-4 a1-4 a2-2 a3-0 t0-0 t1-0 5461.3335 (the-as handle #f))) + (let ((v1-8 (logior (-> obj formation flags) 4)) + (a0-5 (-> obj formation)) + ) + (set! (-> a0-5 flags) v1-8) + (go (method-of-object obj spawning) a0-5 (the-as object a1-4) (the-as process a2-2) (the-as pointer a3-0)) + ) + ) + ) + (none) + ) + +;; definition of type forest-youngsamos +(deftype forest-youngsamos (process-focusable) + ((root-override2 collide-shape-moving :offset 128) + (init-quat quaternion :inline :offset-assert 208) + (desired-pos vector :inline :offset-assert 224) + (hit-dir vector :inline :offset-assert 240) + (hit-points float :offset-assert 256) + (incoming-attack-id uint32 :offset-assert 260) + (falling? basic :offset-assert 264) + (focus-disable-timer uint64 :offset-assert 272) + (hud handle :offset-assert 280) + (sound-id uint32 :offset-assert 288) + ) + :heap-base #xb0 + :method-count-assert 31 + :size-assert #x124 + :flag-assert #x1f00b00124 + (:methods + (idle () _type_ :state 27) + (hit () _type_ :state 28) + (die () _type_ :state 29) + (dormant () _type_ :state 30) + ) + ) + +;; definition for method 3 of type forest-youngsamos +(defmethod inspect forest-youngsamos ((obj forest-youngsamos)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type process-focusable inspect))) + (t9-0 obj) + ) + (format #t "~2Tinit-quat: #~%" (-> obj init-quat)) + (format #t "~2Tdesired-pos: #~%" (-> obj desired-pos)) + (format #t "~2Thit-dir: #~%" (-> obj hit-dir)) + (format #t "~2Thit-points: ~f~%" (-> obj hit-points)) + (format #t "~2Tincoming-attack-id: ~D~%" (-> obj incoming-attack-id)) + (format #t "~2Tfalling?: ~A~%" (-> obj falling?)) + (format #t "~2Tfocus-disable-timer: ~D~%" (-> obj focus-disable-timer)) + (format #t "~2Thud: ~D~%" (-> obj hud)) + (format #t "~2Tsound-id: ~D~%" (-> obj sound-id)) + (label cfg-4) + obj + ) + +;; failed to figure out what this is: +(defskelgroup skel-forest-youngsamos youngsamos-highres youngsamos-highres-lod0-jg youngsamos-highres-idle-ja + ((youngsamos-highres-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0 0 4) + :shadow youngsamos-highres-shadow-mg + ) + +;; definition for function forest-youngsamos-post +;; INFO: Used lq/sq +;; WARN: Return type mismatch int vs none. +(defbehavior forest-youngsamos-post forest-youngsamos () + (let ((a1-0 (new 'stack-no-clear 'collide-query))) + (find-ground (-> self root-override2) a1-0 (collide-spec backgnd) 8192.0 81920.0 1024.0) + ) + (let ((v1-3 (vector-! (new 'stack-no-clear 'vector) (-> self desired-pos) (-> self root-override2 trans)))) + (let ((a0-3 (-> self root-override2 transv))) + (if (not (-> self falling?)) + (vector+float*! a0-3 a0-3 v1-3 (* 3.0 (-> self clock seconds-per-frame))) + ) + ) + (vector-float*! (-> self root-override2 transv) (-> self root-override2 transv) 0.975) + (let ((gp-1 (vector-float*! (new 'stack-no-clear 'vector) v1-3 0.000024414063)) + (s4-0 (-> self init-quat)) + (s5-0 (-> self root-override2 quat)) + ) + (vector-inv-orient-by-quat! gp-1 gp-1 s4-0) + (quaternion-rotate-local-z! s5-0 s4-0 (* 8192.0 (-> gp-1 x))) + (quaternion-rotate-local-x! s5-0 s5-0 (* -8192.0 (-> gp-1 z))) + ) + ) + (if (-> self falling?) + (vector-v++! + (-> self root-override2 transv) + (compute-acc-due-to-gravity (-> self root-override2) (new-stack-vector0) 1.0) + ) + (spawn (-> self part) (vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data 3))) + ) + (let ((gp-4 (-> self root-override2))) + (let ((a2-7 (new 'stack-no-clear 'collide-query))) + (set! (-> a2-7 collide-with) (-> gp-4 root-prim prim-core collide-with)) + (set! (-> a2-7 ignore-process0) self) + (set! (-> a2-7 ignore-process1) #f) + (set! (-> a2-7 ignore-pat) (-> gp-4 pat-ignore-mask)) + (set! (-> a2-7 action-mask) (collide-action solid)) + (fill-cache-integrate-and-collide gp-4 (-> gp-4 transv) a2-7 (meters 0)) + ) + (when (logtest? (-> gp-4 status) (collide-status touch-surface)) + (let ((f0-9 (fmax 0.0 (+ 1.0 (* -11.999999 (-> self clock seconds-per-frame)))))) + (vector-float*! (-> gp-4 transv) (-> gp-4 transv) f0-9) + ) + ) + ) + (when (and (nonzero? (-> self focus-disable-timer)) + (< (the-as time-frame (-> self focus-disable-timer)) (-> self clock frame-counter)) + ) + (logclear! (-> self focus-status) (focus-status disable)) + (set! (-> self focus-disable-timer) (the-as uint 0)) + 0 + ) + (let ((a0-20 *target*)) + (when (and a0-20 (< 614400.0 (vector-vector-distance (get-trans a0-20 0) (-> self root-override2 trans)))) + (let ((a1-19 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-19 from) (process->ppointer self)) + (set! (-> a1-19 num-params) 0) + (set! (-> a1-19 message) 'fail) + (let ((t9-11 send-event-function) + (v1-45 (-> *game-info* sub-task-list 200)) + ) + (t9-11 + (handle->process (if (-> v1-45 info) + (-> v1-45 info manager) + (the-as handle #f) + ) + ) + a1-19 + ) + ) + ) + (go-virtual dormant) + ) + ) + (set! (-> *game-info* bot-health 0) (* 0.11111111 (-> self hit-points))) + (transform-post) + (none) + ) + +;; failed to figure out what this is: +(defstate idle (forest-youngsamos) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('touched) + (send-event proc 'touch (-> event param 0)) + ) + (('attack) + (let ((s4-0 *target*) + (s3-0 proc) + ) + (when (!= (if (type? s3-0 process-focusable) + (the-as process-focusable s3-0) + ) + s4-0 + ) + (let ((s5-1 (the-as attack-info (-> event param 1)))) + (case (-> s5-1 mode) + (('eco-red 'eco-yellow 'eco-blue 'eco-dark) + #f + ) + (else + (when (!= (-> s5-1 id) (-> self incoming-attack-id)) + (set! (-> self incoming-attack-id) (-> s5-1 id)) + (let ((v1-10 (if (type? proc process-focusable) + (the-as process-focusable proc) + ) + ) + ) + (cond + (v1-10 + (vector-! (-> self hit-dir) (-> self root-override2 trans) (-> v1-10 root-override trans)) + (vector-normalize! (-> self hit-dir) 1.0) + ) + ((logtest? (attack-info-mask attacker-velocity) (-> s5-1 mask)) + (vector-normalize-copy! (-> self hit-dir) (-> s5-1 attacker-velocity) 1.0) + ) + (else + (vector-reset! (-> self hit-dir)) + ) + ) + ) + (set! (-> self hit-points) (+ -1.0 (-> self hit-points))) + (if (>= 0.0 (-> self hit-points)) + (go-virtual die) + (go-virtual hit) + ) + ) + ) + ) + ) + ) + ) + ) + (('die-fast) + (cleanup-for-death self) + (go empty-state) + ) + ) + ) + :enter (behavior () + (set! (-> self falling?) #f) + (send-event (handle->process (-> self hud)) 'force-show) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.2)) + (until #f + (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!)) + ) + ) + #f + (none) + ) + :post (behavior () + (sound-play "samos-hover" :id (the-as sound-id (-> self sound-id))) + (forest-youngsamos-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate hit (forest-youngsamos) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('die-fast) + (cleanup-for-death self) + (go empty-state) + ) + ) + ) + :enter (behavior () + (sound-play "samos-impact") + (set! (-> self falling?) (the-as basic #t)) + (logior! (-> self focus-status) (focus-status disable)) + (set! (-> self focus-disable-timer) (the-as uint (+ (-> self clock frame-counter) (seconds 3.5)))) + (none) + ) + :code (behavior () + (set! (-> self root-override2 transv quad) (-> self hit-dir quad)) + (let ((f30-0 (rand-vu-float-range 0.0 1.0)) + (gp-0 (-> self root-override2 transv)) + ) + (vector-float*! gp-0 gp-0 (lerp 24576.0 65536.0 f30-0)) + (set! (-> gp-0 y) (lerp 20480.0 40960.0 f30-0)) + ) + (ja-channel-push! 1 (seconds 0.2)) + (let ((v1-5 + (vector-inv-orient-by-quat! (new 'stack-no-clear 'vector) (-> self hit-dir) (-> self root-override2 quat)) + ) + ) + (cond + ((< (-> v1-5 x) (-> v1-5 z)) + (ja-no-eval :group! (-> self draw art-group data 12) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 12)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ((< (-> v1-5 x) 0.0) + (ja-no-eval :group! (-> self draw art-group data 13) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 13)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + (else + (ja-no-eval :group! (-> self draw art-group data 14) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 14)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + ) + ) + (go-virtual idle) + (none) + ) + :post forest-youngsamos-post + ) + +;; failed to figure out what this is: +(defstate die (forest-youngsamos) + :virtual #t + :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) + (case event-type + (('die-fast) + (cleanup-for-death self) + (go empty-state) + ) + ) + ) + :enter (behavior () + (set! (-> self falling?) (the-as basic #t)) + (none) + ) + :code (behavior () + (speech-control-method-12 *speech-control* self (speech-type speech-type-1 speech-type-3)) + (send-event *camera* 'change-target self) + (set! (-> self root-override2 transv quad) (-> self hit-dir quad)) + (let ((f30-0 (rand-vu-float-range 0.0 1.0)) + (gp-0 (-> self root-override2 transv)) + ) + (vector-float*! gp-0 gp-0 (lerp 24576.0 65536.0 f30-0)) + (set! (-> gp-0 y) (lerp 20480.0 40960.0 f30-0)) + ) + (ja-channel-push! 1 (seconds 0.2)) + (ja-no-eval :group! (-> self draw art-group data 15) + :num! (seek! (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 15)) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (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))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((a1-10 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-10 from) (process->ppointer self)) + (set! (-> a1-10 num-params) 0) + (set! (-> a1-10 message) 'fail) + (let ((t9-12 send-event-function) + (v1-62 (-> *game-info* sub-task-list 200)) + ) + (t9-12 + (handle->process (if (-> v1-62 info) + (-> v1-62 info manager) + (the-as handle #f) + ) + ) + a1-10 + ) + ) + ) + (let ((gp-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-1) (seconds 2)) + (suspend) + ) + ) + (send-event *camera* 'change-target #f) + (cleanup-for-death self) + (none) + ) + :post forest-youngsamos-post + ) + +;; failed to figure out what this is: +(defstate dormant (forest-youngsamos) + :virtual #t + :code (the-as (function none :behavior forest-youngsamos) sleep-code) + ) + +;; definition for function forest-youngsamos-bounce-reaction +;; INFO: Used lq/sq +(defun forest-youngsamos-bounce-reaction ((arg0 control-info) (arg1 collide-query) (arg2 vector) (arg3 vector)) + (let ((s3-0 (new 'static 'array int32 4 0 0 0 0))) + (let ((t9-0 (method-of-type array new)) + (a0-1 (new 'stack-no-clear 'array 'sound-name 2)) + (a1-1 array) + (a2-1 sound-name) + (a3-1 2) + ) + (make-u128 #x316c6c (the-as uint #x61662d736f6d6173)) + (make-u128 #x326c6c (the-as uint #x61662d736f6d6173)) + (let ((v1-3 (the-as (array sound-name) (t9-0 (the-as symbol a0-1) a1-1 a2-1 a3-1)))) + (sound-play-by-name (-> v1-3 (-> s3-0 0)) (new-sound-id) 1024 0 0 (sound-group sfx) #t) + ) + ) + (+! (-> s3-0 0) 1) + ) + (cshape-reaction-update-state arg0 arg1 arg3) + (let ((f30-0 (vector-dot arg3 (-> arg0 surface-normal))) + (s2-1 (new 'stack-no-clear 'vector)) + ) + (vector-float*! s2-1 (-> arg0 surface-normal) (* f30-0 (rand-vu-float-range 1.6 2.2))) + (vector-! arg2 arg3 s2-1) + ) + (-> arg0 status) + ) + +;; definition for method 10 of type forest-youngsamos +(defmethod deactivate forest-youngsamos ((obj forest-youngsamos)) + (if (valid? (-> obj hud) (the-as type #f) (the-as symbol "") #t 0) + (send-event (handle->process (-> obj hud)) 'hide-and-die) + ) + (sound-stop (the-as sound-id (-> obj sound-id))) + ((the-as (function process-focusable none) (find-parent-method forest-youngsamos 10)) obj) + (none) + ) + +;; definition for method 11 of type forest-youngsamos +;; INFO: Used lq/sq +;; WARN: Return type mismatch object vs none. +(defmethod init-from-entity! forest-youngsamos ((obj forest-youngsamos) (arg0 entity-actor)) + "Typically the method that does the initial setup on the process, potentially using the [[entity-actor]] provided as part of that. +This commonly includes things such as: +- stack size +- collision information +- loading the skeleton group / bones +- sounds" + (let ((s4-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-others)))) + (set! (-> s4-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-0 reaction) forest-youngsamos-bounce-reaction) + (set! (-> s4-0 no-reaction) + (the-as (function collide-shape-moving collide-query vector vector object) nothing) + ) + (set! (-> s4-0 penetrated-by) (penetrate jak-yellow-shot jak-red-shot jak-blue-shot jak-dark-shot)) + (let ((s3-0 (new 'process 'collide-shape-prim-group s4-0 (the-as uint 3) 0))) + (set! (-> s4-0 total-prims) (the-as uint 4)) + (set! (-> s3-0 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> s3-0 prim-core collide-with) (collide-spec backgnd jak obstacle player-list)) + (set! (-> s3-0 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> s3-0 local-sphere) 0.0 4505.6 0.0 5734.4) + (set! (-> s4-0 root-prim) s3-0) + ) + (let ((v1-13 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0)))) + (set! (-> v1-13 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> v1-13 prim-core collide-with) (collide-spec backgnd jak obstacle player-list)) + (set! (-> v1-13 prim-core action) (collide-action solid)) + (set-vector! (-> v1-13 local-sphere) 0.0 2457.6 0.0 2457.6) + ) + (let ((v1-15 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0)))) + (set! (-> v1-15 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> v1-15 prim-core collide-with) (collide-spec backgnd jak obstacle player-list)) + (set! (-> v1-15 prim-core action) (collide-action solid)) + (set-vector! (-> v1-15 local-sphere) 0.0 4505.6 0.0 2457.6) + ) + (let ((v1-17 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0)))) + (set! (-> v1-17 prim-core collide-as) (collide-spec bot camera-blocker)) + (set! (-> v1-17 prim-core collide-with) (collide-spec backgnd jak obstacle player-list)) + (set! (-> v1-17 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-17 local-sphere) 0.0 6553.6 0.0 2457.6) + ) + (set! (-> s4-0 nav-radius) 6144.0) + (let ((v1-19 (-> s4-0 root-prim))) + (set! (-> s4-0 backup-collide-as) (-> v1-19 prim-core collide-as)) + (set! (-> s4-0 backup-collide-with) (-> v1-19 prim-core collide-with)) + ) + (set! (-> s4-0 event-self) 'touched) + (set! (-> obj root-override2) s4-0) + ) + (set! (-> obj entity) arg0) + (process-drawable-from-entity! obj (-> obj entity)) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-forest-youngsamos" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (process-entity-status! obj (entity-perm-status no-kill) #t) + (set! (-> obj desired-pos quad) (-> obj root-override2 trans quad)) + (quaternion-copy! (-> obj init-quat) (-> obj root-override2 quat)) + (set! (-> obj desired-pos y) (+ 8192.0 (-> obj desired-pos y))) + (vector-reset! (-> obj hit-dir)) + (set! (-> obj hit-points) 9.0) + (set! (-> obj incoming-attack-id) (the-as uint -1)) + (vector-reset! (-> obj root-override2 transv)) + (set! (-> obj focus-disable-timer) (the-as uint 0)) + (set! (-> obj hud) (ppointer->handle (process-spawn hud-samos-young :init hud-init-by-other :to obj))) + (set! (-> obj sound-id) (the-as uint (new-sound-id))) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 494) obj)) + (go (method-of-object obj idle)) + (none) + ) + +;; failed to figure out what this is: +(set-subtask-hook! + *game-info* + 200 + 0 + (the-as + (function object) + (lambda :behavior task-manager + () + (set-setting! 'airlock #f 0 0) + (set-setting! 'sound-mode #f 0 1) + (set-setting! 'sound-excitement 'abs #x3f4ccccd 0) + (set-setting! 'extra-bank '((forest2 forest4) (forest3 forest5)) 0 0) + (speech-control-method-10 + *speech-control* + 6 + (new 'static 'speech-type-info + :min-delay #x4b0 + :max-delay #x960 + :list (new 'static 'boxed-array :type string + "kg001" + "kg002" + "kg004" + "kg006" + "kg001a" + "kg013" + "kg016" + "kg018" + "kg019" + "kg023" + "kg024" + "kg002a" + "kg004a" + "kg078a" + "kg079a" + "kg080a" + "kg081a" + "kg004a" + "kg082a" + "kg083a" + "kg084a" + "kg085a" + "kg086a" + "kg087a" + "kg088a" + "kg091a" + "kg023a" + "kg006a" + "kg092a" + "kg093a" + "kg094a" + "kg095a" + "kg103a" + "kg104a" + "kg112a" + "kg024a" + "kg134" + "kg136" + "kg137" + "kg138" + "kg139" + "kg140" + "kg141" + "kg130" + "kg135" + "kg156" + "kg157" + ) + ) + ) + (speech-control-method-10 + *speech-control* + 9 + (new 'static 'speech-type-info + :priority #x9 + :max-delay #x12c + :list (new 'static 'boxed-array :type string + "kg133" + "kg137" + "kg142" + "kg144" + "kg145" + "kg146" + "kg147" + "kg148" + "kg149" + "kg150" + "kg138" + "kg151" + "kg152" + "kg153" + "kg154" + "kg155" + "kg159" + "kg163" + "kg164" + ) + ) + ) + (speech-control-method-10 + *speech-control* + 10 + (new 'static 'speech-type-info :priority #xa :max-delay #x12c :list (new 'static 'boxed-array :type string + "kg165" + "kg166" + "kg167" + "kg168" + "kg169" + "kg170" + "kg171" + "kg172" + "kg173" + "kg174" + "kg175" + "kg176" + ) + ) + ) + (none) + ) + ) + ) + +;; failed to figure out what this is: +(set-subtask-hook! + *game-info* + 200 + 2 + (the-as (function object) (lambda :behavior task-manager + () + (if (!= (level-status *level* 'forestb) 'active) + (go-virtual fail) + ) + (none) + ) + ) + ) + +;; failed to figure out what this is: +(set-subtask-hook! + *game-info* + 200 + 3 + (the-as (function object) (lambda :behavior task-manager + () + (set! (-> self start-time) (-> self clock frame-counter)) + (let ((gp-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-0) (seconds 0.5)) + (suspend) + ) + ) + (let ((s5-0 (entity-by-name "transport-level-1")) + (gp-1 (entity-by-name "transport-level-2")) + ) + (let ((s4-0 (entity-by-name "forest-hover-manager-1"))) + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) (process->ppointer self)) + (set! (-> a1-0 num-params) 1) + (set! (-> a1-0 message) 'spawn-time) + (set! (-> a1-0 param 0) (the-as uint 150)) + (let ((t9-3 send-event-function) + (v1-11 s5-0) + ) + (t9-3 + (if v1-11 + (-> v1-11 extra process) + ) + a1-0 + ) + ) + ) + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer self)) + (set! (-> a1-1 num-params) 1) + (set! (-> a1-1 message) 'spawn-time) + (set! (-> a1-1 param 0) (the-as uint 150)) + (let ((t9-4 send-event-function) + (v1-18 gp-1) + ) + (t9-4 + (if v1-18 + (-> v1-18 extra process) + ) + a1-1 + ) + ) + ) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer self)) + (set! (-> a1-2 num-params) 1) + (set! (-> a1-2 message) 'guards-alive) + (set! (-> a1-2 param 0) (the-as uint 0)) + (let ((t9-5 send-event-function) + (v1-24 s5-0) + ) + (t9-5 + (if v1-24 + (-> v1-24 extra process) + ) + a1-2 + ) + ) + ) + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) (process->ppointer self)) + (set! (-> a1-3 num-params) 1) + (set! (-> a1-3 message) 'guards-alive) + (set! (-> a1-3 param 0) (the-as uint 3)) + (let ((t9-6 send-event-function) + (v1-31 gp-1) + ) + (t9-6 + (if v1-31 + (-> v1-31 extra process) + ) + a1-3 + ) + ) + ) + (let ((s3-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s3-0) (seconds 15)) + (suspend) + ) + ) + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) (process->ppointer self)) + (set! (-> a1-4 num-params) 1) + (set! (-> a1-4 message) 'guards-alive) + (set! (-> a1-4 param 0) (the-as uint 3)) + (let ((t9-7 send-event-function) + (v1-43 s5-0) + ) + (t9-7 + (if v1-43 + (-> v1-43 extra process) + ) + a1-4 + ) + ) + ) + (let ((a1-5 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-5 from) (process->ppointer self)) + (set! (-> a1-5 num-params) 1) + (set! (-> a1-5 message) 'guards-alive) + (set! (-> a1-5 param 0) (the-as uint 0)) + (let ((t9-8 send-event-function) + (v1-49 gp-1) + ) + (t9-8 + (if v1-49 + (-> v1-49 extra process) + ) + a1-5 + ) + ) + ) + (dotimes (s3-1 3) + (let ((s2-0 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s2-0) (seconds 10)) + (suspend) + ) + ) + (let ((a1-6 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-6 from) (process->ppointer self)) + (set! (-> a1-6 num-params) 1) + (set! (-> a1-6 message) 'guards-alive) + (set! (-> a1-6 param 0) (the-as uint 0)) + (let ((t9-9 send-event-function) + (v1-60 s5-0) + ) + (t9-9 + (if v1-60 + (-> v1-60 extra process) + ) + a1-6 + ) + ) + ) + (let ((a1-7 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-7 from) (process->ppointer self)) + (set! (-> a1-7 num-params) 1) + (set! (-> a1-7 message) 'guards-alive) + (set! (-> a1-7 param 0) (the-as uint 4)) + (let ((t9-10 send-event-function) + (v1-67 gp-1) + ) + (t9-10 + (if v1-67 + (-> v1-67 extra process) + ) + a1-7 + ) + ) + ) + (let ((s2-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s2-1) (seconds 10)) + (suspend) + ) + ) + (let ((a1-8 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-8 from) (process->ppointer self)) + (set! (-> a1-8 num-params) 1) + (set! (-> a1-8 message) 'guards-alive) + (set! (-> a1-8 param 0) (the-as uint 4)) + (let ((t9-11 send-event-function) + (v1-79 s5-0) + ) + (t9-11 + (if v1-79 + (-> v1-79 extra process) + ) + a1-8 + ) + ) + ) + (let ((a1-9 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-9 from) (process->ppointer self)) + (set! (-> a1-9 num-params) 1) + (set! (-> a1-9 message) 'guards-alive) + (set! (-> a1-9 param 0) (the-as uint 0)) + (let ((t9-12 send-event-function) + (v1-85 gp-1) + ) + (t9-12 + (if v1-85 + (-> v1-85 extra process) + ) + a1-9 + ) + ) + ) + ) + (let ((s3-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s3-2) (seconds 10)) + (suspend) + ) + ) + (let ((a1-10 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-10 from) (process->ppointer self)) + (set! (-> a1-10 num-params) 1) + (set! (-> a1-10 message) 'guards-alive) + (set! (-> a1-10 param 0) (the-as uint 2)) + (let ((t9-13 send-event-function) + (v1-99 s5-0) + ) + (t9-13 + (if v1-99 + (-> v1-99 extra process) + ) + a1-10 + ) + ) + ) + (let ((a1-11 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-11 from) (process->ppointer self)) + (set! (-> a1-11 num-params) 1) + (set! (-> a1-11 message) 'guards-alive) + (set! (-> a1-11 param 0) (the-as uint 2)) + (let ((t9-14 send-event-function) + (v1-106 gp-1) + ) + (t9-14 + (if v1-106 + (-> v1-106 extra process) + ) + a1-11 + ) + ) + ) + (let ((s3-3 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s3-3) (seconds 10)) + (suspend) + ) + ) + (dotimes (s3-4 10) + (let ((v1-114 s4-0)) + (if (not (if v1-114 + (-> v1-114 extra process) + ) + ) + (goto cfg-74) + ) + ) + (let ((s2-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s2-2) (seconds 1)) + (suspend) + ) + ) + ) + (label cfg-74) + (let ((a1-12 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-12 from) (process->ppointer self)) + (set! (-> a1-12 num-params) 0) + (set! (-> a1-12 message) 'stop-spawning) + (let ((t9-15 send-event-function) + (v1-128 s5-0) + ) + (t9-15 + (if v1-128 + (-> v1-128 extra process) + ) + a1-12 + ) + ) + ) + (let ((a1-13 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-13 from) (process->ppointer self)) + (set! (-> a1-13 num-params) 0) + (set! (-> a1-13 message) 'stop-spawning) + (let ((t9-16 send-event-function) + (v1-133 gp-1) + ) + (t9-16 + (if v1-133 + (-> v1-133 extra process) + ) + a1-13 + ) + ) + ) + (while (let ((v1-141 s4-0)) + (or (if v1-141 + (-> v1-141 extra process) + ) + (let ((a1-14 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-14 from) (process->ppointer self)) + (set! (-> a1-14 num-params) 0) + (set! (-> a1-14 message) 'guards-alive-count) + (let ((t9-17 send-event-function) + (v1-146 s5-0) + ) + (> (the-as uint (t9-17 + (if v1-146 + (-> v1-146 extra process) + ) + a1-14 + ) + ) + 0 + ) + ) + ) + (let ((a1-15 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-15 from) (process->ppointer self)) + (set! (-> a1-15 num-params) 0) + (set! (-> a1-15 message) 'guards-alive-count) + (let ((t9-18 send-event-function) + (v1-151 gp-1) + ) + (> (the-as uint (t9-18 + (if v1-151 + (-> v1-151 extra process) + ) + a1-15 + ) + ) + 0 + ) + ) + ) + ) + ) + (let ((s3-5 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s3-5) (seconds 1)) + (suspend) + ) + ) + ) + ) + (let ((s4-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s4-1) (seconds 0.5)) + (suspend) + ) + ) + (set-setting! 'entity-name "camera-260" 0 0) + (set-setting! 'process-mask 'set 0 (process-mask movie enemy)) + (process-grab? *target* #f) + (let ((s4-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s4-2) (seconds 0.5)) + (suspend) + ) + ) + (send-event + (if s5-0 + (-> s5-0 extra process) + ) + 'leave + ) + (let ((s5-1 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) s5-1) (seconds 0.2)) + (suspend) + ) + ) + (send-event + (if gp-1 + (-> gp-1 extra process) + ) + 'leave + ) + ) + (let ((gp-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-2) (seconds 3)) + (suspend) + ) + ) + (remove-setting! 'entity-name) + (remove-setting! 'process-mask) + (process-release? *target*) + (let ((gp-3 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-3) (seconds 3)) + (suspend) + ) + ) + (go-virtual complete) + (while *target* + (suspend) + ) + (go-virtual fail) + (none) + ) + ) + ) + +;; failed to figure out what this is: +(set-subtask-hook! + *game-info* + 200 + 1 + (the-as (function object) (lambda :behavior task-manager + () + (let ((a0-1 (process-by-name "transport-level-1" *active-pool*))) + (if a0-1 + (send-event a0-1 'leave) + ) + ) + (let ((a0-3 (process-by-name "transport-level-2" *active-pool*))) + (if a0-3 + (send-event a0-3 'leave) + ) + ) + (speech-control-method-9 *speech-control*) + (none) + ) + ) + ) + +;; definition for function forest-login +;; WARN: Return type mismatch int vs none. +(defun forest-login () + (set! *nav-network* (new 'loading-level 'nav-network)) + (nav-network-method-9 *nav-network*) + 0 + (none) + ) + +;; definition for function forest-deactivate +;; WARN: Return type mismatch int vs none. +(defun forest-deactivate () + (set! *nav-network* (the-as nav-network 0)) + 0 + (none) + ) + +;; definition for function forest-activate +;; WARN: Return type mismatch int vs none. +(defun forest-activate ((arg0 level)) + (nav-network-method-10 *nav-network* arg0 *forest-adjacency*) + 0 + (none) + ) diff --git a/test/decompiler/reference/jak2/levels/mars_tomb/tomb-beetle_REF.gc b/test/decompiler/reference/jak2/levels/mars_tomb/tomb-beetle_REF.gc new file mode 100644 index 000000000..0ba0df3dd --- /dev/null +++ b/test/decompiler/reference/jak2/levels/mars_tomb/tomb-beetle_REF.gc @@ -0,0 +1,1145 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(defskelgroup skel-tomb-beetle tomb-beetle tomb-beetle-lod0-jg -1 + ((tomb-beetle-lod0-mg (meters 999999))) + :bounds (static-spherem 0 0.6 0 2) + :shadow tomb-beetle-shadow-mg + ) + +;; definition of type tomb-beetle-fly-info +(deftype tomb-beetle-fly-info (structure) + ((dst vector :inline :offset-assert 0) + (dst-quat quaternion :inline :offset-assert 16) + (dist meters :offset-assert 32) + (threshold meters :offset-assert 36) + ) + :method-count-assert 9 + :size-assert #x28 + :flag-assert #x900000028 + ) + +;; definition for method 3 of type tomb-beetle-fly-info +(defmethod inspect tomb-beetle-fly-info ((obj tomb-beetle-fly-info)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (format #t "[~8x] ~A~%" obj 'tomb-beetle-fly-info) + (format #t "~1Tdst: #~%" (-> obj dst)) + (format #t "~1Tdst-quat: #~%" (-> obj dst-quat)) + (format #t "~1Tdist: (meters ~m)~%" (-> obj dist)) + (format #t "~1Tthreshold: (meters ~m)~%" (-> obj threshold)) + (label cfg-4) + obj + ) + +;; definition of type tomb-beetle +(deftype tomb-beetle (nav-enemy) + ((src-quat quaternion :inline :offset-assert 608) + (fly-info tomb-beetle-fly-info 2 :inline :offset-assert 624) + (speed meters :offset-assert 720) + (init-height meters :offset-assert 724) + (flags uint16 :offset-assert 728) + (dest-index int32 :offset-assert 732) + (round uint32 :offset-assert 736) + (flying? symbol :offset-assert 740) + (fly-away-radius float :offset-assert 744) + (fly-away-ry float :offset-assert 748) + (fly-away-ry-speed float :offset-assert 752) + (fly-away-acc float :offset-assert 756) + (fly-away-dir vector :inline :offset-assert 768) + ) + :heap-base #x290 + :method-count-assert 186 + :size-assert #x310 + :flag-assert #xba02900310 + (:methods + (tomb-beetle-method-178 (_type_) none 178) + (explode () _type_ :state 179) + (fly-away () _type_ :state 180) + (go-to-door () _type_ :state 181) + (key () _type_ :state 182) + (land () _type_ :state 183) + (stand () _type_ :state 184) + (tomb-beetle-method-185 (_type_) none 185) + ) + ) + +;; definition for method 3 of type tomb-beetle +(defmethod inspect tomb-beetle ((obj tomb-beetle)) + (when (not obj) + (set! obj obj) + (goto cfg-4) + ) + (let ((t9-0 (method-of-type nav-enemy inspect))) + (t9-0 obj) + ) + (format #t "~2Tsrc-quat: #~%" (-> obj src-quat)) + (format #t "~2Tfly-info[2] @ #x~X~%" (-> obj fly-info)) + (format #t "~2Tspeed: (meters ~m)~%" (-> obj speed)) + (format #t "~2Tinit-height: (meters ~m)~%" (-> obj init-height)) + (format #t "~2Tflags: ~D~%" (-> obj flags)) + (format #t "~2Tdest-index: ~D~%" (-> obj dest-index)) + (format #t "~2Tround: ~D~%" (-> obj round)) + (format #t "~2Tflying?: ~A~%" (-> obj flying?)) + (format #t "~2Tfly-away-radius: ~f~%" (-> obj fly-away-radius)) + (format #t "~2Tfly-away-ry: ~f~%" (-> obj fly-away-ry)) + (format #t "~2Tfly-away-ry-speed: ~f~%" (-> obj fly-away-ry-speed)) + (format #t "~2Tfly-away-acc: ~f~%" (-> obj fly-away-acc)) + (format #t "~2Tfly-away-dir: #~%" (-> obj fly-away-dir)) + (label cfg-4) + obj + ) + +;; definition for symbol *tomb-beetle-nav-enemy-info*, type nav-enemy-info +(define *tomb-beetle-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 #f + :idle-anim 5 + :notice-anim -1 + :hostile-anim -1 + :hit-anim -1 + :knocked-anim -1 + :knocked-land-anim -1 + :die-anim 13 + :die-falling-anim 3 + :victory-anim -1 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint -1 + :look-at-joint 3 + :bullseye-joint 3 + :sound-hit (static-sound-name "tomb-beetle-hit") + :sound-die (static-sound-name "tomb-beetle-die") + :notice-distance (meters 40) + :notice-distance-delta (meters 10) + :proximity-notice-distance (meters 40) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :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 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :recover-gnd-collide-with (collide-spec backgnd crate obstacle hit-by-others-list pusher) + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 4551.1113 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 2) + :shadow-max-y (meters 10) + :shadow-min-y (meters -15) + :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 -1 + :turn-anim -1 + :run-anim -1 + :taunt-anim -1 + :run-travel-speed (meters 10) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 500) + :walk-travel-speed (meters 4) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 3) + :maximum-rotation-rate (degrees 1080.0) + :notice-nav-radius (meters 1.5) + :frustration-distance (meters 8) + :frustration-time (seconds 4) + :blocked-time (seconds 0.3) + :circle-dist-lo 20480.0 + :circle-dist-hi 61440.0 + :nav-mesh #f + ) + ) + +;; failed to figure out what this is: +(set! (-> *tomb-beetle-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for method 74 of type tomb-beetle +(defmethod general-event-handler tomb-beetle ((obj tomb-beetle) (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 (new 'static 'array int64 2 -1 0))) + (case arg2 + (('cue-chase) + (set! (-> obj round) (-> arg3 param 0)) + ((method-of-type nav-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + (('attack) + (when (and (-> obj next-state) (let ((a1-4 (-> obj next-state name))) + (or (= a1-4 'active) (= a1-4 'stand)) + ) + ) + (-> arg3 param 1) + (cond + ((logtest? (-> obj fact-info-override enemy-options) (ash 1 (+ (-> obj round) 8))) + (set! (-> v1-0 0) (the-as int (-> pp clock frame-counter))) + (go (method-of-object obj go-to-door)) + ) + ((>= (- (-> pp clock frame-counter) (the-as time-frame (-> v1-0 0))) (seconds 0.5)) + (logior! (-> obj flags) 1) + (go (method-of-object obj die)) + ) + ) + ) + ) + (('die) + (cond + ((and (-> obj next-state) (= (-> obj next-state name) 'key)) + (go (method-of-object obj explode)) + ) + ((not (and (-> obj next-state) (= (-> obj next-state name) 'dormant))) + (go (method-of-object obj fly-away)) + ) + ) + ) + (else + ((method-of-type nav-enemy general-event-handler) obj arg0 arg1 arg2 arg3) + ) + ) + ) + ) + ) + +;; definition for method 185 of type tomb-beetle +;; INFO: Used lq/sq +(defmethod tomb-beetle-method-185 tomb-beetle ((obj tomb-beetle)) + (cond + ((-> obj draw shadow) + (new 'stack-no-clear 'vector) + (let ((f30-0 81920.0) + (s5-0 (new 'stack-no-clear 'collide-query)) + ) + (set! (-> s5-0 start-pos quad) (-> obj root-override2 trans quad)) + (set-vector! (-> s5-0 move-dist) 0.0 (- f30-0) 0.0 1.0) + (let ((v1-6 s5-0)) + (set! (-> v1-6 radius) 8192.0) + (set! (-> v1-6 collide-with) (collide-spec backgnd)) + (set! (-> v1-6 ignore-process0) obj) + (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)) + ) + (let ((f0-5 (fill-and-probe-using-line-sphere *collide-cache* s5-0))) + (cond + ((>= f0-5 0.0) + (let ((v1-10 (-> obj draw shadow-ctrl))) + (logclear! (-> v1-10 settings flags) (shadow-flags disable-draw)) + ) + 0 + (-> s5-0 best-other-tri intersect) + (let ((a1-2 (-> obj root-override2 trans))) + (-> a1-2 y) + (let ((f0-6 (* f0-5 f30-0))) + (shadow-control-method-14 + (-> obj draw shadow-ctrl) + a1-2 + (-> obj draw shadow-ctrl settings shadow-dir) + (- -8192.0 f30-0) + (+ -8192.0 f0-6) + (+ 8192.0 f0-6) + ) + ) + ) + ) + (else + (let ((v1-22 (-> obj draw shadow-ctrl))) + (logior! (-> v1-22 settings flags) (shadow-flags disable-draw)) + ) + 0 + ) + ) + ) + ) + ) + (else + (let ((v1-24 (-> obj draw shadow-ctrl))) + (logior! (-> v1-24 settings flags) (shadow-flags disable-draw)) + ) + 0 + (set! (-> obj draw bounds y) 2457.6) + (set! (-> obj draw bounds w) 8192.0) + ) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate dormant (tomb-beetle) + :virtual #t + :enter (behavior () + (set! (-> self root-override2 trans quad) (-> self entity extra trans quad)) + (quaternion-copy! (-> self root-override2 quat) (-> self entity quat)) + (let ((t9-2 (-> (the-as (state enemy) (find-parent-method tomb-beetle 27)) enter))) + (if t9-2 + (t9-2) + ) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate ambush (tomb-beetle) + :virtual #t + :enter (behavior () + (let ((v1-1 (-> self root-override2 root-prim))) + (set! (-> v1-1 prim-core collide-as) (collide-spec)) + (set! (-> v1-1 prim-core collide-with) (collide-spec)) + ) + 0 + (vector-reset! (-> self root-override2 transv)) + (set! (-> self move-dest quad) (-> self root-override2 trans quad)) + (+! (-> self root-override2 trans y) (* 4096.0 (rand-vu-float-range 32.0 52.0))) + (set! (-> self init-height) (-> self root-override2 trans y)) + (quaternion-rotate-y! + (-> self root-override2 quat) + (-> self root-override2 quat) + (* 182.04445 (rand-vu-float-range -180.0 180.0)) + ) + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) (process->ppointer self)) + (set! (-> a1-3 num-params) 0) + (set! (-> a1-3 message) 'get-round) + (let ((t9-3 send-event-function) + (v1-18 (-> self actor-group 1 data 0 actor)) + ) + (set! (-> self round) (the-as uint (t9-3 + (if v1-18 + (-> v1-18 extra process) + ) + a1-3 + ) + ) + ) + ) + ) + (setup-masks (-> self draw) 0 -1) + (setup-masks (-> self draw) 2 0) + (if (logtest? (-> self fact-info-override enemy-options) (ash 1 (+ (-> self round) 8))) + (setup-masks (-> self draw) 4 0) + (setup-masks (-> self draw) 8 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)) + ) + (none) + ) + :trans (behavior () + (if (< (fabs (- (-> self root-override2 trans y) (-> self move-dest y))) 4096.0) + (go-virtual land) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.1)) + (until #f + (ja-no-eval :group! tomb-beetle-falling-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-falling-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (tomb-beetle-method-185 self) + (nav-enemy-falling-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate land (tomb-beetle) + :virtual #t + :enter (behavior () + (let ((v1-1 (-> self draw shadow-ctrl))) + (logclear! (-> v1-1 settings flags) (shadow-flags disable-draw)) + ) + 0 + (set! (-> self state-time) (-> self clock frame-counter)) + (none) + ) + :code (behavior () + (ja-no-eval :group! tomb-beetle-land-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-land-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (let ((gp-0 (-> self clock frame-counter)) + (s5-0 (the int (* 300.0 (rand-vu-float-range 1.1 2.3)))) + (f30-1 (rand-vu-float-range 0.8 1.4)) + ) + (ja-no-eval :group! tomb-beetle-wiggle-ja :num! (loop! f30-1) :frame-num 0.0) + (until (>= (- (-> self clock frame-counter) gp-0) s5-0) + (suspend) + (ja :num! (loop! f30-1)) + ) + ) + (ja-no-eval :group! tomb-beetle-flip-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-flip-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (go-virtual active) + (none) + ) + :post (the-as (function none :behavior tomb-beetle) nav-enemy-falling-post) + ) + +;; failed to figure out what this is: +(defstate active (tomb-beetle) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior tomb-beetle) 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 + (nav-enemy-method-166 self) + (let ((gp-0 (new 'stack-no-clear 'vector))) + (set! (-> gp-0 x) 0.0) + (set! (-> gp-0 y) 0.0) + (set! (-> gp-0 z) (* 4096.0 (rand-vu-float-range 3.0 9.0))) + (set! (-> gp-0 w) 0.0) + (let ((f30-1 (rand-vu-float-range 100.0 270.0))) + (vector-orient-by-quat! gp-0 gp-0 (-> self root-override2 quat)) + (if (< 180.0 f30-1) + (set! f30-1 (+ -360.0 f30-1)) + ) + (vector-rotate-y! gp-0 gp-0 (* 182.04445 f30-1)) + ) + (vector+! (-> self move-dest) (-> self root-override2 trans) gp-0) + ) + (cloest-point-on-mesh (-> self nav) (-> self move-dest) (-> self move-dest) (the-as nav-poly #f)) + (let ((a0-23 (-> self nav state)) + (v1-19 (-> self move-dest)) + ) + (logclear! (-> a0-23 flags) (nav-state-flag directional-mode)) + (logior! (-> a0-23 flags) (nav-state-flag target-poly-dirty)) + (set! (-> a0-23 target-post quad) (-> v1-19 quad)) + ) + 0 + (none) + ) + :trans (behavior () + (if (< (vector-vector-xz-distance (-> self root-override2 trans) (-> self move-dest)) 16384.0) + (go-virtual stand) + ) + (none) + ) + :code (behavior () + (until #f + (let ((gp-0 (rand-vu-int-range 2 6)) + (f30-0 (rand-vu-float-range 1.8 1.2)) + ) + (dotimes (s5-0 gp-0) + (ja-no-eval :group! tomb-beetle-run0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-run0-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (ja-no-eval :group! tomb-beetle-run1-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-run1-ja) frames num-frames) -1)) f30-0) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + ) + #f + (none) + ) + :post (behavior () + (nav-enemy-travel-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate stand (tomb-beetle) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior tomb-beetle) 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 state-timeout) (the-as time-frame (the int (* 300.0 (rand-vu-float-range 0.2 0.8))))) + (none) + ) + :trans (behavior () + (if (>= (- (-> self clock frame-counter) (-> self state-time)) (-> self state-timeout)) + (go-virtual active) + ) + (none) + ) + :code (behavior () + (until #f + (ja-no-eval :group! tomb-beetle-stand0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-stand0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (the-as (function none :behavior tomb-beetle) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate fly-away (tomb-beetle) + :virtual #t + :enter (behavior () + (let ((s5-0 (-> self fly-info)) + (gp-0 (the-as (inline-array tomb-beetle-fly-info) (-> self fly-info 1))) + ) + (set! (-> s5-0 0 dst quad) (the-as uint128 (the-as vector (-> self root-override2 trans quad)))) + (set! (-> gp-0 0 dst quad) (-> self entity extra trans quad)) + (set! (-> gp-0 0 dst y) (+ 106496.0 (-> gp-0 0 dst y))) + (vector-! (-> self fly-away-dir) (the-as vector (-> gp-0 0)) (the-as vector (-> s5-0 0))) + (vector-normalize! (-> self fly-away-dir) 1.0) + (quaternion-copy! (-> s5-0 0 dst-quat) (-> self root-override2 quat)) + (quaternion-look-at! (-> gp-0 0 dst-quat) (-> self fly-away-dir) *up-vector*) + (set! (-> self speed) 0.0) + (set! (-> self fly-away-radius) 0.0) + (set! (-> self fly-away-ry) (quaternion-y-angle (-> self root-override2 quat))) + (set! (-> gp-0 0 dist) (vector-vector-distance (-> self root-override2 trans) (the-as vector (-> gp-0 0)))) + ) + (vector-reset! (-> self root-override2 transv)) + (set! (-> self fly-away-acc) (get-rand-float-range self 204800.0 512000.0)) + (set! (-> self fly-away-ry-speed) (get-rand-float-range self 32768.0 109226.664)) + (set! (-> self flying?) #f) + (none) + ) + :trans (behavior () + (let ((f30-0 (- (-> self root-override2 trans y) (-> self fly-info 1 dst y)))) + (when (>= f30-0 0.0) + (send-event self 'death-end) + (go empty-state) + ) + (let ((f0-2 (lerp-scale 1.0 0.0 f30-0 -40960.0 0.0))) + (set-vector! (-> self root-override2 scale) f0-2 f0-2 f0-2 1.0) + ) + ) + (none) + ) + :code (behavior () + (set! (-> self state-timeout) + (+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 0.0 0.8)))) + ) + (let ((v1-6 (ja-group))) + (cond + ((and v1-6 (= v1-6 tomb-beetle-stand0-ja)) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (if (>= (-> self clock frame-counter) (-> self state-timeout)) + (goto cfg-20) + ) + (suspend) + (ja-eval) + ) + ) + (else + (ja-channel-push! 1 (seconds 0.075)) + ) + ) + ) + (until #f + (ja-no-eval :group! tomb-beetle-stand0-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-stand0-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (if (>= (-> self clock frame-counter) (-> self state-timeout)) + (goto cfg-20) + ) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (label cfg-20) + (ja-channel-push! 1 (seconds 0.075)) + (ja-no-eval :group! tomb-beetle-fly-takeoff-ja :num! (seek! 6.0) :frame-num 0.0) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! 6.0)) + ) + (set! (-> self flying?) #t) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (until #f + (ja-no-eval :group! tomb-beetle-fly-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-fly-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (local-vars (at-0 int)) + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (when (-> self flying?) + (let ((gp-0 (-> self root-override2))) + (+! (-> self speed) (* (-> self fly-away-acc) (-> self clock seconds-per-frame))) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (vector-normalize-copy! s5-0 (-> self fly-away-dir) (-> self speed)) + (vector-v++! (the-as vector (-> self fly-info)) s5-0) + ) + (+! (-> self fly-away-ry) (* (-> self fly-away-ry-speed) (-> self clock seconds-per-frame))) + (+! (-> self fly-away-radius) (* 20480.0 (-> self clock seconds-per-frame))) + (let ((s5-1 (new 'stack-no-clear 'vector))) + (set-vector! s5-1 (sin (-> self fly-away-ry)) 0.0 (cos (-> self fly-away-ry)) 1.0) + (vector-normalize! s5-1 (-> self fly-away-radius)) + (vector+! s5-1 s5-1 (the-as vector (-> self fly-info))) + (vector-! (-> gp-0 transv) s5-1 (-> gp-0 trans)) + (let ((v1-10 (-> gp-0 transv))) + (.lvf vf1 (&-> (-> gp-0 transv) quad)) + (let ((f0-14 (-> self clock frames-per-second))) + (.mov at-0 f0-14) + ) + (.mov vf2 at-0) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> v1-10 quad) vf1) + ) + (set! (-> gp-0 trans quad) (-> s5-1 quad)) + ) + ) + (quaternion-smooth-seek! + (-> self root-override2 quat) + (-> self root-override2 quat) + (-> self fly-info 1 dst-quat) + (* 12.0 (-> self clock seconds-per-frame)) + ) + ) + (tomb-beetle-method-185 self) + (transform-post) + (none) + ) + ) + ) + +;; failed to figure out what this is: +(defstate die (tomb-beetle) + :virtual #t + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (let ((f30-0 (get-rand-float-range self 1.8 2.2))) + (ja-no-eval :group! (-> self draw art-group data (-> self enemy-info-override die-anim)) + :num! (seek! + (the float + (+ (-> (the-as art-joint-anim (-> self draw art-group data (-> self enemy-info-override die-anim))) + frames + num-frames + ) + -1 + ) + ) + f30-0 + ) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! max f30-0)) + ) + ) + (send-event self 'death-end) + (go-virtual explode) + (none) + ) + :post (the-as (function none :behavior tomb-beetle) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate explode (tomb-beetle) + :virtual #t + :code (behavior () + (when (logtest? (-> self flags) 1) + (let* ((s5-0 *target*) + (gp-0 (if (type? s5-0 process-focusable) + s5-0 + ) + ) + ) + (when gp-0 + (let ((s5-2 (vector-! (new 'stack-no-clear 'vector) (get-trans gp-0 0) (-> self root-override2 trans)))) + (when (< (vector-length s5-2) 16384.0) + (vector-normalize! s5-2 1.0) + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) (process->ppointer self)) + (set! (-> a1-3 num-params) 2) + (set! (-> a1-3 message) 'attack-or-shove) + (set! (-> a1-3 param 0) (the-as uint #f)) + (let ((v1-13 (new 'static 'attack-info :mask (attack-info-mask vector shove-back shove-up id damage)))) + (let* ((a0-6 *game-info*) + (a2-1 (+ (-> a0-6 attack-id) 1)) + ) + (set! (-> a0-6 attack-id) a2-1) + (set! (-> v1-13 id) a2-1) + ) + (set! (-> v1-13 damage) 1.0) + (set! (-> v1-13 vector quad) (-> s5-2 quad)) + (set! (-> v1-13 shove-back) 20480.0) + (set! (-> v1-13 shove-up) 12288.0) + (set! (-> a1-3 param 1) (the-as uint v1-13)) + ) + (send-event-function gp-0 a1-3) + ) + ) + ) + ) + ) + ) + (let ((v1-16 (-> self root-override2 root-prim))) + (set! (-> v1-16 prim-core collide-as) (collide-spec)) + (set! (-> v1-16 prim-core collide-with) (collide-spec)) + ) + 0 + (logior! (-> self draw status) (draw-control-status no-draw)) + (let ((gp-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-1 + (let ((t9-5 (method-of-type part-tracker activate))) + (t9-5 (the-as part-tracker gp-1) self (symbol->string (-> part-tracker symbol)) (the-as pointer #x70004000)) + ) + (let ((t9-6 run-function-in-process) + (a0-15 gp-1) + (a1-6 part-tracker-init) + (a2-6 (-> *part-group-id-table* 708)) + (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-6) + a0-15 + a1-6 + a2-6 + a3-1 + t0-0 + t1-0 + t2-0 + t3-0 + ) + ) + (-> gp-1 ppointer) + ) + ) + (let ((gp-2 (-> self clock frame-counter))) + (until (>= (- (-> self clock frame-counter) gp-2) (seconds 2)) + (suspend) + ) + ) + (none) + ) + :post (the-as (function none :behavior tomb-beetle) nav-enemy-simple-post) + ) + +;; failed to figure out what this is: +(defstate go-to-door (tomb-beetle) + :virtual #t + :enter (behavior () + (let ((v1-1 (-> self root-override2 root-prim))) + (set! (-> v1-1 prim-core collide-as) (collide-spec)) + (set! (-> v1-1 prim-core collide-with) (collide-spec)) + ) + 0 + (let ((v1-3 self)) + (set! (-> v1-3 enemy-flags) (the-as enemy-flag (logclear (-> v1-3 enemy-flags) (enemy-flag enemy-flag36)))) + (set! (-> v1-3 nav callback-info) *nav-enemy-null-callback-info*) + ) + 0 + (let ((v1-6 self)) + (set! (-> v1-6 enemy-flags) (the-as enemy-flag (logclear (-> v1-6 enemy-flags) (enemy-flag enemy-flag37)))) + ) + 0 + (set! (-> self flying?) #f) + (let ((s5-0 (-> self fly-info)) + (gp-0 (the-as (inline-array tomb-beetle-fly-info) (-> self fly-info 1))) + ) + (cond + ((nonzero? (-> self actor-group-count)) + (let ((v1-12 (-> self actor-group 0 data (-> self round) actor))) + (set! (-> (the-as vector (-> gp-0 0)) quad) (-> v1-12 extra trans quad)) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (let ((a1-5 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-5 from) (process->ppointer self)) + (set! (-> a1-5 num-params) 0) + (set! (-> a1-5 message) 'add-beetle) + (set! (-> s4-0 quad) (-> (the-as vector (send-event-function + (if v1-12 + (-> v1-12 extra process) + ) + a1-5 + ) + ) + quad + ) + ) + ) + (vector+! (the-as vector (-> gp-0 0)) (the-as vector (-> gp-0 0)) s4-0) + (set! (-> gp-0 0 dst w) (-> s4-0 w)) + ) + ) + ) + (else + (set! (-> (the-as vector (-> gp-0 0)) quad) (-> self root-override2 trans quad)) + (set! (-> gp-0 0 dst y) (+ 16384.0 (-> gp-0 0 dst y))) + ) + ) + (let ((s4-2 (vector-! (new 'stack-no-clear 'vector) (the-as vector (-> gp-0 0)) (-> self root-override2 trans)))) + (cond + ((< (vector-length s4-2) 122880.0) + (set! (-> s5-0 0 dst quad) (-> self root-override2 trans quad)) + ) + (else + (vector-float*! s4-2 s4-2 0.25) + (vector+! (the-as vector (-> s5-0 0)) (-> self root-override2 trans) s4-2) + (set! (-> s5-0 0 dst y) (+ 20480.0 (-> gp-0 0 dst y))) + ) + ) + (vector-normalize! s4-2 1.0) + (forward-up-nopitch->quaternion (-> s5-0 0 dst-quat) s4-2 *up-vector*) + ) + (quaternion-copy! (-> self src-quat) (-> self root-override2 quat)) + (quaternion-axis-angle! (-> gp-0 0 dst-quat) -1.0 0.0 0.0 16384.0) + (quaternion-rotate-local-z! (-> gp-0 0 dst-quat) (-> gp-0 0 dst-quat) (-> gp-0 0 dst w)) + (set! (-> s5-0 0 threshold) 16384.0) + (set! (-> gp-0 0 threshold) 12288.0) + (set! (-> s5-0 0 dist) (vector-vector-distance (-> self root-override2 trans) (the-as vector (-> s5-0 0)))) + (set! (-> gp-0 0 dist) (vector-vector-distance (-> self root-override2 trans) (the-as vector (-> gp-0 0)))) + ) + (set! (-> self dest-index) 0) + (set! (-> self speed) 122880.0) + (vector-reset! (-> self root-override2 transv)) + (none) + ) + :trans (behavior () + (when (< (vector-length (vector-! + (new 'stack-no-clear 'vector) + (-> self root-override2 trans) + (the-as vector (-> self fly-info (-> self dest-index))) + ) + ) + (-> self fly-info (-> self dest-index) threshold) + ) + (when (= (-> self dest-index) 1) + (set! (-> self root-override2 trans quad) (-> (the-as vector (-> self fly-info 1)) quad)) + (quaternion-copy! (-> self root-override2 quat) (-> self fly-info 1 dst-quat)) + (go-virtual key) + ) + (set! (-> self speed) 81920.0) + (vector-normalize! (-> self root-override2 transv) (-> self speed)) + (quaternion-copy! (-> self src-quat) (-> self root-override2 quat)) + (+! (-> self dest-index) 1) + ) + (none) + ) + :code (behavior () + (ja-channel-push! 1 (seconds 0.075)) + (ja-no-eval :group! tomb-beetle-fly-takeoff-ja :num! (seek! 6.0) :frame-num 0.0) + (until (ja-done? 0) + (suspend) + (ja :num! (seek! 6.0)) + ) + (set! (-> self flying?) #t) + (ja-no-eval :num! (seek!)) + (while (not (ja-done? 0)) + (suspend) + (ja-eval) + ) + (until #f + (ja-no-eval :group! tomb-beetle-fly-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-fly-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + ) + #f + (none) + ) + :post (behavior () + (local-vars (at-0 int)) + (rlet ((vf0 :class vf) + (vf1 :class vf) + (vf2 :class vf) + ) + (init-vf0-vector) + (when (-> self flying?) + (let* ((gp-0 (-> self fly-info (-> self dest-index))) + (f30-0 (vector-vector-distance (-> self root-override2 trans) (-> gp-0 dst))) + ) + (seek! (-> self speed) (* 4.0 f30-0) (* 409600.0 (-> self clock seconds-per-frame))) + (let ((s5-1 (vector-! (new 'stack-no-clear 'vector) (-> gp-0 dst) (-> self root-override2 trans)))) + (vector-normalize! s5-1 (-> self speed)) + (vector-seek! (-> self root-override2 transv) s5-1 (* (-> self speed) (-> self clock seconds-per-frame))) + ) + (let ((v1-13 (new 'stack-no-clear 'vector))) + (.lvf vf1 (&-> (-> self root-override2 transv) quad)) + (let ((f0-9 (-> self clock seconds-per-frame))) + (.mov at-0 f0-9) + ) + (.mov vf2 at-0) + (.mov.vf vf1 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> v1-13 quad) vf1) + (vector+! (-> self root-override2 trans) (-> self root-override2 trans) v1-13) + ) + (let ((f0-11 (/ f30-0 (-> gp-0 dist)))) + (quaternion-slerp! (-> self root-override2 quat) (-> self src-quat) (-> gp-0 dst-quat) (- 1.0 f0-11)) + ) + ) + ) + (tomb-beetle-method-185 self) + (transform-post) + (none) + ) + ) + ) + +;; failed to figure out what this is: +(defstate key (tomb-beetle) + :virtual #t + :event (the-as (function process int symbol event-message-block object :behavior tomb-beetle) enemy-event-handler) + :enter (behavior () + (let ((v1-1 (-> self draw shadow-ctrl))) + (logclear! (-> v1-1 settings flags) (shadow-flags disable-draw)) + ) + 0 + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) (process->ppointer self)) + (set! (-> a1-1 num-params) 0) + (set! (-> a1-1 message) 'key) + (let ((t9-0 send-event-function) + (v1-9 (-> self actor-group 0 data (-> self round) actor)) + ) + (t9-0 + (if v1-9 + (-> v1-9 extra process) + ) + a1-1 + ) + ) + ) + (none) + ) + :trans (the-as (function none :behavior tomb-beetle) ja-post) + :code (behavior () + (ja-no-eval :group! tomb-beetle-fly-land-ja + :num! (seek! (the float (+ (-> (the-as art-joint-anim tomb-beetle-fly-land-ja) frames num-frames) -1))) + :frame-num 0.0 + ) + (until (ja-done? 0) + (suspend) + (ja :num! (seek!)) + ) + (sleep-code) + (none) + ) + ) + +;; definition for method 114 of type tomb-beetle +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! tomb-beetle ((obj tomb-beetle)) + "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 ((v1-7 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set! (-> v1-7 prim-core collide-as) (collide-spec enemy)) + (set! (-> v1-7 prim-core collide-with) + (collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list) + ) + (set! (-> v1-7 prim-core action) (collide-action solid no-standon)) + (set-vector! (-> v1-7 local-sphere) 0.0 2048.0 0.0 2457.6) + (set! (-> s5-0 total-prims) (the-as uint 1)) + (set! (-> s5-0 root-prim) v1-7) + ) + (set! (-> s5-0 nav-radius) 4915.2) + (let ((v1-9 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-9 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-9 prim-core collide-with)) + ) + (set! (-> s5-0 max-iteration-count) (the-as uint 3)) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 115 of type tomb-beetle +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! tomb-beetle ((obj tomb-beetle)) + "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-tomb-beetle" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *tomb-beetle-nav-enemy-info*) + (let ((v1-5 (-> obj nav))) + (set! (-> v1-5 sphere-mask) (the-as uint #x800fa)) + ) + 0 + (logclear! (-> obj enemy-flags) (enemy-flag check-water-backup no-initial-move-to-ground)) + (set! (-> obj flags) (the-as uint 0)) + (logclear! (-> obj mask) (process-mask actor-pause)) + 0 + (none) + ) + + + + diff --git a/test/decompiler/reference/jak2/levels/undefined/hal_REF.gc b/test/decompiler/reference/jak2/levels/undefined/hal_REF.gc new file mode 100644 index 000000000..3d4e23537 --- /dev/null +++ b/test/decompiler/reference/jak2/levels/undefined/hal_REF.gc @@ -0,0 +1,564 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for symbol *hal-nav-enemy-info*, type nav-enemy-info +(define *hal-nav-enemy-info* (new 'static 'nav-enemy-info + :use-die-falling #t + :use-victory #f + :use-jump-blocked #f + :debug-draw-neck #f + :jump-debug-draw #f + :move-to-ground #f + :hover-if-no-ground #f + :idle-anim-script #f + :idle-anim -1 + :notice-anim -1 + :hostile-anim -1 + :hit-anim -1 + :knocked-anim -1 + :knocked-land-anim -1 + :die-anim -1 + :die-falling-anim -1 + :victory-anim -1 + :jump-wind-up-anim -1 + :jump-in-air-anim -1 + :jump-land-anim -1 + :neck-joint -1 + :notice-distance (meters 30) + :notice-distance-delta (meters 10) + :default-hit-points 1 + :gnd-collide-with (collide-spec backgnd) + :overlaps-others-collide-with-filter (collide-spec jak bot player-list) + :movement-gravity (meters -100) + :friction 0.8 + :attack-shove-back (meters 3) + :attack-shove-up (meters 2) + :attack-mode 'generic + :attack-damage 2 + :recover-gnd-collide-with (collide-spec backgnd crate obstacle hit-by-others-list pusher) + :jump-height-min (meters 3) + :jump-height-factor 0.5 + :knocked-seek-ry-clamp 2730.6667 + :knocked-soft-vxz-lo 72089.6 + :knocked-soft-vxz-hi 108134.4 + :knocked-soft-vy-lo 81920.0 + :knocked-soft-vy-hi 122880.0 + :knocked-medium-vxz-lo 147456.0 + :knocked-medium-vxz-hi 196608.0 + :knocked-medium-vy-lo 135168.0 + :knocked-medium-vy-hi 151552.0 + :knocked-hard-vxz-lo 78643.2 + :knocked-hard-vxz-hi 117964.8 + :knocked-hard-vy-lo 183500.8 + :knocked-hard-vy-hi 209715.2 + :knocked-huge-vxz-lo 164659.2 + :knocked-huge-vxz-hi 249036.8 + :knocked-huge-vy-lo 183500.8 + :knocked-huge-vy-hi 217907.2 + :knocked-yellow-vxz-lo 40960.0 + :knocked-yellow-vxz-hi 49152.0 + :knocked-yellow-vy-lo 57344.0 + :knocked-yellow-vy-hi 81920.0 + :knocked-red-vxz-lo 24576.0 + :knocked-red-vxz-hi 196608.0 + :knocked-red-vy-lo 94208.0 + :knocked-red-vy-hi 151552.0 + :knocked-blue-vxz-lo 40960.0 + :knocked-blue-vxz-hi 49152.0 + :knocked-blue-vy-lo 24576.0 + :knocked-blue-vy-hi 81920.0 + :shadow-size (meters 1) + :shadow-max-y (meters 1) + :shadow-min-y (meters -1) + :shadow-locus-dist (meters 150) + :gem-joint -1 + :gem-offset (new 'static 'sphere :r 163840.0) + :callback-info #f + :use-momentum #f + :use-frustration #t + :use-stop-chase #f + :use-circling #f + :use-pacing #f + :walk-anim -1 + :turn-anim -1 + :run-anim -1 + :taunt-anim -1 + :run-travel-speed (meters 6) + :run-acceleration (meters 1) + :run-turning-acceleration (meters 2) + :walk-travel-speed (meters 3) + :walk-acceleration (meters 1) + :walk-turning-acceleration (meters 1) + :maximum-rotation-rate (degrees 720.0) + :notice-nav-radius (meters 1) + :frustration-distance (meters 8) + :frustration-time (seconds 4) + :blocked-time (seconds 0.3) + :circle-dist-lo 20480.0 + :circle-dist-hi 61440.0 + :nav-mesh #f + ) + ) + +;; failed to figure out what this is: +(set! (-> *hal-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*) + +;; definition for function hal-simple-check-too-far +(defun hal-simple-check-too-far ((arg0 hal)) + (let ((s5-0 (-> *target* control trans)) + (f30-0 40960000.0) + ) + (countdown (s4-0 3) + (let ((v1-6 (handle->process (-> arg0 slave-handle s4-0)))) + (when v1-6 + (let ((f0-0 (vector-vector-xz-distance s5-0 (-> (the-as process-drawable v1-6) root trans)))) + (if (< f0-0 f30-0) + (set! f30-0 f0-0) + ) + ) + ) + ) + ) + (let ((v0-1 0)) + (let ((f0-1 (-> arg0 too-far-warn-dist))) + (when (>= f30-0 f0-1) + (if (>= (- f30-0 f0-1) (-> arg0 too-far-fail-dist-delta)) + (set! v0-1 2) + (set! v0-1 1) + ) + ) + ) + v0-1 + ) + ) + ) + +;; definition for method 220 of type hal +(defmethod stop-speech hal ((obj hal) (arg0 uint) (arg1 symbol)) + (cond + ((zero? arg0) + (let ((t9-0 (method-of-type bot stop-speech))) + (t9-0 obj (-> obj channel) arg1) + ) + (countdown (s4-0 3) + (let ((v1-4 (handle->process (-> obj slave-handle s4-0)))) + (when v1-4 + (let ((t9-1 (method-of-type bot stop-speech))) + (t9-1 (the-as bot v1-4) (-> v1-4 stack 580) arg1) + ) + ) + ) + ) + ) + (else + ((method-of-type bot stop-speech) obj arg0 arg1) + ) + ) + (none) + ) + +;; definition for method 206 of type hal +;; WARN: Return type mismatch gui-connection vs none. +(defmethod play-speech hal ((obj hal) (arg0 int)) + (let ((v1-2 (-> obj course speeches arg0))) + (logior! (-> v1-2 flags) (speech-flags playing)) + (let ((a1-4 (-> v1-2 slave-id)) + (t2-0 (-> v1-2 hold-time)) + (gp-0 (-> obj course speech-tunings (-> v1-2 tuning-id))) + ) + (cond + ((>= a1-4 0) + (let* ((a2-2 (handle->process (-> obj slave-handle a1-4))) + (a1-11 (add-process + *gui-control* + a2-2 + (the-as gui-channel (-> a2-2 stack 580)) + (gui-action play) + (-> v1-2 name) + -99.0 + (the-as time-frame t2-0) + ) + ) + ) + (set-falloff! *gui-control* a1-11 (-> gp-0 trans?) (-> gp-0 fo-min) (-> gp-0 fo-max) (-> gp-0 fo-curve)) + ) + ) + (else + (let ((a1-14 (add-process + *gui-control* + obj + (the-as gui-channel (-> obj channel)) + (gui-action play) + (-> v1-2 name) + -99.0 + (the-as time-frame t2-0) + ) + ) + ) + (set-falloff! *gui-control* a1-14 (-> gp-0 trans?) (-> gp-0 fo-min) (-> gp-0 fo-max) (-> gp-0 fo-curve)) + ) + ) + ) + ) + ) + (none) + ) + +;; definition for method 209 of type hal +(defmethod channel-active? hal ((obj hal) (arg0 uint)) + "Is the given [[gui-channel]] active?" + (cond + ((zero? arg0) + (let ((t9-0 (method-of-type bot channel-active?))) + (if (t9-0 obj (-> obj channel)) + (return #t) + ) + ) + (countdown (s5-0 3) + (let ((v1-7 (handle->process (-> obj slave-handle s5-0)))) + (when v1-7 + (let ((t9-1 (method-of-type bot channel-active?))) + (if (t9-1 (the-as bot v1-7) (-> v1-7 stack 580)) + (return #t) + ) + ) + ) + ) + ) + #f + ) + (else + ((method-of-type bot channel-active?) obj arg0) + ) + ) + ) + +;; definition for method 226 of type hal +(defmethod hal-method-226 hal ((obj hal)) + (countdown (s5-0 3) + (let ((a0-2 (handle->process (-> obj slave-handle s5-0)))) + (when a0-2 + (if (not (send-event a0-2 'request 'slave-id s5-0)) + (return #f) + ) + ) + ) + ) + #t + ) + +;; definition for method 225 of type hal +(defmethod hal-method-225 hal ((obj hal)) + (countdown (v1-0 3) + (if (handle->process (-> obj slave-handle v1-0)) + (return #f) + ) + ) + #t + ) + +;; definition for method 196 of type hal +;; WARN: Return type mismatch symbol vs none. +(defmethod bot-method-196 hal ((obj hal)) + (when (not (logtest? (-> obj bot-flags) (bot-flags too-far-fail))) + (let ((t9-0 (method-of-type bot bot-method-196))) + (t9-0 obj) + ) + (countdown (s5-0 3) + (let ((a0-3 (handle->process (-> obj slave-handle s5-0)))) + (if a0-3 + (bot-method-196 (the-as bot a0-3)) + ) + ) + ) + ) + (none) + ) + +;; definition for method 114 of type hal +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy-collision! hal ((obj hal)) + "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 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) (the-as penetrate -1)) + (let ((v1-7 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) + (set-vector! (-> v1-7 local-sphere) 0.0 0.0 0.0 40.96) + (set! (-> s5-0 total-prims) (the-as uint 1)) + (set! (-> s5-0 root-prim) v1-7) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (let ((v1-10 (-> s5-0 root-prim))) + (set! (-> s5-0 backup-collide-as) (-> v1-10 prim-core collide-as)) + (set! (-> s5-0 backup-collide-with) (-> v1-10 prim-core collide-with)) + ) + (set! (-> obj root-override2) s5-0) + ) + 0 + (none) + ) + +;; definition for method 210 of type hal +;; WARN: Return type mismatch int vs none. +(defmethod init! hal ((obj hal)) + "Set defaults for various fields." + (let ((t9-0 (method-of-type bot init!))) + (t9-0 obj) + ) + (set! (-> obj handle-failed-slave-id) -1) + (countdown (v1-2 3) + (set! (-> obj slave-handle v1-2) (the-as handle #f)) + (nop!) + ) + 0 + (none) + ) + +;; definition for method 115 of type hal +;; WARN: Return type mismatch int vs none. +(defmethod init-enemy! hal ((obj hal)) + "Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods" + (init! obj) + (initialize-skeleton + obj + (the-as skeleton-group (art-group-get-by-name *level* "skel-scenecamera" (the-as (pointer uint32) #f))) + (the-as pair 0) + ) + (init-enemy-behaviour-and-stats! obj *hal-nav-enemy-info*) + (let ((t9-4 (method-of-type bot init-enemy!))) + (t9-4 obj) + ) + (set! (-> obj channel) (the-as uint 28)) + (set! (-> obj spot-color) (the-as uint #x5000ffff)) + (set! (-> obj notice-enemy-dist) 0.0) + (logior! (-> obj focus-status) (focus-status disable)) + (let ((v1-13 (-> obj root-override2 root-prim))) + (set! (-> v1-13 prim-core collide-as) (collide-spec)) + (set! (-> v1-13 prim-core collide-with) (collide-spec)) + ) + (set! (-> obj root-override2 backup-collide-as) (collide-spec)) + (set! (-> obj root-override2 backup-collide-with) (collide-spec)) + 0 + (logior! (-> obj draw status) (draw-control-status no-draw)) + (remove-process-drawable (-> obj nav state mesh) obj) + (set! (-> obj nav) #f) + (set! (-> obj nav-mesh-index) -1) + 0 + (none) + ) + +;; definition for method 205 of type hal +(defmethod scene-play hal ((obj hal) (arg0 string) (arg1 symbol)) + "Spawn a [[scene-player]] process for the given scene." + (when (and (process-grab? obj #t) (or arg1 (process-grab? *target* #t))) + (countdown (s3-0 3) + (let ((a0-4 (handle->process (-> obj slave-handle s3-0)))) + (if (and a0-4 (not (process-grab? a0-4 #t))) + (return #f) + ) + ) + ) + (process-grab? obj #f) + (if (not arg1) + (process-grab? *target* #f) + ) + (countdown (s4-1 3) + (let ((a0-10 (handle->process (-> obj slave-handle s4-1)))) + (if a0-10 + (process-grab? a0-10 #f) + ) + ) + ) + (set! (-> obj scene-player-handle) + (ppointer->handle (process-spawn scene-player :init scene-player-init arg0 #t #f)) + ) + #t + ) + ) + +;; definition for method 188 of type hal +(defmethod scene-release? hal ((obj hal)) + (when (not (handle->process (-> obj scene-player-handle))) + (process-release? obj) + (countdown (s5-0 3) + (let ((a0-7 (handle->process (-> obj slave-handle s5-0)))) + (if a0-7 + (process-release? a0-7) + ) + ) + ) + #t + ) + ) + +;; definition for method 74 of type hal +;; INFO: Used lq/sq +;; WARN: Return type mismatch none vs object. +(defmethod general-event-handler hal ((obj hal) (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" + (the-as + object + (case arg2 + (('notify) + (case (-> arg3 param 0) + (('hit-by) + (let* ((s4-0 arg0) + (v1-2 (if (type? s4-0 bot) + s4-0 + ) + ) + ) + (when v1-2 + (when (= (-> (the-as process (-> arg3 param 1)) type) target) + (logior! (-> obj bot-flags) (ash 1 (+ (-> (the-as bot v1-2) slave-id) 19))) + (the-as object (stop-speech obj (the-as uint 0) #t)) + ) + ) + ) + ) + (('mission-failed) + (let* ((s4-1 arg0) + (s5-1 (if (type? s4-1 bot) + s4-1 + ) + ) + ) + (when s5-1 + (when (not (logtest? (-> obj bot-flags) (bot-flags too-far-fail))) + (when (not (logtest? (-> obj bot-flags) (bot-flags bf09))) + (logior! (-> obj bot-flags) (bot-flags bf09)) + (let ((a1-7 (new 'stack-no-clear 'fail-mission-params))) + (set! (-> a1-7 flags) (fail-mission-flags famflags-5)) + (set! (-> a1-7 message) (fail-mission-message fammsg-0)) + (set! (-> a1-7 retry-continue) #f) + (set! (-> a1-7 fail-continue) #f) + (set! (-> a1-7 reset-delay) (the-as uint 1500)) + (set! (-> a1-7 task) (game-task none)) + (set! (-> a1-7 fail-message) (game-text-id null)) + (if (start! *fail-mission-control* a1-7) + (set! (-> obj handle-failed-slave-id) (-> (the-as bot s5-1) slave-id)) + ) + ) + (set! (-> obj delay-too-far-check) -1) + (stop-speech obj (the-as uint 0) #f) + (countdown (s4-2 3) + (send-event (handle->process (-> obj slave-handle s4-2)) 'notify 'mission-failed) + ) + ) + (= (-> obj handle-failed-slave-id) (-> (the-as bot s5-1) slave-id)) + ) + ) + ) + ) + (('follow-dir) + (set! (-> obj follow-dir quad) (-> (the-as vector (-> arg3 param 1)) quad)) + #t + ) + ) + ) + (('set-task) + (let ((a1-10 (/ (the-as int (-> arg3 param 0)) 8))) + (logior! (-> obj bot-task-bits) (ash 1 a1-10)) + ) + #t + ) + (('clear-task) + (let ((a1-12 (/ (the-as int (-> arg3 param 0)) 8))) + (logclear! (-> obj bot-task-bits) (ash 1 a1-12)) + ) + #t + ) + (('change-mode) + (when (= (-> arg3 param 0) 'grab) + (let ((v0-1 (the-as object (alive? obj)))) + (if (and (the-as symbol v0-1) (-> arg3 param 1)) + (logior! (-> obj focus-status) (focus-status grabbed)) + ) + v0-1 + ) + ) + ) + (('end-mode) + (when (logtest? (-> obj focus-status) (focus-status grabbed)) + (logclear! (-> obj focus-status) (focus-status grabbed)) + #t + ) + ) + (('skip) + (the-as object (skip-waypoint obj)) + ) + (('move-trans) + (move-to-point! (-> obj root-override2) (the-as vector (-> arg3 param 0))) + #t + ) + (('die-fast) + (cleanup-for-death obj) + (go (method-of-object obj die-fast)) + ) + (('nav-mesh-kill) + (remove-process-drawable (-> obj nav state mesh) obj) + (set! (-> obj nav) #f) + (set! (-> obj nav-mesh-index) -1) + #t + ) + ) + ) + ) + +;; definition for function hal-post +(defbehavior hal-post hal () + (when (not (logtest? (-> self bot-flags) (bot-flags bf09))) + (let ((t9-0 (-> self waypoint on-update))) + (if t9-0 + (t9-0 self) + ) + ) + ) + (when (and (not (logtest? (-> self bot-flags) (bot-flags too-far-fail bf09))) (bot-check-too-far self)) + (let ((gp-0 0)) + (countdown (s5-0 3) + (let ((s4-0 (enemy-method-120 self 3 gp-0))) + (let ((a0-4 (handle->process (-> self slave-handle s4-0)))) + (if (send-event a0-4 'request 'too-far-fail) + (goto cfg-24) + ) + ) + (set! gp-0 (logior gp-0 (ash 1 s4-0))) + ) + ) + ) + ) + (label cfg-24) + (if (not (logtest? (-> self bot-flags) (bot-flags bf09))) + (ai-task-control-method-10 (-> self ai-ctrl) self) + ) + (if (logtest? *display-bot-marks* (bot-marks-controls bmc08)) + (bot-debug-draw-spot-id self) + ) + (none) + ) + +;; definition for function hal-event-handler +(defbehavior hal-event-handler hal ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (general-event-handler self arg0 arg1 arg2 arg3) + ) + +;; failed to figure out what this is: +(defstate idle (hal) + :virtual #t + :event hal-event-handler + :enter (the-as (function none :behavior hal) nothing) + :exit (the-as (function none :behavior hal) nothing) + :trans (the-as (function none :behavior hal) nothing) + :code (the-as (function none :behavior hal) sleep-code) + :post hal-post + ) + + + +