From f703d625a54d920ce4aff4ab891f655a3bdb6d32 Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Tue, 5 Oct 2021 23:21:19 -0400 Subject: [PATCH] decomp: finish `misty-conveyor` (#878) * decomp: finish `misty-conveyor` * address feedback --- decompiler/config/all-types.gc | 2 +- .../jak1_ntsc_black_label/type_casts.jsonc | 14 +- goal_src/levels/misty/misty-conveyor.gc | 1044 ++++++++++++++++ .../levels/misty/misty-conveyor_REF.gc | 1093 +++++++++++++++++ 4 files changed, 2147 insertions(+), 6 deletions(-) create mode 100644 test/decompiler/reference/levels/misty/misty-conveyor_REF.gc diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 4c64da9233..fd0a20e1de 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -31858,7 +31858,7 @@ (define-extern keg-conveyor-spawn-keg (function keg-conveyor (pointer process))) ;; VERY likely a keg (define-extern keg-conveyor-spawn-bouncing-keg (function keg-conveyor (pointer process))) ;; VERY likely a keg (define-extern keg-init-by-other (function keg int none :behavior keg)) -(define-extern keg-bounce-set-particle-rotation-callback (function sparticle-system sparticle-cpuinfo matrix)) +(define-extern keg-bounce-set-particle-rotation-callback (function part-tracker none)) (define-extern keg-update-smush (function keg float none)) (define-extern keg-event-handler (function process int symbol event-message-block object :behavior keg)) (define-extern keg-post (function int :behavior keg)) diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index e58d26f425..1ab280b347 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -3520,11 +3520,11 @@ ], "(code keg-on-path)": [ - [13, "v1", "process-drawable"], - [24, "v1", "process-drawable"], - [45, "v1", "process-drawable"], - [72, "v1", "process-drawable"], - [81, "v1", "process-drawable"] + [13, "v1", "keg-conveyor-paddle"], + [24, "v1", "keg-conveyor-paddle"], + [45, "v1", "keg-conveyor-paddle"], + [72, "v1", "keg-conveyor-paddle"], + [81, "v1", "keg-conveyor-paddle"] ], "(code keg-in-chute)": [ @@ -3907,5 +3907,9 @@ [182, "v0", "(pointer int32)"] ], + "keg-bounce-set-particle-rotation-callback": [ + [2, "v1", "(pointer process-drawable)"] + ], + "placeholder-do-not-add-below": [] } diff --git a/goal_src/levels/misty/misty-conveyor.gc b/goal_src/levels/misty/misty-conveyor.gc index 372d5a6f0d..39100e80ca 100644 --- a/goal_src/levels/misty/misty-conveyor.gc +++ b/goal_src/levels/misty/misty-conveyor.gc @@ -5,3 +5,1047 @@ ;; name in dgo: misty-conveyor ;; dgos: L1, MIS +(define-extern *keg-conveyor-sg* skeleton-group) +(define-extern *keg-conveyor-paddle-sg* skeleton-group) +(define-extern *keg-sg* skeleton-group) + +(declare-type keg-conveyor process-drawable) +(declare-type keg-conveyor-paddle process-drawable) +(declare-type keg process-drawable) + +(define-extern keg-conveyor-idle (state keg-conveyor)) ;; unknown type +(define-extern keg-conveyor-paddle-idle (state keg-conveyor-paddle)) ;; unknown type +(define-extern keg-on-paddle (state keg)) ;; unknown type +(define-extern keg-die (state keg)) ;; unknown type +(define-extern keg-in-chute (state keg)) ;; unknown type +(define-extern keg-on-path (state keg)) ;; unknown type +(define-extern keg-paddle-to-path (state keg)) ;; unknown type + +;; DECOMP BEGINS + +(set! + (-> *part-group-id-table* 197) + (new 'static 'sparticle-launch-group + :length 1 + :duration #xa + :linger-duration #x258 + :flags (sp-group-flag use-local-clock) + :name "group-keg-bounce" + :launcher + (new 'static 'inline-array sparticle-group-item 1 + (sp-item 2014 :fade-after (meters 100.0) :falloff-to (meters 100.0)) + ) + :bounds (new 'static 'sphere :w 49152.0) + ) + ) + +(set! + (-> *part-id-table* 2014) + (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 20 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 12.0) + (sp-rnd-flt spt-x (meters -3.0) (meters 6.0) 1.0) + (sp-rnd-flt spt-scale-x (meters 1.0) (meters 1.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-rnd-flt spt-r 128.0 32.0 1.0) + (sp-rnd-flt spt-g 96.0 32.0 1.0) + (sp-rnd-flt spt-b 64.0 32.0 1.0) + (sp-rnd-flt spt-a 16.0 16.0 1.0) + (sp-rnd-flt spt-vel-z (meters -0.013333334) (meters 0.026666667) 1.0) + (sp-flt spt-scalevel-x (meters 0.013333334)) + (sp-rnd-flt spt-rotvel-z (degrees -0.6) (degrees 1.2) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -0.10666667) + (sp-flt spt-accel-y -0.68266666) + (sp-int spt-timer 300) + (sp-cpuinfo-flags bit2 bit3) + (sp-flt spt-rotate-y (degrees 0.0)) + (sp-end) + ) + ) + ) + +(defun keg-bounce-set-particle-rotation-callback ((arg0 part-tracker)) + (let ((v1-0 (the-as object (-> arg0 userdata)))) + (set! + (-> *part-id-table* 2014 init-specs 18 initial-valuef) + (quaternion-y-angle + (-> (the-as (pointer process-drawable) v1-0) 0 root quat) + ) + ) + ) + 0 + (none) + ) + +(deftype keg-conveyor (process-drawable) + ((pivot joint-mod-spinner :offset-assert 176) + (quat quaternion :inline :offset-assert 192) + ) + :heap-base #x60 + :method-count-assert 20 + :size-assert #xd0 + :flag-assert #x14006000d0 + ) + + +(deftype keg-conveyor-paddle (process-drawable) + ((root-override collide-shape-moving :offset 112) + (object-on-paddle (pointer bouncing-float) :offset-assert 176) + (sync sync-info :inline :offset-assert 180) + ) + :heap-base #x50 + :method-count-assert 20 + :size-assert #xbc + :flag-assert #x14005000bc + ) + + +(deftype keg (process-drawable) + ((root-override collide-shape-moving :offset 112) + (sync-offset float :offset-assert 176) + (keg-behavior int8 :offset-assert 180) + (path-position vector :inline :offset-assert 192) + (shadow-enable-plane vector :inline :offset-assert 208) + (smush smush-control :inline :offset-assert 224) + (sound-id sound-id :offset-assert 256) + ) + :heap-base #xa0 + :method-count-assert 20 + :size-assert #x104 + :flag-assert #x1400a00104 + ) + + +(let + ((v1-6 + (new 'static 'skeleton-group + :art-group-name "keg-conveyor" + :bounds + (new 'static 'vector :y -24576.0 :w 32768.0) + :version #x6 + ) + ) + ) + (set! (-> v1-6 jgeo) 0) + (set! (-> v1-6 janim) 2) + (set! (-> v1-6 mgeo 0) (the-as uint 1)) + (set! (-> v1-6 lod-dist 0) 4095996000.0) + (set! *keg-conveyor-sg* v1-6) + ) + +(let + ((v1-7 + (new 'static 'skeleton-group + :art-group-name "keg-conveyor-paddle" + :bounds + (new 'static 'vector :y -24576.0 :w 32768.0) + :version #x6 + ) + ) + ) + (set! (-> v1-7 jgeo) 0) + (set! (-> v1-7 janim) 2) + (set! (-> v1-7 mgeo 0) (the-as uint 1)) + (set! (-> v1-7 lod-dist 0) 4095996000.0) + (set! *keg-conveyor-paddle-sg* v1-7) + ) + +(let + ((v1-8 + (new 'static 'skeleton-group + :art-group-name "keg" + :bounds (new 'static 'vector :w 16384.0) + :max-lod 2 + :version #x6 + :shadow 4 + ) + ) + ) + (set! (-> v1-8 jgeo) 0) + (set! (-> v1-8 janim) 5) + (set! (-> v1-8 mgeo 0) (the-as uint 1)) + (set! (-> v1-8 lod-dist 0) 81920.0) + (set! (-> v1-8 mgeo 1) (the-as uint 2)) + (set! (-> v1-8 lod-dist 1) 163840.0) + (set! (-> v1-8 mgeo 2) (the-as uint 3)) + (set! (-> v1-8 lod-dist 2) 4095996000.0) + (set! *keg-sg* v1-8) + ) + +(defun keg-update-smush ((arg0 keg) (arg1 float)) + (set! (-> arg0 root-override scale x) (+ 1.0 (* -1.0 arg1))) + (set! (-> arg0 root-override scale y) (+ 1.0 (* 2.0 arg1))) + (set! (-> arg0 root-override scale z) (+ 1.0 (* -1.0 arg1))) + 0 + (none) + ) + +(defbehavior + keg-event-handler keg + ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (let ((v1-0 arg2)) + (the-as object (when (or (= v1-0 'touch) (= v1-0 'attack)) + (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) 'attack) + (set! (-> a1-3 param 0) (-> arg3 param 0)) + (set! + (-> a1-3 param 1) + (the-as uint (new 'static 'attack-info)) + ) + (when (send-event-function arg0 a1-3) + (sound-play-by-name + (static-sound-name "icrate-break") + (new-sound-id) + 1024 + 0 + 0 + (the-as uint 1) + (the-as vector #t) + ) + (let + ((gp-1 + (get-process *default-dead-pool* part-tracker #x4000) + ) + ) + (when gp-1 + (let ((t9-4 (method-of-type part-tracker activate))) + (t9-4 + (the-as part-tracker gp-1) + *entity-pool* + 'part-tracker + (the-as pointer #x70004000) + ) + ) + (run-now-in-process + gp-1 + part-tracker-init + (-> *part-group-id-table* 71) + 20 + #f + #f + #f + (-> self root-override trans) + ) + (-> gp-1 ppointer) + ) + ) + (sound-stop (-> self sound-id)) + (deactivate self) + ) + ) + ) + ) + ) + ) + +(defbehavior keg-post keg () + (cond + ((= (-> self keg-behavior) 1) + ) + (else + (if + (< + (vector-vector-distance (-> self root-override trans) (ear-trans)) + 163840.0 + ) + (sound-play-by-name + (static-sound-name "barrel-roll") + (-> self sound-id) + 1024 + 0 + 0 + (the-as uint 1) + (-> self root-override trans) + ) + ) + ) + ) + (transform-post) + ) + +(defstate keg-on-paddle (keg) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (let ((v1-0 arg2)) + (the-as object (if (= v1-0 'detach) + (go keg-paddle-to-path) + ) + ) + ) + ) + :code + (behavior () + (set! + (-> (the-as keg (-> self parent 0)) sync-offset) + (the-as float (process->ppointer self)) + ) + (let ((v1-3 (-> self skel root-channel 0))) + (set! (-> v1-3 num-func) num-func-identity) + (set! (-> v1-3 frame-num) 0.0) + ) + (while #t + (let + ((gp-0 (-> (the-as process-drawable (-> self parent 0)) node-list data 4))) + (matrix->quaternion (-> self root-override quat) (-> gp-0 bone transform)) + (vector<-cspace! (-> self root-override trans) gp-0) + ) + (set! (-> self path-position quad) (-> self root-override trans quad)) + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior keg) keg-post) + ) + +(defstate keg-paddle-to-path (keg) + :event + keg-event-handler + :code + (behavior () + (let ((gp-0 (new-stack-vector0))) + (set! (-> gp-0 quad) (-> self root-override trans quad)) + (let + ((s5-0 + (eval-path-curve-div! + (-> (the-as process-drawable (-> self parent 0)) path) + (new-stack-vector0) + 0.0 + 'interp + ) + ) + (s4-0 + (quaternion-copy! (new-stack-quaternion0) (-> self root-override quat)) + ) + (s3-0 (new-stack-quaternion0)) + (a1-3 + (TODO-RENAME-12 + (-> (the-as process-drawable (-> self parent 0)) path) + (new-stack-vector0) + 0.0 + ) + ) + (f30-0 45.0) + ) + 0.0 + 0.0 + (forward-up-nopitch->quaternion + s3-0 + a1-3 + (new 'static 'vector :y 1.0 :w 1.0) + ) + (while #t + (if + (>= + (the + float + (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) + ) + f30-0 + ) + (go keg-on-path) + ) + (let + ((f28-0 + (/ + (the + float + (- + (-> *display* base-frame-counter) + (the-as int (-> self state-time)) + ) + ) + f30-0 + ) + ) + ) + (vector-lerp! (-> self root-override trans) gp-0 s5-0 f28-0) + (set! (-> self path-position quad) (-> self root-override trans quad)) + (quaternion-slerp! (-> self root-override quat) s4-0 s3-0 f28-0) + ) + (let ((a0-11 (-> self skel root-channel 0))) + (set! (-> a0-11 param 0) 1.0) + (joint-control-channel-group-eval! + a0-11 + (the-as art-joint-anim #f) + num-func-loop! + ) + ) + (suspend) + ) + ) + ) + (none) + ) + :post + (the-as (function none :behavior keg) keg-post) + ) + +(defstate keg-on-path (keg) + :event + keg-event-handler + :code + (behavior () + (local-vars + (sv-48 float) + (sv-64 float) + (sv-80 float) + (sv-96 float) + (sv-112 float) + ) + (let ((gp-0 (new-stack-vector0)) + (s5-0 (new 'stack 'vector3s)) + ) + 0.0 + (let ((f30-0 0.0)) + 0.0 + (let + ((f28-0 + (the + float + (+ + (-> + (the-as keg-conveyor-paddle (-> self parent 0)) + path + curve + num-cverts + ) + -1 + ) + ) + ) + ) + 0.0 + (let + ((f26-1 + (- + 1.0 + (get-current-phase + (-> (the-as keg-conveyor-paddle (-> self parent 0)) sync) + ) + ) + ) + (f24-0 102379.1) + ) + (/ 1.0 f24-0) + (let ((f22-0 1.0) + (f20-0 2.5) + ) + (set! sv-48 0.0) + (set! sv-64 0.0) + (set! sv-80 (- (-> *standard-dynamics* gravity-length))) + (while #t + (let + ((f0-13 + (+ + (get-current-phase + (-> (the-as keg-conveyor-paddle (-> self parent 0)) sync) + ) + f26-1 + ) + ) + ) + (set! sv-96 (- f0-13 (the float (the int f0-13)))) + ) + (if (< sv-96 f30-0) + (go keg-in-chute) + ) + (set! f30-0 sv-96) + (set! sv-112 (* sv-96 f28-0)) + (eval-path-curve-div! + (-> (the-as keg-conveyor-paddle (-> self parent 0)) path) + (-> self path-position) + sv-112 + 'interp + ) + (TODO-RENAME-12 + (-> (the-as keg-conveyor-paddle (-> self parent 0)) path) + gp-0 + sv-112 + ) + (seek-toward-heading-vec! (-> self root-override) gp-0 131072.0 30) + (set! (-> self root-override trans quad) (-> self path-position quad)) + (when (= (-> self keg-behavior) 1) + (cond + ((>= (vector4-dot (camera-pos) (-> self shadow-enable-plane)) 0.0) + (let ((v1-32 (-> self draw shadow-ctrl))) + (set! + (-> v1-32 settings flags) + (logand -33 (-> v1-32 settings flags)) + ) + ) + 0 + (let ((v1-35 (-> self draw shadow-ctrl))) + (set! + (-> v1-35 settings top-plane w) + (- (-> self path-position y)) + ) + ) + 0 + (let ((v1-38 (-> self draw shadow-ctrl))) + (set! + (-> v1-38 settings bot-plane w) + (- (+ -8192.0 (-> self path-position y))) + ) + ) + 0 + ) + (else + (let ((v1-41 (-> self draw shadow-ctrl))) + (logior! (-> v1-41 settings flags) 32) + ) + 0 + (let ((v1-44 (-> self draw shadow-ctrl))) + (set! + (-> v1-44 settings top-plane w) + (- (-> self path-position y)) + ) + ) + 0 + (let ((v1-47 (-> self draw shadow-ctrl))) + (set! + (-> v1-47 settings bot-plane w) + (- (+ -8192.0 (-> self path-position y))) + ) + ) + 0 + ) + ) + (let ((f0-32 (- f28-0 sv-112))) + (if (< f0-32 f20-0) + (set! f22-0 (/ f0-32 f20-0)) + ) + ) + (set! sv-64 (+ sv-64 (* sv-80 (-> *display* seconds-per-frame)))) + (set! sv-48 (+ sv-48 (* sv-64 (-> *display* seconds-per-frame)))) + (when (< sv-48 0.0) + (set! sv-48 0.0) + (activate! (-> self smush) -0.15 90 150 1.0 1.0) + (set! sv-64 f24-0) + (sound-play-by-name + (static-sound-name "barrel-bounce") + (new-sound-id) + 819 + 0 + 0 + (the-as uint 1) + (the-as vector #t) + ) + (let ((s4-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s4-1 + (let ((t9-12 (method-of-type part-tracker activate))) + (t9-12 + (the-as part-tracker s4-1) + self + 'part-tracker + (the-as pointer #x70004000) + ) + ) + (run-now-in-process + s4-1 + part-tracker-init + (-> *part-group-id-table* 197) + -1 + keg-bounce-set-particle-rotation-callback + (-> self ppointer) + #f + (-> self root-override trans) + ) + (-> s4-1 ppointer) + ) + ) + ) + (let ((f0-39 (update! (-> self smush)))) + (keg-update-smush self f0-39) + ) + (+! (-> self root-override trans y) (* f22-0 sv-48)) + (set! (-> s5-0 x) 0.0) + (set! (-> s5-0 y) 1.0) + (set! (-> s5-0 z) 0.0) + ) + (let ((a0-21 (-> self skel root-channel 0))) + (set! (-> a0-21 param 0) 1.0) + (joint-control-channel-group-eval! + a0-21 + (the-as art-joint-anim #f) + num-func-loop! + ) + ) + (suspend) + ) + ) + ) + ) + ) + ) + (none) + ) + :post + (the-as (function none :behavior keg) keg-post) + ) + +(defstate keg-in-chute (keg) + :event + keg-event-handler + :code + (behavior () + (let + ((gp-0 + (TODO-RENAME-12 + (-> (the-as process-drawable (-> self parent 0)) path) + (new-stack-vector0) + (the + float + (+ + (-> (the-as process-drawable (-> self parent 0)) path curve num-cverts) + -1 + ) + ) + ) + ) + (s5-0 (new-stack-vector0)) + (f30-0 61440.0) + (f28-0 0.0) + (f26-0 (- (-> *standard-dynamics* gravity-length))) + ) + (let ((v1-10 (-> self draw shadow-ctrl))) + (logior! (-> v1-10 settings flags) 32) + ) + 0 + (dummy-48 (-> self root-override)) + (vector-normalize! gp-0 1.0) + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (while #t + (if + (>= + (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) + 300 + ) + (go keg-die) + ) + (let ((v1-23 (-> self root-override trans))) + (vector-float*! s5-0 gp-0 (* f30-0 (-> *display* seconds-per-frame))) + (set! (-> s5-0 y) (* f28-0 (-> *display* seconds-per-frame))) + (+! f28-0 (* f26-0 (-> *display* seconds-per-frame))) + (vector+! v1-23 v1-23 s5-0) + ) + (let ((a0-11 (-> self skel root-channel 0))) + (set! (-> a0-11 param 0) 1.0) + (joint-control-channel-group-eval! + a0-11 + (the-as art-joint-anim #f) + num-func-loop! + ) + ) + (suspend) + ) + ) + (none) + ) + :post + (the-as (function none :behavior keg) keg-post) + ) + +(defstate keg-die (keg) + :event + (the-as + (function process int symbol event-message-block object :behavior keg) + #f + ) + :code + (behavior () + (sound-stop (-> self sound-id)) + (dummy-18 self) + (none) + ) + :post + (the-as (function none :behavior keg) transform-post) + ) + +(defbehavior keg-init-by-other keg ((arg0 keg) (arg1 int)) + (stack-size-set! (-> self main-thread) 512) + (let + ((s4-0 + (new 'process 'collide-shape-moving self (collide-list-enum hit-by-player)) + ) + ) + (set! (-> s4-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-0 reaction) default-collision-reaction) + (set! (-> s4-0 no-reaction) nothing) + (let + ((s3-0 + (new + 'process + 'collide-shape-prim-mesh + s4-0 + (the-as uint 0) + (the-as uint 0) + ) + ) + ) + (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 offense) 4) + (set! (-> s3-0 transform-index) 3) + (set-vector! (-> s3-0 local-sphere) 0.0 0.0 0.0 16384.0) + ) + (dummy-46 s4-0) + (set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w))) + (dummy-50 s4-0) + (set! (-> self root-override) s4-0) + ) + (set! (-> self root-override trans quad) (-> arg0 root-override trans quad)) + (dummy-14 self *keg-sg* '()) + (set! + (-> self draw shadow-ctrl) + (new 'process 'shadow-control 0.0 0.0 614400.0 (the-as float 60) 245760.0) + ) + (let ((v1-25 (-> self draw shadow-ctrl))) + (logior! (-> v1-25 settings flags) 32) + ) + 0 + (let + ((s5-1 (new 'static 'vector :x -514715.0 :y 226968.0 :z 3906894.8 :w 1.0))) + (let + ((v1-27 (new 'static 'vector :x 115430.4 :y 109848.9 :z 4391595.5 :w 1.0)) + (s3-1 (new 'stack-no-clear 'vector)) + (s4-1 (new 'stack-no-clear 'vector)) + ) + (vector-! s3-1 v1-27 s5-1) + (vector-normalize! s3-1 1.0) + (vector-cross! s4-1 s3-1 *y-vector*) + (vector-normalize! s4-1 1.0) + (vector-cross! (-> self shadow-enable-plane) s4-1 s3-1) + ) + (vector-normalize! (-> self shadow-enable-plane) 1.0) + (set! + (-> self shadow-enable-plane w) + (- (vector-dot (-> self shadow-enable-plane) s5-1)) + ) + ) + (set! (-> self keg-behavior) arg1) + (logclear! (-> self mask) (process-mask actor-pause enemy)) + (let ((gp-1 (new-stack-vector0))) + (TODO-RENAME-12 + (-> (the-as process-drawable (-> self parent 0)) path) + gp-1 + 0.0 + ) + (set-heading-vec! (-> self root-override) gp-1) + ) + (set! (-> self sound-id) (new-sound-id)) + (go keg-on-paddle) + (none) + ) + +(defun keg-conveyor-spawn-keg ((arg0 keg-conveyor)) + (let ((s5-0 (get-process *default-dead-pool* keg #x4000))) + (when s5-0 + (let ((t9-1 (method-of-type keg activate))) + (t9-1 (the-as keg s5-0) arg0 'keg (the-as pointer #x70004000)) + ) + (run-now-in-process s5-0 keg-init-by-other arg0 0) + (-> s5-0 ppointer) + ) + ) + ) + +(defun keg-conveyor-spawn-bouncing-keg ((arg0 keg-conveyor)) + (let ((s5-0 (get-process *default-dead-pool* keg #x4000))) + (when s5-0 + (let ((t9-1 (method-of-type keg activate))) + (t9-1 (the-as keg s5-0) arg0 'keg (the-as pointer #x70004000)) + ) + (run-now-in-process s5-0 keg-init-by-other arg0 1) + (-> s5-0 ppointer) + ) + ) + ) + +(define + *keg-conveyor-keg-spawn-table* + (the-as (array int8) + (new + 'static + 'boxed-array + :type int8 :length 6 :allocated-length 6 + 1 + 2 + 1 + 1 + 2 + 1 + ) + ) + ) + +(defstate keg-conveyor-idle (keg-conveyor) + :code + (behavior () + (let ((v1-2 (-> self skel root-channel 0))) + (set! (-> v1-2 num-func) num-func-identity) + (set! (-> v1-2 frame-num) 0.0) + ) + 0.0 + (while #t + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior keg-conveyor) ja-post) + ) + +(defstate keg-conveyor-paddle-idle (keg-conveyor-paddle) + :code + (behavior () + (let ((f30-0 57.0) + (gp-0 0) + (s5-0 (length *keg-conveyor-keg-spawn-table*)) + ) + (while #t + (let ((s4-0 #f)) + (when + (or + (not *target*) + (< + 102400.0 + (vector-vector-distance + (-> self root-override trans) + (-> *target* control trans) + ) + ) + ) + (let ((v1-10 (-> *keg-conveyor-keg-spawn-table* gp-0))) + (cond + ((zero? v1-10) + (nothing) + ) + ((= v1-10 1) + (keg-conveyor-spawn-keg (the-as keg-conveyor self)) + ) + ((= v1-10 2) + (keg-conveyor-spawn-bouncing-keg (the-as keg-conveyor self)) + ) + (else + (nothing) + ) + ) + ) + ) + (+! gp-0 1) + (if (>= gp-0 s5-0) + (set! gp-0 0) + ) + (let ((a0-6 (-> self skel root-channel 0))) + (set! (-> a0-6 frame-group) (if (> (-> self skel active-channels) 0) + (-> self skel root-channel 0 frame-group) + ) + ) + (set! + (-> a0-6 param 0) + (the float (+ (-> (if (> (-> self skel active-channels) 0) + (-> self skel root-channel 0 frame-group) + ) + data + 0 + length + ) + -1 + ) + ) + ) + (set! (-> a0-6 param 1) 1.0) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! + a0-6 + (if (> (-> self skel active-channels) 0) + (-> self skel root-channel 0 frame-group) + ) + num-func-seek! + ) + ) + (until (ja-done? 0) + (when (and (not s4-0) (>= (ja-aframe-num 0) f30-0)) + (set! s4-0 #t) + (when (-> self object-on-paddle) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) self) + (set! (-> a1-2 num-params) 0) + (set! (-> a1-2 message) 'detach) + (let ((t9-8 send-event-function) + (v1-42 (-> self object-on-paddle)) + ) + (t9-8 (the-as process (if v1-42 + (-> v1-42 0 max-value) + ) + ) + a1-2 + ) + ) + ) + ) + ) + (suspend) + (let ((a0-9 (-> self skel root-channel 0))) + (set! + (-> a0-9 param 0) + (the float (+ (-> a0-9 frame-group data 0 length) -1)) + ) + (set! (-> a0-9 param 1) 1.0) + (joint-control-channel-group-eval! + a0-9 + (the-as art-joint-anim #f) + num-func-seek! + ) + ) + ) + ) + ) + ) + (none) + ) + :post + (the-as (function none :behavior keg-conveyor-paddle) transform-post) + ) + +(defbehavior + keg-conveyor-paddle-init-by-other keg-conveyor-paddle + ((arg0 keg-conveyor-paddle)) + (let + ((s5-0 + (new 'process 'collide-shape-moving self (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) nothing) + (let + ((s4-0 + (new + 'process + 'collide-shape-prim-mesh + s5-0 + (the-as uint 0) + (the-as uint 0) + ) + ) + ) + (set! (-> s4-0 prim-core collide-as) (the-as uint 2048)) + (set! (-> s4-0 collide-with) (the-as uint 16)) + (set! (-> s4-0 prim-core action) (the-as uint 1)) + (set! (-> s4-0 prim-core offense) 4) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 16384.0) + ) + (dummy-46 s5-0) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (dummy-50 s5-0) + (set! (-> self root-override) s5-0) + ) + (set! (-> self path) (new 'process 'curve-control self 'path -1000000000.0)) + (logior! + (-> self path flags) + (path-control-flag display draw-line draw-point draw-text) + ) + (set! (-> self root-override trans quad) (-> arg0 root-override trans quad)) + (set! + (-> self root-override quat vec quad) + (-> arg0 root-override quat vec quad) + ) + (set! (-> self root-override scale quad) (-> arg0 root-override scale quad)) + (dummy-14 self *keg-conveyor-paddle-sg* '()) + (setup-params! (-> self sync) (the-as uint 4800) 0.0 0.15 0.15) + (logclear! (-> self mask) (process-mask actor-pause enemy)) + (set! (-> self object-on-paddle) (the-as (pointer bouncing-float) #f)) + (go keg-conveyor-paddle-idle) + (none) + ) + +(defmethod relocate keg-conveyor ((obj keg-conveyor) (arg0 int)) + (if (nonzero? (-> obj pivot)) + (&+! (-> obj pivot) arg0) + ) + (the-as + keg-conveyor + ((the-as + (function process-drawable int process-drawable) + (find-parent-method keg-conveyor 7) + ) + obj + arg0 + ) + ) + ) + +;; WARN: Expression building failed: Function (method 11 keg-conveyor) has a return type of none, but the expression builder found a return statement. +(defmethod copy-defaults! keg-conveyor ((obj keg-conveyor) (arg0 res-lump)) + (set! (-> obj mask) (logior (process-mask enemy death) (-> obj mask))) + (set! (-> obj root) (new 'process 'trsqv)) + (process-drawable-from-entity! obj arg0) + (dummy-14 obj *keg-conveyor-sg* '()) + (set! (-> obj path) (new 'process 'curve-control obj 'path -1000000000.0)) + (logior! + (-> obj path flags) + (path-control-flag display draw-line draw-point draw-text) + ) + (when (logtest? (-> obj path flags) (path-control-flag not-found)) + (go process-drawable-art-error "path") + (return #f) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (set! + (-> obj pivot) + (new + 'process + 'joint-mod-spinner + obj + 4 + (new 'static 'vector :x 1.0 :w 1.0) + 65536.0 + ) + ) + (let ((s5-1 (new-stack-vector0))) + (let ((s4-0 (new-stack-matrix0))) + (TODO-RENAME-12 (-> obj path) s5-1 0.0) + (set-heading-vec! (-> obj root) s5-1) + (quaternion->matrix s4-0 (-> obj root quat)) + (set-vector! s5-1 -4096.0 -3072.0 -1433.6 1.0) + (vector-rotate*! s5-1 s5-1 s4-0) + ) + (vector+! (-> obj root trans) (-> obj root trans) s5-1) + ) + (let ((s5-2 (get-process *default-dead-pool* keg-conveyor-paddle #x4000))) + (when s5-2 + (let ((t9-11 (method-of-type keg-conveyor-paddle activate))) + (t9-11 + (the-as keg-conveyor-paddle s5-2) + obj + 'keg-conveyor-paddle + (the-as pointer #x70004000) + ) + ) + (run-now-in-process s5-2 keg-conveyor-paddle-init-by-other obj) + (-> s5-2 ppointer) + ) + ) + (go keg-conveyor-idle) + (none) + ) + + + + diff --git a/test/decompiler/reference/levels/misty/misty-conveyor_REF.gc b/test/decompiler/reference/levels/misty/misty-conveyor_REF.gc new file mode 100644 index 0000000000..2518147c79 --- /dev/null +++ b/test/decompiler/reference/levels/misty/misty-conveyor_REF.gc @@ -0,0 +1,1093 @@ +;;-*-Lisp-*- +(in-package goal) + +;; failed to figure out what this is: +(set! + (-> *part-group-id-table* 197) + (new 'static 'sparticle-launch-group + :length 1 + :duration #xa + :linger-duration #x258 + :flags (sp-group-flag use-local-clock) + :name "group-keg-bounce" + :launcher + (new 'static 'inline-array sparticle-group-item 1 + (sp-item 2014 :fade-after (meters 100.0) :falloff-to (meters 100.0)) + ) + :bounds (new 'static 'sphere :w 49152.0) + ) + ) + +;; failed to figure out what this is: +(set! + (-> *part-id-table* 2014) + (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 20 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 12.0) + (sp-rnd-flt spt-x (meters -3.0) (meters 6.0) 1.0) + (sp-rnd-flt spt-scale-x (meters 1.0) (meters 1.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-rnd-flt spt-r 128.0 32.0 1.0) + (sp-rnd-flt spt-g 96.0 32.0 1.0) + (sp-rnd-flt spt-b 64.0 32.0 1.0) + (sp-rnd-flt spt-a 16.0 16.0 1.0) + (sp-rnd-flt spt-vel-z (meters -0.013333334) (meters 0.026666667) 1.0) + (sp-flt spt-scalevel-x (meters 0.013333334)) + (sp-rnd-flt spt-rotvel-z (degrees -0.6) (degrees 1.2) 1.0) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -0.10666667) + (sp-flt spt-accel-y -0.68266666) + (sp-int spt-timer 300) + (sp-cpuinfo-flags bit2 bit3) + (sp-flt spt-rotate-y (degrees 0.0)) + (sp-end) + ) + ) + ) + +;; definition for function keg-bounce-set-particle-rotation-callback +;; INFO: Return type mismatch int vs none. +(defun keg-bounce-set-particle-rotation-callback ((arg0 part-tracker)) + (let ((v1-0 (the-as object (-> arg0 userdata)))) + (set! + (-> *part-id-table* 2014 init-specs 18 initial-valuef) + (quaternion-y-angle + (-> (the-as (pointer process-drawable) v1-0) 0 root quat) + ) + ) + ) + 0 + (none) + ) + +;; definition of type keg-conveyor +(deftype keg-conveyor (process-drawable) + ((pivot joint-mod-spinner :offset-assert 176) + (quat quaternion :inline :offset-assert 192) + ) + :heap-base #x60 + :method-count-assert 20 + :size-assert #xd0 + :flag-assert #x14006000d0 + ) + +;; definition for method 3 of type keg-conveyor +(defmethod inspect keg-conveyor ((obj keg-conveyor)) + (let ((t9-0 (method-of-type process-drawable inspect))) + (t9-0 obj) + ) + (format #t "~T~Tpivot: ~A~%" (-> obj pivot)) + (format #t "~T~Tquat: #~%" (-> obj quat)) + obj + ) + +;; definition of type keg-conveyor-paddle +(deftype keg-conveyor-paddle (process-drawable) + ((root-override collide-shape-moving :offset 112) + (object-on-paddle (pointer bouncing-float) :offset-assert 176) + (sync sync-info :inline :offset-assert 180) + ) + :heap-base #x50 + :method-count-assert 20 + :size-assert #xbc + :flag-assert #x14005000bc + ) + +;; definition for method 3 of type keg-conveyor-paddle +(defmethod inspect keg-conveyor-paddle ((obj keg-conveyor-paddle)) + (let ((t9-0 (method-of-type process-drawable inspect))) + (t9-0 obj) + ) + (format #t "~T~Tobject-on-paddle: #x~X~%" (-> obj object-on-paddle)) + (format #t "~T~Tsync: #~%" (-> obj sync)) + obj + ) + +;; definition of type keg +(deftype keg (process-drawable) + ((root-override collide-shape-moving :offset 112) + (sync-offset float :offset-assert 176) + (keg-behavior int8 :offset-assert 180) + (path-position vector :inline :offset-assert 192) + (shadow-enable-plane vector :inline :offset-assert 208) + (smush smush-control :inline :offset-assert 224) + (sound-id sound-id :offset-assert 256) + ) + :heap-base #xa0 + :method-count-assert 20 + :size-assert #x104 + :flag-assert #x1400a00104 + ) + +;; definition for method 3 of type keg +(defmethod inspect keg ((obj keg)) + (let ((t9-0 (method-of-type process-drawable inspect))) + (t9-0 obj) + ) + (format #t "~T~Tsync-offset: ~f~%" (-> obj sync-offset)) + (format #t "~T~Tkeg-behavior: ~D~%" (-> obj keg-behavior)) + (format #t "~T~Tpath-position: #~%" (-> obj path-position)) + (format + #t + "~T~Tshadow-enable-plane: #~%" + (-> obj shadow-enable-plane) + ) + (format #t "~T~Tsmush: #~%" (-> obj smush)) + (format #t "~T~Tsound-id: ~D~%" (-> obj sound-id)) + obj + ) + +;; failed to figure out what this is: +(let + ((v1-6 + (new 'static 'skeleton-group + :art-group-name "keg-conveyor" + :bounds + (new 'static 'vector :y -24576.0 :w 32768.0) + :version #x6 + ) + ) + ) + (set! (-> v1-6 jgeo) 0) + (set! (-> v1-6 janim) 2) + (set! (-> v1-6 mgeo 0) (the-as uint 1)) + (set! (-> v1-6 lod-dist 0) 4095996000.0) + (set! *keg-conveyor-sg* v1-6) + ) + +;; failed to figure out what this is: +(let + ((v1-7 + (new 'static 'skeleton-group + :art-group-name "keg-conveyor-paddle" + :bounds + (new 'static 'vector :y -24576.0 :w 32768.0) + :version #x6 + ) + ) + ) + (set! (-> v1-7 jgeo) 0) + (set! (-> v1-7 janim) 2) + (set! (-> v1-7 mgeo 0) (the-as uint 1)) + (set! (-> v1-7 lod-dist 0) 4095996000.0) + (set! *keg-conveyor-paddle-sg* v1-7) + ) + +;; failed to figure out what this is: +(let + ((v1-8 + (new 'static 'skeleton-group + :art-group-name "keg" + :bounds (new 'static 'vector :w 16384.0) + :max-lod 2 + :version #x6 + :shadow 4 + ) + ) + ) + (set! (-> v1-8 jgeo) 0) + (set! (-> v1-8 janim) 5) + (set! (-> v1-8 mgeo 0) (the-as uint 1)) + (set! (-> v1-8 lod-dist 0) 81920.0) + (set! (-> v1-8 mgeo 1) (the-as uint 2)) + (set! (-> v1-8 lod-dist 1) 163840.0) + (set! (-> v1-8 mgeo 2) (the-as uint 3)) + (set! (-> v1-8 lod-dist 2) 4095996000.0) + (set! *keg-sg* v1-8) + ) + +;; definition for function keg-update-smush +;; INFO: Return type mismatch int vs none. +(defun keg-update-smush ((arg0 keg) (arg1 float)) + (set! (-> arg0 root-override scale x) (+ 1.0 (* -1.0 arg1))) + (set! (-> arg0 root-override scale y) (+ 1.0 (* 2.0 arg1))) + (set! (-> arg0 root-override scale z) (+ 1.0 (* -1.0 arg1))) + 0 + (none) + ) + +;; definition for function keg-event-handler +;; INFO: Return type mismatch none vs object. +(defbehavior + keg-event-handler keg + ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (let ((v1-0 arg2)) + (the-as object (when (or (= v1-0 'touch) (= v1-0 'attack)) + (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) 'attack) + (set! (-> a1-3 param 0) (-> arg3 param 0)) + (set! + (-> a1-3 param 1) + (the-as uint (new 'static 'attack-info)) + ) + (when (send-event-function arg0 a1-3) + (sound-play-by-name + (static-sound-name "icrate-break") + (new-sound-id) + 1024 + 0 + 0 + (the-as uint 1) + (the-as vector #t) + ) + (let + ((gp-1 + (get-process *default-dead-pool* part-tracker #x4000) + ) + ) + (when gp-1 + (let ((t9-4 (method-of-type part-tracker activate))) + (t9-4 + (the-as part-tracker gp-1) + *entity-pool* + 'part-tracker + (the-as pointer #x70004000) + ) + ) + (run-now-in-process + gp-1 + part-tracker-init + (-> *part-group-id-table* 71) + 20 + #f + #f + #f + (-> self root-override trans) + ) + (-> gp-1 ppointer) + ) + ) + (sound-stop (-> self sound-id)) + (deactivate self) + ) + ) + ) + ) + ) + ) + +;; definition for function keg-post +(defbehavior keg-post keg () + (cond + ((= (-> self keg-behavior) 1) + ) + (else + (if + (< + (vector-vector-distance (-> self root-override trans) (ear-trans)) + 163840.0 + ) + (sound-play-by-name + (static-sound-name "barrel-roll") + (-> self sound-id) + 1024 + 0 + 0 + (the-as uint 1) + (-> self root-override trans) + ) + ) + ) + ) + (transform-post) + ) + +;; failed to figure out what this is: +(defstate keg-on-paddle (keg) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (let ((v1-0 arg2)) + (the-as object (if (= v1-0 'detach) + (go keg-paddle-to-path) + ) + ) + ) + ) + :code + (behavior () + (set! + (-> (the-as keg (-> self parent 0)) sync-offset) + (the-as float (process->ppointer self)) + ) + (let ((v1-3 (-> self skel root-channel 0))) + (set! (-> v1-3 num-func) num-func-identity) + (set! (-> v1-3 frame-num) 0.0) + ) + (while #t + (let + ((gp-0 (-> (the-as process-drawable (-> self parent 0)) node-list data 4))) + (matrix->quaternion (-> self root-override quat) (-> gp-0 bone transform)) + (vector<-cspace! (-> self root-override trans) gp-0) + ) + (set! (-> self path-position quad) (-> self root-override trans quad)) + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior keg) keg-post) + ) + +;; failed to figure out what this is: +(defstate keg-paddle-to-path (keg) + :event + keg-event-handler + :code + (behavior () + (let ((gp-0 (new-stack-vector0))) + (set! (-> gp-0 quad) (-> self root-override trans quad)) + (let + ((s5-0 + (eval-path-curve-div! + (-> (the-as process-drawable (-> self parent 0)) path) + (new-stack-vector0) + 0.0 + 'interp + ) + ) + (s4-0 + (quaternion-copy! (new-stack-quaternion0) (-> self root-override quat)) + ) + (s3-0 (new-stack-quaternion0)) + (a1-3 + (TODO-RENAME-12 + (-> (the-as process-drawable (-> self parent 0)) path) + (new-stack-vector0) + 0.0 + ) + ) + (f30-0 45.0) + ) + 0.0 + 0.0 + (forward-up-nopitch->quaternion + s3-0 + a1-3 + (new 'static 'vector :y 1.0 :w 1.0) + ) + (while #t + (if + (>= + (the + float + (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) + ) + f30-0 + ) + (go keg-on-path) + ) + (let + ((f28-0 + (/ + (the + float + (- + (-> *display* base-frame-counter) + (the-as int (-> self state-time)) + ) + ) + f30-0 + ) + ) + ) + (vector-lerp! (-> self root-override trans) gp-0 s5-0 f28-0) + (set! (-> self path-position quad) (-> self root-override trans quad)) + (quaternion-slerp! (-> self root-override quat) s4-0 s3-0 f28-0) + ) + (let ((a0-11 (-> self skel root-channel 0))) + (set! (-> a0-11 param 0) 1.0) + (joint-control-channel-group-eval! + a0-11 + (the-as art-joint-anim #f) + num-func-loop! + ) + ) + (suspend) + ) + ) + ) + (none) + ) + :post + (the-as (function none :behavior keg) keg-post) + ) + +;; failed to figure out what this is: +(defstate keg-on-path (keg) + :event + keg-event-handler + :code + (behavior () + (local-vars + (sv-48 float) + (sv-64 float) + (sv-80 float) + (sv-96 float) + (sv-112 float) + ) + (let ((gp-0 (new-stack-vector0)) + (s5-0 (new 'stack 'vector3s)) + ) + 0.0 + (let ((f30-0 0.0)) + 0.0 + (let + ((f28-0 + (the + float + (+ + (-> + (the-as keg-conveyor-paddle (-> self parent 0)) + path + curve + num-cverts + ) + -1 + ) + ) + ) + ) + 0.0 + (let + ((f26-1 + (- + 1.0 + (get-current-phase + (-> (the-as keg-conveyor-paddle (-> self parent 0)) sync) + ) + ) + ) + (f24-0 102379.1) + ) + (/ 1.0 f24-0) + (let ((f22-0 1.0) + (f20-0 2.5) + ) + (set! sv-48 0.0) + (set! sv-64 0.0) + (set! sv-80 (- (-> *standard-dynamics* gravity-length))) + (while #t + (let + ((f0-13 + (+ + (get-current-phase + (-> (the-as keg-conveyor-paddle (-> self parent 0)) sync) + ) + f26-1 + ) + ) + ) + (set! sv-96 (- f0-13 (the float (the int f0-13)))) + ) + (if (< sv-96 f30-0) + (go keg-in-chute) + ) + (set! f30-0 sv-96) + (set! sv-112 (* sv-96 f28-0)) + (eval-path-curve-div! + (-> (the-as keg-conveyor-paddle (-> self parent 0)) path) + (-> self path-position) + sv-112 + 'interp + ) + (TODO-RENAME-12 + (-> (the-as keg-conveyor-paddle (-> self parent 0)) path) + gp-0 + sv-112 + ) + (seek-toward-heading-vec! (-> self root-override) gp-0 131072.0 30) + (set! (-> self root-override trans quad) (-> self path-position quad)) + (when (= (-> self keg-behavior) 1) + (cond + ((>= (vector4-dot (camera-pos) (-> self shadow-enable-plane)) 0.0) + (let ((v1-32 (-> self draw shadow-ctrl))) + (set! + (-> v1-32 settings flags) + (logand -33 (-> v1-32 settings flags)) + ) + ) + 0 + (let ((v1-35 (-> self draw shadow-ctrl))) + (set! + (-> v1-35 settings top-plane w) + (- (-> self path-position y)) + ) + ) + 0 + (let ((v1-38 (-> self draw shadow-ctrl))) + (set! + (-> v1-38 settings bot-plane w) + (- (+ -8192.0 (-> self path-position y))) + ) + ) + 0 + ) + (else + (let ((v1-41 (-> self draw shadow-ctrl))) + (logior! (-> v1-41 settings flags) 32) + ) + 0 + (let ((v1-44 (-> self draw shadow-ctrl))) + (set! + (-> v1-44 settings top-plane w) + (- (-> self path-position y)) + ) + ) + 0 + (let ((v1-47 (-> self draw shadow-ctrl))) + (set! + (-> v1-47 settings bot-plane w) + (- (+ -8192.0 (-> self path-position y))) + ) + ) + 0 + ) + ) + (let ((f0-32 (- f28-0 sv-112))) + (if (< f0-32 f20-0) + (set! f22-0 (/ f0-32 f20-0)) + ) + ) + (set! sv-64 (+ sv-64 (* sv-80 (-> *display* seconds-per-frame)))) + (set! sv-48 (+ sv-48 (* sv-64 (-> *display* seconds-per-frame)))) + (when (< sv-48 0.0) + (set! sv-48 0.0) + (activate! (-> self smush) -0.15 90 150 1.0 1.0) + (set! sv-64 f24-0) + (sound-play-by-name + (static-sound-name "barrel-bounce") + (new-sound-id) + 819 + 0 + 0 + (the-as uint 1) + (the-as vector #t) + ) + (let ((s4-1 (get-process *default-dead-pool* part-tracker #x4000))) + (when s4-1 + (let ((t9-12 (method-of-type part-tracker activate))) + (t9-12 + (the-as part-tracker s4-1) + self + 'part-tracker + (the-as pointer #x70004000) + ) + ) + (run-now-in-process + s4-1 + part-tracker-init + (-> *part-group-id-table* 197) + -1 + keg-bounce-set-particle-rotation-callback + (-> self ppointer) + #f + (-> self root-override trans) + ) + (-> s4-1 ppointer) + ) + ) + ) + (let ((f0-39 (update! (-> self smush)))) + (keg-update-smush self f0-39) + ) + (+! (-> self root-override trans y) (* f22-0 sv-48)) + (set! (-> s5-0 x) 0.0) + (set! (-> s5-0 y) 1.0) + (set! (-> s5-0 z) 0.0) + ) + (let ((a0-21 (-> self skel root-channel 0))) + (set! (-> a0-21 param 0) 1.0) + (joint-control-channel-group-eval! + a0-21 + (the-as art-joint-anim #f) + num-func-loop! + ) + ) + (suspend) + ) + ) + ) + ) + ) + ) + (none) + ) + :post + (the-as (function none :behavior keg) keg-post) + ) + +;; failed to figure out what this is: +(defstate keg-in-chute (keg) + :event + keg-event-handler + :code + (behavior () + (let + ((gp-0 + (TODO-RENAME-12 + (-> (the-as process-drawable (-> self parent 0)) path) + (new-stack-vector0) + (the + float + (+ + (-> (the-as process-drawable (-> self parent 0)) path curve num-cverts) + -1 + ) + ) + ) + ) + (s5-0 (new-stack-vector0)) + (f30-0 61440.0) + (f28-0 0.0) + (f26-0 (- (-> *standard-dynamics* gravity-length))) + ) + (let ((v1-10 (-> self draw shadow-ctrl))) + (logior! (-> v1-10 settings flags) 32) + ) + 0 + (dummy-48 (-> self root-override)) + (vector-normalize! gp-0 1.0) + (set! + (-> self state-time) + (the-as seconds (-> *display* base-frame-counter)) + ) + (while #t + (if + (>= + (- (-> *display* base-frame-counter) (the-as int (-> self state-time))) + 300 + ) + (go keg-die) + ) + (let ((v1-23 (-> self root-override trans))) + (vector-float*! s5-0 gp-0 (* f30-0 (-> *display* seconds-per-frame))) + (set! (-> s5-0 y) (* f28-0 (-> *display* seconds-per-frame))) + (+! f28-0 (* f26-0 (-> *display* seconds-per-frame))) + (vector+! v1-23 v1-23 s5-0) + ) + (let ((a0-11 (-> self skel root-channel 0))) + (set! (-> a0-11 param 0) 1.0) + (joint-control-channel-group-eval! + a0-11 + (the-as art-joint-anim #f) + num-func-loop! + ) + ) + (suspend) + ) + ) + (none) + ) + :post + (the-as (function none :behavior keg) keg-post) + ) + +;; failed to figure out what this is: +(defstate keg-die (keg) + :event + (the-as + (function process int symbol event-message-block object :behavior keg) + #f + ) + :code + (behavior () + (sound-stop (-> self sound-id)) + (dummy-18 self) + (none) + ) + :post + (the-as (function none :behavior keg) transform-post) + ) + +;; definition for function keg-init-by-other +;; Used lq/sq +(defbehavior keg-init-by-other keg ((arg0 keg) (arg1 int)) + (stack-size-set! (-> self main-thread) 512) + (let + ((s4-0 + (new 'process 'collide-shape-moving self (collide-list-enum hit-by-player)) + ) + ) + (set! (-> s4-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-0 reaction) default-collision-reaction) + (set! (-> s4-0 no-reaction) nothing) + (let + ((s3-0 + (new + 'process + 'collide-shape-prim-mesh + s4-0 + (the-as uint 0) + (the-as uint 0) + ) + ) + ) + (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 offense) 4) + (set! (-> s3-0 transform-index) 3) + (set-vector! (-> s3-0 local-sphere) 0.0 0.0 0.0 16384.0) + ) + (dummy-46 s4-0) + (set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w))) + (dummy-50 s4-0) + (set! (-> self root-override) s4-0) + ) + (set! (-> self root-override trans quad) (-> arg0 root-override trans quad)) + (dummy-14 self *keg-sg* '()) + (set! + (-> self draw shadow-ctrl) + (new 'process 'shadow-control 0.0 0.0 614400.0 (the-as float 60) 245760.0) + ) + (let ((v1-25 (-> self draw shadow-ctrl))) + (logior! (-> v1-25 settings flags) 32) + ) + 0 + (let + ((s5-1 (new 'static 'vector :x -514715.0 :y 226968.0 :z 3906894.8 :w 1.0))) + (let + ((v1-27 (new 'static 'vector :x 115430.4 :y 109848.9 :z 4391595.5 :w 1.0)) + (s3-1 (new 'stack-no-clear 'vector)) + (s4-1 (new 'stack-no-clear 'vector)) + ) + (vector-! s3-1 v1-27 s5-1) + (vector-normalize! s3-1 1.0) + (vector-cross! s4-1 s3-1 *y-vector*) + (vector-normalize! s4-1 1.0) + (vector-cross! (-> self shadow-enable-plane) s4-1 s3-1) + ) + (vector-normalize! (-> self shadow-enable-plane) 1.0) + (set! + (-> self shadow-enable-plane w) + (- (vector-dot (-> self shadow-enable-plane) s5-1)) + ) + ) + (set! (-> self keg-behavior) arg1) + (logclear! (-> self mask) (process-mask actor-pause enemy)) + (let ((gp-1 (new-stack-vector0))) + (TODO-RENAME-12 + (-> (the-as process-drawable (-> self parent 0)) path) + gp-1 + 0.0 + ) + (set-heading-vec! (-> self root-override) gp-1) + ) + (set! (-> self sound-id) (new-sound-id)) + (go keg-on-paddle) + (none) + ) + +;; definition for function keg-conveyor-spawn-keg +(defun keg-conveyor-spawn-keg ((arg0 keg-conveyor)) + (let ((s5-0 (get-process *default-dead-pool* keg #x4000))) + (when s5-0 + (let ((t9-1 (method-of-type keg activate))) + (t9-1 (the-as keg s5-0) arg0 'keg (the-as pointer #x70004000)) + ) + (run-now-in-process s5-0 keg-init-by-other arg0 0) + (-> s5-0 ppointer) + ) + ) + ) + +;; definition for function keg-conveyor-spawn-bouncing-keg +(defun keg-conveyor-spawn-bouncing-keg ((arg0 keg-conveyor)) + (let ((s5-0 (get-process *default-dead-pool* keg #x4000))) + (when s5-0 + (let ((t9-1 (method-of-type keg activate))) + (t9-1 (the-as keg s5-0) arg0 'keg (the-as pointer #x70004000)) + ) + (run-now-in-process s5-0 keg-init-by-other arg0 1) + (-> s5-0 ppointer) + ) + ) + ) + +;; definition for symbol *keg-conveyor-keg-spawn-table*, type (array int8) +(define + *keg-conveyor-keg-spawn-table* + (the-as (array int8) + (new + 'static + 'boxed-array + :type int8 :length 6 :allocated-length 6 + 1 + 2 + 1 + 1 + 2 + 1 + ) + ) + ) + +;; failed to figure out what this is: +(defstate keg-conveyor-idle (keg-conveyor) + :code + (behavior () + (let ((v1-2 (-> self skel root-channel 0))) + (set! (-> v1-2 num-func) num-func-identity) + (set! (-> v1-2 frame-num) 0.0) + ) + 0.0 + (while #t + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior keg-conveyor) ja-post) + ) + +;; failed to figure out what this is: +(defstate keg-conveyor-paddle-idle (keg-conveyor-paddle) + :code + (behavior () + (let ((f30-0 57.0) + (gp-0 0) + (s5-0 (length *keg-conveyor-keg-spawn-table*)) + ) + (while #t + (let ((s4-0 #f)) + (when + (or + (not *target*) + (< + 102400.0 + (vector-vector-distance + (-> self root-override trans) + (-> *target* control trans) + ) + ) + ) + (let ((v1-10 (-> *keg-conveyor-keg-spawn-table* gp-0))) + (cond + ((zero? v1-10) + (nothing) + ) + ((= v1-10 1) + (keg-conveyor-spawn-keg (the-as keg-conveyor self)) + ) + ((= v1-10 2) + (keg-conveyor-spawn-bouncing-keg (the-as keg-conveyor self)) + ) + (else + (nothing) + ) + ) + ) + ) + (+! gp-0 1) + (if (>= gp-0 s5-0) + (set! gp-0 0) + ) + (let ((a0-6 (-> self skel root-channel 0))) + (set! (-> a0-6 frame-group) (if (> (-> self skel active-channels) 0) + (-> self skel root-channel 0 frame-group) + ) + ) + (set! + (-> a0-6 param 0) + (the float (+ (-> (if (> (-> self skel active-channels) 0) + (-> self skel root-channel 0 frame-group) + ) + data + 0 + length + ) + -1 + ) + ) + ) + (set! (-> a0-6 param 1) 1.0) + (set! (-> a0-6 frame-num) 0.0) + (joint-control-channel-group! + a0-6 + (if (> (-> self skel active-channels) 0) + (-> self skel root-channel 0 frame-group) + ) + num-func-seek! + ) + ) + (until (ja-done? 0) + (when (and (not s4-0) (>= (ja-aframe-num 0) f30-0)) + (set! s4-0 #t) + (when (-> self object-on-paddle) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) self) + (set! (-> a1-2 num-params) 0) + (set! (-> a1-2 message) 'detach) + (let ((t9-8 send-event-function) + (v1-42 (-> self object-on-paddle)) + ) + (t9-8 (the-as process (if v1-42 + (-> v1-42 0 max-value) + ) + ) + a1-2 + ) + ) + ) + ) + ) + (suspend) + (let ((a0-9 (-> self skel root-channel 0))) + (set! + (-> a0-9 param 0) + (the float (+ (-> a0-9 frame-group data 0 length) -1)) + ) + (set! (-> a0-9 param 1) 1.0) + (joint-control-channel-group-eval! + a0-9 + (the-as art-joint-anim #f) + num-func-seek! + ) + ) + ) + ) + ) + ) + (none) + ) + :post + (the-as (function none :behavior keg-conveyor-paddle) transform-post) + ) + +;; definition for function keg-conveyor-paddle-init-by-other +;; Used lq/sq +(defbehavior + keg-conveyor-paddle-init-by-other keg-conveyor-paddle + ((arg0 keg-conveyor-paddle)) + (let + ((s5-0 + (new 'process 'collide-shape-moving self (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) nothing) + (let + ((s4-0 + (new + 'process + 'collide-shape-prim-mesh + s5-0 + (the-as uint 0) + (the-as uint 0) + ) + ) + ) + (set! (-> s4-0 prim-core collide-as) (the-as uint 2048)) + (set! (-> s4-0 collide-with) (the-as uint 16)) + (set! (-> s4-0 prim-core action) (the-as uint 1)) + (set! (-> s4-0 prim-core offense) 4) + (set! (-> s4-0 transform-index) 3) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 16384.0) + ) + (dummy-46 s5-0) + (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) + (dummy-50 s5-0) + (set! (-> self root-override) s5-0) + ) + (set! (-> self path) (new 'process 'curve-control self 'path -1000000000.0)) + (logior! + (-> self path flags) + (path-control-flag display draw-line draw-point draw-text) + ) + (set! (-> self root-override trans quad) (-> arg0 root-override trans quad)) + (set! + (-> self root-override quat vec quad) + (-> arg0 root-override quat vec quad) + ) + (set! (-> self root-override scale quad) (-> arg0 root-override scale quad)) + (dummy-14 self *keg-conveyor-paddle-sg* '()) + (setup-params! (-> self sync) (the-as uint 4800) 0.0 0.15 0.15) + (logclear! (-> self mask) (process-mask actor-pause enemy)) + (set! (-> self object-on-paddle) (the-as (pointer bouncing-float) #f)) + (go keg-conveyor-paddle-idle) + (none) + ) + +;; definition for method 7 of type keg-conveyor +;; INFO: Return type mismatch process-drawable vs keg-conveyor. +(defmethod relocate keg-conveyor ((obj keg-conveyor) (arg0 int)) + (if (nonzero? (-> obj pivot)) + (&+! (-> obj pivot) arg0) + ) + (the-as + keg-conveyor + ((the-as + (function process-drawable int process-drawable) + (find-parent-method keg-conveyor 7) + ) + obj + arg0 + ) + ) + ) + +;; definition for method 11 of type keg-conveyor +;; WARN: Expression building failed: Function (method 11 keg-conveyor) has a return type of none, but the expression builder found a return statement. +;; Used lq/sq +(defmethod copy-defaults! keg-conveyor ((obj keg-conveyor) (arg0 res-lump)) + (set! (-> obj mask) (logior (process-mask enemy death) (-> obj mask))) + (set! (-> obj root) (new 'process 'trsqv)) + (process-drawable-from-entity! obj arg0) + (dummy-14 obj *keg-conveyor-sg* '()) + (set! (-> obj path) (new 'process 'curve-control obj 'path -1000000000.0)) + (logior! + (-> obj path flags) + (path-control-flag display draw-line draw-point draw-text) + ) + (when (logtest? (-> obj path flags) (path-control-flag not-found)) + (go process-drawable-art-error "path") + (return #f) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (set! + (-> obj pivot) + (new + 'process + 'joint-mod-spinner + obj + 4 + (new 'static 'vector :x 1.0 :w 1.0) + 65536.0 + ) + ) + (let ((s5-1 (new-stack-vector0))) + (let ((s4-0 (new-stack-matrix0))) + (TODO-RENAME-12 (-> obj path) s5-1 0.0) + (set-heading-vec! (-> obj root) s5-1) + (quaternion->matrix s4-0 (-> obj root quat)) + (set-vector! s5-1 -4096.0 -3072.0 -1433.6 1.0) + (vector-rotate*! s5-1 s5-1 s4-0) + ) + (vector+! (-> obj root trans) (-> obj root trans) s5-1) + ) + (let ((s5-2 (get-process *default-dead-pool* keg-conveyor-paddle #x4000))) + (when s5-2 + (let ((t9-11 (method-of-type keg-conveyor-paddle activate))) + (t9-11 + (the-as keg-conveyor-paddle s5-2) + obj + 'keg-conveyor-paddle + (the-as pointer #x70004000) + ) + ) + (run-now-in-process s5-2 keg-conveyor-paddle-init-by-other obj) + (-> s5-2 ppointer) + ) + ) + (go keg-conveyor-idle) + (none) + )