diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 6028068356..4c64da9233 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -1067,6 +1067,8 @@ (citadel-sage-yellow #x804) (citadel-sage-green #x805) + (misty-battle-finished #x813) + (training-gimmie-task-name #x91b) (training-buzzer-task-name #x91c) (training-door-task-name #x91d) @@ -22462,7 +22464,8 @@ (define-extern ja-group-index? (function int symbol :behavior nav-enemy)) (define-extern nav-enemy-jump-post (function none :behavior nav-enemy)) (define-extern nav-enemy-jump-land-post (function none :behavior nav-enemy)) -(define-extern nav-enemy-init-by-other (function nav-enemy vector vector none :behavior nav-enemy)) +(declare-type battlecontroller process-drawable) +(define-extern nav-enemy-init-by-other (function battlecontroller vector vector none :behavior nav-enemy)) ;; - Unknowns @@ -24636,12 +24639,12 @@ ;; - Types (deftype battlecontroller-spawner (structure) - ((path basic :offset-assert 0) - (creature uint64 :offset-assert 8) - (trigger-actor basic :offset-assert 16) - (blocker-actor basic :offset-assert 20) + ((path path-control :offset-assert 0) + (creature handle :offset-assert 8) + (trigger-actor entity-actor :offset-assert 16) + (blocker-actor entity-actor :offset-assert 20) (state int8 :offset-assert 24) - (enabled basic :offset-assert 28) + (enabled symbol :offset-assert 28) ) :method-count-assert 9 :size-assert #x20 @@ -24649,7 +24652,7 @@ ) (deftype battlecontroller-creature-type (structure) - ((type2 basic :offset-assert 0) + ((type2 type :offset-assert 0) ; a guess (percent float :offset-assert 4) (pickup-percent float :offset-assert 8) (pickup-type int32 :offset-assert 12) @@ -24673,16 +24676,16 @@ (creature-type-count int8 :offset-assert 204) (spawner-array battlecontroller-spawner 8 :inline :offset-assert 208) (spawn-period uint64 :offset-assert 464) - (path-spawn basic :offset-assert 472) + (path-spawn path-control :offset-assert 472) (creature-type-array battlecontroller-creature-type 4 :inline :offset-assert 476) - (final-pickup-type int32 :offset-assert 604) - (prespawn basic :offset-assert 608) - (noticed-player basic :offset-assert 612) - (camera-on basic :offset-assert 616) - (misty-ambush-collision-hack basic :offset-assert 620) - (disable-ocean basic :offset-assert 624) - (disable-near-ocean basic :offset-assert 628) - (disable-mid-ocean basic :offset-assert 632) + (final-pickup-type pickup-type :offset-assert 604) + (prespawn symbol :offset-assert 608) + (noticed-player symbol :offset-assert 612) + (camera-on symbol :offset-assert 616) + (misty-ambush-collision-hack symbol :offset-assert 620) + (disable-ocean symbol :offset-assert 624) + (disable-near-ocean symbol :offset-assert 628) + (disable-mid-ocean symbol :offset-assert 632) ) :method-count-assert 29 :size-assert #x27c @@ -24691,38 +24694,38 @@ ;; inherited inspect of process-drawable (:methods (dummy-20 () none 20) - (dummy-21 () none 21) - (battlecontroller-play-intro-camera () none 22) ;; state + (battlecontroller-idle () _type_ :state 21) + (battlecontroller-play-intro-camera () _type_ :state 22) (dummy-23 () none 23) - (dummy-24 () none 24) + (battlecontroller-active () _type_ :state 24) (dummy-25 () none 25) - (battlecontroller-die () none 26) ;; state - (dummy-27 () none 27) - (dummy-28 () none 28) + (battlecontroller-die () _type_ :state 26) + (TODO-RENAME-27 (_type_) none 27) ;; has pairs + (cleanup-if-finished! (_type_) none 28) ) ) ;; - Functions -(define-extern battlecontroller-task-completed? function) -(define-extern battlecontroller-off function) -(define-extern battlecontroller-camera-on function) -(define-extern battlecontroller-spawn-creature-random-spawner function) -(define-extern battlecontroller-disable-ocean function) -(define-extern battlecontroller-update-spawners function) -(define-extern battlecontroller-fill-all-spawners function) -(define-extern battlecontroller-battle-begin function) -(define-extern battlecontroller-spawn-creature-at-spawner function) -(define-extern battlecontroller-spawn-creature function) -(define-extern battlecontroller-spawners-full? function) -(define-extern battlecontroller-default-event-handler function) -(define-extern battlecontroller-draw-debug function) -(define-extern battlecontroller-camera-off function) -(define-extern battlecontroller-battle-end function) -(define-extern battlecontroller-special-contents? function) -(define-extern battlecontroller-special-contents-collected? function) -(define-extern battlecontroller-set-special-contents-collected function) -(define-extern battlecontroller-set-task-completed function) +(define-extern battlecontroller-task-completed? (function symbol :behavior battlecontroller)) +(define-extern battlecontroller-off (function none :behavior battlecontroller)) +(define-extern battlecontroller-camera-on (function object :behavior battlecontroller)) +(define-extern battlecontroller-spawn-creature-random-spawner (function none :behavior battlecontroller)) +(define-extern battlecontroller-disable-ocean (function none :behavior battlecontroller)) +(define-extern battlecontroller-update-spawners (function none :behavior battlecontroller)) +(define-extern battlecontroller-fill-all-spawners (function none :behavior battlecontroller)) +(define-extern battlecontroller-battle-begin (function none :behavior battlecontroller)) +(define-extern battlecontroller-spawn-creature-at-spawner (function int int none :behavior battlecontroller)) +(define-extern battlecontroller-spawn-creature (function vector vector handle :behavior battlecontroller)) +(define-extern battlecontroller-spawners-full? (function symbol :behavior battlecontroller)) +(define-extern battlecontroller-default-event-handler (function process int symbol event-message-block object :behavior battlecontroller)) +(define-extern battlecontroller-draw-debug (function none :behavior battlecontroller)) +(define-extern battlecontroller-camera-off (function none :behavior battlecontroller)) +(define-extern battlecontroller-battle-end (function none :behavior battlecontroller)) +(define-extern battlecontroller-special-contents? (function symbol :behavior battlecontroller)) +(define-extern battlecontroller-special-contents-collected? (function symbol :behavior battlecontroller)) +(define-extern battlecontroller-set-special-contents-collected (function none :behavior battlecontroller)) +(define-extern battlecontroller-set-task-completed (function none :behavior battlecontroller)) ;; ---------------------- diff --git a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc index 49fc6727de..123fb0749f 100644 --- a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc @@ -365,7 +365,6 @@ "kermit-check-to-hit-player?", "(anon-function 6 title-obs)", "(anon-function 36 mistycannon)", - "(anon-function 5 battlecontroller)", "(anon-function 43 maincave-obs)", "(anon-function 2 target-tube)", "(anon-function 5 orbit-plat)", @@ -415,7 +414,8 @@ "entity-remap-names", "(method 21 swamp-rat-nest-dummy-a)", "(method 21 swamp-rat-nest-dummy-b)", - "(method 21 swamp-rat-nest-dummy-c)" + "(method 21 swamp-rat-nest-dummy-c)", + "(method 27 battlecontroller)" ], // If format is used with the wrong number of arguments, diff --git a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc index 9c7c9b2612..22ea64a663 100644 --- a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc @@ -2698,5 +2698,40 @@ [16, "vector"] ], + "battlecontroller-fill-all-spawners": [ + [16, "vector"], + [32, "event-message-block"] + ], + + "battlecontroller-camera-on": [ + [16, "event-message-block"] + ], + + "(code battlecontroller-die battlecontroller)": [ + [16, "event-message-block"] + ], + + "battlecontroller-battle-begin": [ + [16, "event-message-block"] + ], + + "battlecontroller-update-spawners": [ + [16, "vector"], + [32, "event-message-block"] + ], + + "battlecontroller-spawn-creature-at-spawner": [ + [16, "vector"], + [32, "vector"] + ], + + "battlecontroller-camera-off": [ + [16, "event-message-block"] + ], + + "battlecontroller-spawn-creature-random-spawner": [ + [16, "event-message-block"] + ], + "placeholder-do-not-add-below!": [] } diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index 745bd9cea1..e58d26f425 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -3880,5 +3880,32 @@ [311, "v0", "sound-rpc-set-param"] ], + "battlecontroller-default-event-handler": [ + [9, "a0", "process-drawable"] + ], + + "battlecontroller-update-spawners": [ + [19, "s4", "nav-enemy"], + [57, "s4", "nav-enemy"] + ], + + "battlecontroller-spawn-creature": [ + [33, "v0", "nav-enemy"], + [[53, 136], "gp", "(pointer nav-enemy)"] + ], + + "(method 7 battlecontroller)": [ + [29, "t9", "(function process-drawable int process-drawable)"] + ], + + "(method 10 battlecontroller)": [ + [13, "t9", "(function process-drawable none)"] + ], + + "(method 27 battlecontroller)": [ + ["_stack_", 16, "res-tag"], + [182, "v0", "(pointer int32)"] + ], + "placeholder-do-not-add-below": [] } diff --git a/goal_src/engine/ui/text-h.gc b/goal_src/engine/ui/text-h.gc index 66dbb77d01..8cea26f48b 100644 --- a/goal_src/engine/ui/text-h.gc +++ b/goal_src/engine/ui/text-h.gc @@ -268,7 +268,7 @@ (ogre-end #x600) (ogre-buzzer #x601) (ogre-boss #x603) - + (assistant-voicebox-intro-ogre-race #x605) (sidekick-speech-hint-ogre-race #x61c) @@ -283,6 +283,8 @@ (citadel-sage-yellow #x804) (citadel-sage-green #x805) + (misty-battle-finished #x813) + (training-gimmie-task-name #x91b) (training-buzzer-task-name #x91c) (training-door-task-name #x91d) diff --git a/goal_src/levels/common/battlecontroller.gc b/goal_src/levels/common/battlecontroller.gc index 5a7946b223..3c733c2678 100644 --- a/goal_src/levels/common/battlecontroller.gc +++ b/goal_src/levels/common/battlecontroller.gc @@ -5,3 +5,1037 @@ ;; name in dgo: battlecontroller ;; dgos: CIT, L1, MIS, SWA +;; DECOMP BEGINS + +(deftype battlecontroller-spawner (structure) + ((path path-control :offset-assert 0) + (creature handle :offset-assert 8) + (trigger-actor entity-actor :offset-assert 16) + (blocker-actor entity-actor :offset-assert 20) + (state int8 :offset-assert 24) + (enabled symbol :offset-assert 28) + ) + :method-count-assert 9 + :size-assert #x20 + :flag-assert #x900000020 + ) + + +(deftype battlecontroller-creature-type (structure) + ((type2 type :offset-assert 0) + (percent float :offset-assert 4) + (pickup-percent float :offset-assert 8) + (pickup-type int32 :offset-assert 12) + (max-pickup-count int8 :offset-assert 16) + (pickup-count int8 :offset-assert 17) + ) + :allow-misaligned :method-count-assert 9 + :size-assert #x12 + :flag-assert #x900000012 + ) + + +(deftype battlecontroller (process-drawable) + ((final-pickup-spawn-point vector :inline :offset-assert 176) + (activate-distance float :offset-assert 192) + (max-spawn-count int16 :offset-assert 196) + (spawn-count int16 :offset-assert 198) + (die-count int16 :offset-assert 200) + (target-count int8 :offset-assert 202) + (spawner-count int8 :offset-assert 203) + (creature-type-count int8 :offset-assert 204) + (spawner-array battlecontroller-spawner 8 :inline :offset-assert 208) + (spawn-period uint64 :offset-assert 464) + (path-spawn path-control :offset-assert 472) + (creature-type-array battlecontroller-creature-type 4 :inline :offset-assert 476) + (final-pickup-type pickup-type :offset-assert 604) + (prespawn symbol :offset-assert 608) + (noticed-player symbol :offset-assert 612) + (camera-on symbol :offset-assert 616) + (misty-ambush-collision-hack symbol :offset-assert 620) + (disable-ocean symbol :offset-assert 624) + (disable-near-ocean symbol :offset-assert 628) + (disable-mid-ocean symbol :offset-assert 632) + ) + :heap-base #x210 + :method-count-assert 29 + :size-assert #x27c + :flag-assert #x1d0210027c + (:methods + (dummy-20 () none 20) + (battlecontroller-idle () _type_ :state 21) + (battlecontroller-play-intro-camera () _type_ :state 22) + (dummy-23 () none 23) + (battlecontroller-active () _type_ :state 24) + (dummy-25 () none 25) + (battlecontroller-die () _type_ :state 26) + (TODO-RENAME-27 (_type_) none 27) + (cleanup-if-finished! (_type_) none 28) + ) + ) + + +(defbehavior battlecontroller-spawners-full? battlecontroller () + (dotimes (v1-0 (-> self spawner-count)) + (if (= (-> self spawner-array v1-0 creature) #f) + (return #f) + ) + ) + #t + ) + +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? +(defbehavior + battlecontroller-default-event-handler battlecontroller + ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (let ((v1-0 arg2)) + (the-as object (cond + ((= v1-0 'child-die) + (+! (-> self die-count) 1) + (when (= (-> self die-count) (-> self max-spawn-count)) + (let ((v1-4 (the-as process-drawable arg0))) + (when v1-4 + (set! + (-> self final-pickup-spawn-point quad) + (-> v1-4 root trans quad) + ) + (let ((a0-2 (-> self final-pickup-type))) + (the-as none (cond + ((= a0-2 (pickup-type fuel-cell)) + #f + ) + (else + (set! + (-> v1-4 fact pickup-type) + (-> self final-pickup-type) + ) + (set! (-> v1-4 fact pickup-amount) 1.0) + (let ((f0-1 0.0)) + (set! + (-> v1-4 fact pickup-spawn-amount) + f0-1 + ) + f0-1 + ) + ) + ) + ) + ) + ) + ) + ) + ) + ((= v1-0 'trigger) + (go-virtual battlecontroller-die) + ) + ) + ) + ) + ) + +battlecontroller-default-event-handler + +(defbehavior battlecontroller-draw-debug battlecontroller () + (dotimes (gp-0 (-> self spawner-count)) + (dummy-9 (-> self spawner-array gp-0 path)) + ) + 0 + (none) + ) + +(defbehavior battlecontroller-camera-on battlecontroller () + (when (not (-> self camera-on)) + (set! (-> self camera-on) #t) + (let ((v1-4 (res-lump-struct (-> self entity) 'camera-name structure))) + (when v1-4 + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) self) + (set! (-> a1-1 num-params) 1) + (set! (-> a1-1 message) 'change-to-entity-by-name) + (set! (-> a1-1 param 0) (the-as uint v1-4)) + (send-event-function *camera* a1-1) + ) + ) + ) + ) + (the-as object 0) + ) + +(defbehavior battlecontroller-camera-off battlecontroller () + (set! (-> self camera-on) #f) + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) self) + (set! (-> a1-0 num-params) 0) + (set! (-> a1-0 message) 'clear-entity) + (send-event-function *camera* a1-0) + ) + 0 + (none) + ) + +(defbehavior battlecontroller-update-spawners battlecontroller () + (dotimes (gp-0 (-> self spawner-count)) + (let* ((s5-0 (-> self spawner-array gp-0)) + (s4-0 (handle->process (-> s5-0 creature))) + ) + (when + (and s4-0 (logtest? (-> (the-as nav-enemy s4-0) nav-enemy-flags) 2048)) + (cond + ((< (-> s5-0 state) (-> s5-0 path curve num-cverts)) + (when (or (-> self noticed-player) (= (-> s5-0 state) 1)) + (let ((s3-0 (new 'stack-no-clear 'vector))) + (eval-path-curve-div! + (-> s5-0 path) + s3-0 + (the float (-> s5-0 state)) + 'interp + ) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) self) + (set! (-> a1-2 num-params) 1) + (set! (-> a1-2 message) 'cue-jump-to-point) + (set! (-> a1-2 param 0) (the-as uint s3-0)) + (send-event-function s4-0 a1-2) + ) + ) + (if (zero? (logand (-> (the-as nav-enemy s4-0) nav-enemy-flags) 2048)) + (+! (-> s5-0 state) 1) + ) + ) + ) + (else + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) self) + (set! (-> a1-3 num-params) 0) + (set! (-> a1-3 message) 'cue-chase) + (send-event-function s4-0 a1-3) + ) + (set! (-> s5-0 creature) (the-as handle #f)) + ) + ) + ) + ) + ) + 0 + (none) + ) + +(defbehavior + battlecontroller-spawn-creature battlecontroller + ((arg0 vector) (arg1 vector)) + (local-vars (v1-25 int)) + (let ((f0-0 (rand-vu)) + (v1-0 0) + ) + (dotimes (a0-1 (-> self creature-type-count)) + (when (>= f0-0 0.0) + (set! f0-0 (- f0-0 (-> self creature-type-array a0-1 percent))) + (if (< f0-0 0.0) + (set! v1-0 a0-1) + ) + ) + ) + (let* ((s5-0 (-> self creature-type-array v1-0)) + (s2-0 (-> s5-0 type2)) + (s1-0 + (the-as nav-enemy (get-process *default-dead-pool* s2-0 #x4000)) + ) + (gp-0 (when s1-0 + (let ((t9-2 (method-of-type process activate))) + (t9-2 s1-0 self s2-0 (the-as pointer #x70004000)) + ) + (run-now-in-process + s1-0 + nav-enemy-init-by-other + self + arg0 + arg1 + ) + (-> s1-0 ppointer) + ) + ) + ) + (if (and gp-0 (zero? (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info))) + (set! gp-0 (the-as (pointer process) #f)) + ) + (when (the-as (pointer nav-enemy) gp-0) + (logclear! + (-> (the-as (pointer nav-enemy) gp-0) 0 mask) + (process-mask actor-pause) + ) + (if (-> self misty-ambush-collision-hack) + (logior! (-> (the-as (pointer nav-enemy) gp-0) 0 nav-enemy-flags) #x8000) + ) + (+! (-> self spawn-count) 1) + (-> self fact pickup-type) + (cond + ((and + (< (-> s5-0 pickup-count) (-> s5-0 max-pickup-count)) + (rand-vu-percent? (-> s5-0 pickup-percent)) + ) + (+! (-> s5-0 pickup-count) 1) + (set! v1-25 (-> s5-0 pickup-type)) + ) + (else + (set! v1-25 (the-as int (-> self fact pickup-type))) + ) + ) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-type) + (the-as pickup-type v1-25) + ) + (cond + ((= v1-25 7) + ) + ((zero? v1-25) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-amount) + 0.0 + ) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-spawn-amount) + 0.0 + ) + ) + (else + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-amount) + 1.0 + ) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-spawn-amount) + 0.0 + ) + (logior! (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info options) 512) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info fade-time) + (the-as uint 1200) + ) + ) + ) + ) + (the-as handle (ppointer->handle gp-0)) + ) + ) + ) + +(defbehavior + battlecontroller-spawn-creature-at-spawner battlecontroller + ((arg0 int) (arg1 int)) + (let* ((s5-0 (-> self spawner-array arg0)) + (s3-0 (-> s5-0 path)) + (s4-0 + (eval-path-curve-div! + s3-0 + (new 'stack-no-clear 'vector) + (the float arg1) + 'interp + ) + ) + (a1-3 + (eval-path-curve-div! + s3-0 + (new 'stack-no-clear 'vector) + (the float (+ arg1 1)) + 'interp + ) + ) + ) + (when + (and + (not (handle->process (-> s5-0 creature))) + (< (-> self spawn-count) (-> self max-spawn-count)) + ) + (let ((v1-10 (battlecontroller-spawn-creature s4-0 a1-3))) + (when (handle->process v1-10) + (set! (-> s5-0 creature) v1-10) + (set! (-> s5-0 state) (+ arg1 1)) + ) + ) + ) + ) + 0 + (none) + ) + +(defbehavior battlecontroller-spawn-creature-random-spawner battlecontroller () + (let* ((gp-0 (rand-vu-int-count (-> self spawner-count))) + (v1-2 (-> self spawner-array gp-0)) + ) + (when (and (-> v1-2 enabled) (-> v1-2 blocker-actor)) + (when + (logtest? + (-> v1-2 blocker-actor extra perm status) + (entity-perm-status complete) + ) + (set! (-> v1-2 enabled) #f) + (let ((a0-9 0)) + (dotimes (a1-0 (-> self spawner-count)) + (if (-> self spawner-array a1-0 enabled) + (+! a0-9 1) + ) + ) + (if (zero? a0-9) + (set! (-> self spawn-count) (-> self max-spawn-count)) + ) + ) + ) + ) + (when (and (-> v1-2 enabled) (not (handle->process (-> v1-2 creature)))) + (let ((a1-7 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-7 from) self) + (set! (-> a1-7 num-params) 0) + (set! (-> a1-7 message) 'spawn) + (let ((t9-1 send-event-function) + (v1-3 (-> v1-2 trigger-actor)) + ) + (t9-1 (if v1-3 + (-> v1-3 extra process) + ) + a1-7 + ) + ) + ) + (battlecontroller-spawn-creature-at-spawner gp-0 0) + ) + ) + 0 + (none) + ) + +(defbehavior battlecontroller-fill-all-spawners battlecontroller () + (dotimes (gp-0 (-> self spawner-count)) + (battlecontroller-spawn-creature-at-spawner gp-0 1) + ) + (when (nonzero? (-> self path-spawn)) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (dotimes (s5-0 (-> self path-spawn curve num-cverts)) + (eval-path-curve-div! (-> self path-spawn) gp-1 (the float s5-0) 'interp) + (let ((s4-0 (battlecontroller-spawn-creature gp-1 (-> self root trans)))) + (when (handle->process s4-0) + (suspend) + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) self) + (set! (-> a1-4 num-params) 0) + (set! (-> a1-4 message) 'cue-chase) + (send-event-function (handle->process s4-0) a1-4) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +(defbehavior battlecontroller-battle-begin battlecontroller () + (set-setting! *setting-control* self 'music 'danger 0.0 0) + (let ((gp-0 (entity-actor-count (-> self entity) 'kill-actor))) + (dotimes (s5-0 gp-0) + (let ((v1-2 (entity-actor-lookup (-> self entity) 'kill-actor s5-0))) + (if v1-2 + (logior! (-> v1-2 extra perm status) (entity-perm-status bit-9)) + ) + ) + ) + ) + (let ((gp-1 (entity-actor-count (-> self entity) 'trigger-actor))) + (dotimes (s5-1 gp-1) + (let ((s4-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> s4-0 from) self) + (set! (-> s4-0 num-params) 0) + (set! (-> s4-0 message) 'trigger) + (let ((s3-0 send-event-function) + (v1-7 (entity-actor-lookup (-> self entity) 'trigger-actor s5-1)) + ) + (s3-0 (if v1-7 + (-> v1-7 extra process) + ) + s4-0 + ) + ) + ) + ) + ) + (level-hint-spawn + (game-text-id zero) + (the-as string #f) + (-> self entity) + *entity-pool* + (game-task none) + ) + 0 + (none) + ) + +(defbehavior battlecontroller-off battlecontroller () + (clear-pending-settings-from-process *setting-control* self 'music) + (let ((gp-0 (entity-actor-count (-> self entity) 'kill-actor))) + (dotimes (s5-0 gp-0) + (let ((v1-2 (entity-actor-lookup (-> self entity) 'kill-actor s5-0))) + (if v1-2 + (logclear! (-> v1-2 extra perm status) (entity-perm-status bit-9)) + ) + ) + ) + ) + 0 + (none) + ) + +(defbehavior battlecontroller-battle-end battlecontroller () + (case (-> (level-get-target-inside *level*) name) + (('citadel) + (level-hint-spawn + (game-text-id misty-battle-finished) + "sksp0378" + (the-as entity #f) + *entity-pool* + (game-task none) + ) + ) + ) + (battlecontroller-off) + (none) + ) + +(defstate battlecontroller-idle (battlecontroller) + :virtual #t + :event + battlecontroller-default-event-handler + :trans + (behavior () + 0 + (none) + ) + :code + (behavior () + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (if (-> self prespawn) + (battlecontroller-fill-all-spawners) + ) + (while #t + (when + (>= + (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) + 30 + ) + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (when + (and + *target* + (>= + (-> self activate-distance) + (vector-vector-distance + (-> self root trans) + (-> *target* control trans) + ) + ) + ) + (set! (-> self noticed-player) #t) + (battlecontroller-battle-begin) + (when (not (-> self prespawn)) + (battlecontroller-fill-all-spawners) + (suspend) + 0 + ) + (go-virtual battlecontroller-play-intro-camera) + ) + ) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior battlecontroller) #f) + ) + +(defstate battlecontroller-play-intro-camera (battlecontroller) + :virtual #t + :event + battlecontroller-default-event-handler + :enter + (behavior () + (process-entity-status! self (entity-perm-status bit-3) #t) + (none) + ) + :exit + (behavior () + (process-entity-status! self (entity-perm-status bit-3) #f) + (none) + ) + :code + (behavior () + (go-virtual battlecontroller-active) + (none) + ) + ) + +(defbehavior battlecontroller-disable-ocean battlecontroller () + (set! *ocean-off* (-> self disable-ocean)) + (set! *ocean-mid-off* (-> self disable-mid-ocean)) + (set! *ocean-near-off* (-> self disable-near-ocean)) + 0 + (none) + ) + +(defstate battlecontroller-active (battlecontroller) + :virtual #t + :event + battlecontroller-default-event-handler + :trans + (behavior () + (if + (and + *target* + (>= + (-> self activate-distance) + (vector-vector-distance (-> self root trans) (-> *target* control trans)) + ) + ) + (level-hint-spawn + (game-text-id zero) + (the-as string #f) + (-> self entity) + *entity-pool* + (game-task none) + ) + ) + (battlecontroller-disable-ocean) + (battlecontroller-update-spawners) + (none) + ) + :code + (behavior () + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (battlecontroller-camera-on) + (while #t + (when + (>= + (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) + 30 + ) + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (let ((gp-0 0)) + (let ((v1-8 (-> self child))) + (while v1-8 + (+! gp-0 1) + (set! v1-8 (-> v1-8 0 brother)) + (nop!) + (nop!) + ) + ) + (if (and (zero? gp-0) (= (-> self spawn-count) (-> self max-spawn-count))) + (go-virtual battlecontroller-die) + ) + (when (< gp-0 (-> self target-count)) + (let ((gp-1 (-> *display* base-frame-counter))) + (until + (>= + (- (-> *display* base-frame-counter) gp-1) + (the-as int (-> self spawn-period)) + ) + (suspend) + ) + ) + (battlecontroller-spawn-creature-random-spawner) + ) + ) + ) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior battlecontroller) #f) + ) + +(defbehavior battlecontroller-special-contents? battlecontroller () + (= (-> self final-pickup-type) (pickup-type fuel-cell)) + ) + +(defbehavior battlecontroller-special-contents-collected? battlecontroller () + (= (-> self entity extra perm user-int8 0) 2) + ) + +(defbehavior battlecontroller-set-special-contents-collected battlecontroller () + (let ((v1-2 (-> self entity extra perm))) + (logior! (-> v1-2 status) (entity-perm-status user-set-from-cstage)) + (set! (-> v1-2 user-int8 0) 2) + ) + 0 + (none) + ) + +(defbehavior battlecontroller-task-completed? battlecontroller () + (>= (-> self entity extra perm user-int8 0) 1) + ) + +(defbehavior battlecontroller-set-task-completed battlecontroller () + (let ((v1-2 (-> self entity extra perm))) + (logior! (-> v1-2 status) (entity-perm-status user-set-from-cstage)) + (set! (-> v1-2 user-int8 0) 1) + ) + 0 + (none) + ) + +(defstate battlecontroller-die (battlecontroller) + :virtual #t + :event + (the-as + (function process int symbol event-message-block object :behavior battlecontroller) + process-drawable-fuel-cell-handler + ) + :code + (behavior () + (sound-play-by-name + (static-sound-name "money-pickup") + (new-sound-id) + 1024 + -2286 + 0 + (the-as uint 1) + (the-as vector #f) + ) + (battlecontroller-battle-end) + (battlecontroller-camera-off) + (battlecontroller-set-task-completed) + (countdown (gp-1 (entity-actor-count (-> self entity) 'fade-actor)) + (let ((s5-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> s5-1 from) self) + (set! (-> s5-1 num-params) 0) + (set! (-> s5-1 message) 'fade) + (let ((s4-0 send-event-function) + (v1-2 (entity-actor-lookup (-> self entity) 'fade-actor gp-1)) + ) + (s4-0 (if v1-2 + (-> v1-2 extra process) + ) + s5-1 + ) + ) + ) + ) + (countdown (gp-2 (entity-actor-count (-> self entity) 'alt-actor)) + (let ((s5-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> s5-2 from) self) + (set! (-> s5-2 num-params) 0) + (set! (-> s5-2 message) 'trigger) + (let ((s4-1 send-event-function) + (v1-8 (entity-actor-lookup (-> self entity) 'alt-actor gp-2)) + ) + (s4-1 (if v1-8 + (-> v1-8 extra process) + ) + s5-2 + ) + ) + ) + ) + (when + (and + (battlecontroller-special-contents?) + (not (battlecontroller-special-contents-collected?)) + ) + (label cfg-15) + (birth-pickup-at-point + (-> self final-pickup-spawn-point) + (the-as int (-> self final-pickup-type)) + (the float (-> self entity extra perm task)) + #f + self + #f + ) + (when (not (-> self child)) + (suspend) + (goto cfg-15) + ) + (while (-> self child) + (suspend) + ) + (battlecontroller-set-special-contents-collected) + ) + (while (-> self child) + (suspend) + ) + (process-entity-status! self (entity-perm-status dead) #t) + (none) + ) + :post + (the-as (function none :behavior battlecontroller) #f) + ) + +(defmethod relocate battlecontroller ((obj battlecontroller) (arg0 int)) + (dotimes (v1-0 (-> obj spawner-count)) + (let ((a0-3 (-> obj spawner-array v1-0))) + (if (nonzero? (-> a0-3 path)) + (&+! (-> a0-3 path) arg0) + ) + ) + ) + (if (nonzero? (-> obj path-spawn)) + (&+! (-> obj path-spawn) arg0) + ) + (the-as + battlecontroller + ((the-as + (function process-drawable int process-drawable) + (find-parent-method battlecontroller 7) + ) + obj + arg0 + ) + ) + ) + +(defmethod deactivate battlecontroller ((obj battlecontroller)) + (with-pp + (let ((gp-0 pp)) + (let ((s6-1 obj)) + ) + (battlecontroller-off) + (let ((s6-2 gp-0)) + ) + ) + ((the-as + (function process-drawable none) + (find-parent-method battlecontroller 10) + ) + obj + ) + 0 + (none) + ) + ) + +(defmethod TODO-RENAME-27 battlecontroller ((obj battlecontroller)) + (local-vars (sv-16 res-tag)) + (set! + (-> obj fact) + (new + 'process + 'fact-info + obj + (pickup-type eco-pill-random) + (-> *FACT-bank* default-pill-inc) + ) + ) + (set! (-> obj path) (new 'process 'path-control obj 'path 0.0)) + (logior! + (-> obj path flags) + (path-control-flag display draw-line draw-point draw-text) + ) + (set! (-> obj activate-distance) 122880.0) + (let ((s5-0 0)) + (let* ((s4-0 '(patha pathb pathc pathd pathe pathf pathg pathh)) + (s2-0 (car s4-0)) + ) + (while (not (null? s4-0)) + (let + ((v1-7 (res-lump-struct (-> obj entity) (the-as symbol s2-0) structure)) + (s3-0 (-> obj spawner-array s5-0)) + ) + (when (and v1-7 (< s5-0 8)) + (set! + (-> s3-0 path) + (new 'process 'path-control obj (the-as symbol s2-0) 0.0) + ) + (set! (-> s3-0 creature) (the-as handle #f)) + (set! (-> s3-0 trigger-actor) #f) + (set! (-> s3-0 blocker-actor) #f) + (set! (-> s3-0 enabled) #t) + (logior! + (-> s3-0 path flags) + (path-control-flag display draw-line draw-point draw-text) + ) + (+! s5-0 1) + ) + ) + (set! s4-0 (cdr s4-0)) + (set! s2-0 (car s4-0)) + ) + ) + (set! (-> obj spawner-count) s5-0) + ) + 0 + (if (res-lump-struct (-> obj entity) 'pathspawn structure) + (set! (-> obj path-spawn) (new 'process 'path-control obj 'pathspawn 0.0)) + ) + (let ((s5-1 (entity-actor-count (-> obj entity) 'spawner-trigger-actor))) + (dotimes (s4-1 s5-1) + (if (< s4-1 (-> obj spawner-count)) + (set! + (-> obj spawner-array s4-1 trigger-actor) + (entity-actor-lookup (-> obj entity) 'spawner-trigger-actor s4-1) + ) + ) + ) + ) + (let ((s5-2 (entity-actor-count (-> obj entity) 'spawner-blocker-actor))) + (dotimes (s4-2 s5-2) + (if (< s4-2 (-> obj spawner-count)) + (set! + (-> obj spawner-array s4-2 blocker-actor) + (entity-actor-lookup (-> obj entity) 'spawner-blocker-actor s4-2) + ) + ) + ) + ) + (set! + (-> obj spawn-period) + (the-as + uint + (the int (* 300.0 (res-lump-float (-> obj entity) 'delay :default 0.1))) + ) + ) + (set! (-> obj target-count) 10) + (set! (-> obj max-spawn-count) 100) + (set! (-> obj spawn-count) 0) + (set! (-> obj die-count) 0) + (set! (-> obj creature-type-count) 1) + (set! (-> obj noticed-player) #f) + (set! (-> obj camera-on) #f) + (let ((v1-46 (res-lump-data (-> obj entity) 'num-lurkers (pointer int32)))) + (when v1-46 + (set! (-> obj target-count) (-> v1-46 0)) + (set! (-> obj max-spawn-count) (-> v1-46 1)) + ) + ) + (set! (-> obj creature-type-array 0 type2) babak) + (set! (-> obj creature-type-array 0 percent) 1.0) + (let ((s5-3 0)) + (set! sv-16 (new 'static 'res-tag)) + (let + ((v1-49 + (res-lump-data (-> obj entity) 'lurker-type pointer :tag-ptr (& sv-16)) + ) + ) + (when v1-49 + (dotimes (a0-22 (the-as int (-> sv-16 elt-count))) + (let ((a1-15 (-> (the-as (pointer uint32) (&+ v1-49 (* a0-22 4)))))) + (when (nonzero? a1-15) + (set! (-> obj creature-type-array s5-3 type2) (the-as type a1-15)) + (+! s5-3 1) + ) + ) + ) + ) + ) + (set! (-> obj creature-type-count) s5-3) + ) + (let ((v1-52 (res-lump-data (-> obj entity) 'percent pointer)) + (f0-6 0.0) + ) + (when v1-52 + (dotimes (a0-26 (-> obj creature-type-count)) + (set! + (-> obj creature-type-array a0-26 percent) + (fabs (-> (the-as (pointer float) (&+ v1-52 (* a0-26 4))))) + ) + (+! f0-6 (-> obj creature-type-array a0-26 percent)) + ) + (cond + ((= f0-6 0.0) + (set! (-> obj creature-type-count) 1) + (set! (-> obj creature-type-array 0 percent) 1.0) + ) + (else + (let ((f0-9 (/ 1.0 f0-6))) + (dotimes (v1-57 (-> obj creature-type-count)) + (set! + (-> obj creature-type-array 0 percent) + (* (-> obj creature-type-array 0 percent) f0-9) + ) + ) + ) + ) + ) + ) + ) + (set! + (-> obj final-pickup-type) + (res-lump-value + (-> obj entity) + 'final-pickup + pickup-type + :default + (the-as uint128 7) + ) + ) + (let ((s5-4 (res-lump-data (-> obj entity) 'pickup-type pointer)) + (s4-3 (res-lump-data (-> obj entity) 'max-pickup-count pointer)) + (v1-63 (res-lump-data (-> obj entity) 'pickup-percent pointer)) + ) + (dotimes (a0-34 (-> obj creature-type-count)) + (let ((a1-34 (-> obj creature-type-array a0-34))) + (set! (-> a1-34 pickup-count) 0) + (if s5-4 + (set! + (-> a1-34 pickup-type) + (-> (the-as (pointer int32) (&+ s5-4 (* a0-34 4)))) + ) + ) + (if s4-3 + (set! + (-> a1-34 max-pickup-count) + (-> (the-as (pointer int32) (&+ s4-3 (* a0-34 4)))) + ) + ) + (if v1-63 + (set! + (-> a1-34 pickup-percent) + (-> (the-as (pointer float) (&+ v1-63 (* a0-34 4)))) + ) + ) + ) + ) + ) + (set! (-> obj misty-ambush-collision-hack) #f) + (set! (-> obj disable-ocean) #f) + (set! (-> obj disable-mid-ocean) #f) + (set! (-> obj disable-near-ocean) #t) + (set! (-> obj final-pickup-spawn-point quad) (-> obj root trans quad)) + (set! (-> obj prespawn) (= (res-lump-value (-> obj entity) 'mode uint128) 1)) + 0 + (none) + ) + +(defmethod cleanup-if-finished! battlecontroller ((obj battlecontroller)) + (if (battlecontroller-task-completed?) + (go (method-of-object obj battlecontroller-die)) + (go (method-of-object obj battlecontroller-idle)) + ) + 0 + (none) + ) + +(defmethod + copy-defaults! + battlecontroller + ((obj battlecontroller) (arg0 res-lump)) + (set! (-> obj mask) (logior (process-mask enemy) (-> obj mask))) + (set! (-> obj root) (new 'process 'trsqv)) + (process-drawable-from-entity! obj arg0) + (TODO-RENAME-27 obj) + (cleanup-if-finished! obj) + (none) + ) + + + + diff --git a/goal_src/levels/common/nav-enemy.gc b/goal_src/levels/common/nav-enemy.gc index 6a35762a13..805ef69b65 100644 --- a/goal_src/levels/common/nav-enemy.gc +++ b/goal_src/levels/common/nav-enemy.gc @@ -5,6 +5,8 @@ ;; name in dgo: nav-enemy ;; dgos: GAME, COMMON, L1 +(declare-type battlecontroller process-drawable) + ;; DECOMP BEGINS (defun nav-enemy-rnd-float () @@ -3078,7 +3080,7 @@ nav-enemy-default-event-handler (defbehavior nav-enemy-init-by-other nav-enemy - ((arg0 nav-enemy) (arg1 vector) (arg2 vector)) + ((arg0 battlecontroller) (arg1 vector) (arg2 vector)) (initialize-collision self) (logior! (-> self mask) (process-mask actor-pause)) (set! (-> self collide-info trans quad) (-> arg1 quad)) diff --git a/test/decompiler/reference/levels/common/battlecontroller_REF.gc b/test/decompiler/reference/levels/common/battlecontroller_REF.gc new file mode 100644 index 0000000000..984278a155 --- /dev/null +++ b/test/decompiler/reference/levels/common/battlecontroller_REF.gc @@ -0,0 +1,1143 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type battlecontroller-spawner +(deftype battlecontroller-spawner (structure) + ((path path-control :offset-assert 0) + (creature handle :offset-assert 8) + (trigger-actor entity-actor :offset-assert 16) + (blocker-actor entity-actor :offset-assert 20) + (state int8 :offset-assert 24) + (enabled symbol :offset-assert 28) + ) + :method-count-assert 9 + :size-assert #x20 + :flag-assert #x900000020 + ) + +;; definition for method 3 of type battlecontroller-spawner +(defmethod inspect battlecontroller-spawner ((obj battlecontroller-spawner)) + (format #t "[~8x] ~A~%" obj 'battlecontroller-spawner) + (format #t "~Tpath: ~A~%" (-> obj path)) + (format #t "~Tcreature: ~D~%" (-> obj creature)) + (format #t "~Ttrigger-actor: ~A~%" (-> obj trigger-actor)) + (format #t "~Tblocker-actor: ~A~%" (-> obj blocker-actor)) + (format #t "~Tstate: ~D~%" (-> obj state)) + (format #t "~Tenabled: ~A~%" (-> obj enabled)) + obj + ) + +;; definition of type battlecontroller-creature-type +(deftype battlecontroller-creature-type (structure) + ((type2 type :offset-assert 0) + (percent float :offset-assert 4) + (pickup-percent float :offset-assert 8) + (pickup-type int32 :offset-assert 12) + (max-pickup-count int8 :offset-assert 16) + (pickup-count int8 :offset-assert 17) + ) + :allow-misaligned :method-count-assert 9 + :size-assert #x12 + :flag-assert #x900000012 + ) + +;; definition for method 3 of type battlecontroller-creature-type +(defmethod + inspect + battlecontroller-creature-type + ((obj battlecontroller-creature-type)) + (format #t "[~8x] ~A~%" obj 'battlecontroller-creature-type) + (format #t "~Ttype2: ~A~%" (-> obj type2)) + (format #t "~Tpercent: ~f~%" (-> obj percent)) + (format #t "~Tpickup-percent: ~f~%" (-> obj pickup-percent)) + (format #t "~Tpickup-type: ~D~%" (-> obj pickup-type)) + (format #t "~Tmax-pickup-count: ~D~%" (-> obj max-pickup-count)) + (format #t "~Tpickup-count: ~D~%" (-> obj pickup-count)) + obj + ) + +;; definition of type battlecontroller +(deftype battlecontroller (process-drawable) + ((final-pickup-spawn-point vector :inline :offset-assert 176) + (activate-distance float :offset-assert 192) + (max-spawn-count int16 :offset-assert 196) + (spawn-count int16 :offset-assert 198) + (die-count int16 :offset-assert 200) + (target-count int8 :offset-assert 202) + (spawner-count int8 :offset-assert 203) + (creature-type-count int8 :offset-assert 204) + (spawner-array battlecontroller-spawner 8 :inline :offset-assert 208) + (spawn-period uint64 :offset-assert 464) + (path-spawn path-control :offset-assert 472) + (creature-type-array battlecontroller-creature-type 4 :inline :offset-assert 476) + (final-pickup-type pickup-type :offset-assert 604) + (prespawn symbol :offset-assert 608) + (noticed-player symbol :offset-assert 612) + (camera-on symbol :offset-assert 616) + (misty-ambush-collision-hack symbol :offset-assert 620) + (disable-ocean symbol :offset-assert 624) + (disable-near-ocean symbol :offset-assert 628) + (disable-mid-ocean symbol :offset-assert 632) + ) + :heap-base #x210 + :method-count-assert 29 + :size-assert #x27c + :flag-assert #x1d0210027c + (:methods + (dummy-20 () none 20) + (battlecontroller-idle () _type_ :state 21) + (battlecontroller-play-intro-camera () _type_ :state 22) + (dummy-23 () none 23) + (battlecontroller-active () _type_ :state 24) + (dummy-25 () none 25) + (battlecontroller-die () _type_ :state 26) + (TODO-RENAME-27 (_type_) none 27) + (cleanup-if-finished! (_type_) none 28) + ) + ) + +;; definition for method 3 of type battlecontroller +(defmethod inspect battlecontroller ((obj battlecontroller)) + (let ((t9-0 (method-of-type process-drawable inspect))) + (t9-0 obj) + ) + (format + #t + "~T~Tfinal-pickup-spawn-point: #~%" + (-> obj final-pickup-spawn-point) + ) + (format #t "~T~Tactivate-distance: ~f~%" (-> obj activate-distance)) + (format #t "~T~Tmax-spawn-count: ~D~%" (-> obj max-spawn-count)) + (format #t "~T~Tspawn-count: ~D~%" (-> obj spawn-count)) + (format #t "~T~Tdie-count: ~D~%" (-> obj die-count)) + (format #t "~T~Ttarget-count: ~D~%" (-> obj target-count)) + (format #t "~T~Tspawner-count: ~D~%" (-> obj spawner-count)) + (format #t "~T~Tcreature-type-count: ~D~%" (-> obj creature-type-count)) + (format #t "~T~Tspawner-array[8] @ #x~X~%" (-> obj spawner-array)) + (format #t "~T~Tspawn-period: ~D~%" (-> obj spawn-period)) + (format #t "~T~Tpath-spawn: ~A~%" (-> obj path-spawn)) + (format #t "~T~Tcreature-type-array[4] @ #x~X~%" (-> obj creature-type-array)) + (format #t "~T~Tfinal-pickup-type: ~D~%" (-> obj final-pickup-type)) + (format #t "~T~Tprespawn: ~A~%" (-> obj prespawn)) + (format #t "~T~Tnoticed-player: ~A~%" (-> obj noticed-player)) + (format #t "~T~Tcamera-on: ~A~%" (-> obj camera-on)) + (format + #t + "~T~Tmisty-ambush-collision-hack: ~A~%" + (-> obj misty-ambush-collision-hack) + ) + (format #t "~T~Tdisable-ocean: ~A~%" (-> obj disable-ocean)) + (format #t "~T~Tdisable-near-ocean: ~A~%" (-> obj disable-near-ocean)) + (format #t "~T~Tdisable-mid-ocean: ~A~%" (-> obj disable-mid-ocean)) + obj + ) + +;; definition for function battlecontroller-spawners-full? +(defbehavior battlecontroller-spawners-full? battlecontroller () + (dotimes (v1-0 (-> self spawner-count)) + (if (= (-> self spawner-array v1-0 creature) #f) + (return #f) + ) + ) + #t + ) + +;; definition for function battlecontroller-default-event-handler +;; INFO: Return type mismatch none vs object. +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? +;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? +;; Used lq/sq +(defbehavior + battlecontroller-default-event-handler battlecontroller + ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (let ((v1-0 arg2)) + (the-as object (cond + ((= v1-0 'child-die) + (+! (-> self die-count) 1) + (when (= (-> self die-count) (-> self max-spawn-count)) + (let ((v1-4 (the-as process-drawable arg0))) + (when v1-4 + (set! + (-> self final-pickup-spawn-point quad) + (-> v1-4 root trans quad) + ) + (let ((a0-2 (-> self final-pickup-type))) + (the-as none (cond + ((= a0-2 (pickup-type fuel-cell)) + #f + ) + (else + (set! + (-> v1-4 fact pickup-type) + (-> self final-pickup-type) + ) + (set! (-> v1-4 fact pickup-amount) 1.0) + (let ((f0-1 0.0)) + (set! + (-> v1-4 fact pickup-spawn-amount) + f0-1 + ) + f0-1 + ) + ) + ) + ) + ) + ) + ) + ) + ) + ((= v1-0 'trigger) + (go-virtual battlecontroller-die) + ) + ) + ) + ) + ) + +;; failed to figure out what this is: +battlecontroller-default-event-handler + +;; definition for function battlecontroller-draw-debug +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-draw-debug battlecontroller () + (dotimes (gp-0 (-> self spawner-count)) + (dummy-9 (-> self spawner-array gp-0 path)) + ) + 0 + (none) + ) + +;; definition for function battlecontroller-camera-on +;; INFO: Return type mismatch int vs object. +(defbehavior battlecontroller-camera-on battlecontroller () + (when (not (-> self camera-on)) + (set! (-> self camera-on) #t) + (let ((v1-4 (res-lump-struct (-> self entity) 'camera-name structure))) + (when v1-4 + (let ((a1-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-1 from) self) + (set! (-> a1-1 num-params) 1) + (set! (-> a1-1 message) 'change-to-entity-by-name) + (set! (-> a1-1 param 0) (the-as uint v1-4)) + (send-event-function *camera* a1-1) + ) + ) + ) + ) + (the-as object 0) + ) + +;; definition for function battlecontroller-camera-off +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-camera-off battlecontroller () + (set! (-> self camera-on) #f) + (let ((a1-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-0 from) self) + (set! (-> a1-0 num-params) 0) + (set! (-> a1-0 message) 'clear-entity) + (send-event-function *camera* a1-0) + ) + 0 + (none) + ) + +;; definition for function battlecontroller-update-spawners +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-update-spawners battlecontroller () + (dotimes (gp-0 (-> self spawner-count)) + (let* ((s5-0 (-> self spawner-array gp-0)) + (s4-0 (handle->process (-> s5-0 creature))) + ) + (when + (and s4-0 (logtest? (-> (the-as nav-enemy s4-0) nav-enemy-flags) 2048)) + (cond + ((< (-> s5-0 state) (-> s5-0 path curve num-cverts)) + (when (or (-> self noticed-player) (= (-> s5-0 state) 1)) + (let ((s3-0 (new 'stack-no-clear 'vector))) + (eval-path-curve-div! + (-> s5-0 path) + s3-0 + (the float (-> s5-0 state)) + 'interp + ) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) self) + (set! (-> a1-2 num-params) 1) + (set! (-> a1-2 message) 'cue-jump-to-point) + (set! (-> a1-2 param 0) (the-as uint s3-0)) + (send-event-function s4-0 a1-2) + ) + ) + (if (zero? (logand (-> (the-as nav-enemy s4-0) nav-enemy-flags) 2048)) + (+! (-> s5-0 state) 1) + ) + ) + ) + (else + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) self) + (set! (-> a1-3 num-params) 0) + (set! (-> a1-3 message) 'cue-chase) + (send-event-function s4-0 a1-3) + ) + (set! (-> s5-0 creature) (the-as handle #f)) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for function battlecontroller-spawn-creature +;; INFO: Return type mismatch int vs handle. +(defbehavior + battlecontroller-spawn-creature battlecontroller + ((arg0 vector) (arg1 vector)) + (local-vars (v1-25 int)) + (let ((f0-0 (rand-vu)) + (v1-0 0) + ) + (dotimes (a0-1 (-> self creature-type-count)) + (when (>= f0-0 0.0) + (set! f0-0 (- f0-0 (-> self creature-type-array a0-1 percent))) + (if (< f0-0 0.0) + (set! v1-0 a0-1) + ) + ) + ) + (let* ((s5-0 (-> self creature-type-array v1-0)) + (s2-0 (-> s5-0 type2)) + (s1-0 + (the-as nav-enemy (get-process *default-dead-pool* s2-0 #x4000)) + ) + (gp-0 (when s1-0 + (let ((t9-2 (method-of-type process activate))) + (t9-2 s1-0 self s2-0 (the-as pointer #x70004000)) + ) + (run-now-in-process + s1-0 + nav-enemy-init-by-other + self + arg0 + arg1 + ) + (-> s1-0 ppointer) + ) + ) + ) + (if (and gp-0 (zero? (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info))) + (set! gp-0 (the-as (pointer process) #f)) + ) + (when (the-as (pointer nav-enemy) gp-0) + (logclear! + (-> (the-as (pointer nav-enemy) gp-0) 0 mask) + (process-mask actor-pause) + ) + (if (-> self misty-ambush-collision-hack) + (logior! (-> (the-as (pointer nav-enemy) gp-0) 0 nav-enemy-flags) #x8000) + ) + (+! (-> self spawn-count) 1) + (-> self fact pickup-type) + (cond + ((and + (< (-> s5-0 pickup-count) (-> s5-0 max-pickup-count)) + (rand-vu-percent? (-> s5-0 pickup-percent)) + ) + (+! (-> s5-0 pickup-count) 1) + (set! v1-25 (-> s5-0 pickup-type)) + ) + (else + (set! v1-25 (the-as int (-> self fact pickup-type))) + ) + ) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-type) + (the-as pickup-type v1-25) + ) + (cond + ((= v1-25 7) + ) + ((zero? v1-25) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-amount) + 0.0 + ) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-spawn-amount) + 0.0 + ) + ) + (else + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-amount) + 1.0 + ) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info pickup-spawn-amount) + 0.0 + ) + (logior! (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info options) 512) + (set! + (-> (the-as (pointer nav-enemy) gp-0) 0 enemy-info fade-time) + (the-as uint 1200) + ) + ) + ) + ) + (the-as handle (ppointer->handle gp-0)) + ) + ) + ) + +;; definition for function battlecontroller-spawn-creature-at-spawner +;; INFO: Return type mismatch int vs none. +(defbehavior + battlecontroller-spawn-creature-at-spawner battlecontroller + ((arg0 int) (arg1 int)) + (let* ((s5-0 (-> self spawner-array arg0)) + (s3-0 (-> s5-0 path)) + (s4-0 + (eval-path-curve-div! + s3-0 + (new 'stack-no-clear 'vector) + (the float arg1) + 'interp + ) + ) + (a1-3 + (eval-path-curve-div! + s3-0 + (new 'stack-no-clear 'vector) + (the float (+ arg1 1)) + 'interp + ) + ) + ) + (when + (and + (not (handle->process (-> s5-0 creature))) + (< (-> self spawn-count) (-> self max-spawn-count)) + ) + (let ((v1-10 (battlecontroller-spawn-creature s4-0 a1-3))) + (when (handle->process v1-10) + (set! (-> s5-0 creature) v1-10) + (set! (-> s5-0 state) (+ arg1 1)) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for function battlecontroller-spawn-creature-random-spawner +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-spawn-creature-random-spawner battlecontroller () + (let* ((gp-0 (rand-vu-int-count (-> self spawner-count))) + (v1-2 (-> self spawner-array gp-0)) + ) + (when (and (-> v1-2 enabled) (-> v1-2 blocker-actor)) + (when + (logtest? + (-> v1-2 blocker-actor extra perm status) + (entity-perm-status complete) + ) + (set! (-> v1-2 enabled) #f) + (let ((a0-9 0)) + (dotimes (a1-0 (-> self spawner-count)) + (if (-> self spawner-array a1-0 enabled) + (+! a0-9 1) + ) + ) + (if (zero? a0-9) + (set! (-> self spawn-count) (-> self max-spawn-count)) + ) + ) + ) + ) + (when (and (-> v1-2 enabled) (not (handle->process (-> v1-2 creature)))) + (let ((a1-7 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-7 from) self) + (set! (-> a1-7 num-params) 0) + (set! (-> a1-7 message) 'spawn) + (let ((t9-1 send-event-function) + (v1-3 (-> v1-2 trigger-actor)) + ) + (t9-1 (if v1-3 + (-> v1-3 extra process) + ) + a1-7 + ) + ) + ) + (battlecontroller-spawn-creature-at-spawner gp-0 0) + ) + ) + 0 + (none) + ) + +;; definition for function battlecontroller-fill-all-spawners +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-fill-all-spawners battlecontroller () + (dotimes (gp-0 (-> self spawner-count)) + (battlecontroller-spawn-creature-at-spawner gp-0 1) + ) + (when (nonzero? (-> self path-spawn)) + (let ((gp-1 (new 'stack-no-clear 'vector))) + (dotimes (s5-0 (-> self path-spawn curve num-cverts)) + (eval-path-curve-div! (-> self path-spawn) gp-1 (the float s5-0) 'interp) + (let ((s4-0 (battlecontroller-spawn-creature gp-1 (-> self root trans)))) + (when (handle->process s4-0) + (suspend) + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) self) + (set! (-> a1-4 num-params) 0) + (set! (-> a1-4 message) 'cue-chase) + (send-event-function (handle->process s4-0) a1-4) + ) + ) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for function battlecontroller-battle-begin +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-battle-begin battlecontroller () + (set-setting! *setting-control* self 'music 'danger 0.0 0) + (let ((gp-0 (entity-actor-count (-> self entity) 'kill-actor))) + (dotimes (s5-0 gp-0) + (let ((v1-2 (entity-actor-lookup (-> self entity) 'kill-actor s5-0))) + (if v1-2 + (logior! (-> v1-2 extra perm status) (entity-perm-status bit-9)) + ) + ) + ) + ) + (let ((gp-1 (entity-actor-count (-> self entity) 'trigger-actor))) + (dotimes (s5-1 gp-1) + (let ((s4-0 (new 'stack-no-clear 'event-message-block))) + (set! (-> s4-0 from) self) + (set! (-> s4-0 num-params) 0) + (set! (-> s4-0 message) 'trigger) + (let ((s3-0 send-event-function) + (v1-7 (entity-actor-lookup (-> self entity) 'trigger-actor s5-1)) + ) + (s3-0 (if v1-7 + (-> v1-7 extra process) + ) + s4-0 + ) + ) + ) + ) + ) + (level-hint-spawn + (game-text-id zero) + (the-as string #f) + (-> self entity) + *entity-pool* + (game-task none) + ) + 0 + (none) + ) + +;; definition for function battlecontroller-off +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-off battlecontroller () + (clear-pending-settings-from-process *setting-control* self 'music) + (let ((gp-0 (entity-actor-count (-> self entity) 'kill-actor))) + (dotimes (s5-0 gp-0) + (let ((v1-2 (entity-actor-lookup (-> self entity) 'kill-actor s5-0))) + (if v1-2 + (logclear! (-> v1-2 extra perm status) (entity-perm-status bit-9)) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for function battlecontroller-battle-end +(defbehavior battlecontroller-battle-end battlecontroller () + (case (-> (level-get-target-inside *level*) name) + (('citadel) + (level-hint-spawn + (game-text-id misty-battle-finished) + "sksp0378" + (the-as entity #f) + *entity-pool* + (game-task none) + ) + ) + ) + (battlecontroller-off) + (none) + ) + +;; failed to figure out what this is: +(defstate battlecontroller-idle (battlecontroller) + :virtual #t + :event + battlecontroller-default-event-handler + :trans + (behavior () + 0 + (none) + ) + :code + (behavior () + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (if (-> self prespawn) + (battlecontroller-fill-all-spawners) + ) + (while #t + (when + (>= + (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) + 30 + ) + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (when + (and + *target* + (>= + (-> self activate-distance) + (vector-vector-distance + (-> self root trans) + (-> *target* control trans) + ) + ) + ) + (set! (-> self noticed-player) #t) + (battlecontroller-battle-begin) + (when (not (-> self prespawn)) + (battlecontroller-fill-all-spawners) + (suspend) + 0 + ) + (go-virtual battlecontroller-play-intro-camera) + ) + ) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior battlecontroller) #f) + ) + +;; failed to figure out what this is: +(defstate battlecontroller-play-intro-camera (battlecontroller) + :virtual #t + :event + battlecontroller-default-event-handler + :enter + (behavior () + (process-entity-status! self (entity-perm-status bit-3) #t) + (none) + ) + :exit + (behavior () + (process-entity-status! self (entity-perm-status bit-3) #f) + (none) + ) + :code + (behavior () + (go-virtual battlecontroller-active) + (none) + ) + ) + +;; definition for function battlecontroller-disable-ocean +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-disable-ocean battlecontroller () + (set! *ocean-off* (-> self disable-ocean)) + (set! *ocean-mid-off* (-> self disable-mid-ocean)) + (set! *ocean-near-off* (-> self disable-near-ocean)) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate battlecontroller-active (battlecontroller) + :virtual #t + :event + battlecontroller-default-event-handler + :trans + (behavior () + (if + (and + *target* + (>= + (-> self activate-distance) + (vector-vector-distance (-> self root trans) (-> *target* control trans)) + ) + ) + (level-hint-spawn + (game-text-id zero) + (the-as string #f) + (-> self entity) + *entity-pool* + (game-task none) + ) + ) + (battlecontroller-disable-ocean) + (battlecontroller-update-spawners) + (none) + ) + :code + (behavior () + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (battlecontroller-camera-on) + (while #t + (when + (>= + (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) + 30 + ) + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (let ((gp-0 0)) + (let ((v1-8 (-> self child))) + (while v1-8 + (+! gp-0 1) + (set! v1-8 (-> v1-8 0 brother)) + (nop!) + (nop!) + ) + ) + (if (and (zero? gp-0) (= (-> self spawn-count) (-> self max-spawn-count))) + (go-virtual battlecontroller-die) + ) + (when (< gp-0 (-> self target-count)) + (let ((gp-1 (-> *display* base-frame-counter))) + (until + (>= + (- (-> *display* base-frame-counter) gp-1) + (the-as int (-> self spawn-period)) + ) + (suspend) + ) + ) + (battlecontroller-spawn-creature-random-spawner) + ) + ) + ) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior battlecontroller) #f) + ) + +;; definition for function battlecontroller-special-contents? +(defbehavior battlecontroller-special-contents? battlecontroller () + (= (-> self final-pickup-type) (pickup-type fuel-cell)) + ) + +;; definition for function battlecontroller-special-contents-collected? +(defbehavior battlecontroller-special-contents-collected? battlecontroller () + (= (-> self entity extra perm user-int8 0) 2) + ) + +;; definition for function battlecontroller-set-special-contents-collected +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-set-special-contents-collected battlecontroller () + (let ((v1-2 (-> self entity extra perm))) + (logior! (-> v1-2 status) (entity-perm-status user-set-from-cstage)) + (set! (-> v1-2 user-int8 0) 2) + ) + 0 + (none) + ) + +;; definition for function battlecontroller-task-completed? +(defbehavior battlecontroller-task-completed? battlecontroller () + (>= (-> self entity extra perm user-int8 0) 1) + ) + +;; definition for function battlecontroller-set-task-completed +;; INFO: Return type mismatch int vs none. +(defbehavior battlecontroller-set-task-completed battlecontroller () + (let ((v1-2 (-> self entity extra perm))) + (logior! (-> v1-2 status) (entity-perm-status user-set-from-cstage)) + (set! (-> v1-2 user-int8 0) 1) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate battlecontroller-die (battlecontroller) + :virtual #t + :event + (the-as + (function process int symbol event-message-block object :behavior battlecontroller) + process-drawable-fuel-cell-handler + ) + :code + (behavior () + (sound-play-by-name + (static-sound-name "money-pickup") + (new-sound-id) + 1024 + -2286 + 0 + (the-as uint 1) + (the-as vector #f) + ) + (battlecontroller-battle-end) + (battlecontroller-camera-off) + (battlecontroller-set-task-completed) + (countdown (gp-1 (entity-actor-count (-> self entity) 'fade-actor)) + (let ((s5-1 (new 'stack-no-clear 'event-message-block))) + (set! (-> s5-1 from) self) + (set! (-> s5-1 num-params) 0) + (set! (-> s5-1 message) 'fade) + (let ((s4-0 send-event-function) + (v1-2 (entity-actor-lookup (-> self entity) 'fade-actor gp-1)) + ) + (s4-0 (if v1-2 + (-> v1-2 extra process) + ) + s5-1 + ) + ) + ) + ) + (countdown (gp-2 (entity-actor-count (-> self entity) 'alt-actor)) + (let ((s5-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> s5-2 from) self) + (set! (-> s5-2 num-params) 0) + (set! (-> s5-2 message) 'trigger) + (let ((s4-1 send-event-function) + (v1-8 (entity-actor-lookup (-> self entity) 'alt-actor gp-2)) + ) + (s4-1 (if v1-8 + (-> v1-8 extra process) + ) + s5-2 + ) + ) + ) + ) + (when + (and + (battlecontroller-special-contents?) + (not (battlecontroller-special-contents-collected?)) + ) + (label cfg-15) + (birth-pickup-at-point + (-> self final-pickup-spawn-point) + (the-as int (-> self final-pickup-type)) + (the float (-> self entity extra perm task)) + #f + self + #f + ) + (when (not (-> self child)) + (suspend) + (goto cfg-15) + ) + (while (-> self child) + (suspend) + ) + (battlecontroller-set-special-contents-collected) + ) + (while (-> self child) + (suspend) + ) + (process-entity-status! self (entity-perm-status dead) #t) + (none) + ) + :post + (the-as (function none :behavior battlecontroller) #f) + ) + +;; definition for method 7 of type battlecontroller +;; INFO: Return type mismatch process-drawable vs battlecontroller. +(defmethod relocate battlecontroller ((obj battlecontroller) (arg0 int)) + (dotimes (v1-0 (-> obj spawner-count)) + (let ((a0-3 (-> obj spawner-array v1-0))) + (if (nonzero? (-> a0-3 path)) + (&+! (-> a0-3 path) arg0) + ) + ) + ) + (if (nonzero? (-> obj path-spawn)) + (&+! (-> obj path-spawn) arg0) + ) + (the-as + battlecontroller + ((the-as + (function process-drawable int process-drawable) + (find-parent-method battlecontroller 7) + ) + obj + arg0 + ) + ) + ) + +;; definition for method 10 of type battlecontroller +;; INFO: Return type mismatch int vs none. +(defmethod deactivate battlecontroller ((obj battlecontroller)) + (with-pp + (let ((gp-0 pp)) + (let ((s6-1 obj)) + ) + (battlecontroller-off) + (let ((s6-2 gp-0)) + ) + ) + ((the-as + (function process-drawable none) + (find-parent-method battlecontroller 10) + ) + obj + ) + 0 + (none) + ) + ) + +;; definition for method 27 of type battlecontroller +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defmethod TODO-RENAME-27 battlecontroller ((obj battlecontroller)) + (local-vars (sv-16 res-tag)) + (set! + (-> obj fact) + (new + 'process + 'fact-info + obj + (pickup-type eco-pill-random) + (-> *FACT-bank* default-pill-inc) + ) + ) + (set! (-> obj path) (new 'process 'path-control obj 'path 0.0)) + (logior! + (-> obj path flags) + (path-control-flag display draw-line draw-point draw-text) + ) + (set! (-> obj activate-distance) 122880.0) + (let ((s5-0 0)) + (let* ((s4-0 '(patha pathb pathc pathd pathe pathf pathg pathh)) + (s2-0 (car s4-0)) + ) + (while (not (null? s4-0)) + (let + ((v1-7 (res-lump-struct (-> obj entity) (the-as symbol s2-0) structure)) + (s3-0 (-> obj spawner-array s5-0)) + ) + (when (and v1-7 (< s5-0 8)) + (set! + (-> s3-0 path) + (new 'process 'path-control obj (the-as symbol s2-0) 0.0) + ) + (set! (-> s3-0 creature) (the-as handle #f)) + (set! (-> s3-0 trigger-actor) #f) + (set! (-> s3-0 blocker-actor) #f) + (set! (-> s3-0 enabled) #t) + (logior! + (-> s3-0 path flags) + (path-control-flag display draw-line draw-point draw-text) + ) + (+! s5-0 1) + ) + ) + (set! s4-0 (cdr s4-0)) + (set! s2-0 (car s4-0)) + ) + ) + (set! (-> obj spawner-count) s5-0) + ) + 0 + (if (res-lump-struct (-> obj entity) 'pathspawn structure) + (set! (-> obj path-spawn) (new 'process 'path-control obj 'pathspawn 0.0)) + ) + (let ((s5-1 (entity-actor-count (-> obj entity) 'spawner-trigger-actor))) + (dotimes (s4-1 s5-1) + (if (< s4-1 (-> obj spawner-count)) + (set! + (-> obj spawner-array s4-1 trigger-actor) + (entity-actor-lookup (-> obj entity) 'spawner-trigger-actor s4-1) + ) + ) + ) + ) + (let ((s5-2 (entity-actor-count (-> obj entity) 'spawner-blocker-actor))) + (dotimes (s4-2 s5-2) + (if (< s4-2 (-> obj spawner-count)) + (set! + (-> obj spawner-array s4-2 blocker-actor) + (entity-actor-lookup (-> obj entity) 'spawner-blocker-actor s4-2) + ) + ) + ) + ) + (set! + (-> obj spawn-period) + (the-as + uint + (the int (* 300.0 (res-lump-float (-> obj entity) 'delay :default 0.1))) + ) + ) + (set! (-> obj target-count) 10) + (set! (-> obj max-spawn-count) 100) + (set! (-> obj spawn-count) 0) + (set! (-> obj die-count) 0) + (set! (-> obj creature-type-count) 1) + (set! (-> obj noticed-player) #f) + (set! (-> obj camera-on) #f) + (let ((v1-46 (res-lump-data (-> obj entity) 'num-lurkers (pointer int32)))) + (when v1-46 + (set! (-> obj target-count) (-> v1-46 0)) + (set! (-> obj max-spawn-count) (-> v1-46 1)) + ) + ) + (set! (-> obj creature-type-array 0 type2) babak) + (set! (-> obj creature-type-array 0 percent) 1.0) + (let ((s5-3 0)) + (set! sv-16 (new 'static 'res-tag)) + (let + ((v1-49 + (res-lump-data (-> obj entity) 'lurker-type pointer :tag-ptr (& sv-16)) + ) + ) + (when v1-49 + (dotimes (a0-22 (the-as int (-> sv-16 elt-count))) + (let ((a1-15 (-> (the-as (pointer uint32) (&+ v1-49 (* a0-22 4)))))) + (when (nonzero? a1-15) + (set! (-> obj creature-type-array s5-3 type2) (the-as type a1-15)) + (+! s5-3 1) + ) + ) + ) + ) + ) + (set! (-> obj creature-type-count) s5-3) + ) + (let ((v1-52 (res-lump-data (-> obj entity) 'percent pointer)) + (f0-6 0.0) + ) + (when v1-52 + (dotimes (a0-26 (-> obj creature-type-count)) + (set! + (-> obj creature-type-array a0-26 percent) + (fabs (-> (the-as (pointer float) (&+ v1-52 (* a0-26 4))))) + ) + (+! f0-6 (-> obj creature-type-array a0-26 percent)) + ) + (cond + ((= f0-6 0.0) + (set! (-> obj creature-type-count) 1) + (set! (-> obj creature-type-array 0 percent) 1.0) + ) + (else + (let ((f0-9 (/ 1.0 f0-6))) + (dotimes (v1-57 (-> obj creature-type-count)) + (set! + (-> obj creature-type-array 0 percent) + (* (-> obj creature-type-array 0 percent) f0-9) + ) + ) + ) + ) + ) + ) + ) + (set! + (-> obj final-pickup-type) + (res-lump-value + (-> obj entity) + 'final-pickup + pickup-type + :default + (the-as uint128 7) + ) + ) + (let ((s5-4 (res-lump-data (-> obj entity) 'pickup-type pointer)) + (s4-3 (res-lump-data (-> obj entity) 'max-pickup-count pointer)) + (v1-63 (res-lump-data (-> obj entity) 'pickup-percent pointer)) + ) + (dotimes (a0-34 (-> obj creature-type-count)) + (let ((a1-34 (-> obj creature-type-array a0-34))) + (set! (-> a1-34 pickup-count) 0) + (if s5-4 + (set! + (-> a1-34 pickup-type) + (-> (the-as (pointer int32) (&+ s5-4 (* a0-34 4)))) + ) + ) + (if s4-3 + (set! + (-> a1-34 max-pickup-count) + (-> (the-as (pointer int32) (&+ s4-3 (* a0-34 4)))) + ) + ) + (if v1-63 + (set! + (-> a1-34 pickup-percent) + (-> (the-as (pointer float) (&+ v1-63 (* a0-34 4)))) + ) + ) + ) + ) + ) + (set! (-> obj misty-ambush-collision-hack) #f) + (set! (-> obj disable-ocean) #f) + (set! (-> obj disable-mid-ocean) #f) + (set! (-> obj disable-near-ocean) #t) + (set! (-> obj final-pickup-spawn-point quad) (-> obj root trans quad)) + (set! (-> obj prespawn) (= (res-lump-value (-> obj entity) 'mode uint128) 1)) + 0 + (none) + ) + +;; definition for method 28 of type battlecontroller +;; INFO: Return type mismatch int vs none. +(defmethod cleanup-if-finished! battlecontroller ((obj battlecontroller)) + (if (battlecontroller-task-completed?) + (go (method-of-object obj battlecontroller-die)) + (go (method-of-object obj battlecontroller-idle)) + ) + 0 + (none) + ) + +;; definition for method 11 of type battlecontroller +(defmethod + copy-defaults! + battlecontroller + ((obj battlecontroller) (arg0 res-lump)) + (set! (-> obj mask) (logior (process-mask enemy) (-> obj mask))) + (set! (-> obj root) (new 'process 'trsqv)) + (process-drawable-from-entity! obj arg0) + (TODO-RENAME-27 obj) + (cleanup-if-finished! obj) + (none) + ) diff --git a/test/decompiler/reference/levels/common/nav-enemy_REF.gc b/test/decompiler/reference/levels/common/nav-enemy_REF.gc index 388653855b..13d5d3d106 100644 --- a/test/decompiler/reference/levels/common/nav-enemy_REF.gc +++ b/test/decompiler/reference/levels/common/nav-enemy_REF.gc @@ -3203,7 +3203,7 @@ nav-enemy-default-event-handler ;; Used lq/sq (defbehavior nav-enemy-init-by-other nav-enemy - ((arg0 nav-enemy) (arg1 vector) (arg2 vector)) + ((arg0 battlecontroller) (arg1 vector) (arg2 vector)) (initialize-collision self) (logior! (-> self mask) (process-mask actor-pause)) (set! (-> self collide-info trans quad) (-> arg1 quad))