From 823dc135bcb0fb4c5fe779ddcfcc69165342d999 Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Sun, 2 Jan 2022 23:18:51 -0500 Subject: [PATCH] decomp: finish `joint-exploder` and `balloonlurker` (#1043) * close on `joint-exploder` * decomp: finish `joint-exploder` * decomp: finish `balloonlurker` * address issues * update ref tests --- decompiler/config/all-types.gc | 46 +- .../stack_structures.jsonc | 13 +- .../jak1_ntsc_black_label/type_casts.jsonc | 45 + goal_src/engine/collide/collide-cache-h.gc | 2 +- goal_src/engine/collide/collide-shape.gc | 14 +- goal_src/levels/common/joint-exploder.gc | 672 +++++++- goal_src/levels/misty/balloonlurker.gc | 1241 +++++++++++++++ .../engine/collide/collide-cache-h_REF.gc | 2 +- .../levels/common/joint-exploder_REF.gc | 784 ++++++++++ .../levels/misty/balloonlurker_REF.gc | 1351 +++++++++++++++++ 10 files changed, 4089 insertions(+), 81 deletions(-) create mode 100644 test/decompiler/reference/levels/common/joint-exploder_REF.gc create mode 100644 test/decompiler/reference/levels/misty/balloonlurker_REF.gc diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index bbcbd5cf91..5c7e121370 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -12448,7 +12448,7 @@ (dummy-15 (_type_ collide-using-spheres-params) none 15) (dummy-16 (_type_ vector float uint process-drawable uint) none 16) (initialize (_type_) none 17) - (dummy-18 (_type_ vector vector float int collide-mesh-cache-tri int) float 18) + (dummy-18 (_type_ vector vector float int collide-tri-result int) float 18) (probe-using-spheres (_type_) none 19) (dummy-20 (_type_ vector float uint collide-tri-result uint) float 20) (dummy-21 (_type_ (function bsp-header int collide-list none) (function collide-cache none)) none 21) ;; second functiom is method 28 @@ -23209,7 +23209,7 @@ ) (deftype joint-exploder-static-params (basic) - ((joints array :offset-assert 4) ;; an array of...what? + ((joints (array joint-exploder-static-joint-params) :offset-assert 4) ) :method-count-assert 9 :size-assert #x8 @@ -23233,13 +23233,13 @@ (deftype joint-exploder-joints (basic) ((num-joints int32 :offset-assert 4) - (joint joint-exploder-joint :dynamic :offset 16) + (joint joint-exploder-joint :dynamic :inline :offset 16) ) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 (:methods - (new (symbol _type_ int) _type_ 0)) + (new (symbol type joint-exploder-static-params) _type_ 0)) ) (deftype joint-exploder-list (structure) @@ -23254,7 +23254,8 @@ ) (deftype joint-exploder (process-drawable) - ((die-if-below-y float :offset-assert 176) + ((parent-override (pointer process-drawable) :score 100 :offset 12) + (die-if-below-y float :offset-assert 176) (die-if-beyond-xz-dist-sqrd float :offset-assert 180) (joints joint-exploder-joints :offset-assert 184) (static-params joint-exploder-static-params :offset-assert 188) @@ -23268,22 +23269,22 @@ :heap-base #x1a0 :flag-assert #x1d01a00210 (:methods - (dummy-20 (_type_) none 20) - (dummy-21 (_type_) none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 (_type_) none 24) - (dummy-25 () none 25) - (dummy-26 (_type_) none 26) - (dummy-27 (_type_ joint-exploder-list) none 27) - (dummy-28 (_type_) none 28) + (TODO-RENAME-20 (_type_ joint-exploder-list int) int 20) + (TODO-RENAME-21 (_type_ joint-exploder-list joint-exploder-joint) none 21) + (TODO-RENAME-22 (_type_ joint-exploder-list) symbol 22) + (TODO-RENAME-23 (_type_) symbol 23) + (TODO-RENAME-24 (_type_ joint-exploder-list int) int 24) + (TODO-RENAME-25 (_type_ joint-exploder-list) symbol 25) + (TODO-RENAME-26 (_type_ joint-exploder-list int) int 26) + (TODO-RENAME-27 (_type_ joint-exploder-list int) joint-exploder-list 27) + (TODO-RENAME-28 (_type_ joint-exploder-list) none 28) ) ) ;; - Functions (define-extern joint-exploder-joint-callback (function joint-exploder none)) -(define-extern joint-exploder-init-by-other (function skeleton-group int joint-exploder-static-params joint-exploder-tuning none :behavior joint-exploder)) +(define-extern joint-exploder-init-by-other (function skeleton-group int joint-exploder-static-params joint-exploder-static-params none :behavior joint-exploder)) ;; - Unknowns @@ -30617,8 +30618,9 @@ (deftype balloonlurker (rigid-body-platform) ((explosion-force-position vector :inline :offset-assert 736) (explosion-force vector :inline :offset-assert 752) - (explosion basic :offset-assert 768) ;; ?? + (explosion symbol :offset-assert 768) (explosion-joint-index uint16 2 :offset-assert 772) + (explosion-joint-index-bytes int8 4 :offset 772) ;; added overlay (vulnerable symbol :offset-assert 776) (water-y float :offset-assert 780) (propeller joint-mod-set-local :offset-assert 784) @@ -30642,6 +30644,10 @@ :size-assert #x369 :heap-base #x300 :flag-assert #x2303000369 + (:states + balloonlurker-patrol + balloonlurker-die + (balloonlurker-mine-explode int)) ) (deftype balloonlurker-pilot (process-drawable) @@ -30655,6 +30661,9 @@ (dummy-20 (_type_) none 20) (dummy-21 (_type_) none 21) ) + (:states + balloonlurker-pilot-idle + balloonlurker-pilot-die) ) ;; - Functions @@ -30671,16 +30680,11 @@ ;; - Unknowns -(define-extern balloonlurker-patrol (state balloonlurker)) ;; unknown type (define-extern *balloonlurker-sg* skeleton-group) (define-extern *balloonlurker-constants* rigid-body-platform-constants) ;; unknown type -(define-extern balloonlurker-pilot-idle (state balloonlurker-pilot)) ;; unknown type (define-extern *balloonlurker-pilot-sg* skeleton-group) -(define-extern balloonlurker-pilot-die (state balloonlurker-pilot)) ;; unknown type (define-extern *BALLOONLURKER-bank* balloonlurker-bank) ;; unknown type -(define-extern balloonlurker-die (state balloonlurker)) ;; unknown type (define-extern *balloonlurker-rudder-joint-home* vector) ;; unknown type -(define-extern balloonlurker-mine-explode (state int balloonlurker)) ;; unknown type ;; ---------------------- diff --git a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc index 8c9e844ab7..fb0fc50f51 100644 --- a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc @@ -1802,7 +1802,7 @@ [160, "vector"] ], - "(method 18 collide-cache)": [[16, "collide-cache-prim"]], + "(method 18 collide-cache)": [[16, "collide-puls-work"]], "kill-current-level-hint": [[16, "event-message-block"]], "(exit level-hint-sidekick)": [[16, "event-message-block"]], @@ -4415,7 +4415,7 @@ "find-ground-point": [ [16, "vector"], - [32, "collide-mesh-cache-tri"], + [32, "collide-tri-result"], [128, "bounding-box"], [160, "vector"] ], @@ -6017,5 +6017,14 @@ [16, "event-message-block"] ], + "(trans joint-exploder-shatter)": [ + [16, "bounding-box"] + ], + + "(method 22 joint-exploder)": [ + [16, "vector"], + [32, "collide-tri-result"] + ], + "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 fb40c9066d..cdb402b2db 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -7393,5 +7393,50 @@ [31, "s4", "energyarm"] ], + + "(method 0 joint-exploder-tuning)": [ + [[6, 50], "v0", "joint-exploder-tuning"] + ], + + "(method 23 joint-exploder)": [ + [[12, 102], "s3", "joint-exploder-joint"], + [[144, 146], "v1", "joint-exploder-list"], + [148, "v1", "matrix"], + [152, "v1", "matrix"] + ], + + "(method 20 joint-exploder)": [ + [[8, 10], "a3", "joint-exploder-joint"], + [15, "v1", "joint-exploder-joint"] + ], + + "(method 27 joint-exploder)": [ + [41, "s0", "joint-exploder-joint"], + [90, "s0", "joint-exploder-joint"], + [139, "s0", "joint-exploder-joint"] + ], + + "(method 25 joint-exploder)": [ + [[16, 54], "s2", "joint-exploder-joint"] + ], + + "(method 22 joint-exploder)": [ + [[18, 78], "s5", "joint-exploder-joint"] + ], + + "joint-exploder-joint-callback": [ + [[10, 18], "v1", "joint-exploder-joint"] + ], + + "(method 24 joint-exploder)": [ + [[12, 19], "v1", "joint-exploder-joint"] + ], + + "(method 26 joint-exploder)": [ + [[5, 8], "a2", "joint-exploder-joint"], + [18, "v1", "joint-exploder-joint"], + [28, "v1", "joint-exploder-joint"] + ], + "placeholder-do-not-add-below": [] } diff --git a/goal_src/engine/collide/collide-cache-h.gc b/goal_src/engine/collide/collide-cache-h.gc index cc604df09f..4acdecc6aa 100644 --- a/goal_src/engine/collide/collide-cache-h.gc +++ b/goal_src/engine/collide/collide-cache-h.gc @@ -125,7 +125,7 @@ (dummy-15 (_type_ collide-using-spheres-params) none 15) (dummy-16 (_type_ vector float uint process-drawable uint) none 16) (initialize (_type_) none 17) - (dummy-18 (_type_ vector vector float int collide-mesh-cache-tri int) float 18) + (dummy-18 (_type_ vector vector float int collide-tri-result int) float 18) (probe-using-spheres (_type_) none 19) (dummy-20 (_type_ vector float uint collide-tri-result uint) float 20) (dummy-21 (_type_ (function bsp-header int collide-list none) (function collide-cache none)) none 21) diff --git a/goal_src/engine/collide/collide-shape.gc b/goal_src/engine/collide/collide-shape.gc index cde68b230f..28acd4b29d 100644 --- a/goal_src/engine/collide/collide-shape.gc +++ b/goal_src/engine/collide/collide-shape.gc @@ -144,7 +144,7 @@ ) (s2-0 (-> arg0 trans)) (s1-0 (new 'stack-no-clear 'vector)) - (s0-0 (new 'stack-no-clear 'collide-mesh-cache-tri)) + (s0-0 (new 'stack-no-clear 'collide-tri-result)) ) (let ((a1-1 (new 'stack-no-clear 'bounding-box))) (set! (-> arg1 w) 0.0) @@ -180,7 +180,7 @@ ) 0.0 ) - (set! f26-0 (+ -6144.0 (vector-vector-xz-distance s2-0 (-> s0-0 normal)))) + (set! f26-0 (+ -6144.0 (vector-vector-xz-distance s2-0 (-> s0-0 intersect)))) ) (let ((f24-0 arg2)) (while (>= f26-0 f24-0) @@ -201,17 +201,17 @@ ) (cond ((and - (zero? (shr (shl (-> s0-0 bbox4w max data 0) 58) 61)) - (zero? (shr (shl (-> s0-0 bbox4w max data 0) 44) 58)) - (< 0.7 (the-as float (-> s0-0 bbox4w min data 1))) + (= (-> s0-0 pat mode) (pat-mode ground)) + (= (-> s0-0 pat event) (pat-event none)) + (< 0.7 (-> s0-0 normal y)) ) - (set! (-> arg1 quad) (-> s0-0 normal quad)) + (set! (-> arg1 quad) (-> s0-0 intersect quad)) (set! sv-192 (+ sv-192 1)) (if (>= sv-192 2) (return arg1) ) ) - ((and (= (shr (shl (-> s0-0 bbox4w max data 0) 58) 61) 1) (< (+ 4096.0 (-> s2-0 y)) (-> s0-0 normal y))) + ((and (= (-> s0-0 pat mode) (pat-mode wall)) (< (+ 4096.0 (-> s2-0 y)) (-> s0-0 intersect y))) (goto cfg-35) ) ) diff --git a/goal_src/levels/common/joint-exploder.gc b/goal_src/levels/common/joint-exploder.gc index 5db76fc7d5..b7a3787516 100644 --- a/goal_src/levels/common/joint-exploder.gc +++ b/goal_src/levels/common/joint-exploder.gc @@ -5,52 +5,56 @@ ;; name in dgo: joint-exploder ;; dgos: GAME, COMMON, L1 -;; TODO - for racer-states +;; DECOMP BEGINS + (deftype joint-exploder-tuning (structure) - ((explosion uint64 :offset-assert 0) - (duration uint64 :offset-assert 8) - (gravity float :offset-assert 16) - (rot-speed float :offset-assert 20) - (fountain-rand-transv-lo vector :inline :offset-assert 32) - (fountain-rand-transv-hi vector :inline :offset-assert 48) - (away-from-focal-pt vector :inline :offset 32) - (away-from-rand-transv-xz-lo float :offset 48) - (away-from-rand-transv-xz-hi float :offset 52) - (away-from-rand-transv-y-lo float :offset 56) - (away-from-rand-transv-y-hi float :offset 60) + ((explosion uint64 :offset-assert 0) + (duration uint64 :offset-assert 8) + (gravity float :offset-assert 16) + (rot-speed float :offset-assert 20) + (fountain-rand-transv-lo vector :inline :offset-assert 32) + (fountain-rand-transv-hi vector :inline :offset-assert 48) + (away-from-focal-pt vector :inline :offset 32) + (away-from-rand-transv-xz-lo float :offset 48) + (away-from-rand-transv-xz-hi float :offset 52) + (away-from-rand-transv-y-lo float :offset 56) + (away-from-rand-transv-y-hi float :offset 60) ) - (:methods - (new (symbol type int) _type_ 0) - ) :method-count-assert 9 :size-assert #x40 :flag-assert #x900000040 + (:methods + (new (symbol type int) _type_ 0) + ) ) + (deftype joint-exploder-static-joint-params (structure) - ((joint-index int16 :offset-assert 0) - (parent-joint-index int16 :offset-assert 2) + ((joint-index int16 :offset-assert 0) + (parent-joint-index int16 :offset-assert 2) ) :method-count-assert 9 :size-assert #x4 :flag-assert #x900000004 ) + (deftype joint-exploder-static-params (basic) - ((joints array :offset-assert 4) ;; an array of...what? + ((joints (array joint-exploder-static-joint-params) :offset-assert 4) ) :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 ) + (deftype joint-exploder-joint (structure) - ((next int16 :offset-assert 0) - (prev int16 :offset-assert 2) - (joint-index int16 :offset-assert 4) - (rspeed float :offset-assert 8) - (mat matrix :inline :offset-assert 16) - (rmat matrix :inline :offset-assert 80) + ((next int16 :offset-assert 0) + (prev int16 :offset-assert 2) + (joint-index int16 :offset-assert 4) + (rspeed float :offset-assert 8) + (mat matrix :inline :offset-assert 16) + (rmat matrix :inline :offset-assert 80) (transv vector :inline :offset-assert 144) (prev-pos vector :inline :offset-assert 160) ) @@ -59,53 +63,623 @@ :flag-assert #x9000000b0 ) + (deftype joint-exploder-joints (basic) - ((num-joints int32 :offset-assert 4) - (joint joint-exploder-joint :dynamic :offset 16) + ((num-joints int32 :offset-assert 4) + (joint joint-exploder-joint :inline :dynamic :offset 16) ) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 (:methods - (new (symbol _type_ int) _type_ 0)) + (new (symbol type joint-exploder-static-params) _type_ 0) + ) ) + (deftype joint-exploder-list (structure) - ((head int32 :offset-assert 0) - (pre-moved? symbol :offset-assert 4) - (bbox-valid? symbol :offset-assert 8) - (bbox bounding-box :inline :offset-assert 16) + ((head int32 :offset-assert 0) + (pre-moved? symbol :offset-assert 4) + (bbox-valid? symbol :offset-assert 8) + (bbox bounding-box :inline :offset-assert 16) ) :method-count-assert 9 :size-assert #x30 :flag-assert #x900000030 ) + (deftype joint-exploder (process-drawable) - ((die-if-below-y float :offset-assert 176) - (die-if-beyond-xz-dist-sqrd float :offset-assert 180) - (joints joint-exploder-joints :offset-assert 184) - (static-params joint-exploder-static-params :offset-assert 188) + ((parent-override (pointer process-drawable) :offset 12) + (die-if-below-y float :offset-assert 176) + (die-if-beyond-xz-dist-sqrd float :offset-assert 180) + (joints joint-exploder-joints :offset-assert 184) + (static-params joint-exploder-static-params :offset-assert 188) (anim art-joint-anim :offset-assert 192) - (scale-vector vector :inline :offset-assert 208) - (tuning joint-exploder-tuning :inline :offset-assert 224) - (lists joint-exploder-list 5 :inline :offset-assert 288) + (scale-vector vector :inline :offset-assert 208) + (tuning joint-exploder-tuning :inline :offset-assert 224) + (lists joint-exploder-list 5 :inline :offset-assert 288) ) + :heap-base #x1a0 :method-count-assert 29 :size-assert #x210 - :heap-base #x1a0 :flag-assert #x1d01a00210 (:methods - (dummy-20 (_type_) none 20) - (dummy-21 (_type_) none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 (_type_) none 24) - (dummy-25 () none 25) - (dummy-26 (_type_) none 26) - (dummy-27 (_type_ joint-exploder-list) none 27) - (dummy-28 (_type_) none 28) + (TODO-RENAME-20 (_type_ joint-exploder-list int) int 20) + (TODO-RENAME-21 (_type_ joint-exploder-list joint-exploder-joint) none 21) + (TODO-RENAME-22 (_type_ joint-exploder-list) symbol 22) + (TODO-RENAME-23 (_type_) symbol 23) + (TODO-RENAME-24 (_type_ joint-exploder-list int) int 24) + (TODO-RENAME-25 (_type_ joint-exploder-list) symbol 25) + (TODO-RENAME-26 (_type_ joint-exploder-list int) int 26) + (TODO-RENAME-27 (_type_ joint-exploder-list int) joint-exploder-list 27) + (TODO-RENAME-28 (_type_ joint-exploder-list) none 28) ) ) -(define-extern joint-exploder-init-by-other (function skeleton-group int joint-exploder-static-params joint-exploder-tuning none :behavior joint-exploder)) + +(defmethod asize-of joint-exploder-joints ((obj joint-exploder-joints)) + (the-as int (+ (-> obj type size) (* 176 (-> obj num-joints)))) + ) + +(defmethod new joint-exploder-joints ((allocation symbol) (type-to-make type) (arg0 joint-exploder-static-params)) + (let* ((gp-0 (-> arg0 joints length)) + (v0-0 (object-new allocation type-to-make (the-as int (+ (-> type-to-make size) (* 176 gp-0))))) + ) + (set! (-> v0-0 num-joints) gp-0) + v0-0 + ) + ) + +(defun joint-exploder-joint-callback ((arg0 joint-exploder)) + (let ((gp-0 (-> arg0 node-list))) + (let ((s4-0 (-> arg0 joints))) + (countdown (s3-0 (-> s4-0 num-joints)) + (let* ((v1-3 (-> s4-0 joint s3-0)) + (a0-5 (-> gp-0 data (-> v1-3 joint-index) bone transform)) + ) + (matrix*! a0-5 (-> v1-3 rmat) (-> v1-3 mat)) + ) + ) + ) + (let ((s5-1 (-> arg0 scale-vector))) + (countdown (s4-1 (-> gp-0 length)) + (let ((a2-1 (-> gp-0 data s4-1 bone transform))) + (scale-matrix! a2-1 s5-1 a2-1) + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod TODO-RENAME-24 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 int)) + (let ((v0-0 (TODO-RENAME-26 obj arg0 arg1))) + (let* ((v1-1 (-> obj joints)) + (v1-2 (-> v1-1 joint arg1)) + ) + (set! (-> v1-2 mat vector 0 quad) (the-as uint128 0)) + (set! (-> v1-2 mat vector 1 quad) (the-as uint128 0)) + (set! (-> v1-2 mat vector 2 quad) (the-as uint128 0)) + (set! (-> v1-2 mat vector 3 quad) (-> obj root trans quad)) + ) + v0-0 + ) + ) + +(defmethod TODO-RENAME-26 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 int)) + (let* ((v1-0 (-> obj joints)) + (a2-1 (-> v1-0 joint arg1)) + (a0-4 (-> a2-1 prev)) + (v0-0 (-> a2-1 next)) + ) + (cond + ((>= a0-4 0) + (set! (-> v1-0 joint a0-4 next) v0-0) + (if (>= v0-0 0) + (set! (-> (the-as joint-exploder-joint (-> v1-0 joint v0-0)) prev) a0-4) + ) + ) + (else + (set! (-> arg0 head) v0-0) + (cond + ((>= v0-0 0) + (let ((v1-2 (-> v1-0 joint v0-0))) + (set! (-> v1-2 prev) -1) + ) + ) + (else + (set! (-> arg0 bbox-valid?) #f) + ) + ) + ) + ) + v0-0 + ) + ) + +(defmethod TODO-RENAME-20 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 int)) + (let* ((v1-0 (-> obj joints)) + (a3-0 (-> v1-0 joint arg1)) + (a0-4 (-> arg0 head)) + ) + (set! (-> arg0 head) arg1) + (set! (-> a3-0 prev) -1) + (set! (-> a3-0 next) a0-4) + (when (>= a0-4 0) + (set! (-> (the-as joint-exploder-joint (-> v1-0 joint a0-4)) prev) arg1) + arg1 + ) + ) + ) + +(defmethod TODO-RENAME-21 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 joint-exploder-joint)) + (let ((a1-1 (-> arg1 mat vector 3))) + (cond + ((-> arg0 bbox-valid?) + (add-point! (-> arg0 bbox) (the-as vector3s a1-1)) + ) + (else + (set! (-> arg0 bbox-valid?) #t) + (set! (-> arg0 bbox min quad) (-> a1-1 quad)) + (set! (-> arg0 bbox max quad) (-> a1-1 quad)) + ) + ) + ) + (add-point! (-> arg0 bbox) (the-as vector3s (-> arg1 prev-pos))) + (none) + ) + +(defmethod TODO-RENAME-27 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 int)) + (local-vars (sv-16 int) (sv-32 int) (sv-48 int)) + (let ((s4-0 (the-as joint-exploder-list #f))) + (let ((v1-0 1)) + (until (= v1-0 5) + (let ((a0-4 (-> obj lists v1-0))) + (when (< (-> a0-4 head) 0) + (set! s4-0 a0-4) + (goto cfg-6) + ) + ) + (+! v1-0 1) + ) + ) + (label cfg-6) + (let ((s3-0 (the-as object s4-0))) + (cond + ((the-as joint-exploder-list s3-0) + (set! (-> (the-as joint-exploder-list s3-0) pre-moved?) #t) + (set! (-> (the-as joint-exploder-list s3-0) bbox-valid?) #f) + ) + (else + (set! s3-0 (-> obj lists)) + ) + ) + (set! (-> arg0 bbox-valid?) #f) + (let ((s2-0 (-> obj joints)) + (s1-0 (-> arg0 head)) + ) + (cond + ((zero? arg1) + (let ((f30-0 (* 0.5 (+ (-> arg0 bbox min x) (-> arg0 bbox max x))))) + (while (>= s1-0 0) + (let ((s0-0 (-> s2-0 joint s1-0))) + (cond + ((>= (-> s0-0 mat vector 3 x) f30-0) + (set! sv-16 (TODO-RENAME-26 obj arg0 s1-0)) + (TODO-RENAME-20 obj (the-as joint-exploder-list s3-0) s1-0) + (set! s1-0 sv-16) + (TODO-RENAME-21 obj (the-as joint-exploder-list s3-0) s0-0) + ) + (else + (TODO-RENAME-21 obj arg0 s0-0) + (set! s1-0 (-> s0-0 next)) + ) + ) + ) + ) + ) + ) + ((= arg1 1) + (let ((f30-1 (* 0.5 (+ (-> arg0 bbox min y) (-> arg0 bbox max y))))) + (while (>= s1-0 0) + (let ((s0-1 (-> s2-0 joint s1-0))) + (cond + ((>= (-> s0-1 mat vector 3 y) f30-1) + (set! sv-32 (TODO-RENAME-26 obj arg0 s1-0)) + (TODO-RENAME-20 obj (the-as joint-exploder-list s3-0) s1-0) + (set! s1-0 sv-32) + (TODO-RENAME-21 obj (the-as joint-exploder-list s3-0) s0-1) + ) + (else + (TODO-RENAME-21 obj arg0 s0-1) + (set! s1-0 (-> s0-1 next)) + ) + ) + ) + ) + ) + ) + ((= arg1 2) + (let ((f30-2 (* 0.5 (+ (-> arg0 bbox min z) (-> arg0 bbox max z))))) + (while (>= s1-0 0) + (let ((s0-2 (-> s2-0 joint s1-0))) + (cond + ((>= (-> s0-2 mat vector 3 z) f30-2) + (set! sv-48 (TODO-RENAME-26 obj arg0 s1-0)) + (TODO-RENAME-20 obj (the-as joint-exploder-list s3-0) s1-0) + (set! s1-0 sv-48) + (TODO-RENAME-21 obj (the-as joint-exploder-list s3-0) s0-2) + ) + (else + (TODO-RENAME-21 obj arg0 s0-2) + (set! s1-0 (-> s0-2 next)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + s4-0 + ) + ) + +(defmethod TODO-RENAME-28 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list)) + (when (and (-> arg0 bbox-valid?) (>= (-> arg0 head) 0)) + (cond + ((< 20480.0 (- (-> arg0 bbox max x) (-> arg0 bbox min x))) + (let ((a1-2 (TODO-RENAME-27 obj arg0 0))) + (if a1-2 + (TODO-RENAME-28 obj a1-2) + ) + ) + (TODO-RENAME-28 obj arg0) + ) + ((< 20480.0 (- (-> arg0 bbox max y) (-> arg0 bbox min y))) + (let ((a1-5 (TODO-RENAME-27 obj arg0 1))) + (if a1-5 + (TODO-RENAME-28 obj a1-5) + ) + ) + (TODO-RENAME-28 obj arg0) + ) + ((< 20480.0 (- (-> arg0 bbox max z) (-> arg0 bbox min z))) + (let ((a1-8 (TODO-RENAME-27 obj arg0 2))) + (if a1-8 + (TODO-RENAME-28 obj a1-8) + ) + ) + (TODO-RENAME-28 obj arg0) + ) + ) + ) + (none) + ) + +(defmethod TODO-RENAME-25 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list)) + (set! (-> arg0 bbox-valid?) #f) + (set! (-> arg0 pre-moved?) #t) + (let ((s4-0 (-> obj joints)) + (f30-0 (* (-> obj tuning gravity) (-> *display* seconds-per-frame))) + (s3-0 (-> arg0 head)) + ) + (while (>= s3-0 0) + (let* ((s2-0 (-> s4-0 joint s3-0)) + (s1-0 (-> s2-0 mat vector 3)) + ) + (set! (-> s2-0 prev-pos quad) (-> s1-0 quad)) + (+! (-> s2-0 transv y) f30-0) + (vector-v+! s1-0 s1-0 (-> s2-0 transv)) + (let ((f0-3 0.99) + (f2-1 (* (-> s2-0 rspeed) (-> *display* seconds-per-frame))) + (f5-0 (-> s2-0 rmat vector 0 x)) + (f4-0 (-> s2-0 rmat vector 0 y)) + (f3-0 (-> s2-0 rmat vector 1 x)) + (f1-2 (-> s2-0 rmat vector 1 y)) + ) + (set! (-> s2-0 rmat vector 0 x) (- (* f5-0 f0-3) (* f4-0 f2-1))) + (set! (-> s2-0 rmat vector 0 y) (+ (* f5-0 f2-1) (* f4-0 f0-3))) + (set! (-> s2-0 rmat vector 1 x) (- (* f3-0 f0-3) (* f1-2 f2-1))) + (set! (-> s2-0 rmat vector 1 y) (+ (* f3-0 f2-1) (* f1-2 f0-3))) + ) + (cond + ((or + (< (-> s1-0 y) (-> obj die-if-below-y)) + (< (-> obj die-if-beyond-xz-dist-sqrd) (vector-vector-xz-distance s1-0 (-> obj root trans))) + ) + (set! s3-0 (TODO-RENAME-24 obj arg0 s3-0)) + ) + (else + (TODO-RENAME-21 obj arg0 s2-0) + (set! s3-0 (-> s2-0 next)) + ) + ) + ) + ) + ) + #f + ) + +(defmethod TODO-RENAME-22 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list)) + (dummy-13 *collide-cache* (-> arg0 bbox) (the-as uint 1) obj (the-as uint 1)) + (let ((gp-1 (-> obj joints)) + (v1-2 (-> arg0 head)) + ) + (while (>= v1-2 0) + (let ((s5-1 (-> gp-1 joint v1-2))) + (let ((s4-0 (-> s5-1 mat vector 3)) + (a2-1 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'collide-tri-result)) + ) + (vector-! a2-1 s4-0 (-> s5-1 prev-pos)) + (when (>= (dummy-18 *collide-cache* (-> s5-1 prev-pos) a2-1 40.96 1 s3-0 1) 0.0) + (set! (-> s4-0 quad) (-> s3-0 intersect quad)) + (let ((f28-0 (vector-xz-length (-> s5-1 transv)))) + (vector-reflect! (-> s5-1 transv) (-> s5-1 transv) (-> s3-0 normal)) + (let ((f30-0 (-> s5-1 transv y))) + (set! (-> s5-1 transv y) 0.0) + (vector-normalize! (-> s5-1 transv) (* 0.75 f28-0)) + (set! (-> s5-1 transv y) (* 0.7 f30-0)) + ) + ) + (+! (-> s4-0 y) (* 40.96 (-> s3-0 normal y))) + (set! (-> s4-0 w) 1.0) + (set! (-> s5-1 rspeed) (* 0.5 (-> s5-1 rspeed))) + ) + ) + (set! v1-2 (-> s5-1 next)) + ) + ) + ) + #f + ) + +(defstate joint-exploder-shatter (joint-exploder) + :enter + (behavior () (set! (-> self state-time) (-> *display* base-frame-counter)) (none)) + :trans + (behavior () + (let* ((f1-0 (the float (- (-> *display* base-frame-counter) (-> self state-time)))) + (f0-2 (- 1.0 (/ f1-0 (the float (-> self tuning duration))))) + (f1-2 (- 1.0 (/ f1-0 (* 0.75 (the float (-> self tuning duration)))))) + ) + (if (< f1-2 0.0) + (set! f1-2 0.0) + ) + (set-vector! (-> self scale-vector) f0-2 f1-2 f0-2 1.0) + ) + (dotimes (v1-8 5) + (set! (-> self lists v1-8 pre-moved?) #f) + ) + (dotimes (gp-0 5) + (let ((s5-0 (-> self lists gp-0))) + (when (>= (-> s5-0 head) 0) + (when (not (-> s5-0 pre-moved?)) + (TODO-RENAME-25 self s5-0) + (if (nonzero? gp-0) + (TODO-RENAME-28 self s5-0) + ) + ) + ) + ) + ) + (let ((gp-1 (new 'stack-no-clear 'bounding-box))) + (let ((v1-26 (-> self root trans))) + (set! (-> gp-1 min quad) (-> v1-26 quad)) + (set! (-> gp-1 max quad) (-> v1-26 quad)) + ) + (dotimes (s5-1 5) + (let ((s4-0 (-> self lists s5-1))) + (if (-> s4-0 bbox-valid?) + (add-box! gp-1 (-> s4-0 bbox)) + ) + (if (nonzero? s5-1) + (TODO-RENAME-22 self s4-0) + ) + ) + ) + (let ((s5-2 (-> self draw bounds))) + (set-vector! + s5-2 + (* 0.5 (+ (-> gp-1 min x) (-> gp-1 max x))) + (* 0.5 (+ (-> gp-1 min y) (-> gp-1 max y))) + (* 0.5 (+ (-> gp-1 min z) (-> gp-1 max z))) + 1.0 + ) + (let ((f0-12 (+ 16384.0 (vector-vector-distance s5-2 (-> gp-1 max))))) + (vector-! s5-2 s5-2 (-> self root trans)) + (set! (-> s5-2 w) f0-12) + ) + ) + ) + 0 + (none) + ) + :code + (behavior () + (set! (-> self state-time) (-> *display* base-frame-counter)) + (until (>= (- (-> *display* base-frame-counter) (-> self state-time)) (the-as int (-> self tuning duration))) + (suspend) + (let ((a0-0 (-> self skel root-channel 0))) + (set! (-> a0-0 param 0) 1.0) + (joint-control-channel-group-eval! a0-0 (the-as art-joint-anim #f) num-func-loop!) + ) + ) + (none) + ) + :post + (the-as (function none :behavior joint-exploder) ja-post) + ) + +(defmethod TODO-RENAME-23 joint-exploder ((obj joint-exploder)) + (let ((gp-0 (-> obj joints))) + (dotimes (s4-0 (-> gp-0 num-joints)) + (let ((v1-2 (-> obj static-params joints s4-0)) + (s3-0 (-> gp-0 joint s4-0)) + ) + (let ((a0-6 (-> v1-2 parent-joint-index))) + (set! (-> s3-0 prev) (+ s4-0 -1)) + (set! (-> s3-0 next) (+ s4-0 1)) + (set! (-> s3-0 joint-index) (-> v1-2 joint-index)) + (set! (-> s3-0 rspeed) (-> obj tuning rot-speed)) + (cond + ((>= a0-6 0) + (if (zero? a0-6) + (set! a0-6 (-> v1-2 joint-index)) + ) + (let* ((a3-0 (-> obj parent-override 0 node-list data a0-6 bone transform)) + (a2-0 (-> s3-0 mat)) + (v1-9 (-> a3-0 vector 0 quad)) + (a0-8 (-> a3-0 vector 1 quad)) + (a1-4 (-> a3-0 vector 2 quad)) + (a3-1 (-> a3-0 vector 3 quad)) + ) + (set! (-> a2-0 vector 0 quad) v1-9) + (set! (-> a2-0 vector 1 quad) a0-8) + (set! (-> a2-0 vector 2 quad) a1-4) + (set! (-> a2-0 vector 3 quad) a3-1) + ) + (matrix-identity! (-> s3-0 rmat)) + ) + (else + (let* ((a3-2 (-> obj node-list data (-> v1-2 joint-index) bone transform)) + (a2-1 (-> s3-0 mat)) + (v1-15 (-> a3-2 vector 0 quad)) + (a0-11 (-> a3-2 vector 1 quad)) + (a1-5 (-> a3-2 vector 2 quad)) + (a3-3 (-> a3-2 vector 3 quad)) + ) + (set! (-> a2-1 vector 0 quad) v1-15) + (set! (-> a2-1 vector 1 quad) a0-11) + (set! (-> a2-1 vector 2 quad) a1-5) + (set! (-> a2-1 vector 3 quad) a3-3) + ) + (matrix-identity! (-> s3-0 rmat)) + ) + ) + ) + (case (-> obj tuning explosion) + ((1) + (vector-! (-> s3-0 transv) (-> s3-0 mat vector 3) (-> obj tuning fountain-rand-transv-lo)) + (vector-normalize! + (-> s3-0 transv) + (rand-vu-float-range (-> obj tuning fountain-rand-transv-hi x) (-> obj tuning fountain-rand-transv-hi y)) + ) + (+! + (-> s3-0 transv y) + (rand-vu-float-range (-> obj tuning fountain-rand-transv-hi z) (-> obj tuning fountain-rand-transv-hi w)) + ) + (set! (-> s3-0 transv w) 1.0) + ) + (else + (let ((s1-1 (-> obj tuning fountain-rand-transv-lo)) + (s2-1 (-> obj tuning fountain-rand-transv-hi)) + ) + (set-vector! + (-> s3-0 transv) + (rand-vu-float-range (-> s1-1 x) (-> s2-1 x)) + (rand-vu-float-range (-> s1-1 y) (-> s2-1 y)) + (rand-vu-float-range (-> s1-1 z) (-> s2-1 z)) + 1.0 + ) + ) + ) + ) + ) + ) + (when (nonzero? (-> gp-0 num-joints)) + (let ((v1-26 (-> gp-0 joint (+ (-> gp-0 num-joints) -1)))) + (set! (-> v1-26 next) -1) + ) + (let ((v1-27 (the-as joint-exploder-list (&-> obj stack 224)))) + (set! (-> v1-27 head) 0) + (let ((s5-1 (-> v1-27 bbox))) + (let ((v1-28 (the-as structure (-> gp-0 joint 0 mat vector 3)))) + (set! (-> s5-1 min quad) (-> (the-as matrix v1-28) vector 0 quad)) + (set! (-> s5-1 max quad) (-> (the-as matrix v1-28) vector 0 quad)) + ) + (dotimes (s4-1 (-> gp-0 num-joints)) + (add-point! s5-1 (the-as vector3s (+ (the-as uint (-> gp-0 joint 0 mat vector 3)) (* 176 s4-1)))) + ) + ) + ) + #f + ) + ) + ) + +(defmethod relocate joint-exploder ((obj joint-exploder) (arg0 int)) + (if (nonzero? (-> obj joints)) + (&+! (-> obj joints) arg0) + ) + (the-as joint-exploder ((method-of-type process-drawable relocate) obj arg0)) + ) + +(defbehavior joint-exploder-init-by-other joint-exploder ((arg0 skeleton-group) (arg1 int) (arg2 joint-exploder-static-params) (arg3 joint-exploder-static-params)) + (set! (-> self static-params) arg3) + (set! (-> self die-if-beyond-xz-dist-sqrd) 10485760000.0) + (mem-copy! (the-as pointer (-> self tuning)) (the-as pointer arg2) 64) + (set! (-> self joints) (new 'process 'joint-exploder-joints arg3)) + (dotimes (v1-1 5) + (let ((a0-6 (-> self lists v1-1))) + (set! (-> a0-6 head) -1) + (set! (-> a0-6 bbox-valid?) #f) + (set! (-> a0-6 pre-moved?) #f) + ) + ) + (set! (-> self mask) (logior (process-mask enemy) (-> self mask))) + (set! (-> self root) (new 'process 'trsqv)) + (set! (-> self root trans quad) (-> self parent-override 0 root trans quad)) + (quaternion-copy! (-> self root quat) (-> self parent-override 0 root quat)) + (set! (-> self root scale quad) (-> self parent-override 0 root scale quad)) + (initialize-skeleton self arg0 '()) + (logior! (-> self skel status) 1) + (set! (-> self anim) (the-as art-joint-anim (-> self draw art-group data arg1))) + (ja-channel-set! 1) + (let ((gp-1 (-> self skel root-channel 0))) + (joint-control-channel-group-eval! gp-1 (-> self anim) num-func-identity) + (set! (-> gp-1 frame-num) 0.0) + ) + (ja-post) + (TODO-RENAME-23 self) + (set! (-> self die-if-below-y) (+ -102400.0 (-> self root trans y))) + (set! (-> self skel postbind-function) joint-exploder-joint-callback) + (go joint-exploder-shatter) + (none) + ) + +(defmethod new joint-exploder-tuning ((allocation symbol) (type-to-make type) (arg0 int)) + (let ((t9-0 (method-of-type structure new)) + (v1-1 type-to-make) + ) + (-> type-to-make size) + (let ((v0-0 (the-as joint-exploder-tuning (t9-0 allocation v1-1)))) + (set! (-> v0-0 explosion) (the-as uint arg0)) + (set! (-> v0-0 duration) (the-as uint 600)) + (set! (-> v0-0 gravity) -286720.0) + (set! (-> v0-0 rot-speed) 8.4) + (cond + ((zero? arg0) + (set-vector! (-> v0-0 fountain-rand-transv-lo) -81920.0 20480.0 -81920.0 1.0) + (set-vector! (-> v0-0 fountain-rand-transv-hi) 81920.0 61440.0 81920.0 1.0) + ) + ((= arg0 1) + (vector-reset! (-> v0-0 fountain-rand-transv-lo)) + (set! (-> v0-0 fountain-rand-transv-hi x) 49152.0) + (set! (-> v0-0 fountain-rand-transv-hi y) 163840.0) + (set! (-> v0-0 fountain-rand-transv-hi z) 20480.0) + (set! (-> v0-0 fountain-rand-transv-hi w) 61440.0) + ) + ) + v0-0 + ) + ) + ) + + + + diff --git a/goal_src/levels/misty/balloonlurker.gc b/goal_src/levels/misty/balloonlurker.gc index 6eefb81015..b596129ba6 100644 --- a/goal_src/levels/misty/balloonlurker.gc +++ b/goal_src/levels/misty/balloonlurker.gc @@ -5,3 +5,1244 @@ ;; name in dgo: balloonlurker ;; dgos: L1, MIS +;; DECOMP BEGINS + +(set! (-> *part-group-id-table* 203) (new 'static 'sparticle-launch-group + :length 1 + :duration #x5 + :linger-duration #x258 + :flags (sp-group-flag use-local-clock) + :name "group-balloonlurker-pilot-death" + :launcher + (new 'static 'inline-array sparticle-group-item 1 (sp-item 2015)) + :bounds (new 'static 'sphere :w 49152.0) + ) + ) + +(set! (-> *part-id-table* 2015) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 14 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 1.0)) + (sp-flt spt-scale-x (meters 16.0)) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 196.0) + (sp-flt spt-g 196.0) + (sp-flt spt-b 196.0) + (sp-flt spt-a 128.0) + (sp-flt spt-fade-a -3.2) + (sp-int spt-timer 25) + (sp-cpuinfo-flags bit2 bit3) + (sp-end) + ) + ) + ) + +(set! (-> *part-group-id-table* 204) + (new 'static 'sparticle-launch-group + :length 21 + :duration #x258 + :linger-duration #x5dc + :flags (sp-group-flag use-local-clock) + :name "group-balloonlurker-mine-explosion" + :launcher + (new 'static 'inline-array sparticle-group-item 21 + (sp-item 964 :period 1200 :length 30) + (sp-item 965 :fade-after (meters 60.0) :period 1200 :length 15) + (sp-item 966 :period 1200 :length 15 :offset 15) + (sp-item 967 :period 1200 :length 15) + (sp-item 968 :fade-after (meters 80.0) :period 1200 :length 30 :binding 963) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + ) + :bounds (new 'static 'sphere :w 65536.0) + ) + ) + +(set! (-> *part-id-table* 964) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 24 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 1.5) + (sp-rnd-flt spt-y (meters 0.5) (meters 0.5) 1.0) + (sp-rnd-flt spt-scale-x (meters 2.5) (meters 1.5) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 70.0) + (sp-flt spt-g 70.0) + (sp-rnd-flt spt-b 70.0 16.0 1.0) + (sp-flt spt-a 96.0) + (sp-rnd-flt spt-vel-y (meters 0.006666667) (meters 0.033333335) 1.0) + (sp-flt spt-scalevel-x (meters 0.006)) + (sp-rnd-flt spt-rotvel-z (degrees -0.2) (degrees 0.4) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-accel-y 0.2048) + (sp-flt spt-friction 0.92) + (sp-int spt-timer 900) + (sp-cpuinfo-flags bit2 bit12 bit14) + (sp-int-plain-rnd spt-next-time 30 299 1) + (sp-launcher-by-id spt-next-launcher 969) + (sp-rnd-flt spt-conerot-x (degrees 70.0) (degrees 20.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-radius (meters 2.0)) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 969) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 4 + (sp-flt spt-scalevel-x (meters 0.0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -0.32) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 965) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 21 + (sp-tex spt-texture (new 'static 'texture-id :index #x2 :page #x2)) + (sp-flt spt-num 6.0) + (sp-flt spt-y (meters 0.75)) + (sp-rnd-flt spt-scale-x (meters 8.0) (meters 8.0) 1.0) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 1.2) (meters 3.0) 1.0) + (sp-flt spt-r 192.0) + (sp-flt spt-g 192.0) + (sp-rnd-flt spt-b 64.0 128.0 1.0) + (sp-flt spt-a 0.0) + (sp-flt spt-scalevel-x (meters 0.009765625)) + (sp-rnd-flt spt-rotvel-z (degrees -0.15) (degrees 0.3) 1.0) + (sp-flt spt-scalevel-y (meters 0.009765625)) + (sp-flt spt-fade-a 2.1333334) + (sp-int spt-timer 30) + (sp-cpuinfo-flags bit2 bit3 bit14) + (sp-int spt-next-time 15) + (sp-launcher-by-id spt-next-launcher 970) + (sp-flt spt-rotate-y (degrees 0.0)) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 970) + (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 2 (sp-flt spt-fade-a -1.3333334) (sp-end)) + ) + ) + +(set! (-> *part-id-table* 966) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 13 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 1.0)) + (sp-rnd-flt spt-scale-x (meters 24.0) (meters 16.0) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 196.0) + (sp-flt spt-g 196.0) + (sp-flt spt-b 196.0) + (sp-flt spt-a 64.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags bit2 bit3 bit14) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 967) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 13 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 1.0)) + (sp-rnd-flt spt-scale-x (meters 24.0) (meters 16.0) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 196.0) + (sp-flt spt-g 32.0) + (sp-flt spt-b 32.0) + (sp-flt spt-a 64.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags bit2 bit3 bit14) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 968) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 24 + (sp-tex spt-texture (new 'static 'texture-id :index #xf :page #x2)) + (sp-rnd-flt spt-num 5.0 10.0 1.0) + (sp-rnd-flt spt-x (meters -0.5) (meters 1.0) 1.0) + (sp-rnd-flt spt-y (meters 0.25) (meters 1.5) 1.0) + (sp-rnd-flt spt-z -2048.0 4096.0 1.0) + (sp-flt spt-scale-x (meters 0.5)) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-rnd-int spt-g 1123942400 1 127.0) + (sp-flt spt-b 0.0) + (sp-flt spt-a 127.0) + (sp-rnd-flt spt-vel-y (meters 0.06666667) (meters 0.06666667) 1.0) + (sp-flt spt-fade-g -4.266667) + (sp-flt spt-fade-b -2.8444445) + (sp-flt spt-accel-y -16.384) + (sp-flt spt-friction 0.97) + (sp-int spt-timer 90) + (sp-cpuinfo-flags bit2 bit3) + (sp-int-plain-rnd spt-next-time 5 38 1) + (sp-launcher-by-id spt-next-launcher 971) + (sp-rnd-flt spt-conerot-x (degrees 40.0) (degrees 30.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 971) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 7 + (sp-flt spt-scalevel-x (meters -0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -4.266667) + (sp-flt spt-fade-g 0.7111111) + (sp-flt spt-fade-b 1.4222223) + (sp-flt spt-fade-a -2.8444445) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 963) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 19 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 2.0) + (sp-rnd-flt spt-x (meters -0.25) (meters 0.5) 1.0) + (sp-rnd-flt spt-y (meters -0.25) (meters 0.5) 1.0) + (sp-rnd-flt spt-z -1024.0 2048.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.5) (meters 0.5) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 70.0) + (sp-flt spt-g 70.0) + (sp-rnd-flt spt-b 70.0 16.0 1.0) + (sp-rnd-flt spt-a 20.0 8.0 1.0) + (sp-flt spt-scalevel-x (meters 0.0033333334)) + (sp-rnd-flt spt-rotvel-z (degrees -0.3) (degrees 0.6) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -0.11666667) + (sp-int spt-timer 300) + (sp-cpuinfo-flags bit2 bit12) + (sp-end) + ) + ) + ) + +(deftype balloonlurker-bank (basic) + ((buoyancy-depth-offset meters :offset-assert 4) + (player-mass float :offset-assert 8) + (rudder-factor float :offset-assert 12) + (max-engine-thrust float :offset-assert 16) + (max-rudder-deflection-angle float :offset-assert 20) + (throttle-factor float :offset-assert 24) + (throttle-distance float :offset-assert 28) + (throttle-close-distance float :offset-assert 32) + (explosion-force float :offset-assert 36) + (mine-weight float :offset-assert 40) + ) + :method-count-assert 9 + :size-assert #x2c + :flag-assert #x90000002c + ) + + +(define *BALLOONLURKER-bank* (new 'static 'balloonlurker-bank + :buoyancy-depth-offset (meters 30.0) + :player-mass 20.0 + :rudder-factor 32.0 + :max-engine-thrust 409600.0 + :max-rudder-deflection-angle 8192.0 + :throttle-factor 0.5 + :throttle-distance 53248.0 + :throttle-close-distance 81920.0 + :explosion-force 24576000.0 + :mine-weight 53248.0 + ) + ) + +(define *balloonlurker-constants* (new 'static 'rigid-body-platform-constants + :drag-factor 1.6 + :buoyancy-factor 1.2 + :max-buoyancy-depth (meters 15.0) + :gravity-factor 1.0 + :gravity (meters 60.0) + :player-weight (meters 6.6) + :player-bonk-factor 1.0 + :player-dive-factor 1.0 + :player-force-distance (meters 1000.0) + :player-force-clamp (meters 1000000.0) + :player-force-timeout #x1e + :explosion-force (meters 1000.0) + :linear-damping 1.0 + :angular-damping 1.0 + :control-point-count 7 + :mass 2.0 + :inertial-tensor-x (meters 12.0) + :inertial-tensor-y (meters 12.0) + :inertial-tensor-z (meters 20.0) + :cm-joint-y (meters 9.0) + :idle-distance (meters 50.0) + :platform #f + :sound-name #f + ) + ) + +(deftype balloonlurker (rigid-body-platform) + ((explosion-force-position vector :inline :offset-assert 736) + (explosion-force vector :inline :offset-assert 752) + (explosion symbol :offset-assert 768) + (explosion-joint-index uint16 2 :offset-assert 772) + (explosion-joint-index-bytes int8 4 :offset 772) + (vulnerable symbol :offset-assert 776) + (water-y float :offset-assert 780) + (propeller joint-mod-set-local :offset-assert 784) + (rudder joint-mod-set-local :offset-assert 788) + (mine joint-mod-set-world 2 :offset-assert 792) + (buoyancy-factor float :offset-assert 800) + (rudder-control float :offset-assert 804) + (throttle-control float :offset-assert 808) + (engine-thrust float :offset-assert 812) + (dest-point vector :inline :offset-assert 816) + (dest-point-old vector :inline :offset-assert 832) + (dest-index int8 :offset-assert 848) + (auto-pilot symbol :offset-assert 852) + (dead symbol :offset-assert 856) + (anim-frame float :offset-assert 860) + (engine-sound-id sound-id :offset-assert 864) + (pedal-sound-id sound-id :offset-assert 868) + (frame-count int8 :offset-assert 872) + ) + :heap-base #x300 + :method-count-assert 35 + :size-assert #x369 + :flag-assert #x2303000369 + (:states + balloonlurker-die + (balloonlurker-mine-explode int) + balloonlurker-patrol + ) + ) + + +(deftype balloonlurker-pilot (process-drawable) + ((parent-override (pointer balloonlurker) :offset 12) + (root-override collide-shape-moving :offset 112) + ) + :heap-base #x40 + :method-count-assert 22 + :size-assert #xb0 + :flag-assert #x16004000b0 + (:methods + (dummy-20 (_type_) none 20) + (dummy-21 (_type_) none 21) + ) + (:states + balloonlurker-pilot-die + balloonlurker-pilot-idle + ) + ) + + +(defskelgroup *balloonlurker-sg* balloonlurker + 0 + 4 + ((1 (meters 20)) (2 (meters 40)) (3 (meters 999999))) + :bounds (static-spherem 0 12 0 17) + :longest-edge (meters 0) + ) + +(defskelgroup *balloonlurker-pilot-sg* balloonlurker + 6 + 10 + ((7 (meters 20)) (8 (meters 40)) (9 (meters 999999))) + :bounds (static-spherem 0 0 0 4) + :longest-edge (meters 0) + ) + +(defbehavior balloonlurker-get-path-point balloonlurker ((arg0 int)) + (if (<= (-> self path curve num-cverts) 0) + (go process-drawable-art-error "no path") + ) + (set! (-> self dest-index) arg0) + (set! (-> self dest-point-old quad) (-> self dest-point quad)) + (eval-path-curve-div! (-> self path) (-> self dest-point) (the float arg0) 'interp) + 0 + (none) + ) + +(defbehavior balloonlurker-get-next-path-point balloonlurker () + (if (<= (-> self path curve num-cverts) 0) + (go process-drawable-art-error "no path") + ) + (let ((a0-1 (+ (-> self dest-index) 1))) + (if (= a0-1 (-> self path curve num-cverts)) + (set! a0-1 0) + ) + (balloonlurker-get-path-point a0-1) + ) + 0 + (none) + ) + +(defbehavior balloonlurker-snap-to-path-point balloonlurker ((arg0 int)) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (eval-path-curve-div! (-> self path) s4-0 (the float arg0) 'interp) + (set! (-> self root-overlay trans quad) (-> s4-0 quad)) + (TODO-RENAME-12 (-> self path) gp-0 (the float arg0)) + (set! (-> gp-0 y) 0.0) + (vector-normalize! gp-0 1.0) + (forward-up-nopitch->quaternion (-> self root-overlay quat) gp-0 *up-vector*) + ) + ) + +(defbehavior balloonlurker-find-nearest-path-point balloonlurker () + (let ((gp-0 0)) + (let ((f30-0 409600000.0) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (dotimes (s4-0 (-> self path curve num-cverts)) + (eval-path-curve-div! (-> self path) s5-0 (the float s4-0) 'interp) + (let ((f0-2 (vector-vector-xz-distance (-> self root-overlay trans) s5-0))) + (when (< f0-2 f30-0) + (set! f30-0 f0-2) + (set! gp-0 s4-0) + ) + ) + ) + ) + (balloonlurker-get-path-point gp-0) + ) + (set! (-> self dest-point-old quad) (-> self dest-point quad)) + 0 + (none) + ) + +(defbehavior balloonlurker-player-impulse balloonlurker () + (when *target* + (set! (-> self player-impulse) (the-as collide-shape-prim-mesh #t)) + (set! (-> self player-force-position quad) (-> *target* control trans quad)) + (vector-! (-> self player-force) (-> self player-velocity) (-> *target* control transv)) + (vector-float*! (-> self player-force) (-> self player-force) (-> *BALLOONLURKER-bank* player-mass)) + ) + ) + +(defbehavior balloonlurker-event-handler balloonlurker ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('touch 'attack) + (balloonlurker-player-impulse) + (when ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry (-> arg3 param 0)) + (-> self root-overlay) + (the-as uint 1) + ) + (dummy-45 (-> self root-overlay)) + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) self) + (set! (-> a1-3 num-params) 2) + (set! (-> a1-3 message) 'shove) + (set! (-> a1-3 param 0) (-> arg3 param 0)) + (let ((v1-9 (new 'static 'attack-info :mask #xc0))) + (set! (-> v1-9 shove-back) 8192.0) + (set! (-> v1-9 shove-up) 2048.0) + (set! (-> a1-3 param 1) (the-as uint v1-9)) + ) + (send-event-function arg0 a1-3) + ) + ) + (dotimes (s4-0 2) + (let ((s3-0 (if (zero? s4-0) + 8 + 16 + ) + ) + ) + (when ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry (-> arg3 param 0)) + (-> self root-overlay) + (the-as uint s3-0) + ) + (let ((a0-10 (dummy-34 (-> self root-overlay) (the-as uint s3-0)))) + (when a0-10 + (set! (-> self explosion-force-position quad) (-> a0-10 prim-core world-sphere quad)) + (let ((a1-6 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-6 from) self) + (set! (-> a1-6 num-params) 2) + (set! (-> a1-6 message) 'attack) + (set! (-> a1-6 param 0) (-> arg3 param 0)) + (let ((a0-13 (new 'static 'attack-info :mask #x20))) + (set! (-> a0-13 mode) 'balloonlurker) + (set! (-> a1-6 param 1) (the-as uint a0-13)) + ) + (if (send-event-function arg0 a1-6) + (level-hint-spawn + (game-text-id misty-daxter-hit-lurkers-not-mines) + "sksp0063" + (the-as entity #f) + *entity-pool* + (game-task none) + ) + ) + ) + (go balloonlurker-mine-explode s4-0) + ) + ) + ) + ) + ) + #f + ) + (('die) + (go balloonlurker-die) + ) + ) + ) + +(defmethod TODO-RENAME-23 balloonlurker ((obj balloonlurker) (arg0 float)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s4-0 (-> obj rbody matrix)) + ) + (dotimes (s2-0 4) + (let ((s1-0 (-> obj control-point-array data s2-0))) + (vector-matrix*! (-> s1-0 world-pos) (-> s1-0 local-pos) s4-0) + (TODO-RENAME-17 (-> obj rbody) (-> s1-0 world-pos) (-> s1-0 velocity)) + (let* ((f30-0 (vector-vector-xz-distance (-> obj dest-point) (-> obj root-overlay trans))) + (f0-0 (vector-vector-xz-distance (-> obj dest-point-old) (-> obj root-overlay trans))) + (f0-6 + (/ (- (+ (/ (+ (* f30-0 (-> obj dest-point-old y)) (* f0-0 (-> obj dest-point y))) (fmax 409.6 (+ f30-0 f0-0))) + (-> *BALLOONLURKER-bank* buoyancy-depth-offset) + ) + (-> s1-0 world-pos y) + ) + (-> obj info max-buoyancy-depth) + ) + ) + ) + (vector-float*! + s5-0 + *y-vector* + (* 0.25 + (-> obj buoyancy-factor) + (-> obj info gravity-factor) + (fmax 0.3 (fmin 1.0 f0-6)) + (-> obj info gravity) + (-> obj rbody mass) + ) + ) + ) + (TODO-RENAME-13 (-> obj rbody) (-> s1-0 world-pos) s5-0) + (vector-float*! s5-0 (-> s1-0 velocity) (* -1.0 (-> obj info drag-factor))) + (TODO-RENAME-13 (-> obj rbody) (-> s1-0 world-pos) s5-0) + ) + 0 + ) + (let ((s2-1 (-> obj control-point-array data 4))) + (let ((f30-1 (* (-> *BALLOONLURKER-bank* max-rudder-deflection-angle) (-> obj rudder-control)))) + (vector-matrix*! (-> s2-1 world-pos) (-> s2-1 local-pos) s4-0) + (TODO-RENAME-17 (-> obj rbody) (-> s2-1 world-pos) (-> s2-1 velocity)) + (set-vector! s3-0 (cos f30-1) 0.0 (sin f30-1) 1.0) + ) + (vector-rotate*! s3-0 s3-0 s4-0) + (vector-float*! + s5-0 + s3-0 + (* -1.0 (-> *BALLOONLURKER-bank* rudder-factor) (vector-dot s3-0 (-> s2-1 velocity))) + ) + (TODO-RENAME-13 (-> obj rbody) (-> s2-1 world-pos) s5-0) + ) + 0 + (let ((s3-1 (-> obj control-point-array data 5))) + (vector-matrix*! (-> s3-1 world-pos) (-> s3-1 local-pos) s4-0) + (set! (-> s3-1 world-pos quad) (-> s3-1 world-pos quad)) + (vector-float*! s5-0 (-> s4-0 vector 2) (-> obj engine-thrust)) + (TODO-RENAME-13 (-> obj rbody) (-> s3-1 world-pos) s5-0) + ) + ) + (dotimes (s4-1 2) + (when (-> obj mine s4-1 enable) + (let ((v1-43 (-> obj control-point-array data (if (zero? s4-1) + 5 + 4 + ) + ) + ) + ) + (vector-float*! s5-0 *y-vector* (-> *BALLOONLURKER-bank* mine-weight)) + (TODO-RENAME-13 (-> obj rbody) (-> v1-43 world-pos) s5-0) + ) + ) + ) + (vector-float*! + s5-0 + *y-vector* + (* -1.0 (-> obj info gravity-factor) (-> obj info gravity) (-> obj rbody mass)) + ) + (TODO-RENAME-15 (-> obj rbody) s5-0) + ) + (when (or (-> obj player-impulse) (-> obj player-contact)) + (set! (-> obj player-impulse) #f) + (TODO-RENAME-13 (-> obj rbody) (-> obj player-force-position) (-> obj player-force)) + ) + (when (-> obj explosion) + (set! (-> obj explosion) #f) + (TODO-RENAME-13 (-> obj rbody) (-> obj explosion-force-position) (-> obj explosion-force)) + ) + 0 + (none) + ) + +(define *balloonlurker-rudder-joint-home* (new 'static 'vector :x 0.5 :y -0.5 :z -0.5 :w 0.5)) + +(defbehavior balloonlurker-play-sounds balloonlurker () + (cond + ((not (-> self dead)) + (if (zero? (-> self engine-sound-id)) + (set! (-> self engine-sound-id) (new-sound-id)) + ) + (if (zero? (-> self pedal-sound-id)) + (set! (-> self pedal-sound-id) (new-sound-id)) + ) + (when (< (vector-vector-distance (-> self root-overlay trans) (ear-trans)) 286720.0) + (let* ((f0-2 (/ (-> self engine-thrust) (-> *BALLOONLURKER-bank* max-engine-thrust))) + (f1-2 100.0) + (f0-3 (* 3.0 f0-2)) + ) + (sound-play-by-name + (static-sound-name "propeller") + (-> self engine-sound-id) + (the int (* 10.24 f1-2)) + (the int (* 1524.0 f0-3)) + 0 + 1 + (the-as symbol (-> self node-list data 4 bone transform vector 3)) + ) + ) + (sound-play-by-name + (static-sound-name "pedals") + (-> self pedal-sound-id) + 1024 + 0 + 0 + 1 + (the-as symbol (-> self root-overlay trans)) + ) + ) + ) + (else + (when (nonzero? (-> self engine-sound-id)) + (sound-stop (-> self engine-sound-id)) + (set! (-> self engine-sound-id) (new 'static 'sound-id)) + 0 + ) + (when (nonzero? (-> self pedal-sound-id)) + (sound-stop (-> self pedal-sound-id)) + (set! (-> self pedal-sound-id) (new 'static 'sound-id)) + 0 + ) + ) + ) + (none) + ) + +(defbehavior balloonlurker-post balloonlurker () + (set! (-> self anim-frame) (ja-frame-num 0)) + (cond + ((and (-> self auto-pilot) (not (-> self dead))) + (let* ((s4-0 (-> self rbody matrix vector 2)) + (s5-0 (-> self rbody matrix)) + (gp-0 (-> self rbody position)) + (f30-0 (vector-vector-xz-distance (-> self dest-point) gp-0)) + ) + (when (< f30-0 (-> *BALLOONLURKER-bank* throttle-close-distance)) + (balloonlurker-get-next-path-point) + (set! f30-0 (vector-vector-xz-distance (-> self dest-point) gp-0)) + ) + (let ((f0-4 (- (vector-dot s4-0 (-> self dest-point)) (vector-dot s4-0 gp-0))) + (f2-2 (- (vector-dot (the-as vector s5-0) (-> self dest-point)) (vector-dot (the-as vector s5-0) gp-0))) + ) + (set! (-> self rudder-control) (seek + (-> self rudder-control) + (fmax -1.0 (fmin 1.0 (/ f2-2 (fmax 4096.0 f0-4)))) + (* 4.0 (-> *display* seconds-per-frame)) + ) + ) + ) + (let ((f0-12 0.0) + (f1-7 1.0) + (f2-4 (* (-> *BALLOONLURKER-bank* throttle-factor) (- f30-0 (-> *BALLOONLURKER-bank* throttle-distance)))) + (f3-3 (-> *BALLOONLURKER-bank* throttle-distance)) + ) + (set! (-> self throttle-control) (fmax f0-12 (fmin f1-7 (* f2-4 (/ 1.0 f3-3))))) + ) + ) + 0 + ) + (else + (let ((f0-14 (analog-input (the-as int (-> *cpad-list* cpads 1 leftx)) 128.0 48.0 110.0 -1.0))) + (set! (-> self rudder-control) (seek (-> self rudder-control) f0-14 (* 2.0 (-> *display* seconds-per-frame)))) + ) + (if (cpad-hold? 1 x) + (set! (-> self throttle-control) (seek (-> self throttle-control) 1.0 (-> *display* seconds-per-frame))) + (set! (-> self throttle-control) + (seek (-> self throttle-control) 0.0 (* 0.25 (-> *display* seconds-per-frame))) + ) + ) + ) + ) + (set! (-> self engine-thrust) (seek + (-> self engine-thrust) + (* (-> self throttle-control) (-> *BALLOONLURKER-bank* max-engine-thrust)) + (* 0.005 (-> *BALLOONLURKER-bank* max-engine-thrust)) + ) + ) + (let ((f0-31 60.0) + (f1-14 1820.4445) + (f2-6 6735.6445) + (f3-6 (-> *BALLOONLURKER-bank* max-engine-thrust)) + ) + (set! (-> self propeller transform quat y) (* f0-31 (+ f1-14 (* f2-6 (/ 1.0 f3-6) (-> self engine-thrust))))) + ) + (let ((f0-34 (* (-> *BALLOONLURKER-bank* max-rudder-deflection-angle) (-> self rudder-control))) + (gp-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-vector-angle! gp-1 *x-vector* f0-34) + (quaternion*! (-> self rudder transform quat) (the-as quaternion *balloonlurker-rudder-joint-home*) gp-1) + ) + (TODO-RENAME-28 self) + (quaternion-copy! (-> self root-overlay quat) (-> self rbody rotation)) + (TODO-RENAME-18 (-> self rbody) (-> self root-overlay trans)) + (balloonlurker-play-sounds) + (when (nonzero? (-> self draw)) + (cond + ((or + (logtest? (-> self draw status) (draw-status drwf04)) + (logtest? (-> self draw status) (draw-status drwf03)) + ) + (logclear! (-> self draw status) (draw-status drwf05)) + (dummy-47 (-> self root-overlay)) + (ja-post) + ) + (else + (set! (-> self draw origin quad) (-> self root-overlay trans quad)) + (logior! (-> self draw status) (draw-status drwf05)) + ) + ) + ) + (none) + ) + +(defstate balloonlurker-patrol (balloonlurker) + :event + balloonlurker-event-handler + :trans + (behavior () + (let ((a0-0 (-> self skel root-channel 0))) + (set! (-> a0-0 param 0) 1.0) + (joint-control-channel-group-eval! a0-0 (the-as art-joint-anim #f) num-func-loop!) + ) + (set! (-> self anim-frame) (ja-frame-num 0)) + (none) + ) + :code + (behavior () + (when (not (= (if (> (-> self skel active-channels) 0) + (-> self skel root-channel 0 frame-group) + ) + (-> self draw art-group data 4) + ) + ) + (ja-channel-push! 1 21) + (let ((v1-8 (-> self skel root-channel 0))) + (set! (-> v1-8 frame-group) (the-as art-joint-anim (-> self draw art-group data 4))) + ) + (let ((v1-11 (-> self skel root-channel 0))) + (set! (-> v1-11 num-func) num-func-identity) + (set! (-> v1-11 frame-num) 0.0) + ) + ) + (ja-post) + (anim-loop) + (none) + ) + :post + balloonlurker-post + ) + +(defstate balloonlurker-mine-explode (balloonlurker) + :event + balloonlurker-event-handler + :code + (behavior ((arg0 int)) + (set! (-> self explosion-force-position quad) + (-> self node-list data (-> self explosion-joint-index-bytes arg0) bone transform vector 3 quad) + ) + (let ((s5-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when s5-0 + (let ((t9-1 (method-of-type part-tracker activate))) + (t9-1 (the-as part-tracker s5-0) *entity-pool* 'part-tracker (the-as pointer #x70004000)) + ) + (run-now-in-process + s5-0 + part-tracker-init + (-> *part-group-id-table* 204) + -1 + #f + #f + #f + (-> self explosion-force-position) + ) + (-> s5-0 ppointer) + ) + ) + (sound-play-by-name (static-sound-name "explosion") (new-sound-id) 1024 0 0 1 #t) + (set! (-> self explosion) #t) + (vector-! (-> self explosion-force) (-> self rbody position) (-> self explosion-force-position)) + (set! (-> self explosion-force y) (* 2.0 (-> self explosion-force y))) + (vector-length (-> self explosion-force)) + (vector-normalize! (-> self explosion-force) (-> *BALLOONLURKER-bank* explosion-force)) + (suspend) + (let ((a0-14 (-> self skel root-channel 0))) + (set! (-> a0-14 param 0) 1.0) + (joint-control-channel-group-eval! a0-14 (the-as art-joint-anim #f) num-func-loop!) + ) + (let ((v1-16 (-> self mine arg0))) + (set! (-> v1-16 enable) #t) + (set-vector! (-> v1-16 transform scale) 0.0 0.0 0.0 1.0) + ) + (if (-> self dead) + (go balloonlurker-die) + (go balloonlurker-patrol) + ) + (none) + ) + :post + balloonlurker-post + ) + +(defstate balloonlurker-die (balloonlurker) + :event + (the-as (function process int symbol event-message-block object :behavior balloonlurker) #f) + :enter + (behavior () + (set! (-> self state-time) (-> *display* base-frame-counter)) + (set! (-> self vulnerable) #f) + (set! (-> self dead) #t) + (none) + ) + :code + (behavior () + (local-vars (v1-27 symbol) (sv-16 symbol) (sv-20 (pointer process-tree)) (sv-24 entity-actor)) + (process-entity-status! self (entity-perm-status bit-4) #t) + (process-entity-status! self (entity-perm-status dead) #t) + (when (or (-> self link prev) (-> self link next)) + (set! sv-16 (the-as symbol #f)) + (set! sv-20 (-> self child)) + (set! sv-24 (entity-actor-lookup (-> self entity) 'alt-actor 0)) + (entity-birth-no-kill sv-24) + (apply-all (-> self link) actor-link-dead-hook (& sv-16)) + (when (and sv-16 sv-24) + (process-grab? *target*) + (let ((gp-0 (-> *display* base-frame-counter))) + (until (>= (- (-> *display* base-frame-counter) gp-0) 300) + (suspend) + ) + ) + (process-release? *target*) + (while (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) 'task-complete) + (let ((t9-7 send-event-function) + (v1-17 sv-24) + ) + (not (t9-7 + (if v1-17 + (-> v1-17 extra process) + ) + a1-4 + ) + ) + ) + ) + (suspend) + ) + ) + ) + (set! (-> self buoyancy-factor) (* 4.0 (-> self buoyancy-factor))) + (until v1-27 + (suspend) + (let ((a0-8 (-> self skel root-channel 0))) + (set! (-> a0-8 param 0) 1.0) + (joint-control-channel-group-eval! a0-8 (the-as art-joint-anim #f) num-func-loop!) + ) + (set! v1-27 (or + (>= (- (-> *display* base-frame-counter) (-> self state-time)) 9000) + (< 819200.0 (- (-> self root-overlay trans y) (-> self water-y))) + ) + ) + ) + (dummy-18 self) + (while (-> self child) + (suspend) + ) + (none) + ) + :post + balloonlurker-post + ) + +(defmethod relocate balloonlurker ((obj balloonlurker) (arg0 int)) + (if (nonzero? (-> obj propeller)) + (&+! (-> obj propeller) arg0) + ) + (if (nonzero? (-> obj rudder)) + (&+! (-> obj rudder) arg0) + ) + (if (nonzero? (-> obj mine 0)) + (&+! (-> obj mine 0) arg0) + ) + (if (nonzero? (-> obj mine 1)) + (&+! (-> obj mine 1) arg0) + ) + (the-as + balloonlurker + ((the-as (function process-drawable int process-drawable) (find-parent-method balloonlurker 7)) obj arg0) + ) + ) + +(defstate balloonlurker-pilot-idle (balloonlurker-pilot) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('attack) + (send-event (ppointer->process (-> self parent-override)) 'die) + (go balloonlurker-pilot-die) + ) + ) + ) + :code + (behavior () + (ja-channel-push! 1 30) + (let ((v1-2 (-> self skel root-channel 0))) + (set! (-> v1-2 frame-group) (the-as art-joint-anim (-> self draw art-group data 10))) + ) + (let ((v1-5 (-> self skel root-channel 0))) + (set! (-> v1-5 num-func) num-func-identity) + (set! (-> v1-5 frame-num) 0.0) + ) + (while #t + (suspend) + (let ((v1-9 (-> self skel root-channel 0))) + (set! (-> v1-9 num-func) num-func-identity) + (set! (-> v1-9 frame-num) (-> self parent-override 0 anim-frame)) + ) + ) + (none) + ) + :post + (behavior () + (set! (-> self root-override trans quad) (-> self parent-override 0 root-overlay trans quad)) + (quaternion-copy! (-> self root-override quat) (-> self parent-override 0 root-overlay quat)) + (dummy-47 (-> self root-override)) + (ja-post) + (none) + ) + ) + +(defstate balloonlurker-pilot-die (balloonlurker-pilot) + :event + (the-as + (function process int symbol event-message-block object :behavior balloonlurker-pilot) + process-drawable-death-event-handler + ) + :code + (behavior () + (let ((gp-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-0 + (let ((t9-1 (method-of-type part-tracker activate))) + (t9-1 (the-as part-tracker gp-0) *entity-pool* 'part-tracker (the-as pointer #x70004000)) + ) + (run-now-in-process + gp-0 + part-tracker-init + (-> *part-group-id-table* 203) + -1 + #f + #f + #f + (-> self root-override trans) + ) + (-> gp-0 ppointer) + ) + ) + (TODO-RENAME-17 + (-> self parent-override 0 rbody) + (-> self root-override trans) + (-> self root-override transv) + ) + (clear-collide-with-as (-> self root-override)) + (ja-channel-push! 1 30) + (let ((a0-6 (-> self skel root-channel 0))) + (set! (-> a0-6 frame-group) (the-as art-joint-anim (-> self draw art-group data 11))) + (set! (-> a0-6 param 0) + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 11)) data 0 length) -1)) + ) + (set! (-> a0-6 param 1) 1.0) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! a0-6 (the-as art-joint-anim (-> self draw art-group data 11)) num-func-seek!) + ) + (until (ja-done? 0) + (suspend) + (let ((a0-7 (-> self skel root-channel 0))) + (set! (-> a0-7 param 0) (the float (+ (-> a0-7 frame-group data 0 length) -1))) + (set! (-> a0-7 param 1) 1.0) + (joint-control-channel-group-eval! a0-7 (the-as art-joint-anim #f) num-func-seek!) + ) + ) + (dummy-18 self) + (none) + ) + :post + (behavior () + (vector-v++! (-> self root-override transv) (dummy-62 (-> self root-override) (new-stack-vector0) 0.0)) + (dummy-57 (-> self root-override) (-> self root-override transv)) + (ja-post) + (none) + ) + ) + +(defmethod dummy-20 balloonlurker-pilot ((obj balloonlurker-pilot)) + (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) default-collision-reaction) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 2)))) + (set! (-> s4-0 prim-core collide-as) (the-as uint 256)) + (set! (-> s4-0 collide-with) (the-as uint 16)) + (set! (-> s4-0 prim-core offense) 1) + (set! (-> s4-0 transform-index) 6) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 10240.0) + (set-root-prim! s5-0 s4-0) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (backup-collide-with-as s5-0) + (set! (-> obj root-override) s5-0) + ) + 0 + (none) + ) + +(defmethod dummy-21 balloonlurker-pilot ((obj balloonlurker-pilot)) + (initialize-skeleton obj *balloonlurker-pilot-sg* '()) + (set! (-> obj draw origin-joint-index) (the-as uint 6)) + 0 + (none) + ) + +(defbehavior balloonlurker-pilot-init-by-other balloonlurker-pilot ((arg0 balloonlurker)) + (set! (-> self mask) (logior (process-mask enemy) (-> self mask))) + (dummy-20 self) + (logclear! (-> self mask) (process-mask actor-pause)) + (set! (-> self fact) + (new 'process 'fact-info-enemy self (pickup-type eco-pill-random) (-> *FACT-bank* default-pill-inc)) + ) + (set! (-> self root-override trans quad) (-> arg0 root-overlay trans quad)) + (set! (-> self root-override quat vec quad) (-> arg0 root-overlay quat vec quad)) + (set! (-> self root-override scale quad) (-> arg0 root-overlay scale quad)) + (dummy-21 self) + (go balloonlurker-pilot-idle) + (none) + ) + +(defmethod TODO-RENAME-30 balloonlurker ((obj balloonlurker)) + (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) default-collision-reaction) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 4) 0))) + (set! (-> s4-0 prim-core collide-as) (the-as uint 256)) + (set! (-> s4-0 collide-with) (the-as uint 16)) + (set! (-> s4-0 prim-core action) (the-as uint 1)) + (set-vector! (-> s4-0 local-sphere) 0.0 40960.0 0.0 61440.0) + (set-root-prim! s5-0 s4-0) + (let ((s3-0 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 1)))) + (set! (-> s3-0 prim-core collide-as) (the-as uint 256)) + (set! (-> s3-0 collide-with) (the-as uint 16)) + (set! (-> s3-0 prim-core action) (the-as uint 1)) + (set! (-> s3-0 prim-core offense) 4) + (set-vector! (-> s3-0 local-sphere) 0.0 57344.0 0.0 28672.0) + (append-prim s4-0 s3-0) + ) + (let ((s3-1 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 4)))) + (set! (-> s3-1 prim-core collide-as) (the-as uint 256)) + (set! (-> s3-1 collide-with) (the-as uint 16)) + (set! (-> s3-1 prim-core offense) 2) + (set! (-> s3-1 transform-index) 4) + (set-vector! (-> s3-1 local-sphere) 0.0 0.0 -8192.0 10240.0) + (append-prim s4-0 s3-1) + ) + (let ((s3-2 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 8)))) + (set! (-> s3-2 prim-core collide-as) (the-as uint 256)) + (set! (-> s3-2 collide-with) (the-as uint 16)) + (set! (-> s3-2 prim-core offense) 2) + (set! (-> s3-2 transform-index) 10) + (set-vector! (-> s3-2 local-sphere) 0.0 -8192.0 0.0 6144.0) + (append-prim s4-0 s3-2) + ) + (let ((s3-3 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 16)))) + (set! (-> s3-3 prim-core collide-as) (the-as uint 256)) + (set! (-> s3-3 collide-with) (the-as uint 16)) + (set! (-> s3-3 prim-core offense) 2) + (set! (-> s3-3 transform-index) 7) + (set-vector! (-> s3-3 local-sphere) 0.0 -8192.0 0.0 6144.0) + (append-prim s4-0 s3-3) + ) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (backup-collide-with-as s5-0) + (set! (-> s5-0 max-iteration-count) (the-as uint 1)) + (set! (-> obj root-overlay) s5-0) + ) + 0 + (none) + ) + +(defmethod TODO-RENAME-31 balloonlurker ((obj balloonlurker)) + (logclear! (-> obj mask) (process-mask actor-pause)) + (initialize-skeleton obj *balloonlurker-sg* '()) + (set! (-> obj root-overlay pause-adjust-distance) 1228800.0) + (set! (-> obj fact) + (new 'process 'fact-info-enemy obj (pickup-type eco-pill-random) (-> *FACT-bank* default-pill-inc)) + ) + (set! (-> obj water-y) (-> obj root-overlay trans y)) + (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 link) (new 'process 'actor-link-info obj)) + (balloonlurker-find-nearest-path-point) + (balloonlurker-snap-to-path-point (-> obj dest-index)) + (TODO-RENAME-29 obj *balloonlurker-constants*) + (dotimes (s5-0 4) + (let ((s4-0 (-> obj control-point-array data s5-0))) + (let ((f30-0 (* 16384.0 (the float (logand s5-0 3))))) + (set! (-> s4-0 local-pos x) (* 24576.0 (cos f30-0))) + (set! (-> s4-0 local-pos y) 61440.0) + (set! (-> s4-0 local-pos z) (* 36864.0 (sin f30-0))) + ) + (set! (-> s4-0 local-pos w) 1.0) + ) + ) + (let ((v1-22 (-> obj control-point-array data 4))) + (set! (-> v1-22 local-pos x) 0.0) + (set! (-> v1-22 local-pos y) 61440.0) + (set! (-> v1-22 local-pos z) -40960.0) + (set! (-> v1-22 local-pos w) 1.0) + ) + (let ((v1-24 (-> obj control-point-array data 5))) + (set! (-> v1-24 local-pos x) 0.0) + (set! (-> v1-24 local-pos y) 61440.0) + (set! (-> v1-24 local-pos z) 40960.0) + (set! (-> v1-24 local-pos w) 1.0) + ) + (let ((v1-26 (-> obj control-point-array data 6))) + (set! (-> v1-26 local-pos x) 0.0) + (set! (-> v1-26 local-pos y) 0.0) + (set! (-> v1-26 local-pos z) 0.0) + (set! (-> v1-26 local-pos w) 1.0) + ) + (set! (-> obj buoyancy-factor) (-> obj info buoyancy-factor)) + (set! (-> obj player-impulse) #f) + (set! (-> obj player-contact) #f) + (set! (-> obj auto-pilot) #t) + (set! (-> obj vulnerable) #t) + (set! (-> obj dead) #f) + (set! (-> obj explosion) #f) + (set! (-> obj propeller) + (the-as + joint-mod-set-local + (new 'process 'joint-mod-spinner obj 4 (new 'static 'vector :z -1.0 :w 1.0) 8192.0) + ) + ) + (set! (-> obj rudder) (new 'process 'joint-mod-set-local obj 12 #f #t #f)) + (set! (-> obj mine 0) (new 'process 'joint-mod-set-world obj 8 #f)) + (set! (-> obj mine 1) (new 'process 'joint-mod-set-world obj 5 #f)) + (set! (-> obj stack 660) (the-as uint 10)) + (set! (-> obj stack 661) (the-as uint 7)) + (set! (-> obj engine-sound-id) (new 'static 'sound-id)) + (set! (-> obj pedal-sound-id) (new 'static 'sound-id)) + (set! (-> obj player-force quad) (-> *null-vector* quad)) + (set! (-> obj player-velocity quad) (-> *null-vector* quad)) + 0 + (none) + ) + +;; WARN: Expression building failed: Function (method 11 balloonlurker) has a return type of none, but the expression builder found a return statement. +(defmethod init-from-entity! balloonlurker ((obj balloonlurker) (arg0 entity-actor)) + (set! (-> obj mask) (logior (process-mask enemy) (-> obj mask))) + (TODO-RENAME-30 obj) + (process-drawable-from-entity! obj arg0) + (TODO-RENAME-31 obj) + (cond + ((logtest? + (-> (entity-actor-lookup (-> obj entity) 'alt-actor 0) extra perm status) + (entity-perm-status complete) + ) + (process-entity-status! obj (entity-perm-status dead) #t) + (return #f) + ) + (else + (let ((s5-1 (get-process *default-dead-pool* balloonlurker-pilot #x4000))) + (when s5-1 + (let ((t9-6 (method-of-type balloonlurker-pilot activate))) + (t9-6 (the-as balloonlurker-pilot s5-1) obj 'balloonlurker-pilot (the-as pointer #x70004000)) + ) + (run-now-in-process s5-1 balloonlurker-pilot-init-by-other obj) + (-> s5-1 ppointer) + ) + ) + (go balloonlurker-patrol) + ) + ) + (none) + ) + + + + diff --git a/test/decompiler/reference/engine/collide/collide-cache-h_REF.gc b/test/decompiler/reference/engine/collide/collide-cache-h_REF.gc index 73be7ecc29..1f03e5e030 100644 --- a/test/decompiler/reference/engine/collide/collide-cache-h_REF.gc +++ b/test/decompiler/reference/engine/collide/collide-cache-h_REF.gc @@ -188,7 +188,7 @@ (dummy-15 (_type_ collide-using-spheres-params) none 15) (dummy-16 (_type_ vector float uint process-drawable uint) none 16) (initialize (_type_) none 17) - (dummy-18 (_type_ vector vector float int collide-mesh-cache-tri int) float 18) + (dummy-18 (_type_ vector vector float int collide-tri-result int) float 18) (probe-using-spheres (_type_) none 19) (dummy-20 (_type_ vector float uint collide-tri-result uint) float 20) (dummy-21 (_type_ (function bsp-header int collide-list none) (function collide-cache none)) none 21) diff --git a/test/decompiler/reference/levels/common/joint-exploder_REF.gc b/test/decompiler/reference/levels/common/joint-exploder_REF.gc new file mode 100644 index 0000000000..a7d696a458 --- /dev/null +++ b/test/decompiler/reference/levels/common/joint-exploder_REF.gc @@ -0,0 +1,784 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type joint-exploder-tuning +(deftype joint-exploder-tuning (structure) + ((explosion uint64 :offset-assert 0) + (duration uint64 :offset-assert 8) + (gravity float :offset-assert 16) + (rot-speed float :offset-assert 20) + (fountain-rand-transv-lo vector :inline :offset-assert 32) + (fountain-rand-transv-hi vector :inline :offset-assert 48) + (away-from-focal-pt vector :inline :offset 32) + (away-from-rand-transv-xz-lo float :offset 48) + (away-from-rand-transv-xz-hi float :offset 52) + (away-from-rand-transv-y-lo float :offset 56) + (away-from-rand-transv-y-hi float :offset 60) + ) + :method-count-assert 9 + :size-assert #x40 + :flag-assert #x900000040 + (:methods + (new (symbol type int) _type_ 0) + ) + ) + +;; definition for method 3 of type joint-exploder-tuning +(defmethod inspect joint-exploder-tuning ((obj joint-exploder-tuning)) + (format #t "[~8x] ~A~%" obj 'joint-exploder-tuning) + (format #t "~Texplosion: ~D~%" (-> obj explosion)) + (format #t "~Tduration: ~D~%" (-> obj duration)) + (format #t "~Tgravity: ~f~%" (-> obj gravity)) + (format #t "~Trot-speed: ~f~%" (-> obj rot-speed)) + (format #t "~Tfountain-rand-transv-lo: #~%" (-> obj fountain-rand-transv-lo)) + (format #t "~Tfountain-rand-transv-hi: #~%" (-> obj fountain-rand-transv-hi)) + (format #t "~Taway-from-focal-pt: #~%" (-> obj fountain-rand-transv-lo)) + (format #t "~Taway-from-rand-transv-xz-lo: ~f~%" (-> obj fountain-rand-transv-hi x)) + (format #t "~Taway-from-rand-transv-xz-hi: ~f~%" (-> obj fountain-rand-transv-hi y)) + (format #t "~Taway-from-rand-transv-y-lo: ~f~%" (-> obj fountain-rand-transv-hi z)) + (format #t "~Taway-from-rand-transv-y-hi: ~f~%" (-> obj fountain-rand-transv-hi w)) + obj + ) + +;; definition of type joint-exploder-static-joint-params +(deftype joint-exploder-static-joint-params (structure) + ((joint-index int16 :offset-assert 0) + (parent-joint-index int16 :offset-assert 2) + ) + :method-count-assert 9 + :size-assert #x4 + :flag-assert #x900000004 + ) + +;; definition for method 3 of type joint-exploder-static-joint-params +(defmethod inspect joint-exploder-static-joint-params ((obj joint-exploder-static-joint-params)) + (format #t "[~8x] ~A~%" obj 'joint-exploder-static-joint-params) + (format #t "~Tjoint-index: ~D~%" (-> obj joint-index)) + (format #t "~Tparent-joint-index: ~D~%" (-> obj parent-joint-index)) + obj + ) + +;; definition of type joint-exploder-static-params +(deftype joint-exploder-static-params (basic) + ((joints (array joint-exploder-static-joint-params) :offset-assert 4) + ) + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +;; definition for method 3 of type joint-exploder-static-params +(defmethod inspect joint-exploder-static-params ((obj joint-exploder-static-params)) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~Tjoints: ~A~%" (-> obj joints)) + obj + ) + +;; definition of type joint-exploder-joint +(deftype joint-exploder-joint (structure) + ((next int16 :offset-assert 0) + (prev int16 :offset-assert 2) + (joint-index int16 :offset-assert 4) + (rspeed float :offset-assert 8) + (mat matrix :inline :offset-assert 16) + (rmat matrix :inline :offset-assert 80) + (transv vector :inline :offset-assert 144) + (prev-pos vector :inline :offset-assert 160) + ) + :method-count-assert 9 + :size-assert #xb0 + :flag-assert #x9000000b0 + ) + +;; definition for method 3 of type joint-exploder-joint +(defmethod inspect joint-exploder-joint ((obj joint-exploder-joint)) + (format #t "[~8x] ~A~%" obj 'joint-exploder-joint) + (format #t "~Tnext: ~D~%" (-> obj next)) + (format #t "~Tprev: ~D~%" (-> obj prev)) + (format #t "~Tjoint-index: ~D~%" (-> obj joint-index)) + (format #t "~Trspeed: ~f~%" (-> obj rspeed)) + (format #t "~Tmat: #~%" (-> obj mat)) + (format #t "~Trmat: #~%" (-> obj rmat)) + (format #t "~Ttransv: #~%" (-> obj transv)) + (format #t "~Tprev-pos: #~%" (-> obj prev-pos)) + obj + ) + +;; definition of type joint-exploder-joints +(deftype joint-exploder-joints (basic) + ((num-joints int32 :offset-assert 4) + (joint joint-exploder-joint :inline :dynamic :offset 16) + ) + :method-count-assert 9 + :size-assert #x10 + :flag-assert #x900000010 + (:methods + (new (symbol type joint-exploder-static-params) _type_ 0) + ) + ) + +;; definition for method 3 of type joint-exploder-joints +(defmethod inspect joint-exploder-joints ((obj joint-exploder-joints)) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~Tnum-joints: ~D~%" (-> obj num-joints)) + (format #t "~Tjoint[0] @ #x~X~%" (-> obj joint)) + obj + ) + +;; definition of type joint-exploder-list +(deftype joint-exploder-list (structure) + ((head int32 :offset-assert 0) + (pre-moved? symbol :offset-assert 4) + (bbox-valid? symbol :offset-assert 8) + (bbox bounding-box :inline :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x30 + :flag-assert #x900000030 + ) + +;; definition for method 3 of type joint-exploder-list +(defmethod inspect joint-exploder-list ((obj joint-exploder-list)) + (format #t "[~8x] ~A~%" obj 'joint-exploder-list) + (format #t "~Thead: ~D~%" (-> obj head)) + (format #t "~Tpre-moved?: ~A~%" (-> obj pre-moved?)) + (format #t "~Tbbox-valid?: ~A~%" (-> obj bbox-valid?)) + (format #t "~Tbbox: #~%" (-> obj bbox)) + obj + ) + +;; definition of type joint-exploder +(deftype joint-exploder (process-drawable) + ((parent-override (pointer process-drawable) :offset 12) + (die-if-below-y float :offset-assert 176) + (die-if-beyond-xz-dist-sqrd float :offset-assert 180) + (joints joint-exploder-joints :offset-assert 184) + (static-params joint-exploder-static-params :offset-assert 188) + (anim art-joint-anim :offset-assert 192) + (scale-vector vector :inline :offset-assert 208) + (tuning joint-exploder-tuning :inline :offset-assert 224) + (lists joint-exploder-list 5 :inline :offset-assert 288) + ) + :heap-base #x1a0 + :method-count-assert 29 + :size-assert #x210 + :flag-assert #x1d01a00210 + (:methods + (TODO-RENAME-20 (_type_ joint-exploder-list int) int 20) + (TODO-RENAME-21 (_type_ joint-exploder-list joint-exploder-joint) none 21) + (TODO-RENAME-22 (_type_ joint-exploder-list) symbol 22) + (TODO-RENAME-23 (_type_) symbol 23) + (TODO-RENAME-24 (_type_ joint-exploder-list int) int 24) + (TODO-RENAME-25 (_type_ joint-exploder-list) symbol 25) + (TODO-RENAME-26 (_type_ joint-exploder-list int) int 26) + (TODO-RENAME-27 (_type_ joint-exploder-list int) joint-exploder-list 27) + (TODO-RENAME-28 (_type_ joint-exploder-list) none 28) + ) + ) + +;; definition for method 3 of type joint-exploder +(defmethod inspect joint-exploder ((obj joint-exploder)) + (let ((t9-0 (method-of-type process-drawable inspect))) + (t9-0 obj) + ) + (format #t "~T~Tdie-if-below-y: ~f~%" (-> obj die-if-below-y)) + (format #t "~T~Tdie-if-beyond-xz-dist-sqrd: ~f~%" (-> obj die-if-beyond-xz-dist-sqrd)) + (format #t "~T~Tjoints: ~A~%" (-> obj joints)) + (format #t "~T~Tstatic-params: ~A~%" (-> obj static-params)) + (format #t "~T~Tanim: ~A~%" (-> obj anim)) + (format #t "~T~Tscale-vector: #~%" (-> obj scale-vector)) + (format #t "~T~Ttuning: #~%" (-> obj tuning)) + (format #t "~T~Tlists[5] @ #x~X~%" (-> obj lists)) + obj + ) + +;; definition for method 5 of type joint-exploder-joints +;; INFO: Return type mismatch uint vs int. +(defmethod asize-of joint-exploder-joints ((obj joint-exploder-joints)) + (the-as int (+ (-> obj type size) (* 176 (-> obj num-joints)))) + ) + +;; definition for method 0 of type joint-exploder-joints +(defmethod new joint-exploder-joints ((allocation symbol) (type-to-make type) (arg0 joint-exploder-static-params)) + (let* ((gp-0 (-> arg0 joints length)) + (v0-0 (object-new allocation type-to-make (the-as int (+ (-> type-to-make size) (* 176 gp-0))))) + ) + (set! (-> v0-0 num-joints) gp-0) + v0-0 + ) + ) + +;; definition for function joint-exploder-joint-callback +;; INFO: Return type mismatch int vs none. +(defun joint-exploder-joint-callback ((arg0 joint-exploder)) + (let ((gp-0 (-> arg0 node-list))) + (let ((s4-0 (-> arg0 joints))) + (countdown (s3-0 (-> s4-0 num-joints)) + (let* ((v1-3 (-> s4-0 joint s3-0)) + (a0-5 (-> gp-0 data (-> v1-3 joint-index) bone transform)) + ) + (matrix*! a0-5 (-> v1-3 rmat) (-> v1-3 mat)) + ) + ) + ) + (let ((s5-1 (-> arg0 scale-vector))) + (countdown (s4-1 (-> gp-0 length)) + (let ((a2-1 (-> gp-0 data s4-1 bone transform))) + (scale-matrix! a2-1 s5-1 a2-1) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 24 of type joint-exploder +;; Used lq/sq +(defmethod TODO-RENAME-24 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 int)) + (let ((v0-0 (TODO-RENAME-26 obj arg0 arg1))) + (let* ((v1-1 (-> obj joints)) + (v1-2 (-> v1-1 joint arg1)) + ) + (set! (-> v1-2 mat vector 0 quad) (the-as uint128 0)) + (set! (-> v1-2 mat vector 1 quad) (the-as uint128 0)) + (set! (-> v1-2 mat vector 2 quad) (the-as uint128 0)) + (set! (-> v1-2 mat vector 3 quad) (-> obj root trans quad)) + ) + v0-0 + ) + ) + +;; definition for method 26 of type joint-exploder +(defmethod TODO-RENAME-26 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 int)) + (let* ((v1-0 (-> obj joints)) + (a2-1 (-> v1-0 joint arg1)) + (a0-4 (-> a2-1 prev)) + (v0-0 (-> a2-1 next)) + ) + (cond + ((>= a0-4 0) + (set! (-> v1-0 joint a0-4 next) v0-0) + (if (>= v0-0 0) + (set! (-> (the-as joint-exploder-joint (-> v1-0 joint v0-0)) prev) a0-4) + ) + ) + (else + (set! (-> arg0 head) v0-0) + (cond + ((>= v0-0 0) + (let ((v1-2 (-> v1-0 joint v0-0))) + (set! (-> v1-2 prev) -1) + ) + ) + (else + (set! (-> arg0 bbox-valid?) #f) + ) + ) + ) + ) + v0-0 + ) + ) + +;; definition for method 20 of type joint-exploder +(defmethod TODO-RENAME-20 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 int)) + (let* ((v1-0 (-> obj joints)) + (a3-0 (-> v1-0 joint arg1)) + (a0-4 (-> arg0 head)) + ) + (set! (-> arg0 head) arg1) + (set! (-> a3-0 prev) -1) + (set! (-> a3-0 next) a0-4) + (when (>= a0-4 0) + (set! (-> (the-as joint-exploder-joint (-> v1-0 joint a0-4)) prev) arg1) + arg1 + ) + ) + ) + +;; definition for method 21 of type joint-exploder +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defmethod TODO-RENAME-21 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 joint-exploder-joint)) + (let ((a1-1 (-> arg1 mat vector 3))) + (cond + ((-> arg0 bbox-valid?) + (add-point! (-> arg0 bbox) (the-as vector3s a1-1)) + ) + (else + (set! (-> arg0 bbox-valid?) #t) + (set! (-> arg0 bbox min quad) (-> a1-1 quad)) + (set! (-> arg0 bbox max quad) (-> a1-1 quad)) + ) + ) + ) + (add-point! (-> arg0 bbox) (the-as vector3s (-> arg1 prev-pos))) + (none) + ) + +;; definition for method 27 of type joint-exploder +;; Used lq/sq +(defmethod TODO-RENAME-27 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list) (arg1 int)) + (local-vars (sv-16 int) (sv-32 int) (sv-48 int)) + (let ((s4-0 (the-as joint-exploder-list #f))) + (let ((v1-0 1)) + (until (= v1-0 5) + (let ((a0-4 (-> obj lists v1-0))) + (when (< (-> a0-4 head) 0) + (set! s4-0 a0-4) + (goto cfg-6) + ) + ) + (+! v1-0 1) + ) + ) + (label cfg-6) + (let ((s3-0 (the-as object s4-0))) + (cond + ((the-as joint-exploder-list s3-0) + (set! (-> (the-as joint-exploder-list s3-0) pre-moved?) #t) + (set! (-> (the-as joint-exploder-list s3-0) bbox-valid?) #f) + ) + (else + (set! s3-0 (-> obj lists)) + ) + ) + (set! (-> arg0 bbox-valid?) #f) + (let ((s2-0 (-> obj joints)) + (s1-0 (-> arg0 head)) + ) + (cond + ((zero? arg1) + (let ((f30-0 (* 0.5 (+ (-> arg0 bbox min x) (-> arg0 bbox max x))))) + (while (>= s1-0 0) + (let ((s0-0 (-> s2-0 joint s1-0))) + (cond + ((>= (-> s0-0 mat vector 3 x) f30-0) + (set! sv-16 (TODO-RENAME-26 obj arg0 s1-0)) + (TODO-RENAME-20 obj (the-as joint-exploder-list s3-0) s1-0) + (set! s1-0 sv-16) + (TODO-RENAME-21 obj (the-as joint-exploder-list s3-0) s0-0) + ) + (else + (TODO-RENAME-21 obj arg0 s0-0) + (set! s1-0 (-> s0-0 next)) + ) + ) + ) + ) + ) + ) + ((= arg1 1) + (let ((f30-1 (* 0.5 (+ (-> arg0 bbox min y) (-> arg0 bbox max y))))) + (while (>= s1-0 0) + (let ((s0-1 (-> s2-0 joint s1-0))) + (cond + ((>= (-> s0-1 mat vector 3 y) f30-1) + (set! sv-32 (TODO-RENAME-26 obj arg0 s1-0)) + (TODO-RENAME-20 obj (the-as joint-exploder-list s3-0) s1-0) + (set! s1-0 sv-32) + (TODO-RENAME-21 obj (the-as joint-exploder-list s3-0) s0-1) + ) + (else + (TODO-RENAME-21 obj arg0 s0-1) + (set! s1-0 (-> s0-1 next)) + ) + ) + ) + ) + ) + ) + ((= arg1 2) + (let ((f30-2 (* 0.5 (+ (-> arg0 bbox min z) (-> arg0 bbox max z))))) + (while (>= s1-0 0) + (let ((s0-2 (-> s2-0 joint s1-0))) + (cond + ((>= (-> s0-2 mat vector 3 z) f30-2) + (set! sv-48 (TODO-RENAME-26 obj arg0 s1-0)) + (TODO-RENAME-20 obj (the-as joint-exploder-list s3-0) s1-0) + (set! s1-0 sv-48) + (TODO-RENAME-21 obj (the-as joint-exploder-list s3-0) s0-2) + ) + (else + (TODO-RENAME-21 obj arg0 s0-2) + (set! s1-0 (-> s0-2 next)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + s4-0 + ) + ) + +;; definition for method 28 of type joint-exploder +(defmethod TODO-RENAME-28 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list)) + (when (and (-> arg0 bbox-valid?) (>= (-> arg0 head) 0)) + (cond + ((< 20480.0 (- (-> arg0 bbox max x) (-> arg0 bbox min x))) + (let ((a1-2 (TODO-RENAME-27 obj arg0 0))) + (if a1-2 + (TODO-RENAME-28 obj a1-2) + ) + ) + (TODO-RENAME-28 obj arg0) + ) + ((< 20480.0 (- (-> arg0 bbox max y) (-> arg0 bbox min y))) + (let ((a1-5 (TODO-RENAME-27 obj arg0 1))) + (if a1-5 + (TODO-RENAME-28 obj a1-5) + ) + ) + (TODO-RENAME-28 obj arg0) + ) + ((< 20480.0 (- (-> arg0 bbox max z) (-> arg0 bbox min z))) + (let ((a1-8 (TODO-RENAME-27 obj arg0 2))) + (if a1-8 + (TODO-RENAME-28 obj a1-8) + ) + ) + (TODO-RENAME-28 obj arg0) + ) + ) + ) + (none) + ) + +;; definition for method 25 of type joint-exploder +;; Used lq/sq +(defmethod TODO-RENAME-25 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list)) + (set! (-> arg0 bbox-valid?) #f) + (set! (-> arg0 pre-moved?) #t) + (let ((s4-0 (-> obj joints)) + (f30-0 (* (-> obj tuning gravity) (-> *display* seconds-per-frame))) + (s3-0 (-> arg0 head)) + ) + (while (>= s3-0 0) + (let* ((s2-0 (-> s4-0 joint s3-0)) + (s1-0 (-> s2-0 mat vector 3)) + ) + (set! (-> s2-0 prev-pos quad) (-> s1-0 quad)) + (+! (-> s2-0 transv y) f30-0) + (vector-v+! s1-0 s1-0 (-> s2-0 transv)) + (let ((f0-3 0.99) + (f2-1 (* (-> s2-0 rspeed) (-> *display* seconds-per-frame))) + (f5-0 (-> s2-0 rmat vector 0 x)) + (f4-0 (-> s2-0 rmat vector 0 y)) + (f3-0 (-> s2-0 rmat vector 1 x)) + (f1-2 (-> s2-0 rmat vector 1 y)) + ) + (set! (-> s2-0 rmat vector 0 x) (- (* f5-0 f0-3) (* f4-0 f2-1))) + (set! (-> s2-0 rmat vector 0 y) (+ (* f5-0 f2-1) (* f4-0 f0-3))) + (set! (-> s2-0 rmat vector 1 x) (- (* f3-0 f0-3) (* f1-2 f2-1))) + (set! (-> s2-0 rmat vector 1 y) (+ (* f3-0 f2-1) (* f1-2 f0-3))) + ) + (cond + ((or + (< (-> s1-0 y) (-> obj die-if-below-y)) + (< (-> obj die-if-beyond-xz-dist-sqrd) (vector-vector-xz-distance s1-0 (-> obj root trans))) + ) + (set! s3-0 (TODO-RENAME-24 obj arg0 s3-0)) + ) + (else + (TODO-RENAME-21 obj arg0 s2-0) + (set! s3-0 (-> s2-0 next)) + ) + ) + ) + ) + ) + #f + ) + +;; definition for method 22 of type joint-exploder +;; Used lq/sq +(defmethod TODO-RENAME-22 joint-exploder ((obj joint-exploder) (arg0 joint-exploder-list)) + (dummy-13 *collide-cache* (-> arg0 bbox) (the-as uint 1) obj (the-as uint 1)) + (let ((gp-1 (-> obj joints)) + (v1-2 (-> arg0 head)) + ) + (while (>= v1-2 0) + (let ((s5-1 (-> gp-1 joint v1-2))) + (let ((s4-0 (-> s5-1 mat vector 3)) + (a2-1 (new 'stack-no-clear 'vector)) + (s3-0 (new 'stack-no-clear 'collide-tri-result)) + ) + (vector-! a2-1 s4-0 (-> s5-1 prev-pos)) + (when (>= (dummy-18 *collide-cache* (-> s5-1 prev-pos) a2-1 40.96 1 s3-0 1) 0.0) + (set! (-> s4-0 quad) (-> s3-0 intersect quad)) + (let ((f28-0 (vector-xz-length (-> s5-1 transv)))) + (vector-reflect! (-> s5-1 transv) (-> s5-1 transv) (-> s3-0 normal)) + (let ((f30-0 (-> s5-1 transv y))) + (set! (-> s5-1 transv y) 0.0) + (vector-normalize! (-> s5-1 transv) (* 0.75 f28-0)) + (set! (-> s5-1 transv y) (* 0.7 f30-0)) + ) + ) + (+! (-> s4-0 y) (* 40.96 (-> s3-0 normal y))) + (set! (-> s4-0 w) 1.0) + (set! (-> s5-1 rspeed) (* 0.5 (-> s5-1 rspeed))) + ) + ) + (set! v1-2 (-> s5-1 next)) + ) + ) + ) + #f + ) + +;; failed to figure out what this is: +(defstate joint-exploder-shatter (joint-exploder) + :enter + (behavior () (set! (-> self state-time) (-> *display* base-frame-counter)) (none)) + :trans + (behavior () + (let* ((f1-0 (the float (- (-> *display* base-frame-counter) (-> self state-time)))) + (f0-2 (- 1.0 (/ f1-0 (the float (-> self tuning duration))))) + (f1-2 (- 1.0 (/ f1-0 (* 0.75 (the float (-> self tuning duration)))))) + ) + (if (< f1-2 0.0) + (set! f1-2 0.0) + ) + (set-vector! (-> self scale-vector) f0-2 f1-2 f0-2 1.0) + ) + (dotimes (v1-8 5) + (set! (-> self lists v1-8 pre-moved?) #f) + ) + (dotimes (gp-0 5) + (let ((s5-0 (-> self lists gp-0))) + (when (>= (-> s5-0 head) 0) + (when (not (-> s5-0 pre-moved?)) + (TODO-RENAME-25 self s5-0) + (if (nonzero? gp-0) + (TODO-RENAME-28 self s5-0) + ) + ) + ) + ) + ) + (let ((gp-1 (new 'stack-no-clear 'bounding-box))) + (let ((v1-26 (-> self root trans))) + (set! (-> gp-1 min quad) (-> v1-26 quad)) + (set! (-> gp-1 max quad) (-> v1-26 quad)) + ) + (dotimes (s5-1 5) + (let ((s4-0 (-> self lists s5-1))) + (if (-> s4-0 bbox-valid?) + (add-box! gp-1 (-> s4-0 bbox)) + ) + (if (nonzero? s5-1) + (TODO-RENAME-22 self s4-0) + ) + ) + ) + (let ((s5-2 (-> self draw bounds))) + (set-vector! + s5-2 + (* 0.5 (+ (-> gp-1 min x) (-> gp-1 max x))) + (* 0.5 (+ (-> gp-1 min y) (-> gp-1 max y))) + (* 0.5 (+ (-> gp-1 min z) (-> gp-1 max z))) + 1.0 + ) + (let ((f0-12 (+ 16384.0 (vector-vector-distance s5-2 (-> gp-1 max))))) + (vector-! s5-2 s5-2 (-> self root trans)) + (set! (-> s5-2 w) f0-12) + ) + ) + ) + 0 + (none) + ) + :code + (behavior () + (set! (-> self state-time) (-> *display* base-frame-counter)) + (until (>= (- (-> *display* base-frame-counter) (-> self state-time)) (the-as int (-> self tuning duration))) + (suspend) + (let ((a0-0 (-> self skel root-channel 0))) + (set! (-> a0-0 param 0) 1.0) + (joint-control-channel-group-eval! a0-0 (the-as art-joint-anim #f) num-func-loop!) + ) + ) + (none) + ) + :post + (the-as (function none :behavior joint-exploder) ja-post) + ) + +;; definition for method 23 of type joint-exploder +;; Used lq/sq +(defmethod TODO-RENAME-23 joint-exploder ((obj joint-exploder)) + (let ((gp-0 (-> obj joints))) + (dotimes (s4-0 (-> gp-0 num-joints)) + (let ((v1-2 (-> obj static-params joints s4-0)) + (s3-0 (-> gp-0 joint s4-0)) + ) + (let ((a0-6 (-> v1-2 parent-joint-index))) + (set! (-> s3-0 prev) (+ s4-0 -1)) + (set! (-> s3-0 next) (+ s4-0 1)) + (set! (-> s3-0 joint-index) (-> v1-2 joint-index)) + (set! (-> s3-0 rspeed) (-> obj tuning rot-speed)) + (cond + ((>= a0-6 0) + (if (zero? a0-6) + (set! a0-6 (-> v1-2 joint-index)) + ) + (let* ((a3-0 (-> obj parent-override 0 node-list data a0-6 bone transform)) + (a2-0 (-> s3-0 mat)) + (v1-9 (-> a3-0 vector 0 quad)) + (a0-8 (-> a3-0 vector 1 quad)) + (a1-4 (-> a3-0 vector 2 quad)) + (a3-1 (-> a3-0 vector 3 quad)) + ) + (set! (-> a2-0 vector 0 quad) v1-9) + (set! (-> a2-0 vector 1 quad) a0-8) + (set! (-> a2-0 vector 2 quad) a1-4) + (set! (-> a2-0 vector 3 quad) a3-1) + ) + (matrix-identity! (-> s3-0 rmat)) + ) + (else + (let* ((a3-2 (-> obj node-list data (-> v1-2 joint-index) bone transform)) + (a2-1 (-> s3-0 mat)) + (v1-15 (-> a3-2 vector 0 quad)) + (a0-11 (-> a3-2 vector 1 quad)) + (a1-5 (-> a3-2 vector 2 quad)) + (a3-3 (-> a3-2 vector 3 quad)) + ) + (set! (-> a2-1 vector 0 quad) v1-15) + (set! (-> a2-1 vector 1 quad) a0-11) + (set! (-> a2-1 vector 2 quad) a1-5) + (set! (-> a2-1 vector 3 quad) a3-3) + ) + (matrix-identity! (-> s3-0 rmat)) + ) + ) + ) + (case (-> obj tuning explosion) + ((1) + (vector-! (-> s3-0 transv) (-> s3-0 mat vector 3) (-> obj tuning fountain-rand-transv-lo)) + (vector-normalize! + (-> s3-0 transv) + (rand-vu-float-range (-> obj tuning fountain-rand-transv-hi x) (-> obj tuning fountain-rand-transv-hi y)) + ) + (+! + (-> s3-0 transv y) + (rand-vu-float-range (-> obj tuning fountain-rand-transv-hi z) (-> obj tuning fountain-rand-transv-hi w)) + ) + (set! (-> s3-0 transv w) 1.0) + ) + (else + (let ((s1-1 (-> obj tuning fountain-rand-transv-lo)) + (s2-1 (-> obj tuning fountain-rand-transv-hi)) + ) + (set-vector! + (-> s3-0 transv) + (rand-vu-float-range (-> s1-1 x) (-> s2-1 x)) + (rand-vu-float-range (-> s1-1 y) (-> s2-1 y)) + (rand-vu-float-range (-> s1-1 z) (-> s2-1 z)) + 1.0 + ) + ) + ) + ) + ) + ) + (when (nonzero? (-> gp-0 num-joints)) + (let ((v1-26 (-> gp-0 joint (+ (-> gp-0 num-joints) -1)))) + (set! (-> v1-26 next) -1) + ) + (let ((v1-27 (the-as joint-exploder-list (&-> obj stack 224)))) + (set! (-> v1-27 head) 0) + (let ((s5-1 (-> v1-27 bbox))) + (let ((v1-28 (the-as structure (-> gp-0 joint 0 mat vector 3)))) + (set! (-> s5-1 min quad) (-> (the-as matrix v1-28) vector 0 quad)) + (set! (-> s5-1 max quad) (-> (the-as matrix v1-28) vector 0 quad)) + ) + (dotimes (s4-1 (-> gp-0 num-joints)) + (add-point! s5-1 (the-as vector3s (+ (the-as uint (-> gp-0 joint 0 mat vector 3)) (* 176 s4-1)))) + ) + ) + ) + #f + ) + ) + ) + +;; definition for method 7 of type joint-exploder +;; INFO: Return type mismatch process-drawable vs joint-exploder. +(defmethod relocate joint-exploder ((obj joint-exploder) (arg0 int)) + (if (nonzero? (-> obj joints)) + (&+! (-> obj joints) arg0) + ) + (the-as joint-exploder ((method-of-type process-drawable relocate) obj arg0)) + ) + +;; definition for function joint-exploder-init-by-other +;; INFO: Return type mismatch object vs none. +;; Used lq/sq +(defbehavior joint-exploder-init-by-other joint-exploder ((arg0 skeleton-group) (arg1 int) (arg2 joint-exploder-static-params) (arg3 joint-exploder-static-params)) + (set! (-> self static-params) arg3) + (set! (-> self die-if-beyond-xz-dist-sqrd) 10485760000.0) + (mem-copy! (the-as pointer (-> self tuning)) (the-as pointer arg2) 64) + (set! (-> self joints) (new 'process 'joint-exploder-joints arg3)) + (dotimes (v1-1 5) + (let ((a0-6 (-> self lists v1-1))) + (set! (-> a0-6 head) -1) + (set! (-> a0-6 bbox-valid?) #f) + (set! (-> a0-6 pre-moved?) #f) + ) + ) + (set! (-> self mask) (logior (process-mask enemy) (-> self mask))) + (set! (-> self root) (new 'process 'trsqv)) + (set! (-> self root trans quad) (-> self parent-override 0 root trans quad)) + (quaternion-copy! (-> self root quat) (-> self parent-override 0 root quat)) + (set! (-> self root scale quad) (-> self parent-override 0 root scale quad)) + (initialize-skeleton self arg0 '()) + (logior! (-> self skel status) 1) + (set! (-> self anim) (the-as art-joint-anim (-> self draw art-group data arg1))) + (ja-channel-set! 1) + (let ((gp-1 (-> self skel root-channel 0))) + (joint-control-channel-group-eval! gp-1 (-> self anim) num-func-identity) + (set! (-> gp-1 frame-num) 0.0) + ) + (ja-post) + (TODO-RENAME-23 self) + (set! (-> self die-if-below-y) (+ -102400.0 (-> self root trans y))) + (set! (-> self skel postbind-function) joint-exploder-joint-callback) + (go joint-exploder-shatter) + (none) + ) + +;; definition for method 0 of type joint-exploder-tuning +;; INFO: Return type mismatch structure vs joint-exploder-tuning. +(defmethod new joint-exploder-tuning ((allocation symbol) (type-to-make type) (arg0 int)) + (let ((t9-0 (method-of-type structure new)) + (v1-1 type-to-make) + ) + (-> type-to-make size) + (let ((v0-0 (the-as joint-exploder-tuning (t9-0 allocation v1-1)))) + (set! (-> v0-0 explosion) (the-as uint arg0)) + (set! (-> v0-0 duration) (the-as uint 600)) + (set! (-> v0-0 gravity) -286720.0) + (set! (-> v0-0 rot-speed) 8.4) + (cond + ((zero? arg0) + (set-vector! (-> v0-0 fountain-rand-transv-lo) -81920.0 20480.0 -81920.0 1.0) + (set-vector! (-> v0-0 fountain-rand-transv-hi) 81920.0 61440.0 81920.0 1.0) + ) + ((= arg0 1) + (vector-reset! (-> v0-0 fountain-rand-transv-lo)) + (set! (-> v0-0 fountain-rand-transv-hi x) 49152.0) + (set! (-> v0-0 fountain-rand-transv-hi y) 163840.0) + (set! (-> v0-0 fountain-rand-transv-hi z) 20480.0) + (set! (-> v0-0 fountain-rand-transv-hi w) 61440.0) + ) + ) + v0-0 + ) + ) + ) diff --git a/test/decompiler/reference/levels/misty/balloonlurker_REF.gc b/test/decompiler/reference/levels/misty/balloonlurker_REF.gc new file mode 100644 index 0000000000..daa27af230 --- /dev/null +++ b/test/decompiler/reference/levels/misty/balloonlurker_REF.gc @@ -0,0 +1,1351 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(set! (-> *part-group-id-table* 203) (new 'static 'sparticle-launch-group + :length 1 + :duration #x5 + :linger-duration #x258 + :flags (sp-group-flag use-local-clock) + :name "group-balloonlurker-pilot-death" + :launcher + (new 'static 'inline-array sparticle-group-item 1 (sp-item 2015)) + :bounds (new 'static 'sphere :w 49152.0) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 2015) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 14 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 1.0)) + (sp-flt spt-scale-x (meters 16.0)) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 196.0) + (sp-flt spt-g 196.0) + (sp-flt spt-b 196.0) + (sp-flt spt-a 128.0) + (sp-flt spt-fade-a -3.2) + (sp-int spt-timer 25) + (sp-cpuinfo-flags bit2 bit3) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-group-id-table* 204) + (new 'static 'sparticle-launch-group + :length 21 + :duration #x258 + :linger-duration #x5dc + :flags (sp-group-flag use-local-clock) + :name "group-balloonlurker-mine-explosion" + :launcher + (new 'static 'inline-array sparticle-group-item 21 + (sp-item 964 :period 1200 :length 30) + (sp-item 965 :fade-after (meters 60.0) :period 1200 :length 15) + (sp-item 966 :period 1200 :length 15 :offset 15) + (sp-item 967 :period 1200 :length 15) + (sp-item 968 :fade-after (meters 80.0) :period 1200 :length 30 :binding 963) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + (sp-item 963 :flags (start-dead)) + ) + :bounds (new 'static 'sphere :w 65536.0) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 964) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 24 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 1.5) + (sp-rnd-flt spt-y (meters 0.5) (meters 0.5) 1.0) + (sp-rnd-flt spt-scale-x (meters 2.5) (meters 1.5) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 70.0) + (sp-flt spt-g 70.0) + (sp-rnd-flt spt-b 70.0 16.0 1.0) + (sp-flt spt-a 96.0) + (sp-rnd-flt spt-vel-y (meters 0.006666667) (meters 0.033333335) 1.0) + (sp-flt spt-scalevel-x (meters 0.006)) + (sp-rnd-flt spt-rotvel-z (degrees -0.2) (degrees 0.4) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-accel-y 0.2048) + (sp-flt spt-friction 0.92) + (sp-int spt-timer 900) + (sp-cpuinfo-flags bit2 bit12 bit14) + (sp-int-plain-rnd spt-next-time 30 299 1) + (sp-launcher-by-id spt-next-launcher 969) + (sp-rnd-flt spt-conerot-x (degrees 70.0) (degrees 20.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-radius (meters 2.0)) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 969) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 4 + (sp-flt spt-scalevel-x (meters 0.0)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -0.32) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 965) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 21 + (sp-tex spt-texture (new 'static 'texture-id :index #x2 :page #x2)) + (sp-flt spt-num 6.0) + (sp-flt spt-y (meters 0.75)) + (sp-rnd-flt spt-scale-x (meters 8.0) (meters 8.0) 1.0) + (sp-int spt-rot-x 4) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-scale-y (meters 1.2) (meters 3.0) 1.0) + (sp-flt spt-r 192.0) + (sp-flt spt-g 192.0) + (sp-rnd-flt spt-b 64.0 128.0 1.0) + (sp-flt spt-a 0.0) + (sp-flt spt-scalevel-x (meters 0.009765625)) + (sp-rnd-flt spt-rotvel-z (degrees -0.15) (degrees 0.3) 1.0) + (sp-flt spt-scalevel-y (meters 0.009765625)) + (sp-flt spt-fade-a 2.1333334) + (sp-int spt-timer 30) + (sp-cpuinfo-flags bit2 bit3 bit14) + (sp-int spt-next-time 15) + (sp-launcher-by-id spt-next-launcher 970) + (sp-flt spt-rotate-y (degrees 0.0)) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 970) + (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 2 (sp-flt spt-fade-a -1.3333334) (sp-end)) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 966) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 13 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 1.0)) + (sp-rnd-flt spt-scale-x (meters 24.0) (meters 16.0) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 196.0) + (sp-flt spt-g 196.0) + (sp-flt spt-b 196.0) + (sp-flt spt-a 64.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags bit2 bit3 bit14) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 967) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 13 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 1.0) + (sp-flt spt-y (meters 1.0)) + (sp-rnd-flt spt-scale-x (meters 24.0) (meters 16.0) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 196.0) + (sp-flt spt-g 32.0) + (sp-flt spt-b 32.0) + (sp-flt spt-a 64.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags bit2 bit3 bit14) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 968) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 24 + (sp-tex spt-texture (new 'static 'texture-id :index #xf :page #x2)) + (sp-rnd-flt spt-num 5.0 10.0 1.0) + (sp-rnd-flt spt-x (meters -0.5) (meters 1.0) 1.0) + (sp-rnd-flt spt-y (meters 0.25) (meters 1.5) 1.0) + (sp-rnd-flt spt-z -2048.0 4096.0 1.0) + (sp-flt spt-scale-x (meters 0.5)) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 255.0) + (sp-rnd-int spt-g 1123942400 1 127.0) + (sp-flt spt-b 0.0) + (sp-flt spt-a 127.0) + (sp-rnd-flt spt-vel-y (meters 0.06666667) (meters 0.06666667) 1.0) + (sp-flt spt-fade-g -4.266667) + (sp-flt spt-fade-b -2.8444445) + (sp-flt spt-accel-y -16.384) + (sp-flt spt-friction 0.97) + (sp-int spt-timer 90) + (sp-cpuinfo-flags bit2 bit3) + (sp-int-plain-rnd spt-next-time 5 38 1) + (sp-launcher-by-id spt-next-launcher 971) + (sp-rnd-flt spt-conerot-x (degrees 40.0) (degrees 30.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 971) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 7 + (sp-flt spt-scalevel-x (meters -0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -4.266667) + (sp-flt spt-fade-g 0.7111111) + (sp-flt spt-fade-b 1.4222223) + (sp-flt spt-fade-a -2.8444445) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 963) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 19 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 2.0) + (sp-rnd-flt spt-x (meters -0.25) (meters 0.5) 1.0) + (sp-rnd-flt spt-y (meters -0.25) (meters 0.5) 1.0) + (sp-rnd-flt spt-z -1024.0 2048.0 1.0) + (sp-rnd-flt spt-scale-x (meters 0.5) (meters 0.5) 1.0) + (sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0) + (sp-copy-from-other spt-scale-y -4) + (sp-flt spt-r 70.0) + (sp-flt spt-g 70.0) + (sp-rnd-flt spt-b 70.0 16.0 1.0) + (sp-rnd-flt spt-a 20.0 8.0 1.0) + (sp-flt spt-scalevel-x (meters 0.0033333334)) + (sp-rnd-flt spt-rotvel-z (degrees -0.3) (degrees 0.6) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -0.11666667) + (sp-int spt-timer 300) + (sp-cpuinfo-flags bit2 bit12) + (sp-end) + ) + ) + ) + +;; definition of type balloonlurker-bank +(deftype balloonlurker-bank (basic) + ((buoyancy-depth-offset meters :offset-assert 4) + (player-mass float :offset-assert 8) + (rudder-factor float :offset-assert 12) + (max-engine-thrust float :offset-assert 16) + (max-rudder-deflection-angle float :offset-assert 20) + (throttle-factor float :offset-assert 24) + (throttle-distance float :offset-assert 28) + (throttle-close-distance float :offset-assert 32) + (explosion-force float :offset-assert 36) + (mine-weight float :offset-assert 40) + ) + :method-count-assert 9 + :size-assert #x2c + :flag-assert #x90000002c + ) + +;; definition for method 3 of type balloonlurker-bank +(defmethod inspect balloonlurker-bank ((obj balloonlurker-bank)) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~Tbuoyancy-depth-offset: (meters ~m)~%" (-> obj buoyancy-depth-offset)) + (format #t "~Tplayer-mass: ~f~%" (-> obj player-mass)) + (format #t "~Trudder-factor: ~f~%" (-> obj rudder-factor)) + (format #t "~Tmax-engine-thrust: ~f~%" (-> obj max-engine-thrust)) + (format #t "~Tmax-rudder-deflection-angle: ~f~%" (-> obj max-rudder-deflection-angle)) + (format #t "~Tthrottle-factor: ~f~%" (-> obj throttle-factor)) + (format #t "~Tthrottle-distance: ~f~%" (-> obj throttle-distance)) + (format #t "~Tthrottle-close-distance: ~f~%" (-> obj throttle-close-distance)) + (format #t "~Texplosion-force: ~f~%" (-> obj explosion-force)) + (format #t "~Tmine-weight: ~f~%" (-> obj mine-weight)) + obj + ) + +;; definition for symbol *BALLOONLURKER-bank*, type balloonlurker-bank +(define *BALLOONLURKER-bank* (new 'static 'balloonlurker-bank + :buoyancy-depth-offset (meters 30.0) + :player-mass 20.0 + :rudder-factor 32.0 + :max-engine-thrust 409600.0 + :max-rudder-deflection-angle 8192.0 + :throttle-factor 0.5 + :throttle-distance 53248.0 + :throttle-close-distance 81920.0 + :explosion-force 24576000.0 + :mine-weight 53248.0 + ) + ) + +;; definition for symbol *balloonlurker-constants*, type rigid-body-platform-constants +(define *balloonlurker-constants* (new 'static 'rigid-body-platform-constants + :drag-factor 1.6 + :buoyancy-factor 1.2 + :max-buoyancy-depth (meters 15.0) + :gravity-factor 1.0 + :gravity (meters 60.0) + :player-weight (meters 6.6) + :player-bonk-factor 1.0 + :player-dive-factor 1.0 + :player-force-distance (meters 1000.0) + :player-force-clamp (meters 1000000.0) + :player-force-timeout #x1e + :explosion-force (meters 1000.0) + :linear-damping 1.0 + :angular-damping 1.0 + :control-point-count 7 + :mass 2.0 + :inertial-tensor-x (meters 12.0) + :inertial-tensor-y (meters 12.0) + :inertial-tensor-z (meters 20.0) + :cm-joint-y (meters 9.0) + :idle-distance (meters 50.0) + :platform #f + :sound-name #f + ) + ) + +;; definition of type balloonlurker +(deftype balloonlurker (rigid-body-platform) + ((explosion-force-position vector :inline :offset-assert 736) + (explosion-force vector :inline :offset-assert 752) + (explosion symbol :offset-assert 768) + (explosion-joint-index uint16 2 :offset-assert 772) + (explosion-joint-index-bytes int8 4 :offset 772) + (vulnerable symbol :offset-assert 776) + (water-y float :offset-assert 780) + (propeller joint-mod-set-local :offset-assert 784) + (rudder joint-mod-set-local :offset-assert 788) + (mine joint-mod-set-world 2 :offset-assert 792) + (buoyancy-factor float :offset-assert 800) + (rudder-control float :offset-assert 804) + (throttle-control float :offset-assert 808) + (engine-thrust float :offset-assert 812) + (dest-point vector :inline :offset-assert 816) + (dest-point-old vector :inline :offset-assert 832) + (dest-index int8 :offset-assert 848) + (auto-pilot symbol :offset-assert 852) + (dead symbol :offset-assert 856) + (anim-frame float :offset-assert 860) + (engine-sound-id sound-id :offset-assert 864) + (pedal-sound-id sound-id :offset-assert 868) + (frame-count int8 :offset-assert 872) + ) + :heap-base #x300 + :method-count-assert 35 + :size-assert #x369 + :flag-assert #x2303000369 + (:states + balloonlurker-die + (balloonlurker-mine-explode int) + balloonlurker-patrol + ) + ) + +;; definition for method 3 of type balloonlurker +(defmethod inspect balloonlurker ((obj balloonlurker)) + (let ((t9-0 (method-of-type rigid-body-platform inspect))) + (t9-0 obj) + ) + (format #t "~T~Texplosion-force-position: #~%" (-> obj explosion-force-position)) + (format #t "~T~Texplosion-force: #~%" (-> obj explosion-force)) + (format #t "~T~Texplosion: ~A~%" (-> obj explosion)) + (format #t "~T~Texplosion-joint-index[2] @ #x~X~%" (-> obj explosion-joint-index)) + (format #t "~T~Tvulnerable: ~A~%" (-> obj vulnerable)) + (format #t "~T~Twater-y: ~f~%" (-> obj water-y)) + (format #t "~T~Tpropeller: ~A~%" (-> obj propeller)) + (format #t "~T~Trudder: ~A~%" (-> obj rudder)) + (format #t "~T~Tmine[2] @ #x~X~%" (-> obj mine)) + (format #t "~T~Tbuoyancy-factor: ~f~%" (-> obj buoyancy-factor)) + (format #t "~T~Trudder-control: ~f~%" (-> obj rudder-control)) + (format #t "~T~Tthrottle-control: ~f~%" (-> obj throttle-control)) + (format #t "~T~Tengine-thrust: ~f~%" (-> obj engine-thrust)) + (format #t "~T~Tdest-point: #~%" (-> obj dest-point)) + (format #t "~T~Tdest-point-old: #~%" (-> obj dest-point-old)) + (format #t "~T~Tdest-index: ~D~%" (-> obj dest-index)) + (format #t "~T~Tauto-pilot: ~A~%" (-> obj auto-pilot)) + (format #t "~T~Tdead: ~A~%" (-> obj dead)) + (format #t "~T~Tanim-frame: ~f~%" (-> obj anim-frame)) + (format #t "~T~Tengine-sound-id: ~D~%" (-> obj engine-sound-id)) + (format #t "~T~Tpedal-sound-id: ~D~%" (-> obj pedal-sound-id)) + (format #t "~T~Tframe-count: ~D~%" (-> obj frame-count)) + obj + ) + +;; definition of type balloonlurker-pilot +(deftype balloonlurker-pilot (process-drawable) + ((parent-override (pointer balloonlurker) :offset 12) + (root-override collide-shape-moving :offset 112) + ) + :heap-base #x40 + :method-count-assert 22 + :size-assert #xb0 + :flag-assert #x16004000b0 + (:methods + (dummy-20 (_type_) none 20) + (dummy-21 (_type_) none 21) + ) + (:states + balloonlurker-pilot-die + balloonlurker-pilot-idle + ) + ) + +;; definition for method 3 of type balloonlurker-pilot +(defmethod inspect balloonlurker-pilot ((obj balloonlurker-pilot)) + (let ((t9-0 (method-of-type process-drawable inspect))) + (t9-0 obj) + ) + obj + ) + +;; failed to figure out what this is: +(defskelgroup *balloonlurker-sg* balloonlurker + 0 + 4 + ((1 (meters 20)) (2 (meters 40)) (3 (meters 999999))) + :bounds (static-spherem 0 12 0 17) + :longest-edge (meters 0) + ) + +;; failed to figure out what this is: +(defskelgroup *balloonlurker-pilot-sg* balloonlurker + 6 + 10 + ((7 (meters 20)) (8 (meters 40)) (9 (meters 999999))) + :bounds (static-spherem 0 0 0 4) + :longest-edge (meters 0) + ) + +;; definition for function balloonlurker-get-path-point +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defbehavior balloonlurker-get-path-point balloonlurker ((arg0 int)) + (if (<= (-> self path curve num-cverts) 0) + (go process-drawable-art-error "no path") + ) + (set! (-> self dest-index) arg0) + (set! (-> self dest-point-old quad) (-> self dest-point quad)) + (eval-path-curve-div! (-> self path) (-> self dest-point) (the float arg0) 'interp) + 0 + (none) + ) + +;; definition for function balloonlurker-get-next-path-point +;; INFO: Return type mismatch int vs none. +(defbehavior balloonlurker-get-next-path-point balloonlurker () + (if (<= (-> self path curve num-cverts) 0) + (go process-drawable-art-error "no path") + ) + (let ((a0-1 (+ (-> self dest-index) 1))) + (if (= a0-1 (-> self path curve num-cverts)) + (set! a0-1 0) + ) + (balloonlurker-get-path-point a0-1) + ) + 0 + (none) + ) + +;; definition for function balloonlurker-snap-to-path-point +;; Used lq/sq +(defbehavior balloonlurker-snap-to-path-point balloonlurker ((arg0 int)) + (let ((s4-0 (new 'stack-no-clear 'vector)) + (gp-0 (new 'stack-no-clear 'vector)) + ) + (eval-path-curve-div! (-> self path) s4-0 (the float arg0) 'interp) + (set! (-> self root-overlay trans quad) (-> s4-0 quad)) + (TODO-RENAME-12 (-> self path) gp-0 (the float arg0)) + (set! (-> gp-0 y) 0.0) + (vector-normalize! gp-0 1.0) + (forward-up-nopitch->quaternion (-> self root-overlay quat) gp-0 *up-vector*) + ) + ) + +;; definition for function balloonlurker-find-nearest-path-point +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defbehavior balloonlurker-find-nearest-path-point balloonlurker () + (let ((gp-0 0)) + (let ((f30-0 409600000.0) + (s5-0 (new 'stack-no-clear 'vector)) + ) + (dotimes (s4-0 (-> self path curve num-cverts)) + (eval-path-curve-div! (-> self path) s5-0 (the float s4-0) 'interp) + (let ((f0-2 (vector-vector-xz-distance (-> self root-overlay trans) s5-0))) + (when (< f0-2 f30-0) + (set! f30-0 f0-2) + (set! gp-0 s4-0) + ) + ) + ) + ) + (balloonlurker-get-path-point gp-0) + ) + (set! (-> self dest-point-old quad) (-> self dest-point quad)) + 0 + (none) + ) + +;; definition for function balloonlurker-player-impulse +;; Used lq/sq +(defbehavior balloonlurker-player-impulse balloonlurker () + (when *target* + (set! (-> self player-impulse) (the-as collide-shape-prim-mesh #t)) + (set! (-> self player-force-position quad) (-> *target* control trans quad)) + (vector-! (-> self player-force) (-> self player-velocity) (-> *target* control transv)) + (vector-float*! (-> self player-force) (-> self player-force) (-> *BALLOONLURKER-bank* player-mass)) + ) + ) + +;; definition for function balloonlurker-event-handler +;; Used lq/sq +(defbehavior balloonlurker-event-handler balloonlurker ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('touch 'attack) + (balloonlurker-player-impulse) + (when ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry (-> arg3 param 0)) + (-> self root-overlay) + (the-as uint 1) + ) + (dummy-45 (-> self root-overlay)) + (let ((a1-3 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-3 from) self) + (set! (-> a1-3 num-params) 2) + (set! (-> a1-3 message) 'shove) + (set! (-> a1-3 param 0) (-> arg3 param 0)) + (let ((v1-9 (new 'static 'attack-info :mask #xc0))) + (set! (-> v1-9 shove-back) 8192.0) + (set! (-> v1-9 shove-up) 2048.0) + (set! (-> a1-3 param 1) (the-as uint v1-9)) + ) + (send-event-function arg0 a1-3) + ) + ) + (dotimes (s4-0 2) + (let ((s3-0 (if (zero? s4-0) + 8 + 16 + ) + ) + ) + (when ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry (-> arg3 param 0)) + (-> self root-overlay) + (the-as uint s3-0) + ) + (let ((a0-10 (dummy-34 (-> self root-overlay) (the-as uint s3-0)))) + (when a0-10 + (set! (-> self explosion-force-position quad) (-> a0-10 prim-core world-sphere quad)) + (let ((a1-6 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-6 from) self) + (set! (-> a1-6 num-params) 2) + (set! (-> a1-6 message) 'attack) + (set! (-> a1-6 param 0) (-> arg3 param 0)) + (let ((a0-13 (new 'static 'attack-info :mask #x20))) + (set! (-> a0-13 mode) 'balloonlurker) + (set! (-> a1-6 param 1) (the-as uint a0-13)) + ) + (if (send-event-function arg0 a1-6) + (level-hint-spawn + (game-text-id misty-daxter-hit-lurkers-not-mines) + "sksp0063" + (the-as entity #f) + *entity-pool* + (game-task none) + ) + ) + ) + (go balloonlurker-mine-explode s4-0) + ) + ) + ) + ) + ) + #f + ) + (('die) + (go balloonlurker-die) + ) + ) + ) + +;; definition for method 23 of type balloonlurker +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defmethod TODO-RENAME-23 balloonlurker ((obj balloonlurker) (arg0 float)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (let ((s3-0 (new 'stack-no-clear 'vector)) + (s4-0 (-> obj rbody matrix)) + ) + (dotimes (s2-0 4) + (let ((s1-0 (-> obj control-point-array data s2-0))) + (vector-matrix*! (-> s1-0 world-pos) (-> s1-0 local-pos) s4-0) + (TODO-RENAME-17 (-> obj rbody) (-> s1-0 world-pos) (-> s1-0 velocity)) + (let* ((f30-0 (vector-vector-xz-distance (-> obj dest-point) (-> obj root-overlay trans))) + (f0-0 (vector-vector-xz-distance (-> obj dest-point-old) (-> obj root-overlay trans))) + (f0-6 + (/ (- (+ (/ (+ (* f30-0 (-> obj dest-point-old y)) (* f0-0 (-> obj dest-point y))) (fmax 409.6 (+ f30-0 f0-0))) + (-> *BALLOONLURKER-bank* buoyancy-depth-offset) + ) + (-> s1-0 world-pos y) + ) + (-> obj info max-buoyancy-depth) + ) + ) + ) + (vector-float*! + s5-0 + *y-vector* + (* 0.25 + (-> obj buoyancy-factor) + (-> obj info gravity-factor) + (fmax 0.3 (fmin 1.0 f0-6)) + (-> obj info gravity) + (-> obj rbody mass) + ) + ) + ) + (TODO-RENAME-13 (-> obj rbody) (-> s1-0 world-pos) s5-0) + (vector-float*! s5-0 (-> s1-0 velocity) (* -1.0 (-> obj info drag-factor))) + (TODO-RENAME-13 (-> obj rbody) (-> s1-0 world-pos) s5-0) + ) + 0 + ) + (let ((s2-1 (-> obj control-point-array data 4))) + (let ((f30-1 (* (-> *BALLOONLURKER-bank* max-rudder-deflection-angle) (-> obj rudder-control)))) + (vector-matrix*! (-> s2-1 world-pos) (-> s2-1 local-pos) s4-0) + (TODO-RENAME-17 (-> obj rbody) (-> s2-1 world-pos) (-> s2-1 velocity)) + (set-vector! s3-0 (cos f30-1) 0.0 (sin f30-1) 1.0) + ) + (vector-rotate*! s3-0 s3-0 s4-0) + (vector-float*! + s5-0 + s3-0 + (* -1.0 (-> *BALLOONLURKER-bank* rudder-factor) (vector-dot s3-0 (-> s2-1 velocity))) + ) + (TODO-RENAME-13 (-> obj rbody) (-> s2-1 world-pos) s5-0) + ) + 0 + (let ((s3-1 (-> obj control-point-array data 5))) + (vector-matrix*! (-> s3-1 world-pos) (-> s3-1 local-pos) s4-0) + (set! (-> s3-1 world-pos quad) (-> s3-1 world-pos quad)) + (vector-float*! s5-0 (-> s4-0 vector 2) (-> obj engine-thrust)) + (TODO-RENAME-13 (-> obj rbody) (-> s3-1 world-pos) s5-0) + ) + ) + (dotimes (s4-1 2) + (when (-> obj mine s4-1 enable) + (let ((v1-43 (-> obj control-point-array data (if (zero? s4-1) + 5 + 4 + ) + ) + ) + ) + (vector-float*! s5-0 *y-vector* (-> *BALLOONLURKER-bank* mine-weight)) + (TODO-RENAME-13 (-> obj rbody) (-> v1-43 world-pos) s5-0) + ) + ) + ) + (vector-float*! + s5-0 + *y-vector* + (* -1.0 (-> obj info gravity-factor) (-> obj info gravity) (-> obj rbody mass)) + ) + (TODO-RENAME-15 (-> obj rbody) s5-0) + ) + (when (or (-> obj player-impulse) (-> obj player-contact)) + (set! (-> obj player-impulse) #f) + (TODO-RENAME-13 (-> obj rbody) (-> obj player-force-position) (-> obj player-force)) + ) + (when (-> obj explosion) + (set! (-> obj explosion) #f) + (TODO-RENAME-13 (-> obj rbody) (-> obj explosion-force-position) (-> obj explosion-force)) + ) + 0 + (none) + ) + +;; definition for symbol *balloonlurker-rudder-joint-home*, type vector +(define *balloonlurker-rudder-joint-home* (new 'static 'vector :x 0.5 :y -0.5 :z -0.5 :w 0.5)) + +;; definition for function balloonlurker-play-sounds +;; INFO: Return type mismatch int vs none. +(defbehavior balloonlurker-play-sounds balloonlurker () + (cond + ((not (-> self dead)) + (if (zero? (-> self engine-sound-id)) + (set! (-> self engine-sound-id) (new-sound-id)) + ) + (if (zero? (-> self pedal-sound-id)) + (set! (-> self pedal-sound-id) (new-sound-id)) + ) + (when (< (vector-vector-distance (-> self root-overlay trans) (ear-trans)) 286720.0) + (let* ((f0-2 (/ (-> self engine-thrust) (-> *BALLOONLURKER-bank* max-engine-thrust))) + (f1-2 100.0) + (f0-3 (* 3.0 f0-2)) + ) + (sound-play-by-name + (static-sound-name "propeller") + (-> self engine-sound-id) + (the int (* 10.24 f1-2)) + (the int (* 1524.0 f0-3)) + 0 + 1 + (the-as symbol (-> self node-list data 4 bone transform vector 3)) + ) + ) + (sound-play-by-name + (static-sound-name "pedals") + (-> self pedal-sound-id) + 1024 + 0 + 0 + 1 + (the-as symbol (-> self root-overlay trans)) + ) + ) + ) + (else + (when (nonzero? (-> self engine-sound-id)) + (sound-stop (-> self engine-sound-id)) + (set! (-> self engine-sound-id) (new 'static 'sound-id)) + 0 + ) + (when (nonzero? (-> self pedal-sound-id)) + (sound-stop (-> self pedal-sound-id)) + (set! (-> self pedal-sound-id) (new 'static 'sound-id)) + 0 + ) + ) + ) + (none) + ) + +;; definition for function balloonlurker-post +;; Used lq/sq +(defbehavior balloonlurker-post balloonlurker () + (set! (-> self anim-frame) (ja-frame-num 0)) + (cond + ((and (-> self auto-pilot) (not (-> self dead))) + (let* ((s4-0 (-> self rbody matrix vector 2)) + (s5-0 (-> self rbody matrix)) + (gp-0 (-> self rbody position)) + (f30-0 (vector-vector-xz-distance (-> self dest-point) gp-0)) + ) + (when (< f30-0 (-> *BALLOONLURKER-bank* throttle-close-distance)) + (balloonlurker-get-next-path-point) + (set! f30-0 (vector-vector-xz-distance (-> self dest-point) gp-0)) + ) + (let ((f0-4 (- (vector-dot s4-0 (-> self dest-point)) (vector-dot s4-0 gp-0))) + (f2-2 (- (vector-dot (the-as vector s5-0) (-> self dest-point)) (vector-dot (the-as vector s5-0) gp-0))) + ) + (set! (-> self rudder-control) (seek + (-> self rudder-control) + (fmax -1.0 (fmin 1.0 (/ f2-2 (fmax 4096.0 f0-4)))) + (* 4.0 (-> *display* seconds-per-frame)) + ) + ) + ) + (let ((f0-12 0.0) + (f1-7 1.0) + (f2-4 (* (-> *BALLOONLURKER-bank* throttle-factor) (- f30-0 (-> *BALLOONLURKER-bank* throttle-distance)))) + (f3-3 (-> *BALLOONLURKER-bank* throttle-distance)) + ) + (set! (-> self throttle-control) (fmax f0-12 (fmin f1-7 (* f2-4 (/ 1.0 f3-3))))) + ) + ) + 0 + ) + (else + (let ((f0-14 (analog-input (the-as int (-> *cpad-list* cpads 1 leftx)) 128.0 48.0 110.0 -1.0))) + (set! (-> self rudder-control) (seek (-> self rudder-control) f0-14 (* 2.0 (-> *display* seconds-per-frame)))) + ) + (if (cpad-hold? 1 x) + (set! (-> self throttle-control) (seek (-> self throttle-control) 1.0 (-> *display* seconds-per-frame))) + (set! (-> self throttle-control) + (seek (-> self throttle-control) 0.0 (* 0.25 (-> *display* seconds-per-frame))) + ) + ) + ) + ) + (set! (-> self engine-thrust) (seek + (-> self engine-thrust) + (* (-> self throttle-control) (-> *BALLOONLURKER-bank* max-engine-thrust)) + (* 0.005 (-> *BALLOONLURKER-bank* max-engine-thrust)) + ) + ) + (let ((f0-31 60.0) + (f1-14 1820.4445) + (f2-6 6735.6445) + (f3-6 (-> *BALLOONLURKER-bank* max-engine-thrust)) + ) + (set! (-> self propeller transform quat y) (* f0-31 (+ f1-14 (* f2-6 (/ 1.0 f3-6) (-> self engine-thrust))))) + ) + (let ((f0-34 (* (-> *BALLOONLURKER-bank* max-rudder-deflection-angle) (-> self rudder-control))) + (gp-1 (new 'stack-no-clear 'quaternion)) + ) + (quaternion-vector-angle! gp-1 *x-vector* f0-34) + (quaternion*! (-> self rudder transform quat) (the-as quaternion *balloonlurker-rudder-joint-home*) gp-1) + ) + (TODO-RENAME-28 self) + (quaternion-copy! (-> self root-overlay quat) (-> self rbody rotation)) + (TODO-RENAME-18 (-> self rbody) (-> self root-overlay trans)) + (balloonlurker-play-sounds) + (when (nonzero? (-> self draw)) + (cond + ((or + (logtest? (-> self draw status) (draw-status drwf04)) + (logtest? (-> self draw status) (draw-status drwf03)) + ) + (logclear! (-> self draw status) (draw-status drwf05)) + (dummy-47 (-> self root-overlay)) + (ja-post) + ) + (else + (set! (-> self draw origin quad) (-> self root-overlay trans quad)) + (logior! (-> self draw status) (draw-status drwf05)) + ) + ) + ) + (none) + ) + +;; failed to figure out what this is: +(defstate balloonlurker-patrol (balloonlurker) + :event + balloonlurker-event-handler + :trans + (behavior () + (let ((a0-0 (-> self skel root-channel 0))) + (set! (-> a0-0 param 0) 1.0) + (joint-control-channel-group-eval! a0-0 (the-as art-joint-anim #f) num-func-loop!) + ) + (set! (-> self anim-frame) (ja-frame-num 0)) + (none) + ) + :code + (behavior () + (when (not (= (if (> (-> self skel active-channels) 0) + (-> self skel root-channel 0 frame-group) + ) + (-> self draw art-group data 4) + ) + ) + (ja-channel-push! 1 21) + (let ((v1-8 (-> self skel root-channel 0))) + (set! (-> v1-8 frame-group) (the-as art-joint-anim (-> self draw art-group data 4))) + ) + (let ((v1-11 (-> self skel root-channel 0))) + (set! (-> v1-11 num-func) num-func-identity) + (set! (-> v1-11 frame-num) 0.0) + ) + ) + (ja-post) + (anim-loop) + (none) + ) + :post + balloonlurker-post + ) + +;; failed to figure out what this is: +(defstate balloonlurker-mine-explode (balloonlurker) + :event + balloonlurker-event-handler + :code + (behavior ((arg0 int)) + (set! (-> self explosion-force-position quad) + (-> self node-list data (-> self explosion-joint-index-bytes arg0) bone transform vector 3 quad) + ) + (let ((s5-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when s5-0 + (let ((t9-1 (method-of-type part-tracker activate))) + (t9-1 (the-as part-tracker s5-0) *entity-pool* 'part-tracker (the-as pointer #x70004000)) + ) + (run-now-in-process + s5-0 + part-tracker-init + (-> *part-group-id-table* 204) + -1 + #f + #f + #f + (-> self explosion-force-position) + ) + (-> s5-0 ppointer) + ) + ) + (sound-play-by-name (static-sound-name "explosion") (new-sound-id) 1024 0 0 1 #t) + (set! (-> self explosion) #t) + (vector-! (-> self explosion-force) (-> self rbody position) (-> self explosion-force-position)) + (set! (-> self explosion-force y) (* 2.0 (-> self explosion-force y))) + (vector-length (-> self explosion-force)) + (vector-normalize! (-> self explosion-force) (-> *BALLOONLURKER-bank* explosion-force)) + (suspend) + (let ((a0-14 (-> self skel root-channel 0))) + (set! (-> a0-14 param 0) 1.0) + (joint-control-channel-group-eval! a0-14 (the-as art-joint-anim #f) num-func-loop!) + ) + (let ((v1-16 (-> self mine arg0))) + (set! (-> v1-16 enable) #t) + (set-vector! (-> v1-16 transform scale) 0.0 0.0 0.0 1.0) + ) + (if (-> self dead) + (go balloonlurker-die) + (go balloonlurker-patrol) + ) + (none) + ) + :post + balloonlurker-post + ) + +;; failed to figure out what this is: +(defstate balloonlurker-die (balloonlurker) + :event + (the-as (function process int symbol event-message-block object :behavior balloonlurker) #f) + :enter + (behavior () + (set! (-> self state-time) (-> *display* base-frame-counter)) + (set! (-> self vulnerable) #f) + (set! (-> self dead) #t) + (none) + ) + :code + (behavior () + (local-vars (v1-27 symbol) (sv-16 symbol) (sv-20 (pointer process-tree)) (sv-24 entity-actor)) + (process-entity-status! self (entity-perm-status bit-4) #t) + (process-entity-status! self (entity-perm-status dead) #t) + (when (or (-> self link prev) (-> self link next)) + (set! sv-16 (the-as symbol #f)) + (set! sv-20 (-> self child)) + (set! sv-24 (entity-actor-lookup (-> self entity) 'alt-actor 0)) + (entity-birth-no-kill sv-24) + (apply-all (-> self link) actor-link-dead-hook (& sv-16)) + (when (and sv-16 sv-24) + (process-grab? *target*) + (let ((gp-0 (-> *display* base-frame-counter))) + (until (>= (- (-> *display* base-frame-counter) gp-0) 300) + (suspend) + ) + ) + (process-release? *target*) + (while (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) 'task-complete) + (let ((t9-7 send-event-function) + (v1-17 sv-24) + ) + (not (t9-7 + (if v1-17 + (-> v1-17 extra process) + ) + a1-4 + ) + ) + ) + ) + (suspend) + ) + ) + ) + (set! (-> self buoyancy-factor) (* 4.0 (-> self buoyancy-factor))) + (until v1-27 + (suspend) + (let ((a0-8 (-> self skel root-channel 0))) + (set! (-> a0-8 param 0) 1.0) + (joint-control-channel-group-eval! a0-8 (the-as art-joint-anim #f) num-func-loop!) + ) + (set! v1-27 (or + (>= (- (-> *display* base-frame-counter) (-> self state-time)) 9000) + (< 819200.0 (- (-> self root-overlay trans y) (-> self water-y))) + ) + ) + ) + (dummy-18 self) + (while (-> self child) + (suspend) + ) + (none) + ) + :post + balloonlurker-post + ) + +;; definition for method 7 of type balloonlurker +;; INFO: Return type mismatch process-drawable vs balloonlurker. +(defmethod relocate balloonlurker ((obj balloonlurker) (arg0 int)) + (if (nonzero? (-> obj propeller)) + (&+! (-> obj propeller) arg0) + ) + (if (nonzero? (-> obj rudder)) + (&+! (-> obj rudder) arg0) + ) + (if (nonzero? (-> obj mine 0)) + (&+! (-> obj mine 0) arg0) + ) + (if (nonzero? (-> obj mine 1)) + (&+! (-> obj mine 1) arg0) + ) + (the-as + balloonlurker + ((the-as (function process-drawable int process-drawable) (find-parent-method balloonlurker 7)) obj arg0) + ) + ) + +;; failed to figure out what this is: +(defstate balloonlurker-pilot-idle (balloonlurker-pilot) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('attack) + (send-event (ppointer->process (-> self parent-override)) 'die) + (go balloonlurker-pilot-die) + ) + ) + ) + :code + (behavior () + (ja-channel-push! 1 30) + (let ((v1-2 (-> self skel root-channel 0))) + (set! (-> v1-2 frame-group) (the-as art-joint-anim (-> self draw art-group data 10))) + ) + (let ((v1-5 (-> self skel root-channel 0))) + (set! (-> v1-5 num-func) num-func-identity) + (set! (-> v1-5 frame-num) 0.0) + ) + (while #t + (suspend) + (let ((v1-9 (-> self skel root-channel 0))) + (set! (-> v1-9 num-func) num-func-identity) + (set! (-> v1-9 frame-num) (-> self parent-override 0 anim-frame)) + ) + ) + (none) + ) + :post + (behavior () + (set! (-> self root-override trans quad) (-> self parent-override 0 root-overlay trans quad)) + (quaternion-copy! (-> self root-override quat) (-> self parent-override 0 root-overlay quat)) + (dummy-47 (-> self root-override)) + (ja-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate balloonlurker-pilot-die (balloonlurker-pilot) + :event + (the-as + (function process int symbol event-message-block object :behavior balloonlurker-pilot) + process-drawable-death-event-handler + ) + :code + (behavior () + (let ((gp-0 (get-process *default-dead-pool* part-tracker #x4000))) + (when gp-0 + (let ((t9-1 (method-of-type part-tracker activate))) + (t9-1 (the-as part-tracker gp-0) *entity-pool* 'part-tracker (the-as pointer #x70004000)) + ) + (run-now-in-process + gp-0 + part-tracker-init + (-> *part-group-id-table* 203) + -1 + #f + #f + #f + (-> self root-override trans) + ) + (-> gp-0 ppointer) + ) + ) + (TODO-RENAME-17 + (-> self parent-override 0 rbody) + (-> self root-override trans) + (-> self root-override transv) + ) + (clear-collide-with-as (-> self root-override)) + (ja-channel-push! 1 30) + (let ((a0-6 (-> self skel root-channel 0))) + (set! (-> a0-6 frame-group) (the-as art-joint-anim (-> self draw art-group data 11))) + (set! (-> a0-6 param 0) + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 11)) data 0 length) -1)) + ) + (set! (-> a0-6 param 1) 1.0) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! a0-6 (the-as art-joint-anim (-> self draw art-group data 11)) num-func-seek!) + ) + (until (ja-done? 0) + (suspend) + (let ((a0-7 (-> self skel root-channel 0))) + (set! (-> a0-7 param 0) (the float (+ (-> a0-7 frame-group data 0 length) -1))) + (set! (-> a0-7 param 1) 1.0) + (joint-control-channel-group-eval! a0-7 (the-as art-joint-anim #f) num-func-seek!) + ) + ) + (dummy-18 self) + (none) + ) + :post + (behavior () + (vector-v++! (-> self root-override transv) (dummy-62 (-> self root-override) (new-stack-vector0) 0.0)) + (dummy-57 (-> self root-override) (-> self root-override transv)) + (ja-post) + (none) + ) + ) + +;; definition for method 20 of type balloonlurker-pilot +;; INFO: Return type mismatch int vs none. +(defmethod dummy-20 balloonlurker-pilot ((obj balloonlurker-pilot)) + (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) default-collision-reaction) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 2)))) + (set! (-> s4-0 prim-core collide-as) (the-as uint 256)) + (set! (-> s4-0 collide-with) (the-as uint 16)) + (set! (-> s4-0 prim-core offense) 1) + (set! (-> s4-0 transform-index) 6) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 10240.0) + (set-root-prim! s5-0 s4-0) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (backup-collide-with-as s5-0) + (set! (-> obj root-override) s5-0) + ) + 0 + (none) + ) + +;; definition for method 21 of type balloonlurker-pilot +;; INFO: Return type mismatch int vs none. +(defmethod dummy-21 balloonlurker-pilot ((obj balloonlurker-pilot)) + (initialize-skeleton obj *balloonlurker-pilot-sg* '()) + (set! (-> obj draw origin-joint-index) (the-as uint 6)) + 0 + (none) + ) + +;; definition for function balloonlurker-pilot-init-by-other +;; INFO: Return type mismatch object vs none. +;; Used lq/sq +(defbehavior balloonlurker-pilot-init-by-other balloonlurker-pilot ((arg0 balloonlurker)) + (set! (-> self mask) (logior (process-mask enemy) (-> self mask))) + (dummy-20 self) + (logclear! (-> self mask) (process-mask actor-pause)) + (set! (-> self fact) + (new 'process 'fact-info-enemy self (pickup-type eco-pill-random) (-> *FACT-bank* default-pill-inc)) + ) + (set! (-> self root-override trans quad) (-> arg0 root-overlay trans quad)) + (set! (-> self root-override quat vec quad) (-> arg0 root-overlay quat vec quad)) + (set! (-> self root-override scale quad) (-> arg0 root-overlay scale quad)) + (dummy-21 self) + (go balloonlurker-pilot-idle) + (none) + ) + +;; definition for method 30 of type balloonlurker +;; INFO: Return type mismatch int vs none. +(defmethod TODO-RENAME-30 balloonlurker ((obj balloonlurker)) + (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) default-collision-reaction) + (set! (-> s5-0 no-reaction) + (the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing) + ) + (let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 4) 0))) + (set! (-> s4-0 prim-core collide-as) (the-as uint 256)) + (set! (-> s4-0 collide-with) (the-as uint 16)) + (set! (-> s4-0 prim-core action) (the-as uint 1)) + (set-vector! (-> s4-0 local-sphere) 0.0 40960.0 0.0 61440.0) + (set-root-prim! s5-0 s4-0) + (let ((s3-0 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 1)))) + (set! (-> s3-0 prim-core collide-as) (the-as uint 256)) + (set! (-> s3-0 collide-with) (the-as uint 16)) + (set! (-> s3-0 prim-core action) (the-as uint 1)) + (set! (-> s3-0 prim-core offense) 4) + (set-vector! (-> s3-0 local-sphere) 0.0 57344.0 0.0 28672.0) + (append-prim s4-0 s3-0) + ) + (let ((s3-1 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 4)))) + (set! (-> s3-1 prim-core collide-as) (the-as uint 256)) + (set! (-> s3-1 collide-with) (the-as uint 16)) + (set! (-> s3-1 prim-core offense) 2) + (set! (-> s3-1 transform-index) 4) + (set-vector! (-> s3-1 local-sphere) 0.0 0.0 -8192.0 10240.0) + (append-prim s4-0 s3-1) + ) + (let ((s3-2 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 8)))) + (set! (-> s3-2 prim-core collide-as) (the-as uint 256)) + (set! (-> s3-2 collide-with) (the-as uint 16)) + (set! (-> s3-2 prim-core offense) 2) + (set! (-> s3-2 transform-index) 10) + (set-vector! (-> s3-2 local-sphere) 0.0 -8192.0 0.0 6144.0) + (append-prim s4-0 s3-2) + ) + (let ((s3-3 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 16)))) + (set! (-> s3-3 prim-core collide-as) (the-as uint 256)) + (set! (-> s3-3 collide-with) (the-as uint 16)) + (set! (-> s3-3 prim-core offense) 2) + (set! (-> s3-3 transform-index) 7) + (set-vector! (-> s3-3 local-sphere) 0.0 -8192.0 0.0 6144.0) + (append-prim s4-0 s3-3) + ) + ) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (backup-collide-with-as s5-0) + (set! (-> s5-0 max-iteration-count) (the-as uint 1)) + (set! (-> obj root-overlay) s5-0) + ) + 0 + (none) + ) + +;; definition for method 31 of type balloonlurker +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defmethod TODO-RENAME-31 balloonlurker ((obj balloonlurker)) + (logclear! (-> obj mask) (process-mask actor-pause)) + (initialize-skeleton obj *balloonlurker-sg* '()) + (set! (-> obj root-overlay pause-adjust-distance) 1228800.0) + (set! (-> obj fact) + (new 'process 'fact-info-enemy obj (pickup-type eco-pill-random) (-> *FACT-bank* default-pill-inc)) + ) + (set! (-> obj water-y) (-> obj root-overlay trans y)) + (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 link) (new 'process 'actor-link-info obj)) + (balloonlurker-find-nearest-path-point) + (balloonlurker-snap-to-path-point (-> obj dest-index)) + (TODO-RENAME-29 obj *balloonlurker-constants*) + (dotimes (s5-0 4) + (let ((s4-0 (-> obj control-point-array data s5-0))) + (let ((f30-0 (* 16384.0 (the float (logand s5-0 3))))) + (set! (-> s4-0 local-pos x) (* 24576.0 (cos f30-0))) + (set! (-> s4-0 local-pos y) 61440.0) + (set! (-> s4-0 local-pos z) (* 36864.0 (sin f30-0))) + ) + (set! (-> s4-0 local-pos w) 1.0) + ) + ) + (let ((v1-22 (-> obj control-point-array data 4))) + (set! (-> v1-22 local-pos x) 0.0) + (set! (-> v1-22 local-pos y) 61440.0) + (set! (-> v1-22 local-pos z) -40960.0) + (set! (-> v1-22 local-pos w) 1.0) + ) + (let ((v1-24 (-> obj control-point-array data 5))) + (set! (-> v1-24 local-pos x) 0.0) + (set! (-> v1-24 local-pos y) 61440.0) + (set! (-> v1-24 local-pos z) 40960.0) + (set! (-> v1-24 local-pos w) 1.0) + ) + (let ((v1-26 (-> obj control-point-array data 6))) + (set! (-> v1-26 local-pos x) 0.0) + (set! (-> v1-26 local-pos y) 0.0) + (set! (-> v1-26 local-pos z) 0.0) + (set! (-> v1-26 local-pos w) 1.0) + ) + (set! (-> obj buoyancy-factor) (-> obj info buoyancy-factor)) + (set! (-> obj player-impulse) #f) + (set! (-> obj player-contact) #f) + (set! (-> obj auto-pilot) #t) + (set! (-> obj vulnerable) #t) + (set! (-> obj dead) #f) + (set! (-> obj explosion) #f) + (set! (-> obj propeller) + (the-as + joint-mod-set-local + (new 'process 'joint-mod-spinner obj 4 (new 'static 'vector :z -1.0 :w 1.0) 8192.0) + ) + ) + (set! (-> obj rudder) (new 'process 'joint-mod-set-local obj 12 #f #t #f)) + (set! (-> obj mine 0) (new 'process 'joint-mod-set-world obj 8 #f)) + (set! (-> obj mine 1) (new 'process 'joint-mod-set-world obj 5 #f)) + (set! (-> obj stack 660) (the-as uint 10)) + (set! (-> obj stack 661) (the-as uint 7)) + (set! (-> obj engine-sound-id) (new 'static 'sound-id)) + (set! (-> obj pedal-sound-id) (new 'static 'sound-id)) + (set! (-> obj player-force quad) (-> *null-vector* quad)) + (set! (-> obj player-velocity quad) (-> *null-vector* quad)) + 0 + (none) + ) + +;; definition for method 11 of type balloonlurker +;; INFO: Return type mismatch object vs none. +;; WARN: Expression building failed: Function (method 11 balloonlurker) has a return type of none, but the expression builder found a return statement. +(defmethod init-from-entity! balloonlurker ((obj balloonlurker) (arg0 entity-actor)) + (set! (-> obj mask) (logior (process-mask enemy) (-> obj mask))) + (TODO-RENAME-30 obj) + (process-drawable-from-entity! obj arg0) + (TODO-RENAME-31 obj) + (cond + ((logtest? + (-> (entity-actor-lookup (-> obj entity) 'alt-actor 0) extra perm status) + (entity-perm-status complete) + ) + (process-entity-status! obj (entity-perm-status dead) #t) + (return #f) + ) + (else + (let ((s5-1 (get-process *default-dead-pool* balloonlurker-pilot #x4000))) + (when s5-1 + (let ((t9-6 (method-of-type balloonlurker-pilot activate))) + (t9-6 (the-as balloonlurker-pilot s5-1) obj 'balloonlurker-pilot (the-as pointer #x70004000)) + ) + (run-now-in-process s5-1 balloonlurker-pilot-init-by-other obj) + (-> s5-1 ppointer) + ) + ) + (go balloonlurker-patrol) + ) + ) + (none) + )