From 574a61e02ae220a9c348a8ab6f486b710b946cfa Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Wed, 15 Dec 2021 21:19:22 -0500 Subject: [PATCH] decomp: finish `mistycannon` (#1009) * stuck: a bit more progress in `snow-ball` * decomp: finish `mistycannon` * address feedback --- decompiler/config/all-types.gc | 36 +- .../config/jak1_ntsc_black_label/hacks.jsonc | 2 - .../jak1_ntsc_black_label/label_types.jsonc | 4 +- .../stack_structures.jsonc | 4 +- .../jak1_ntsc_black_label/type_casts.jsonc | 19 + goal_src/engine/ui/text-h.gc | 1 + goal_src/levels/common/mistycannon.gc | 2032 ++++++++++++++- .../levels/common/mistycannon_REF.gc | 2180 +++++++++++++++++ 8 files changed, 4229 insertions(+), 49 deletions(-) create mode 100644 test/decompiler/reference/levels/common/mistycannon_REF.gc diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index cec46637b8..ab24615105 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -977,6 +977,7 @@ (daxter-screaming-jump #x290) (daxter-wahoo-jump #x291) + (daxter-get-some #x292) (collectables-scout-flies-red-boxes #x295) (found-all-scout-flies #x296) @@ -23625,6 +23626,10 @@ (:methods (spawn-part (_type_) none 20) ) + (:states + mistycannon-missile-idle + mistycannon-missile-explode + mistycannon-missile-in-water) ) (deftype mistycannon-init-data (structure) @@ -23669,9 +23674,15 @@ (:methods (rotate! (_type_ float) none 20) (tilt! (_type_ float) none 21) - (dummy-22 (_type_ float float float) none 22) + (dummy-22 (_type_ float float float) none 22) ;; can return a #f is postbindinfo-ok is false (dummy-23 (_type_) none 23) ) + (:states + mistycannon-idle + mistycannon-waiting-for-player + mistycannon-waiting-for-player-to-fuck-off + mistycannon-aim-at-player + mistycannon-player-control) ) (deftype quadratic-solution (structure) @@ -23698,12 +23709,12 @@ ;; - Functions -(define-extern mistycannon-prebind-function (function mistycannon object)) +(define-extern mistycannon-prebind-function (function mistycannon int mistycannon none)) (define-extern mistycannon-postbind-function (function mistycannon none)) (define-extern angle-tracker-init-range! (function angle-tracker float float float none)) (define-extern mistycannon-pick-random-target-point (function float :behavior mistycannon)) (define-extern angle-tracker-seek! (function angle-tracker float symbol)) -(define-extern mistycannon-do-aim (function vector vector none :behavior mistycannon)) +(define-extern mistycannon-do-aim (function vector vector none :behavior mistycannon)) ;; can return a #f is postbindinfo-ok is false (define-extern mistycannon-find-trajectory (function trajectory-params none :behavior mistycannon)) (define-extern solve-missile-velocity (function trajectory-params float none)) (define-extern spawn-mistycannon-missile (function process-tree vector vector float float float float entity none)) @@ -23712,22 +23723,14 @@ (define-extern mistycannon-collision-reaction (function collide-shape-moving collide-shape-intersect none)) (define-extern angle-tracker-get-value (function angle-tracker float)) (define-extern angle-tracker-set-value (function angle-tracker float float)) -(define-extern solve-missile-tilt (function trajectory-params float float float float symbol)) -(define-extern mistycannon-find-best-solution (function quadratic-solution none :behavior mistycannon)) +(define-extern solve-missile-tilt (function quadratic-solution float float float float symbol)) +(define-extern mistycannon-find-best-solution (function quadratic-solution int :behavior mistycannon)) ;; - Unknowns (define-extern *mistycannon-sg* skeleton-group) -(define-extern mistycannon-idle (state mistycannon)) ;; unknown type -(define-extern mistycannon-waiting-for-player (state mistycannon)) ;; unknown type (define-extern cam-mistycannon (state camera-slave)) ;; unknown type -(define-extern mistycannon-waiting-for-player-to-fuck-off (state mistycannon)) ;; unknown type -(define-extern mistycannon-aim-at-player (state mistycannon)) ;; unknown type -(define-extern mistycannon-player-control (state mistycannon)) ;; unknown type (define-extern *mistycannon-missile-sg* skeleton-group) -(define-extern mistycannon-missile-idle (state mistycannon-missile)) ;; unknown type -(define-extern mistycannon-missile-explode (state mistycannon-missile)) ;; unknown type -(define-extern mistycannon-missile-in-water (state mistycannon-missile)) ;; unknown type ;; ---------------------- @@ -35232,7 +35235,8 @@ ) (deftype snow-ball (process) - ((state-time uint64 :offset-assert 112) + ((child-override (pointer snow-ball-roller) :score 100 :offset 20) + (state-time uint64 :offset-assert 112) (last-path-picked int32 :offset-assert 120) (same-path-picked-count int32 :offset-assert 124) (delay-til-next int32 :offset-assert 128) @@ -35243,8 +35247,8 @@ :heap-base #x20 :flag-assert #x100020008c (:methods - (dummy-14 (_type_ vector float int) none 14) ;; TODO - im pretty sure the 2nd arg is snow-ball-junction related! - (dummy-15 (_type_ vector int) none 15) ;; TODO - same type as above + (dummy-14 (_type_ (inline-array snow-ball-junction) float int) symbol 14) + (dummy-15 (_type_ (inline-array snow-ball-junction) int) none 15) ;; TODO - same type as above ) ) diff --git a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc index fa3b882de2..893cf53b9a 100644 --- a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc @@ -312,9 +312,7 @@ // all unchecked and in level DGO code "(anon-function 21 plant-boss)", // CFG - "mistycannon-find-best-solution", "target-flut-falling-anim-trans", // CFG failure - "(anon-function 36 mistycannon)", "(anon-function 6 title-obs)", "(anon-function 43 maincave-obs)", "(anon-function 2 target-tube)", diff --git a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc index 9e83f806a4..bc4d045da8 100644 --- a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc @@ -1895,8 +1895,8 @@ ], "snow-ball": [ - ["L86", "snow-ball-path-info"], - ["L87", "snow-ball-path-info"], + ["L86", "(inline-array vector)", 2], // likely wrong, but its 8 floats -- maybe its timing related, like a ticky? but those are int64s + ["L87", "(inline-array vector)", 2], // likely wrong, but its 8 floats -- maybe its timing related, like a ticky? but those are int64s ["L89", "attack-info"] ], diff --git a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc index 47069522c5..56781f45f8 100644 --- a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc @@ -5437,7 +5437,7 @@ ], "(code mistycannon-missile-in-water)": [ - [16, "event-message-block"], + [16, "vector"], [32, "vector"] ], @@ -5450,7 +5450,7 @@ ], "(code mistycannon-missile-explode)": [ - [16, "vector2w"] + [16, "overlaps-others-params"] ], "(event mistycannon-missile-explode)": [ diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index 1d5c793b59..7257118d35 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -6698,6 +6698,7 @@ ], "(code mistycannon-missile-idle)": [ + [110, "v0", "sound-rpc-set-param"], [207, "v1", "art-joint-anim"], [257, "v1", "art-joint-anim"] ], @@ -6985,5 +6986,23 @@ [[3, 99], "s4", "joint-mod-tracker"] ], + "(method 14 snow-ball)": [ + [16, "v1", "vector"], + [23, "v1", "vector"], + [30, "v1", "vector"] + ], + + "(method 7 snow-ball)": [ + [26, "t9", "(function process-drawable int process-drawable)"] + ], + + "(method 11 mistycannon)": [ + ["_stack_", 16, "res-tag"], + ["_stack_", 32, "res-tag"], + ["_stack_", 48, "res-tag"], + [337, "v0", "(pointer float)"], + [367, "v0", "(pointer float)"] + ], + "placeholder-do-not-add-below": [] } diff --git a/goal_src/engine/ui/text-h.gc b/goal_src/engine/ui/text-h.gc index 8f03c4634a..a6b9ebbfa1 100644 --- a/goal_src/engine/ui/text-h.gc +++ b/goal_src/engine/ui/text-h.gc @@ -194,6 +194,7 @@ (daxter-screaming-jump #x290) (daxter-wahoo-jump #x291) + (daxter-get-some #x292) (collectables-scout-flies-red-boxes #x295) (found-all-scout-flies #x296) diff --git a/goal_src/levels/common/mistycannon.gc b/goal_src/levels/common/mistycannon.gc index d3ac513676..73a0eb75fb 100644 --- a/goal_src/levels/common/mistycannon.gc +++ b/goal_src/levels/common/mistycannon.gc @@ -5,42 +5,1237 @@ ;; name in dgo: mistycannon ;; dgos: BEA, L1, MIS -;; TODO - for babak-with-cannon +;; DECOMP BEGINS + (deftype angle-tracker (structure) - ((value float :offset-assert 0) - (min float :offset-assert 4) - (range float :offset-assert 8) - (speed float :offset-assert 12) + ((value float :offset-assert 0) + (min float :offset-assert 4) + (range float :offset-assert 8) + (speed float :offset-assert 12) ) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 ) -(deftype mistycannon (process-drawable) - ((root-override collide-shape-moving :score 100 :offset 112) - (rotate angle-tracker :inline :offset-assert 176) - (fact-info-override fact-info-enemy :score 100 :offset 144) - (tilt angle-tracker :inline :offset-assert 192) - (front-wheel float :offset-assert 208) - (rear-wheel float :offset-assert 212) - (last-known-rotation float :offset-assert 216) - (part-timer uint64 :offset-assert 224) - (hellmouth vector :inline :offset-assert 240) - (postbindinfo-ok symbol :offset-assert 256) - (launch-origin vector :inline :offset-assert 272) - (goggles vector :inline :offset-assert 288) - (avoid-entity entity-actor :offset-assert 304) - (center-point vector :inline :offset-assert 320) - (at-point vector :inline :offset-assert 336) - (accuracy-range float :offset-assert 352) - (target-theta float :offset-assert 356) - (sound-id sound-id :offset-assert 360) - (aim-sound-id sound-id :offset-assert 364) - (player-touching-grips? symbol :offset-assert 368) + + +(defun angle-tracker-apply-move! ((arg0 angle-tracker) (arg1 float)) + (let* ((f0-2 (* arg1 (-> arg0 speed) (-> *display* seconds-per-frame))) + (f0-3 (+ (-> arg0 value) f0-2)) + ) + (when (!= (-> arg0 range) 0.0) + (if (< f0-3 0.0) + (set! f0-3 0.0) + ) + (if (< (-> arg0 range) f0-3) + (set! f0-3 (-> arg0 range)) + ) + ) + (let ((f1-7 (- (-> arg0 value) f0-3))) + (if (= (-> arg0 range) 0.0) + (set! f0-3 (the float (sar (shl (the int f0-3) 48) 48))) + ) + (set! (-> arg0 value) f0-3) + f1-7 + ) + ) + ) + +(defun angle-tracker-init-range! ((arg0 angle-tracker) (arg1 float) (arg2 float) (arg3 float)) + (set! (-> arg0 min) arg1) + (set! (-> arg0 range) (the float (sar (shl (the int (- arg2 arg1)) 48) 48))) + (if (< (-> arg0 range) 0.0) + (set! (-> arg0 range) (+ 65536.0 (-> arg0 range))) + ) + (set! (-> arg0 value) (* 0.5 (-> arg0 range))) + (set! (-> arg0 speed) arg3) + 0 + (none) + ) + +(defun angle-tracker-get-value ((arg0 angle-tracker)) + (the float (sar (shl (the int (+ (-> arg0 min) (-> arg0 value))) 48) 48)) + ) + +(defun angle-tracker-set-value ((arg0 angle-tracker) (arg1 float)) + (let ((v1-0 (- arg1 (-> arg0 min)))) + (when (!= (-> arg0 range) 0.0) + (if (< v1-0 0.0) + (set! v1-0 0.0) + ) + (if (< (-> arg0 range) v1-0) + (set! v1-0 (-> arg0 range)) + ) + ) + (set! (-> arg0 value) v1-0) + (+ (-> arg0 min) v1-0) + ) + ) + +(defun angle-tracker-seek! ((arg0 angle-tracker) (arg1 float)) + (let* ((v1-0 arg0) + (f1-1 (the float (sar (shl (the int (+ (-> v1-0 min) (-> v1-0 value))) 48) 48))) + (f0-6 (* (-> arg0 speed) (-> *display* seconds-per-frame))) + (v1-9 (the float (sar (shl (the int (- arg1 f1-1)) 48) 48))) + ) + (when (< (fabs v1-9) f0-6) + (let ((f0-8 (+ (-> arg0 value) v1-9))) + (cond + ((= (-> arg0 range) 0.0) + (set! (-> arg0 value) (the float (sar (shl (the int f0-8) 48) 48))) + (return #t) + ) + (else + (when (< f0-8 0.0) + (set! (-> arg0 value) 0.0) + (return #f) + ) + (when (< (-> arg0 range) f0-8) + (set! (-> arg0 value) (-> arg0 range)) + (return #f) + ) + (set! (-> arg0 value) f0-8) + (return #t) + ) + ) + ) + (set! v1-9 (the-as float 0)) + ) + (cond + ((< v1-9 0.0) + (let ((f0-14 (- (-> arg0 value) f0-6))) + (set! f0-14 (cond + ((= (-> arg0 range) 0.0) + (the float (sar (shl (the int f0-14) 48) 48)) + ) + (else + (if (< f0-14 0.0) + (set! f0-14 0.0) + ) + f0-14 + ) + ) + ) + (set! (-> arg0 value) (the float (sar (shl (the int f0-14) 48) 48))) + ) + ) + (else + (let ((f0-20 (+ (-> arg0 value) f0-6))) + (set! f0-20 (cond + ((= (-> arg0 range) 0.0) + (the float (sar (shl (the int f0-20) 48) 48)) + ) + (else + (if (< (-> arg0 range) f0-20) + (set! f0-20 (-> arg0 range)) + ) + f0-20 + ) + ) + ) + (set! (-> arg0 value) (the float (sar (shl (the int f0-20) 48) 48))) + ) + ) + ) + ) + #f + ) + +(set! (-> *part-group-id-table* 117) (new 'static 'sparticle-launch-group + :length 3 + :duration #xbb8 + :linger-duration #x5dc + :name "group-beach-sack-fuse" + :launcher + (new 'static 'inline-array sparticle-group-item 3 + (sp-item 517 :fade-after (meters 30.0)) + (sp-item 518 :fade-after (meters 120.0) :falloff-to (meters 120.0)) + (sp-item 519 :fade-after (meters 80.0) :falloff-to (meters 80.0)) + ) + :bounds (new 'static 'sphere :w 4096.0) + ) + ) + +(set! (-> *part-id-table* 517) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 18 + (sp-tex spt-texture (new 'static 'texture-id :index #xf :page #x2)) + (sp-flt spt-num 4.0) + (sp-flt spt-scale-x (meters 0.1)) + (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 192.0) + (sp-flt spt-g 192.0) + (sp-rnd-flt spt-b 64.0 128.0 1.0) + (sp-rnd-flt spt-a 4.0 24.0 1.0) + (sp-flt spt-vel-y (meters 0.013333334)) + (sp-rnd-flt spt-rotvel-z (degrees -0.15) (degrees 0.3) 1.0) + (sp-flt spt-fade-a 2.1333334) + (sp-flt spt-accel-y -0.4096) + (sp-int-plain-rnd spt-timer 45 14 1) + (sp-cpuinfo-flags bit2 bit3) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 180.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 518) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 12 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-scale-x (meters 0.25) (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-flt spt-r 192.0) + (sp-flt spt-g 192.0) + (sp-rnd-flt spt-b 64.0 128.0 1.0) + (sp-rnd-flt spt-a 48.0 48.0 1.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags bit2 bit3) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 519) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 19 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 4.0) + (sp-flt spt-scale-x (meters 0.2)) + (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 32.0) + (sp-flt spt-g 32.0) + (sp-rnd-flt spt-b 8.0 24.0 1.0) + (sp-rnd-flt spt-a 160.0 95.0 1.0) + (sp-flt spt-scalevel-x (meters 0.016666668)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -8.366014) + (sp-flt spt-accel-y -8.192) + (sp-int spt-timer 15) + (sp-cpuinfo-flags bit2 bit3) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 180.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-conerot-radius (meters 0.6) (meters 0.2) 1.0) + (sp-end) + ) + ) + ) + +(set! (-> *part-group-id-table* 118) + (new 'static 'sparticle-launch-group + :length 21 + :duration #xbb8 + :linger-duration #x5dc + :flags (sp-group-flag use-local-clock) + :name "group-beach-sack-explosion" + :launcher + (new 'static 'inline-array sparticle-group-item 21 + (sp-item 520 :period 1200 :length 30) + (sp-item 521 :fade-after (meters 60.0) :period 1200 :length 15) + (sp-item 522 :period 1200 :length 15 :offset 15) + (sp-item 523 :period 1200 :length 15) + (sp-item 524 :fade-after (meters 80.0) :falloff-to (meters 80.0) :period 1200 :length 30 :binding 525) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + ) + :bounds (new 'static 'sphere :w 65536.0) + ) + ) + +(set! (-> *part-id-table* 520) (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 526) + (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* 526) + (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* 521) (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 527) + (sp-flt spt-rotate-y (degrees 0.0)) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 527) + (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* 522) (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* 523) (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* 524) (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 bit14) + (sp-int-plain-rnd spt-next-time 5 38 1) + (sp-launcher-by-id spt-next-launcher 528) + (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* 528) + (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* 525) + (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 bit14) + (sp-end) + ) + ) + ) + +(set! (-> *part-group-id-table* 119) + (new 'static 'sparticle-launch-group + :length 30 + :duration #xbb8 + :linger-duration #x5dc + :flags (sp-group-flag use-local-clock) + :name "group-beach-cannon-fire" + :launcher + (new 'static 'inline-array sparticle-group-item 30 + (sp-item 529 :fade-after (meters 200.0) :falloff-to (meters 200.0) :period 1200 :length 30) + (sp-item 530 :fade-after (meters 100.0) :falloff-to (meters 100.0) :period 1200 :length 15) + (sp-item 531 :fade-after (meters 40.0) :falloff-to (meters 40.0) :period 1200 :length 15) + (sp-item 532 :period 1200 :length 15 :offset 15) + (sp-item 533 :period 1200 :length 15) + (sp-item 534 :fade-after (meters 40.0) :falloff-to (meters 40.0) :period 1200 :length 15 :binding 535) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + ) + :bounds (new 'static 'sphere :w 98304.0) + ) + ) + +(set! (-> *part-id-table* 529) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 26 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 6.0) + (sp-rnd-flt spt-scale-x (meters 1.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 64.0) + (sp-flt spt-g 64.0) + (sp-rnd-flt spt-b 64.0 16.0 1.0) + (sp-flt spt-a 48.0) + (sp-rnd-flt spt-vel-y (meters 0.1) (meters 0.013333334) 1.0) + (sp-flt spt-vel-z (meters -0.033333335)) + (sp-flt spt-scalevel-x (meters 0.016666668)) + (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.27306667) + (sp-flt spt-friction 0.92) + (sp-int spt-timer 900) + (sp-cpuinfo-flags bit2 bit12) + (sp-int-plain-rnd spt-next-time 30 299 1) + (sp-launcher-by-id spt-next-launcher 536) + (sp-flt spt-launchrot-x (degrees 90.0)) + (sp-rnd-flt spt-launchrot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-x (degrees 45.0)) + (sp-flt spt-conerot-radius (meters 2.0)) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 536) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 4 + (sp-flt spt-scalevel-x (meters 0.006666667)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -0.16) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 530) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 25 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 5.0) + (sp-rnd-flt spt-scale-x (meters 1.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 64.0) + (sp-flt spt-g 64.0) + (sp-rnd-flt spt-b 64.0 16.0 1.0) + (sp-flt spt-a 48.0) + (sp-rnd-flt spt-vel-z (meters 0.3) (meters 0.06666667) 1.0) + (sp-flt spt-scalevel-x (meters 0.026666667)) + (sp-rnd-int-flt spt-rotvel-z (degrees -0.3) 1 109.22667) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-accel-y -0.27306667) + (sp-flt spt-friction 0.96) + (sp-int spt-timer 900) + (sp-cpuinfo-flags bit2 bit12) + (sp-int-plain-rnd spt-next-time 30 149 1) + (sp-launcher-by-id spt-next-launcher 536) + (sp-rnd-flt spt-launchrot-x (degrees -83.0) (degrees -7.0000005) 1.0) + (sp-rnd-flt spt-launchrot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-x (degrees 45.0)) + (sp-flt spt-conerot-radius (meters 2.0)) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 531) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 20 + (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 16.0) (meters 16.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) + (sp-int spt-next-time 15) + (sp-launcher-by-id spt-next-launcher 537) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 537) + (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* 532) (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) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 533) (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) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 534) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 23 + (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-scale-x (meters 0.5) (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-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 0.0) + (sp-flt spt-a 128.0) + (sp-rnd-flt spt-vel-z (meters 0.16666667) (meters 0.16666667) 1.0) + (sp-flt spt-fade-g -4.2222223) + (sp-flt spt-fade-b -2.8) + (sp-rnd-flt spt-accel-y -6.826667 -3.4133334 1.0) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 600) + (sp-cpuinfo-flags bit2 bit3) + (sp-int-plain-rnd spt-next-time 10 89 1) + (sp-launcher-by-id spt-next-launcher 538) + (sp-rnd-flt spt-launchrot-x (degrees -60.0) (degrees -60.0) 1.0) + (sp-rnd-flt spt-launchrot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-x (degrees 45.0)) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 538) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 6 + (sp-flt spt-scalevel-x (meters -0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.6) + (sp-flt spt-fade-g -1.8) + (sp-flt spt-fade-a -0.85333335) + (sp-end) + ) + ) + ) + +(set! (-> *part-id-table* 535) + (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 0.5) + (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 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-flt spt-r 64.0) + (sp-flt spt-g 64.0) + (sp-flt spt-b 64.0) + (sp-rnd-flt spt-a 16.0 8.0 1.0) + (sp-flt spt-scalevel-x (meters 0.006666667)) + (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.08) + (sp-int spt-timer 300) + (sp-cpuinfo-flags bit2 bit12) + (sp-end) + ) + ) + ) + +(deftype mistycannon-missile (process-drawable) + ((root-override collide-shape-moving :offset 112) + (muzzle-time float :offset-assert 176) + (tumble-quat quaternion :inline :offset-assert 192) + (blast-radius float :offset-assert 208) + (water-height float :offset-assert 212) + (sfx uint32 :offset-assert 216) + (part2 sparticle-launch-control :offset-assert 220) + (ground-time uint64 :offset-assert 224) ) + :heap-base #x80 + :method-count-assert 21 + :size-assert #xe8 + :flag-assert #x15008000e8 + (:methods + (spawn-part (_type_) none 20) + ) + (:states + mistycannon-missile-explode + mistycannon-missile-idle + mistycannon-missile-in-water + ) + ) + + +(defmethod relocate mistycannon-missile ((obj mistycannon-missile) (arg0 int)) + (if (nonzero? (-> obj part2)) + (&+! (-> obj part2) arg0) + ) + (the-as mistycannon-missile ((method-of-type process-drawable relocate) obj arg0)) + ) + +(defmethod deactivate mistycannon-missile ((obj mistycannon-missile)) + (if (nonzero? (-> obj part2)) + (kill-and-free-particles (-> obj part2)) + ) + ((method-of-type process-drawable deactivate) obj) + (none) + ) + +(defskelgroup *mistycannon-missile-sg* sack + 0 + 2 + ((1 (meters 999999))) + :bounds (static-spherem 0 0 0 4) + :longest-edge (meters 0) + ) + +(defmethod spawn-part mistycannon-missile ((obj mistycannon-missile)) + (let ((gp-0 (-> obj part)) + (a1-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 7))) + ) + (spawn gp-0 a1-1) + ) + 0 + (none) + ) + +(defstate mistycannon-missile-idle (mistycannon-missile) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('attack) + (go mistycannon-missile-explode) + ) + ) + ) + :enter + (behavior () + (set! (-> self state-time) (-> *display* base-frame-counter)) + (set! (-> self sfx) (the-as uint 0)) + 0 + (none) + ) + :trans + (behavior () + (if (< (-> self root-override trans y) (-> self water-height)) + (go mistycannon-missile-in-water) + ) + (none) + ) + :code + (behavior () + (clear-collide-with-as (-> self root-override)) + (while (< (- (-> *display* base-frame-counter) (-> self state-time)) (the int (* 300.0 (-> self muzzle-time)))) + (quaternion*! (-> self root-override quat) (-> self root-override quat) (-> self tumble-quat)) + (suspend) + (let ((f0-1 + (fmin + 1.0 + (/ (the float (- (-> *display* base-frame-counter) (-> self state-time))) + (the float (the int (* 300.0 (-> self muzzle-time)))) + ) + ) + ) + ) + (set! (-> self root-override scale x) (* 0.6 f0-1)) + (set! (-> self root-override scale y) (* 0.6 f0-1)) + (set! (-> self root-override scale z) (* 0.6 f0-1)) + ) + ) + (restore-collide-with-as (-> self root-override)) + (set-vector! (-> self root-override scale) 0.6 0.6 0.6 1.0) + (while (zero? (logand (-> self root-override status) 1)) + (if (and + (zero? (-> self sfx)) + (< (if *target* + (vector-vector-distance (-> self root-override trans) (-> *target* control trans)) + 4096000.0 + ) + 409600.0 + ) + ) + (set! (-> self sfx) + (the-as + uint + (sound-play-by-name + (static-sound-name "sack-incoming") + (new-sound-id) + 1024 + 0 + 0 + 1 + (the-as symbol (-> self root-override trans)) + ) + ) + ) + ) + (when (nonzero? (-> self sfx)) + (let ((gp-1 (the-as sound-rpc-set-param (get-sound-buffer-entry)))) + (set! (-> gp-1 command) (sound-command set-param)) + (set! (-> gp-1 id) (the-as sound-id (-> self sfx))) + (let ((a1-3 (-> self root-override trans))) + (let ((s5-1 self)) + (when (= a1-3 #t) + (if (and s5-1 (type-type? (-> s5-1 type) process-drawable) (nonzero? (-> s5-1 root-override))) + (set! a1-3 (-> s5-1 root-override trans)) + (set! a1-3 (the-as vector #f)) + ) + ) + ) + (sound-trans-convert (-> gp-1 parms trans) a1-3) + ) + (set! (-> gp-1 parms mask) (the-as uint 32)) + (-> gp-1 id) + ) + ) + (quaternion*! (-> self root-override quat) (-> self root-override quat) (-> self tumble-quat)) + (suspend) + ) + (quaternion-set! (-> self root-override quat) 0.0 0.0 0.0 1.0) + (dummy-47 (-> self root-override)) + (when (nonzero? (-> self sfx)) + (sound-stop (the-as sound-id (-> self sfx))) + (set! (-> self sfx) (the-as uint 0)) + 0 + ) + (set! (-> self ground-time) (the-as uint (-> *display* base-frame-counter))) + (sound-play-by-name + (static-sound-name "sack-land") + (new-sound-id) + 1024 + 0 + 0 + 1 + (the-as symbol (-> self root-override trans)) + ) + (let ((a0-18 (-> self skel root-channel 0))) + (set! (-> a0-18 frame-group) (the-as art-joint-anim (-> self draw art-group data 3))) + (set! (-> a0-18 param 0) + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 3)) data 0 length) -1)) + ) + (set! (-> a0-18 param 1) 1.0) + (set! (-> a0-18 frame-num) 0.0) + (joint-control-channel-group! a0-18 (the-as art-joint-anim (-> self draw art-group data 3)) num-func-seek!) + ) + (until (ja-done? 0) + (suspend) + (let ((a0-19 (-> self skel root-channel 0))) + (set! (-> a0-19 param 0) (the float (+ (-> a0-19 frame-group data 0 length) -1))) + (set! (-> a0-19 param 1) 1.0) + (joint-control-channel-group-eval! a0-19 (the-as art-joint-anim #f) num-func-seek!) + ) + ) + (let ((a0-21 (-> self skel root-channel 0))) + (set! (-> a0-21 frame-group) (the-as art-joint-anim (-> self draw art-group data 4))) + (set! (-> a0-21 param 0) + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 4)) data 0 length) -1)) + ) + (set! (-> a0-21 param 1) 1.0) + (set! (-> a0-21 frame-num) 0.0) + (joint-control-channel-group! a0-21 (the-as art-joint-anim (-> self draw art-group data 4)) num-func-seek!) + ) + (until (ja-done? 0) + (suspend) + (let ((a0-22 (-> self skel root-channel 0))) + (set! (-> a0-22 param 0) (the float (+ (-> a0-22 frame-group data 0 length) -1))) + (set! (-> a0-22 param 1) 1.0) + (joint-control-channel-group-eval! a0-22 (the-as art-joint-anim #f) num-func-seek!) + ) + ) + (go mistycannon-missile-explode) + (none) + ) + :post + (behavior () + (vector-v++! (-> self root-override transv) (dummy-62 (-> self root-override) (new-stack-vector0) 1.0)) + (set! (-> self root-override root-prim prim-core offense) 1) + (dummy-33 + (-> self root-override) + (-> self root-override transv) + (-> self root-override root-prim collide-with) + ) + (set! (-> self root-override root-prim prim-core offense) 4) + (spawn-part self) + (when (and (zero? (-> self draw cur-lod)) (logtest? (-> self draw status) 8)) + (if (logtest? (-> self root-override status) 1) + (draw-shadow + (-> self root-override shadow-pos) + (-> self root-override shadow-pos) + (-> self root-override ground-poly-normal) + 8192.0 + 4096.0 + (the-as float 0) + ) + (find-ground-and-draw-shadow + (-> self root-override trans) + (-> self root-override shadow-pos) + 8192.0 + (the-as uint 1) + (the-as process #f) + 0.0 + 81920.0 + ) + ) + ) + (ja-post) + (none) + ) + ) + +(defstate mistycannon-missile-in-water (mistycannon-missile) + :code + (behavior () + (when (nonzero? (-> self sfx)) + (sound-stop (the-as sound-id (-> self sfx))) + (set! (-> self sfx) (the-as uint 0)) + 0 + ) + (let ((a1-0 (new-stack-vector0))) + (set! (-> a1-0 x) (-> self root-override trans x)) + (set! (-> a1-0 y) (-> self water-height)) + (set! (-> a1-0 z) (-> self root-override trans z)) + (set! (-> a1-0 w) 1.0) + (splash-spawn (the-as basic 1.0) (the-as basic a1-0) 1) + ) + (label cfg-3) + (vector-v++! (-> self root-override transv) (dummy-62 (-> self root-override) (new-stack-vector0) 1.0)) + (vector-float*! (-> self root-override transv) (-> self root-override transv) 0.5) + (dummy-47 (-> self root-override)) + (dummy-33 + (-> self root-override) + (-> self root-override transv) + (-> self root-override root-prim collide-with) + ) + (set! (-> self root-override scale x) + (seek (-> self root-override scale x) 0.0 (* 0.01 (-> *display* time-adjust-ratio))) + ) + (set! (-> self root-override scale y) + (seek (-> self root-override scale y) 0.0 (* 0.01 (-> *display* time-adjust-ratio))) + ) + (set! (-> self root-override scale z) + (seek (-> self root-override scale z) 0.0 (* 0.01 (-> *display* time-adjust-ratio))) + ) + (when (< 0.05 (-> self root-override scale x)) + (suspend) + (goto cfg-3) + ) + (ja-channel-set! 0) + (none) + ) + :post + (the-as (function none :behavior mistycannon-missile) ja-post) + ) + +(defstate mistycannon-missile-explode (mistycannon-missile) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('touched) + (let* ((s4-0 arg0) + (v1-2 (if (and (nonzero? s4-0) (type-type? (-> s4-0 type) process-drawable)) + s4-0 + ) + ) + ) + (when v1-2 + (let* ((v1-3 (-> (the-as mistycannon-missile v1-2) root-override)) + (a1-2 (-> self root-override root-prim prim-core)) + (v1-5 (-> v1-3 root-prim prim-core)) + (a2-1 (new 'stack-no-clear 'vector)) + (t2-0 (new 'stack-no-clear 'collide-mesh-cache-tri)) + ) + 0.0 + (vector-! a2-1 (the-as vector v1-5) (the-as vector a1-2)) + (when (< (dummy-10 *collide-cache* (the-as vector a1-2) a2-1 40.96 1 self (the-as collide-tri-result t2-0) 1) 0.0) + (cond + ((= (-> arg0 type) target) + (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)) + (let ((a0-8 (new 'static 'attack-info :mask #x20))) + (set! (-> a0-8 mode) 'explode) + (set! (-> a1-3 param 1) (the-as uint a0-8)) + ) + (send-event-function arg0 a1-3) + ) + ) + (else + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) self) + (set! (-> a1-4 num-params) 4) + (set! (-> a1-4 message) 'attack) + (set! (-> a1-4 param 0) (-> arg3 param 0)) + (set! (-> a1-4 param 1) (the-as uint 'explode)) + (let ((v1-18 (+ *global-attack-id* 1))) + (set! *global-attack-id* v1-18) + (set! (-> a1-4 param 2) (the-as uint v1-18)) + ) + (set! (-> a1-4 param 3) (the-as uint 0)) + (send-event-function arg0 a1-4) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + :code + (behavior () + (if (and *target* (= (-> *target* next-state name) 'target-periscope)) + (sound-play-by-spec + (new 'static 'sound-spec + :mask #xc0 + :num 1.0 + :group #x1 + :sound-name (static-sound-name "explosion") + :volume #x400 + :fo-min #xc8 + :fo-max #x190 + ) + (new-sound-id) + (the-as vector #t) + ) + (sound-play-by-spec + (new 'static 'sound-spec :num 1.0 :group #x1 :sound-name (static-sound-name "explosion") :volume #x400) + (new-sound-id) + (the-as vector #t) + ) + ) + (spawn (-> self part2) (-> self root-override trans)) + (ja-channel-set! 0) + (let ((v1-11 (-> self root-override root-prim))) + (set! (-> v1-11 local-sphere w) (-> self blast-radius)) + (set! (-> v1-11 prim-core world-sphere w) (-> self blast-radius)) + (set! (-> v1-11 collide-with) (the-as uint 924)) + (set! (-> v1-11 prim-core collide-as) (the-as uint 256)) + ) + (dummy-47 (-> self root-override)) + (let ((a1-3 (new 'stack-no-clear 'overlaps-others-params))) + (set! (-> a1-3 options) (the-as uint 0)) + (set! (-> a1-3 tlist) *touching-list*) + (dummy-40 (-> self root-override) a1-3) + ) + (suspend) + (clear-collide-with-as (-> self root-override)) + (let ((gp-2 (-> *display* base-frame-counter))) + (until (>= (- (-> *display* base-frame-counter) gp-2) 900) + (spawn (-> self part2) (-> self root-override trans)) + (suspend) + ) + ) + (kill-and-free-particles (-> self part2)) + (deactivate self) + (none) + ) + :post + (the-as (function none :behavior mistycannon-missile) ja-post) + ) + +(defun mistycannon-collision-reaction ((arg0 collide-shape-moving) (arg1 collide-shape-intersect)) + (let ((s5-0 0)) + (let ((a1-1 (new 'stack-no-clear 'vector))) + (vector-float*! a1-1 (-> arg1 move-vec) (-> arg1 best-u)) + (TODO-RENAME-28 arg0 a1-1) + ) + (let ((f0-2 (vector-dot (-> arg0 transv) (-> arg1 best-tri normal))) + (v1-6 (new 'stack-no-clear 'vector)) + ) + (vector-float*! v1-6 (-> arg1 best-tri normal) (* 2.0 f0-2)) + (vector-! (-> arg0 transv) (-> arg0 transv) v1-6) + ) + (vector-float*! (-> arg0 transv) (-> arg0 transv) 0.15) + (let ((v0-1 (logior s5-0 7))) + (logior! (-> arg0 status) v0-1) + ) + ) + (none) + ) + +(deftype mistycannon-init-data (structure) + ((pos vector :offset-assert 0) + (vel vector :offset-assert 4) + (rotate float :offset-assert 8) + (flight-time float :offset-assert 12) + (muzzle-time float :offset-assert 16) + (blast-radius float :offset-assert 20) + ) + :method-count-assert 9 + :size-assert #x18 + :flag-assert #x900000018 + ) + + +(defbehavior mistycannon-missile-init-by-other mistycannon-missile ((arg0 mistycannon-init-data) (arg1 entity)) + (set! (-> self mask) (logior (process-mask projectile) (-> self mask))) + (logclear! (-> self mask) (process-mask actor-pause)) + (set! (-> self entity) arg1) + (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) + (the-as + (function collide-shape-moving collide-shape-intersect vector vector none) + mistycannon-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 0)))) + (set! (-> s4-0 prim-core collide-as) (the-as uint 256)) + (set! (-> s4-0 collide-with) (the-as uint 925)) + (set! (-> s4-0 prim-core action) (the-as uint 1)) + (set! (-> s4-0 prim-core offense) 1) + (set! (-> s4-0 transform-index) 0) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 1720.3201) + (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! (-> s5-0 event-self) 'touched) + (set! (-> s5-0 max-iteration-count) (the-as uint 4)) + (set! (-> self root-override) s5-0) + ) + (set! (-> self root-override trans quad) (-> arg0 pos quad)) + (set-vector! (-> self root-override scale) 0.0 0.0 0.0 1.0) + (set! (-> self muzzle-time) (-> arg0 muzzle-time)) + (quaternion-axis-angle! (-> self root-override quat) 0.0 1.0 0.0 (-> arg0 rotate)) + (let ((f0-13 (/ 655360.0 (the float (the int (* 300.0 (-> arg0 flight-time))))))) + (quaternion-axis-angle! (-> self tumble-quat) 1.0 0.0 0.0 f0-13) + ) + (initialize-skeleton self *mistycannon-missile-sg* '()) + (set! (-> self root-override transv quad) (-> arg0 vel quad)) + (set! (-> self blast-radius) (-> arg0 blast-radius)) + (set! (-> self water-height) (res-lump-float (-> self entity) 'water-height :default -4096000.0)) + (set! (-> self part) (create-launch-control (-> *part-group-id-table* 117) self)) + (set! (-> self part2) (create-launch-control (-> *part-group-id-table* 118) self)) + (go mistycannon-missile-idle) + (none) + ) + +(defun spawn-mistycannon-missile ((arg0 process-tree) + (arg1 vector) + (arg2 vector) + (arg3 float) + (arg4 float) + (arg5 float) + (arg6 float) + (arg7 entity) + ) + (let ((s5-0 (new 'stack-no-clear 'mistycannon-init-data))) + (set! (-> s5-0 pos) arg1) + (set! (-> s5-0 vel) arg2) + (set! (-> s5-0 rotate) arg3) + (set! (-> s5-0 flight-time) arg4) + (set! (-> s5-0 muzzle-time) arg5) + (set! (-> s5-0 blast-radius) arg6) + (let ((s3-0 (get-process *default-dead-pool* mistycannon-missile #x4000))) + (when s3-0 + (let ((t9-1 (method-of-type mistycannon-missile activate))) + (t9-1 (the-as mistycannon-missile s3-0) arg0 'mistycannon-missile (the-as pointer #x70004000)) + ) + (run-now-in-process s3-0 mistycannon-missile-init-by-other s5-0 arg7) + (-> s3-0 ppointer) + ) + ) + ) + 0 + (none) + ) + +(deftype mistycannon (process-drawable) + ((root-override collide-shape-moving :offset 112) + (rotate angle-tracker :inline :offset-assert 176) + (fact-info-override fact-info-enemy :offset 144) + (tilt angle-tracker :inline :offset-assert 192) + (front-wheel float :offset-assert 208) + (rear-wheel float :offset-assert 212) + (last-known-rotation float :offset-assert 216) + (part-timer uint64 :offset-assert 224) + (hellmouth vector :inline :offset-assert 240) + (postbindinfo-ok symbol :offset-assert 256) + (launch-origin vector :inline :offset-assert 272) + (goggles vector :inline :offset-assert 288) + (avoid-entity entity-actor :offset-assert 304) + (center-point vector :inline :offset-assert 320) + (at-point vector :inline :offset-assert 336) + (accuracy-range float :offset-assert 352) + (target-theta float :offset-assert 356) + (sound-id sound-id :offset-assert 360) + (aim-sound-id sound-id :offset-assert 364) + (player-touching-grips? symbol :offset-assert 368) + ) + :heap-base #x110 :method-count-assert 24 :size-assert #x174 - :heap-base #x110 :flag-assert #x1801100174 (:methods (rotate! (_type_ float) none 20) @@ -48,4 +1243,787 @@ (dummy-22 (_type_ float float float) none 22) (dummy-23 (_type_) none 23) ) + (:states + mistycannon-aim-at-player + mistycannon-idle + mistycannon-player-control + mistycannon-waiting-for-player + mistycannon-waiting-for-player-to-fuck-off + ) ) + + +(defbehavior mistycannon-pick-random-target-point mistycannon () + (let ((f30-0 (* (sqrtf (rand-vu)) (-> self center-point w))) + (f28-1 (* 65536.0 (rand-vu))) + ) + (set! (-> self at-point x) (+ (-> self center-point x) (* f30-0 (cos f28-1)))) + (set! (-> self at-point y) (-> self center-point y)) + (set! (-> self at-point z) (+ (-> self center-point z) (* f30-0 (sin f28-1)))) + ) + (set! (-> self at-point w) 1.0) + (let ((f0-11 (rand-vu-float-range 2730.6667 12743.111))) + (set! (-> self target-theta) f0-11) + f0-11 + ) + ) + +(defmethod rotate! mistycannon ((obj mistycannon) (arg0 float)) + (angle-tracker-apply-move! (-> obj rotate) arg0) + 0 + (none) + ) + +(defmethod tilt! mistycannon ((obj mistycannon) (arg0 float)) + (angle-tracker-apply-move! (-> obj tilt) arg0) + 0 + (none) + ) + +;; WARN: Expression building failed: Function (method 22 mistycannon) has a return type of none, but the expression builder found a return statement. +(defmethod dummy-22 mistycannon ((obj mistycannon) (arg0 float) (arg1 float) (arg2 float)) + (if (not (-> obj postbindinfo-ok)) + (return #f) + ) + (let* ((s3-0 (-> obj launch-origin)) + (s2-0 (new 'stack-no-clear 'vector)) + (v1-3 (-> obj rotate)) + (f30-0 (the float (sar (shl (the int (+ (-> v1-3 min) (-> v1-3 value))) 48) 48))) + (v1-8 (-> obj tilt)) + (f26-0 (the float (sar (shl (the int (+ (-> v1-8 min) (-> v1-8 value))) 48) 48))) + (f28-0 (/ 24576.0 arg0)) + ) + (let ((f24-0 (cos f26-0))) + (set! (-> s2-0 x) (* arg0 f24-0 (sin f30-0))) + (set! (-> s2-0 z) (* arg0 f24-0 (cos f30-0))) + ) + (set! (-> s2-0 y) (* arg0 (sin f26-0))) + (vector-float*! (-> obj hellmouth) s2-0 f28-0) + (vector+! (-> obj hellmouth) (-> obj hellmouth) s3-0) + (spawn-mistycannon-missile obj s3-0 s2-0 f30-0 arg1 f28-0 arg2 (-> obj entity)) + ) + (sound-play-by-name (static-sound-name "cannon-shot") (new-sound-id) 1024 0 0 1 #t) + (set! (-> obj part local-clock) 0) + (set! (-> obj part-timer) (the-as uint (-> *display* base-frame-counter))) + (mistycannon-pick-random-target-point) + 0 + (none) + ) + +(defmethod dummy-23 mistycannon ((obj mistycannon)) + (when (< (- (-> *display* base-frame-counter) (the-as int (-> obj part-timer))) 900) + (let ((v1-4 (-> obj rotate))) + (set! (-> *part-id-table* 529 init-specs 24 initial-valuef) + (the float (sar (shl (the int (+ (-> v1-4 min) (-> v1-4 value))) 48) 48)) + ) + ) + (let ((v1-12 (-> obj rotate))) + (set! (-> *part-id-table* 530 init-specs 23 initial-valuef) + (the float (sar (shl (the int (+ (-> v1-12 min) (-> v1-12 value))) 48) 48)) + ) + ) + (let ((v1-20 (-> obj rotate))) + (set! (-> *part-id-table* 534 init-specs 21 initial-valuef) + (the float (sar (shl (the int (+ (-> v1-20 min) (-> v1-20 value))) 48) 48)) + ) + ) + (let ((f0-18 16384.0) + (v1-28 (-> obj tilt)) + ) + (set! (-> *part-id-table* 529 init-specs 22 initial-valuef) + (- f0-18 (the float (sar (shl (the int (+ (-> v1-28 min) (-> v1-28 value))) 48) 48))) + ) + ) + (let ((f0-20 16384.0) + (v1-36 (-> obj tilt)) + ) + (set! (-> *part-id-table* 530 init-specs 21 initial-valuef) + (- f0-20 (the float (sar (shl (the int (+ (-> v1-36 min) (-> v1-36 value))) 48) 48))) + ) + ) + (let ((f0-22 16384.0) + (v1-44 (-> obj tilt)) + ) + (set! (-> *part-id-table* 534 init-specs 20 initial-valuef) + (- f0-22 (the float (sar (shl (the int (+ (-> v1-44 min) (-> v1-44 value))) 48) 48))) + ) + ) + (spawn (-> obj part) (-> obj hellmouth)) + ) + 0 + (none) + ) + +(defskelgroup *mistycannon-sg* mistycannon + 0 + 3 + ((1 (meters 20)) (2 (meters 999999))) + :bounds (static-spherem 0 5 0 9) + :longest-edge (meters 4) + ) + +(defun mistycannon-prebind-function ((arg0 mistycannon) (arg1 int) (arg2 mistycannon)) + (let ((t9-0 quaternion-axis-angle!) + (a0-1 (&-> arg0 link)) + (a1-1 0.0) + (a2-1 1.0) + (a3-0 0.0) + (v1-0 (-> arg2 rotate)) + ) + (t9-0 + (the-as quaternion a0-1) + a1-1 + a2-1 + a3-0 + (the float (sar (shl (the int (+ (-> v1-0 min) (-> v1-0 value))) 48) 48)) + ) + ) + (let ((t9-1 quaternion-axis-angle!) + (a0-2 (&-> arg0 tilt min)) + (a1-2 -1.0) + (a2-2 0.0) + (a3-1 0.0) + (v1-4 (-> arg2 tilt)) + ) + (t9-1 + (the-as quaternion a0-2) + a1-2 + a2-2 + a3-1 + (the float (sar (shl (the int (+ (-> v1-4 min) (-> v1-4 value))) 48) 48)) + ) + ) + (let* ((v1-8 (-> arg2 rotate)) + (f0-16 + (- (the float (sar (shl (the int (+ (-> v1-8 min) (-> v1-8 value))) 48) 48)) (-> arg2 last-known-rotation)) + ) + ) + (set! (-> arg2 front-wheel) (the float (sar (shl (the int (+ (-> arg2 front-wheel) (* 5.0 f0-16))) 48) 48))) + (set! (-> arg2 rear-wheel) (the float (sar (shl (the int (+ (-> arg2 rear-wheel) (* 3.0 f0-16))) 48) 48))) + ) + (let ((v1-19 (-> arg2 rotate))) + (set! (-> arg2 last-known-rotation) + (the float (sar (shl (the int (+ (-> v1-19 min) (-> v1-19 value))) 48) 48)) + ) + ) + (quaternion-axis-angle! (the-as quaternion (&-> arg0 stack 324)) -1.0 0.0 0.0 (-> arg2 front-wheel)) + (quaternion-axis-angle! (the-as quaternion (&-> arg0 stack 276)) 1.0 0.0 0.0 (-> arg2 front-wheel)) + (quaternion-axis-angle! (the-as quaternion (&-> arg0 goggles y)) -1.0 0.0 0.0 (-> arg2 rear-wheel)) + (quaternion-axis-angle! (the-as quaternion (&-> arg0 at-point y)) 1.0 0.0 0.0 (-> arg2 rear-wheel)) + 0 + (none) + ) + +(defun mistycannon-postbind-function ((arg0 mistycannon)) + (set! (-> arg0 launch-origin quad) (-> arg0 node-list data 4 bone transform vector 3 quad)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set-vector! s5-0 0.0 53248.0 -4096.0 1.0) + (vector-matrix*! s5-0 s5-0 (-> arg0 node-list data 3 bone transform)) + (set! (-> arg0 goggles quad) (-> s5-0 quad)) + ) + (set! (-> arg0 postbindinfo-ok) #t) + 0 + (none) + ) + +(defstate mistycannon-idle (mistycannon) + :trans + (behavior () + (if (not (and (-> self entity) (logtest? (-> self entity extra perm status) (entity-perm-status complete)))) + (go mistycannon-waiting-for-player) + ) + (if (and + (-> self postbindinfo-ok) + *target* + (>= (-> self fact-info-override idle-distance) + (vector-vector-distance (-> self root-override trans) (-> *target* control trans)) + ) + ) + (go mistycannon-aim-at-player) + ) + (rider-trans) + (none) + ) + :code + (behavior () + (while #t + (dummy-23 self) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +(deftype quadratic-solution (structure) + ((s1 float :offset-assert 0) + (s2 float :offset-assert 4) + ) + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + + +(defun solve-missile-tilt ((arg0 quadratic-solution) (arg1 float) (arg2 float) (arg3 float) (arg4 float)) + (let* ((f1-3 (* 0.5 arg2 arg2 arg4)) + (f0-3 f1-3) + (f30-0 (- (* arg2 arg1 arg1))) + (f2-6 (+ f1-3 (* arg1 arg1 arg3))) + (f1-5 (- (* f30-0 f30-0) (* 4.0 f2-6 f0-3))) + (f28-0 (/ 0.5 f0-3)) + ) + (if (< f1-5 0.0) + (return #f) + ) + (let ((f26-0 (sqrtf f1-5))) + (set! (-> arg0 s1) (atan (* (+ (- f30-0) f26-0) f28-0) 1.0)) + (set! (-> arg0 s2) (atan (* (- (- f30-0) f26-0) f28-0) 1.0)) + ) + ) + #t + ) + +(deftype trajectory-params (structure) + ((x float :offset-assert 0) + (y float :offset-assert 4) + (gravity float :offset-assert 8) + (theta float :offset-assert 12) + (speed float :offset-assert 16) + (time float :offset-assert 20) + ) + :method-count-assert 9 + :size-assert #x18 + :flag-assert #x900000018 + ) + + +(defun solve-missile-velocity ((arg0 trajectory-params) (arg1 float)) + (set! (-> arg0 theta) arg1) + (let ((f0-4 (* (- (* (-> arg0 x) (tan arg1)) (-> arg0 y)) (/ 2.0 (-> arg0 gravity))))) + (when (< 0.0 f0-4) + (set! (-> arg0 time) (sqrtf f0-4)) + (set! (-> arg0 speed) (/ (-> arg0 x) (* (-> arg0 time) (cos arg1)))) + ) + ) + 0 + (none) + ) + +(defbehavior mistycannon-find-best-solution mistycannon ((arg0 quadratic-solution)) + (let ((v1-0 #t) + (a1-0 #t) + (v0-0 -1) + ) + (let ((f1-0 (-> self tilt min)) + (f0-1 (+ (-> self tilt range) (-> self tilt min))) + ) + (if (< (-> arg0 s1) f1-0) + (set! v1-0 #f) + ) + (if (< f0-1 (-> arg0 s1)) + (set! v1-0 #f) + ) + (if (< (-> arg0 s2) f1-0) + (set! a1-0 #f) + ) + (if (< f0-1 (-> arg0 s2)) + (set! a1-0 #f) + ) + ) + (if v1-0 + (set! v0-0 0) + ) + (if a1-0 + (set! v0-0 1) + ) + (set! a1-0 (and v1-0 a1-0)) + (when a1-0 + (if (< (-> arg0 s1) (-> arg0 s2)) + (set! v0-0 0) + (set! v0-0 1) + ) + ) + v0-0 + ) + ) + +(defbehavior mistycannon-find-trajectory mistycannon ((arg0 trajectory-params)) + (set! (-> arg0 time) 0.0) + (solve-missile-velocity arg0 (-> arg0 theta)) + (none) + ) + +;; WARN: Expression building failed: Function mistycannon-do-aim has a return type of none, but the expression builder found a return statement. +(defbehavior mistycannon-do-aim mistycannon ((arg0 vector) (arg1 vector)) + (if (not (-> self postbindinfo-ok)) + (return #f) + ) + (when (-> self avoid-entity) + (let ((a1-1 (-> self avoid-entity extra trans))) + (if (< (vector-vector-distance arg0 a1-1) 122880.0) + (return #f) + ) + ) + ) + (let ((gp-0 (new 'stack-no-clear 'trajectory-params))) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (vector-! s4-0 arg0 (-> self launch-origin)) + (set! (-> gp-0 x) (vector-xz-length s4-0)) + (set! (-> gp-0 y) (-> s4-0 y)) + ) + (set! (-> gp-0 gravity) (-> *standard-dynamics* gravity-length)) + (set! (-> gp-0 speed) 409600.0) + (set! (-> gp-0 theta) (-> self target-theta)) + (mistycannon-find-trajectory gp-0) + (let ((v1-12 (new 'stack-no-clear 'vector)) + (s4-1 (new 'stack-no-clear 'vector)) + ) + (vector-float*! v1-12 arg1 (* 0.4 (+ 2.0 (-> gp-0 time)))) + (vector+! s4-1 arg0 v1-12) + (let ((f30-0 (* (sqrtf (rand-vu)) (-> self accuracy-range))) + (f28-1 (* 65536.0 (rand-vu))) + ) + (+! (-> s4-1 x) (* f30-0 (cos f28-1))) + (+! (-> s4-1 z) (* f30-0 (sin f28-1))) + ) + (let ((s5-1 (new 'stack-no-clear 'vector))) + (vector-! s5-1 s4-1 (-> self launch-origin)) + (let ((f0-19 (atan (-> s5-1 x) (-> s5-1 z)))) + (angle-tracker-seek! (-> self rotate) f0-19) + ) + (set! (-> gp-0 x) (vector-xz-length s5-1)) + (set! (-> gp-0 y) (-> s5-1 y)) + ) + ) + (mistycannon-find-trajectory gp-0) + (when (= (-> gp-0 time) 0.0) + (when (>= (- (-> *display* base-frame-counter) (-> self state-time)) 900) + (dummy-22 self 409600.0 2.0 20480.0) + (set! (-> self state-time) (-> *display* base-frame-counter)) + ) + (return #f) + ) + (when (angle-tracker-seek! (-> self tilt) (-> gp-0 theta)) + (when (>= (- (-> *display* base-frame-counter) (-> self state-time)) 900) + (dummy-22 self (fmax 163840.0 (fmin 409600.0 (-> gp-0 speed))) (-> gp-0 time) 20480.0) + (set! (-> self state-time) (-> *display* base-frame-counter)) + ) + ) + ) + 0 + (none) + ) + +(defstate mistycannon-aim-at-player (mistycannon) + :enter + (behavior () (set! (-> self state-time) (-> *display* base-frame-counter)) (none)) + :trans + (behavior () + (if (not (and (-> self entity) (logtest? (-> self entity extra perm status) (entity-perm-status complete)))) + (go mistycannon-waiting-for-player) + ) + (if (not (and *target* (>= (-> self fact-info-override idle-distance) + (vector-vector-distance (-> self root-override trans) (-> *target* control trans)) + ) + ) + ) + (go mistycannon-idle) + ) + (rider-trans) + (none) + ) + :code + (behavior () + (while #t + (if (< (vector-vector-xz-distance (target-pos 0) (-> self center-point)) (-> self center-point w)) + (mistycannon-do-aim (-> *target* control trans) (-> *target* control transv)) + (mistycannon-do-aim (-> self at-point) (new-stack-vector0)) + ) + (dummy-23 self) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +(defstate mistycannon-waiting-for-player (mistycannon) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('touch) + (when ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry (-> arg3 param 0)) + (-> self root-override) + (the-as uint 1) + ) + (let ((v0-1 (the-as object #t))) + (set! (-> self player-touching-grips?) (the-as symbol v0-1)) + v0-1 + ) + ) + ) + (('change-mode) + (go mistycannon-player-control) + ) + ) + ) + :trans + (behavior () + (if (and (-> self entity) (logtest? (-> self entity extra perm status) (entity-perm-status complete))) + (go mistycannon-aim-at-player) + ) + (rider-trans) + (none) + ) + :code + (behavior () + (set! (-> self player-touching-grips?) #f) + (while #t + (let ((f0-0 2730.6667) + (v1-0 (-> self tilt)) + ) + (if (< f0-0 (the float (sar (shl (the int (+ (-> v1-0 min) (-> v1-0 value))) 48) 48))) + (angle-tracker-seek! (-> self tilt) 2730.6667) + ) + ) + (dummy-23 self) + (when (and (-> self player-touching-grips?) (not (level-hint-displayed?))) + (set! (-> self player-touching-grips?) #f) + (hide-hud) + (level-hint-surpress!) + (kill-current-level-hint '() '(sidekick voicebox) 'exit) + (when (and (hud-hidden?) (can-grab-display? (the-as process-taskable self))) + (let ((gp-0 + (new 'stack 'font-context *font-default-matrix* 32 160 0.0 (font-color default) (font-flags shadow kerning)) + ) + ) + (let ((v1-15 gp-0)) + (set! (-> v1-15 width) (the float 440)) + ) + (let ((v1-16 gp-0)) + (set! (-> v1-16 height) (the float 80)) + ) + (set! (-> gp-0 flags) (font-flags shadow kerning large)) + (print-game-text (lookup-text! *common-text* (game-text-id press-to-use) #f) gp-0 #f 128 22) + ) + (when (cpad-pressed? 0 circle) + (while #t + (send-event *target* 'change-mode 'periscope self) + (suspend) + (suspend) + ) + ) + ) + ) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +(defstate cam-mistycannon (camera-slave) + :event + cam-standard-event-handler + :enter + (behavior () + (when (not (-> self enter-has-run)) + (set! (-> self blend-from-type) (the-as uint 1)) + (set! (-> self blend-to-type) (the-as uint 1)) + ) + (none) + ) + :trans + (behavior () + (if (zero? (logand (-> *camera* master-options) 2)) + (cam-slave-go cam-free-floating) + ) + (none) + ) + :code + (behavior () + (while #t + (let ((v1-0 (-> self change-event-from))) + (set! (-> self trans quad) (-> (the-as mistycannon (-> v1-0 0)) goggles quad)) + (let ((t9-0 matrix-rotate-yx!) + (a0-1 (-> self tracking)) + (v1-2 (-> (the-as mistycannon (-> v1-0 0)) rotate)) + ) + (t9-0 (the-as matrix a0-1) (the float (sar (shl (the int (+ (-> v1-2 min) (-> v1-2 value))) 48) 48)) 3640.889) + ) + ) + (suspend) + ) + (none) + ) + ) + +(defstate mistycannon-player-control (mistycannon) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('change-mode) + (send-event *camera* 'change-state cam-mistycannon 0) + ) + ) + ) + :exit + (behavior () (sound-stop (-> self sound-id)) (sound-stop (-> self aim-sound-id)) (none)) + :trans + (behavior () (dummy-23 self) (rider-trans) (none)) + :code + (behavior () + (send-event *camera* 'change-state cam-mistycannon 0) + (suspend) + (set! (-> self state-time) (-> *display* base-frame-counter)) + (let ((gp-0 0) + (s5-0 0) + ) + (while #t + (when *camera-read-analog* + (let ((f30-0 (analog-input (the-as int (-> *cpad-list* cpads 0 leftx)) 128.0 48.0 110.0 -1.0)) + (f28-0 (analog-input (the-as int (-> *cpad-list* cpads 0 lefty)) 128.0 48.0 110.0 -1.0)) + ) + (rotate! self f30-0) + (tilt! self (- f28-0)) + (if (or (!= f30-0 0.0) (!= f28-0 0.0)) + (sound-play-by-name (static-sound-name "telescope") (-> self aim-sound-id) 1024 0 0 1 #t) + (sound-stop (-> self aim-sound-id)) + ) + ) + ) + (when (cpad-pressed? 0 triangle) + (process-entity-status! self (entity-perm-status bit-3) #t) + (sound-stop (-> self sound-id)) + (send-event *camera* 'change-to-entity-by-name "camera-111") + (suspend) + (while #t + (let ((a1-8 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-8 from) self) + (set! (-> a1-8 num-params) 0) + (set! (-> a1-8 message) 'end-mode) + (when (send-event-function *target* a1-8) + (send-event *camera* 'change-state *camera-base-mode* 0) + (process-entity-status! self (entity-perm-status bit-3) #f) + (go mistycannon-waiting-for-player-to-fuck-off) + ) + ) + (suspend) + ) + ) + (let ((v1-45 (and (cpad-hold? 0 x) (>= (- (-> *display* base-frame-counter) (-> self state-time)) 300)))) + (when (zero? s5-0) + (when v1-45 + (set! gp-0 (seekl gp-0 300 (- (-> *display* base-frame-counter) (-> *display* old-base-frame-counter)))) + (sound-play-by-name + (static-sound-name "cannon-charge") + (-> self sound-id) + 1024 + (the int (* 1524.0 (* 0.008 (the float gp-0)))) + 0 + 1 + #t + ) + ) + (when (or + (= gp-0 300) + (and (zero? (logand (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons x))) (nonzero? gp-0)) + ) + (let ((gp-1 (+ 50 (the int (* 0.16666667 (the float gp-0)))))) + (level-hint-spawn (game-text-id daxter-get-some) "sksp009f" (the-as entity #f) *entity-pool* (game-task none)) + (dummy-22 self (* 4096.0 (the float gp-1)) 2.0 40960.0) + ) + (set! (-> self state-time) (-> *display* base-frame-counter)) + (set! gp-0 0) + (set! s5-0 1) + (sound-stop (-> self sound-id)) + ) + (if (nonzero? gp-0) + (debug-percent-bar + #t + (bucket-id debug-draw0) + 192 + 160 + (* 0.0033333334 (the float gp-0)) + (new 'static 'rgba :r #xff :a #x80) + ) + ) + ) + ) + (if (zero? (logand (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons x))) + (set! s5-0 0) + ) + (suspend) + ) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +(defstate mistycannon-waiting-for-player-to-fuck-off (mistycannon) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (let ((v1-0 arg2)) + (the-as object (when (= v1-0 'touch) + (when ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry (-> arg3 param 0)) + (-> self root-override) + (the-as uint 1) + ) + (let ((v0-0 (-> *display* base-frame-counter))) + (set! (-> self state-time) v0-0) + v0-0 + ) + ) + ) + ) + ) + ) + :enter + (behavior () (set! (-> self state-time) (-> *display* base-frame-counter)) (none)) + :trans + (the-as (function none :behavior mistycannon) rider-trans) + :code + (behavior () + (while #t + (suspend) + (dummy-23 self) + (if (>= (- (-> *display* base-frame-counter) (-> self state-time)) 300) + (go mistycannon-waiting-for-player) + ) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +(defmethod init-from-entity! mistycannon ((obj mistycannon) (arg0 entity-actor)) + (local-vars (sv-16 res-tag) (sv-32 res-tag) (sv-48 res-tag)) + (set! (-> obj mask) (logior (process-mask enemy) (-> obj mask))) + (let ((s4-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-others)))) + (set! (-> s4-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-0 reaction) default-collision-reaction) + (set! (-> s4-0 no-reaction) + (the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing) + ) + (dummy-29 s4-0 1) + (let ((s3-0 (new 'process 'collide-shape-prim-group s4-0 (the-as uint 2) 0))) + (set! (-> s3-0 prim-core collide-as) (the-as uint 2048)) + (set! (-> s3-0 collide-with) (the-as uint 16)) + (set! (-> s3-0 prim-core action) (the-as uint 3)) + (set! (-> s3-0 transform-index) 3) + (set-vector! (-> s3-0 local-sphere) 0.0 20480.0 0.0 40960.0) + (set-root-prim! s4-0 s3-0) + (let ((s2-0 (new 'process 'collide-shape-prim-mesh s4-0 (the-as uint 0) (the-as uint 0)))) + (set! (-> s2-0 prim-core collide-as) (the-as uint 2048)) + (set! (-> s2-0 collide-with) (the-as uint 16)) + (set! (-> s2-0 prim-core action) (the-as uint 3)) + (set! (-> s2-0 prim-core offense) 4) + (set! (-> s2-0 transform-index) 3) + (set-vector! (-> s2-0 local-sphere) 0.0 20480.0 0.0 40960.0) + (append-prim s3-0 s2-0) + ) + (let ((s2-1 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 1)))) + (set! (-> s2-1 prim-core collide-as) (the-as uint 256)) + (set! (-> s2-1 collide-with) (the-as uint 16)) + (set! (-> s2-1 prim-core offense) 4) + (set! (-> s2-1 transform-index) 3) + (set-vector! (-> s2-1 local-sphere) 0.0 28672.0 -8192.0 4096.0) + (append-prim s3-0 s2-1) + ) + ) + (set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w))) + (backup-collide-with-as s4-0) + (set! (-> obj root-override) s4-0) + ) + (process-drawable-from-entity! obj arg0) + (quaternion-identity! (-> obj root-override quat)) + (initialize-skeleton obj *mistycannon-sg* '()) + (logior! (-> obj skel status) 1) + (dummy-47 (-> obj root-override)) + (set! (-> obj skel prebind-function) + (the-as (function pointer int process-drawable none) mistycannon-prebind-function) + ) + (set! (-> obj skel postbind-function) + (the-as (function pointer int process-drawable none) mistycannon-postbind-function) + ) + (set! (-> obj fact-info-override) + (new 'process 'fact-info-enemy obj (pickup-type eco-pill-random) (-> *FACT-bank* default-pill-inc)) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (let ((f30-0 (res-lump-float arg0 'rotmin :default 16384.0)) + (f28-0 (res-lump-float arg0 'rotmax :default 32768.0)) + (f0-15 (res-lump-float arg0 'rotspeed :default 3640.889)) + ) + (angle-tracker-init-range! (-> obj rotate) f30-0 f28-0 f0-15) + ) + (let ((f30-1 (res-lump-float arg0 'tiltmin :default -1820.4445)) + (f28-1 (res-lump-float arg0 'tiltmax :default 12743.111)) + (f0-16 (res-lump-float arg0 'tiltspeed :default 3640.889)) + ) + (angle-tracker-init-range! (-> obj tilt) f30-1 f28-1 f0-16) + ) + (set! (-> obj avoid-entity) (entity-actor-lookup (-> obj entity) 'alt-actor 0)) + (set! (-> obj center-point w) (res-lump-float arg0 'center-radius)) + (cond + ((= (-> obj center-point w) 0.0) + (set! (-> obj center-point quad) (-> obj root-override trans quad)) + (set! (-> obj center-point w) (-> obj fact-info-override idle-distance)) + ) + (else + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-64 (res-lump-data arg0 'center-point pointer :tag-ptr (& sv-16)))) + (set! (-> obj center-point x) (if (and v1-64 (< 0.0 (the float (-> sv-16 elt-count)))) + (-> (the-as (pointer float) v1-64)) + 0.0 + ) + ) + ) + (set! sv-32 (new 'static 'res-tag)) + (let ((v1-67 (res-lump-data arg0 'center-point (pointer float) :tag-ptr (& sv-32)))) + (set! (-> obj center-point y) (if (and v1-67 (< 1.0 (the float (-> sv-32 elt-count)))) + (-> v1-67 1) + 0.0 + ) + ) + ) + (set! sv-48 (new 'static 'res-tag)) + (let ((v1-70 (res-lump-data arg0 'center-point (pointer float) :tag-ptr (& sv-48)))) + (set! (-> obj center-point z) (if (and v1-70 (< 2.0 (the float (-> sv-48 elt-count)))) + (-> v1-70 2) + 0.0 + ) + ) + ) + ) + ) + (set! (-> obj accuracy-range) 16384.0) + (mistycannon-pick-random-target-point) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 119) obj)) + (set! (-> obj part-timer) (the-as uint (+ (-> *display* base-frame-counter) -3000))) + (set! (-> obj postbindinfo-ok) #f) + (let ((v1-79 (-> obj rotate))) + (set! (-> obj last-known-rotation) + (the float (sar (shl (the int (+ (-> v1-79 min) (-> v1-79 value))) 48) 48)) + ) + ) + (set! (-> obj sound-id) (new-sound-id)) + (set! (-> obj aim-sound-id) (new-sound-id)) + (if (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status complete))) + (go mistycannon-idle) + (go mistycannon-waiting-for-player) + ) + (none) + ) + + + + diff --git a/test/decompiler/reference/levels/common/mistycannon_REF.gc b/test/decompiler/reference/levels/common/mistycannon_REF.gc new file mode 100644 index 0000000000..8fc5d63414 --- /dev/null +++ b/test/decompiler/reference/levels/common/mistycannon_REF.gc @@ -0,0 +1,2180 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition of type angle-tracker +(deftype angle-tracker (structure) + ((value float :offset-assert 0) + (min float :offset-assert 4) + (range float :offset-assert 8) + (speed float :offset-assert 12) + ) + :method-count-assert 9 + :size-assert #x10 + :flag-assert #x900000010 + ) + +;; definition for method 3 of type angle-tracker +(defmethod inspect angle-tracker ((obj angle-tracker)) + (format #t "[~8x] ~A~%" obj 'angle-tracker) + (format #t "~Tvalue: ~f~%" (-> obj value)) + (format #t "~Tmin: ~f~%" (-> obj min)) + (format #t "~Trange: ~f~%" (-> obj range)) + (format #t "~Tspeed: ~f~%" (-> obj speed)) + obj + ) + +;; definition for function angle-tracker-apply-move! +(defun angle-tracker-apply-move! ((arg0 angle-tracker) (arg1 float)) + (let* ((f0-2 (* arg1 (-> arg0 speed) (-> *display* seconds-per-frame))) + (f0-3 (+ (-> arg0 value) f0-2)) + ) + (when (!= (-> arg0 range) 0.0) + (if (< f0-3 0.0) + (set! f0-3 0.0) + ) + (if (< (-> arg0 range) f0-3) + (set! f0-3 (-> arg0 range)) + ) + ) + (let ((f1-7 (- (-> arg0 value) f0-3))) + (if (= (-> arg0 range) 0.0) + (set! f0-3 (the float (sar (shl (the int f0-3) 48) 48))) + ) + (set! (-> arg0 value) f0-3) + f1-7 + ) + ) + ) + +;; definition for function angle-tracker-init-range! +;; INFO: Return type mismatch int vs none. +(defun angle-tracker-init-range! ((arg0 angle-tracker) (arg1 float) (arg2 float) (arg3 float)) + (set! (-> arg0 min) arg1) + (set! (-> arg0 range) (the float (sar (shl (the int (- arg2 arg1)) 48) 48))) + (if (< (-> arg0 range) 0.0) + (set! (-> arg0 range) (+ 65536.0 (-> arg0 range))) + ) + (set! (-> arg0 value) (* 0.5 (-> arg0 range))) + (set! (-> arg0 speed) arg3) + 0 + (none) + ) + +;; definition for function angle-tracker-get-value +(defun angle-tracker-get-value ((arg0 angle-tracker)) + (the float (sar (shl (the int (+ (-> arg0 min) (-> arg0 value))) 48) 48)) + ) + +;; definition for function angle-tracker-set-value +(defun angle-tracker-set-value ((arg0 angle-tracker) (arg1 float)) + (let ((v1-0 (- arg1 (-> arg0 min)))) + (when (!= (-> arg0 range) 0.0) + (if (< v1-0 0.0) + (set! v1-0 0.0) + ) + (if (< (-> arg0 range) v1-0) + (set! v1-0 (-> arg0 range)) + ) + ) + (set! (-> arg0 value) v1-0) + (+ (-> arg0 min) v1-0) + ) + ) + +;; definition for function angle-tracker-seek! +(defun angle-tracker-seek! ((arg0 angle-tracker) (arg1 float)) + (let* ((v1-0 arg0) + (f1-1 (the float (sar (shl (the int (+ (-> v1-0 min) (-> v1-0 value))) 48) 48))) + (f0-6 (* (-> arg0 speed) (-> *display* seconds-per-frame))) + (v1-9 (the float (sar (shl (the int (- arg1 f1-1)) 48) 48))) + ) + (when (< (fabs v1-9) f0-6) + (let ((f0-8 (+ (-> arg0 value) v1-9))) + (cond + ((= (-> arg0 range) 0.0) + (set! (-> arg0 value) (the float (sar (shl (the int f0-8) 48) 48))) + (return #t) + ) + (else + (when (< f0-8 0.0) + (set! (-> arg0 value) 0.0) + (return #f) + ) + (when (< (-> arg0 range) f0-8) + (set! (-> arg0 value) (-> arg0 range)) + (return #f) + ) + (set! (-> arg0 value) f0-8) + (return #t) + ) + ) + ) + (set! v1-9 (the-as float 0)) + ) + (cond + ((< v1-9 0.0) + (let ((f0-14 (- (-> arg0 value) f0-6))) + (set! f0-14 (cond + ((= (-> arg0 range) 0.0) + (the float (sar (shl (the int f0-14) 48) 48)) + ) + (else + (if (< f0-14 0.0) + (set! f0-14 0.0) + ) + f0-14 + ) + ) + ) + (set! (-> arg0 value) (the float (sar (shl (the int f0-14) 48) 48))) + ) + ) + (else + (let ((f0-20 (+ (-> arg0 value) f0-6))) + (set! f0-20 (cond + ((= (-> arg0 range) 0.0) + (the float (sar (shl (the int f0-20) 48) 48)) + ) + (else + (if (< (-> arg0 range) f0-20) + (set! f0-20 (-> arg0 range)) + ) + f0-20 + ) + ) + ) + (set! (-> arg0 value) (the float (sar (shl (the int f0-20) 48) 48))) + ) + ) + ) + ) + #f + ) + +;; failed to figure out what this is: +(set! (-> *part-group-id-table* 117) (new 'static 'sparticle-launch-group + :length 3 + :duration #xbb8 + :linger-duration #x5dc + :name "group-beach-sack-fuse" + :launcher + (new 'static 'inline-array sparticle-group-item 3 + (sp-item 517 :fade-after (meters 30.0)) + (sp-item 518 :fade-after (meters 120.0) :falloff-to (meters 120.0)) + (sp-item 519 :fade-after (meters 80.0) :falloff-to (meters 80.0)) + ) + :bounds (new 'static 'sphere :w 4096.0) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 517) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 18 + (sp-tex spt-texture (new 'static 'texture-id :index #xf :page #x2)) + (sp-flt spt-num 4.0) + (sp-flt spt-scale-x (meters 0.1)) + (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 192.0) + (sp-flt spt-g 192.0) + (sp-rnd-flt spt-b 64.0 128.0 1.0) + (sp-rnd-flt spt-a 4.0 24.0 1.0) + (sp-flt spt-vel-y (meters 0.013333334)) + (sp-rnd-flt spt-rotvel-z (degrees -0.15) (degrees 0.3) 1.0) + (sp-flt spt-fade-a 2.1333334) + (sp-flt spt-accel-y -0.4096) + (sp-int-plain-rnd spt-timer 45 14 1) + (sp-cpuinfo-flags bit2 bit3) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 180.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* 518) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 12 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 1.0) + (sp-rnd-flt spt-scale-x (meters 0.25) (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-flt spt-r 192.0) + (sp-flt spt-g 192.0) + (sp-rnd-flt spt-b 64.0 128.0 1.0) + (sp-rnd-flt spt-a 48.0 48.0 1.0) + (sp-int spt-timer 5) + (sp-cpuinfo-flags bit2 bit3) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 519) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 19 + (sp-tex spt-texture (new 'static 'texture-id :index #x12 :page #x2)) + (sp-flt spt-num 4.0) + (sp-flt spt-scale-x (meters 0.2)) + (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 32.0) + (sp-flt spt-g 32.0) + (sp-rnd-flt spt-b 8.0 24.0 1.0) + (sp-rnd-flt spt-a 160.0 95.0 1.0) + (sp-flt spt-scalevel-x (meters 0.016666668)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -8.366014) + (sp-flt spt-accel-y -8.192) + (sp-int spt-timer 15) + (sp-cpuinfo-flags bit2 bit3) + (sp-rnd-flt spt-conerot-x (degrees 0.0) (degrees 180.0) 1.0) + (sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-rnd-flt spt-conerot-radius (meters 0.6) (meters 0.2) 1.0) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-group-id-table* 118) + (new 'static 'sparticle-launch-group + :length 21 + :duration #xbb8 + :linger-duration #x5dc + :flags (sp-group-flag use-local-clock) + :name "group-beach-sack-explosion" + :launcher + (new 'static 'inline-array sparticle-group-item 21 + (sp-item 520 :period 1200 :length 30) + (sp-item 521 :fade-after (meters 60.0) :period 1200 :length 15) + (sp-item 522 :period 1200 :length 15 :offset 15) + (sp-item 523 :period 1200 :length 15) + (sp-item 524 :fade-after (meters 80.0) :falloff-to (meters 80.0) :period 1200 :length 30 :binding 525) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + (sp-item 525 :flags (start-dead)) + ) + :bounds (new 'static 'sphere :w 65536.0) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 520) (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 526) + (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* 526) + (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* 521) (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 527) + (sp-flt spt-rotate-y (degrees 0.0)) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 527) + (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* 522) (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* 523) (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* 524) (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 bit14) + (sp-int-plain-rnd spt-next-time 5 38 1) + (sp-launcher-by-id spt-next-launcher 528) + (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* 528) + (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* 525) + (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 bit14) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-group-id-table* 119) + (new 'static 'sparticle-launch-group + :length 30 + :duration #xbb8 + :linger-duration #x5dc + :flags (sp-group-flag use-local-clock) + :name "group-beach-cannon-fire" + :launcher + (new 'static 'inline-array sparticle-group-item 30 + (sp-item 529 :fade-after (meters 200.0) :falloff-to (meters 200.0) :period 1200 :length 30) + (sp-item 530 :fade-after (meters 100.0) :falloff-to (meters 100.0) :period 1200 :length 15) + (sp-item 531 :fade-after (meters 40.0) :falloff-to (meters 40.0) :period 1200 :length 15) + (sp-item 532 :period 1200 :length 15 :offset 15) + (sp-item 533 :period 1200 :length 15) + (sp-item 534 :fade-after (meters 40.0) :falloff-to (meters 40.0) :period 1200 :length 15 :binding 535) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + (sp-item 535 :flags (start-dead)) + ) + :bounds (new 'static 'sphere :w 98304.0) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 529) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 26 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 6.0) + (sp-rnd-flt spt-scale-x (meters 1.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 64.0) + (sp-flt spt-g 64.0) + (sp-rnd-flt spt-b 64.0 16.0 1.0) + (sp-flt spt-a 48.0) + (sp-rnd-flt spt-vel-y (meters 0.1) (meters 0.013333334) 1.0) + (sp-flt spt-vel-z (meters -0.033333335)) + (sp-flt spt-scalevel-x (meters 0.016666668)) + (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.27306667) + (sp-flt spt-friction 0.92) + (sp-int spt-timer 900) + (sp-cpuinfo-flags bit2 bit12) + (sp-int-plain-rnd spt-next-time 30 299 1) + (sp-launcher-by-id spt-next-launcher 536) + (sp-flt spt-launchrot-x (degrees 90.0)) + (sp-rnd-flt spt-launchrot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-x (degrees 45.0)) + (sp-flt spt-conerot-radius (meters 2.0)) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 536) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 4 + (sp-flt spt-scalevel-x (meters 0.006666667)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-a -0.16) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 530) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 25 + (sp-tex spt-texture (new 'static 'texture-id :page #x2)) + (sp-flt spt-num 5.0) + (sp-rnd-flt spt-scale-x (meters 1.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 64.0) + (sp-flt spt-g 64.0) + (sp-rnd-flt spt-b 64.0 16.0 1.0) + (sp-flt spt-a 48.0) + (sp-rnd-flt spt-vel-z (meters 0.3) (meters 0.06666667) 1.0) + (sp-flt spt-scalevel-x (meters 0.026666667)) + (sp-rnd-int-flt spt-rotvel-z (degrees -0.3) 1 109.22667) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-accel-y -0.27306667) + (sp-flt spt-friction 0.96) + (sp-int spt-timer 900) + (sp-cpuinfo-flags bit2 bit12) + (sp-int-plain-rnd spt-next-time 30 149 1) + (sp-launcher-by-id spt-next-launcher 536) + (sp-rnd-flt spt-launchrot-x (degrees -83.0) (degrees -7.0000005) 1.0) + (sp-rnd-flt spt-launchrot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-x (degrees 45.0)) + (sp-flt spt-conerot-radius (meters 2.0)) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 531) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 20 + (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 16.0) (meters 16.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) + (sp-int spt-next-time 15) + (sp-launcher-by-id spt-next-launcher 537) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 537) + (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* 532) (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) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 533) (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) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 534) (new 'static 'sparticle-launcher + :init-specs + (new 'static 'inline-array sp-field-init-spec 23 + (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-scale-x (meters 0.5) (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-flt spt-r 255.0) + (sp-flt spt-g 255.0) + (sp-flt spt-b 0.0) + (sp-flt spt-a 128.0) + (sp-rnd-flt spt-vel-z (meters 0.16666667) (meters 0.16666667) 1.0) + (sp-flt spt-fade-g -4.2222223) + (sp-flt spt-fade-b -2.8) + (sp-rnd-flt spt-accel-y -6.826667 -3.4133334 1.0) + (sp-flt spt-friction 0.95) + (sp-int spt-timer 600) + (sp-cpuinfo-flags bit2 bit3) + (sp-int-plain-rnd spt-next-time 10 89 1) + (sp-launcher-by-id spt-next-launcher 538) + (sp-rnd-flt spt-launchrot-x (degrees -60.0) (degrees -60.0) 1.0) + (sp-rnd-flt spt-launchrot-y (degrees 0.0) (degrees 360.0) 1.0) + (sp-flt spt-conerot-x (degrees 45.0)) + (sp-flt spt-rotate-y (degrees 90.0)) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 538) + (new 'static 'sparticle-launcher :init-specs (new 'static 'inline-array sp-field-init-spec 6 + (sp-flt spt-scalevel-x (meters -0.0033333334)) + (sp-copy-from-other spt-scalevel-y -4) + (sp-flt spt-fade-r -0.6) + (sp-flt spt-fade-g -1.8) + (sp-flt spt-fade-a -0.85333335) + (sp-end) + ) + ) + ) + +;; failed to figure out what this is: +(set! (-> *part-id-table* 535) + (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 0.5) + (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 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-flt spt-r 64.0) + (sp-flt spt-g 64.0) + (sp-flt spt-b 64.0) + (sp-rnd-flt spt-a 16.0 8.0 1.0) + (sp-flt spt-scalevel-x (meters 0.006666667)) + (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.08) + (sp-int spt-timer 300) + (sp-cpuinfo-flags bit2 bit12) + (sp-end) + ) + ) + ) + +;; definition of type mistycannon-missile +(deftype mistycannon-missile (process-drawable) + ((root-override collide-shape-moving :offset 112) + (muzzle-time float :offset-assert 176) + (tumble-quat quaternion :inline :offset-assert 192) + (blast-radius float :offset-assert 208) + (water-height float :offset-assert 212) + (sfx uint32 :offset-assert 216) + (part2 sparticle-launch-control :offset-assert 220) + (ground-time uint64 :offset-assert 224) + ) + :heap-base #x80 + :method-count-assert 21 + :size-assert #xe8 + :flag-assert #x15008000e8 + (:methods + (spawn-part (_type_) none 20) + ) + (:states + mistycannon-missile-explode + mistycannon-missile-idle + mistycannon-missile-in-water + ) + ) + +;; definition for method 3 of type mistycannon-missile +(defmethod inspect mistycannon-missile ((obj mistycannon-missile)) + (let ((t9-0 (method-of-type process-drawable inspect))) + (t9-0 obj) + ) + (format #t "~T~Tmuzzle-time: ~f~%" (-> obj muzzle-time)) + (format #t "~T~Ttumble-quat: #~%" (-> obj tumble-quat)) + (format #t "~T~Tblast-radius: ~f~%" (-> obj blast-radius)) + (format #t "~T~Twater-height: ~f~%" (-> obj water-height)) + (format #t "~T~Tsfx: ~D~%" (-> obj sfx)) + (format #t "~T~Tpart2: ~A~%" (-> obj part2)) + (format #t "~T~Tground-time: ~D~%" (-> obj ground-time)) + obj + ) + +;; definition for method 7 of type mistycannon-missile +;; INFO: Return type mismatch process-drawable vs mistycannon-missile. +(defmethod relocate mistycannon-missile ((obj mistycannon-missile) (arg0 int)) + (if (nonzero? (-> obj part2)) + (&+! (-> obj part2) arg0) + ) + (the-as mistycannon-missile ((method-of-type process-drawable relocate) obj arg0)) + ) + +;; definition for method 10 of type mistycannon-missile +(defmethod deactivate mistycannon-missile ((obj mistycannon-missile)) + (if (nonzero? (-> obj part2)) + (kill-and-free-particles (-> obj part2)) + ) + ((method-of-type process-drawable deactivate) obj) + (none) + ) + +;; failed to figure out what this is: +(defskelgroup *mistycannon-missile-sg* sack + 0 + 2 + ((1 (meters 999999))) + :bounds (static-spherem 0 0 0 4) + :longest-edge (meters 0) + ) + +;; definition for method 20 of type mistycannon-missile +;; INFO: Return type mismatch int vs none. +(defmethod spawn-part mistycannon-missile ((obj mistycannon-missile)) + (let ((gp-0 (-> obj part)) + (a1-1 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 7))) + ) + (spawn gp-0 a1-1) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate mistycannon-missile-idle (mistycannon-missile) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('attack) + (go mistycannon-missile-explode) + ) + ) + ) + :enter + (behavior () + (set! (-> self state-time) (-> *display* base-frame-counter)) + (set! (-> self sfx) (the-as uint 0)) + 0 + (none) + ) + :trans + (behavior () + (if (< (-> self root-override trans y) (-> self water-height)) + (go mistycannon-missile-in-water) + ) + (none) + ) + :code + (behavior () + (clear-collide-with-as (-> self root-override)) + (while (< (- (-> *display* base-frame-counter) (-> self state-time)) (the int (* 300.0 (-> self muzzle-time)))) + (quaternion*! (-> self root-override quat) (-> self root-override quat) (-> self tumble-quat)) + (suspend) + (let ((f0-1 + (fmin + 1.0 + (/ (the float (- (-> *display* base-frame-counter) (-> self state-time))) + (the float (the int (* 300.0 (-> self muzzle-time)))) + ) + ) + ) + ) + (set! (-> self root-override scale x) (* 0.6 f0-1)) + (set! (-> self root-override scale y) (* 0.6 f0-1)) + (set! (-> self root-override scale z) (* 0.6 f0-1)) + ) + ) + (restore-collide-with-as (-> self root-override)) + (set-vector! (-> self root-override scale) 0.6 0.6 0.6 1.0) + (while (zero? (logand (-> self root-override status) 1)) + (if (and + (zero? (-> self sfx)) + (< (if *target* + (vector-vector-distance (-> self root-override trans) (-> *target* control trans)) + 4096000.0 + ) + 409600.0 + ) + ) + (set! (-> self sfx) + (the-as + uint + (sound-play-by-name + (static-sound-name "sack-incoming") + (new-sound-id) + 1024 + 0 + 0 + 1 + (the-as symbol (-> self root-override trans)) + ) + ) + ) + ) + (when (nonzero? (-> self sfx)) + (let ((gp-1 (the-as sound-rpc-set-param (get-sound-buffer-entry)))) + (set! (-> gp-1 command) (sound-command set-param)) + (set! (-> gp-1 id) (the-as sound-id (-> self sfx))) + (let ((a1-3 (-> self root-override trans))) + (let ((s5-1 self)) + (when (= a1-3 #t) + (if (and s5-1 (type-type? (-> s5-1 type) process-drawable) (nonzero? (-> s5-1 root-override))) + (set! a1-3 (-> s5-1 root-override trans)) + (set! a1-3 (the-as vector #f)) + ) + ) + ) + (sound-trans-convert (-> gp-1 parms trans) a1-3) + ) + (set! (-> gp-1 parms mask) (the-as uint 32)) + (-> gp-1 id) + ) + ) + (quaternion*! (-> self root-override quat) (-> self root-override quat) (-> self tumble-quat)) + (suspend) + ) + (quaternion-set! (-> self root-override quat) 0.0 0.0 0.0 1.0) + (dummy-47 (-> self root-override)) + (when (nonzero? (-> self sfx)) + (sound-stop (the-as sound-id (-> self sfx))) + (set! (-> self sfx) (the-as uint 0)) + 0 + ) + (set! (-> self ground-time) (the-as uint (-> *display* base-frame-counter))) + (sound-play-by-name + (static-sound-name "sack-land") + (new-sound-id) + 1024 + 0 + 0 + 1 + (the-as symbol (-> self root-override trans)) + ) + (let ((a0-18 (-> self skel root-channel 0))) + (set! (-> a0-18 frame-group) (the-as art-joint-anim (-> self draw art-group data 3))) + (set! (-> a0-18 param 0) + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 3)) data 0 length) -1)) + ) + (set! (-> a0-18 param 1) 1.0) + (set! (-> a0-18 frame-num) 0.0) + (joint-control-channel-group! a0-18 (the-as art-joint-anim (-> self draw art-group data 3)) num-func-seek!) + ) + (until (ja-done? 0) + (suspend) + (let ((a0-19 (-> self skel root-channel 0))) + (set! (-> a0-19 param 0) (the float (+ (-> a0-19 frame-group data 0 length) -1))) + (set! (-> a0-19 param 1) 1.0) + (joint-control-channel-group-eval! a0-19 (the-as art-joint-anim #f) num-func-seek!) + ) + ) + (let ((a0-21 (-> self skel root-channel 0))) + (set! (-> a0-21 frame-group) (the-as art-joint-anim (-> self draw art-group data 4))) + (set! (-> a0-21 param 0) + (the float (+ (-> (the-as art-joint-anim (-> self draw art-group data 4)) data 0 length) -1)) + ) + (set! (-> a0-21 param 1) 1.0) + (set! (-> a0-21 frame-num) 0.0) + (joint-control-channel-group! a0-21 (the-as art-joint-anim (-> self draw art-group data 4)) num-func-seek!) + ) + (until (ja-done? 0) + (suspend) + (let ((a0-22 (-> self skel root-channel 0))) + (set! (-> a0-22 param 0) (the float (+ (-> a0-22 frame-group data 0 length) -1))) + (set! (-> a0-22 param 1) 1.0) + (joint-control-channel-group-eval! a0-22 (the-as art-joint-anim #f) num-func-seek!) + ) + ) + (go mistycannon-missile-explode) + (none) + ) + :post + (behavior () + (vector-v++! (-> self root-override transv) (dummy-62 (-> self root-override) (new-stack-vector0) 1.0)) + (set! (-> self root-override root-prim prim-core offense) 1) + (dummy-33 + (-> self root-override) + (-> self root-override transv) + (-> self root-override root-prim collide-with) + ) + (set! (-> self root-override root-prim prim-core offense) 4) + (spawn-part self) + (when (and (zero? (-> self draw cur-lod)) (logtest? (-> self draw status) 8)) + (if (logtest? (-> self root-override status) 1) + (draw-shadow + (-> self root-override shadow-pos) + (-> self root-override shadow-pos) + (-> self root-override ground-poly-normal) + 8192.0 + 4096.0 + (the-as float 0) + ) + (find-ground-and-draw-shadow + (-> self root-override trans) + (-> self root-override shadow-pos) + 8192.0 + (the-as uint 1) + (the-as process #f) + 0.0 + 81920.0 + ) + ) + ) + (ja-post) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate mistycannon-missile-in-water (mistycannon-missile) + :code + (behavior () + (when (nonzero? (-> self sfx)) + (sound-stop (the-as sound-id (-> self sfx))) + (set! (-> self sfx) (the-as uint 0)) + 0 + ) + (let ((a1-0 (new-stack-vector0))) + (set! (-> a1-0 x) (-> self root-override trans x)) + (set! (-> a1-0 y) (-> self water-height)) + (set! (-> a1-0 z) (-> self root-override trans z)) + (set! (-> a1-0 w) 1.0) + (splash-spawn (the-as basic 1.0) (the-as basic a1-0) 1) + ) + (label cfg-3) + (vector-v++! (-> self root-override transv) (dummy-62 (-> self root-override) (new-stack-vector0) 1.0)) + (vector-float*! (-> self root-override transv) (-> self root-override transv) 0.5) + (dummy-47 (-> self root-override)) + (dummy-33 + (-> self root-override) + (-> self root-override transv) + (-> self root-override root-prim collide-with) + ) + (set! (-> self root-override scale x) + (seek (-> self root-override scale x) 0.0 (* 0.01 (-> *display* time-adjust-ratio))) + ) + (set! (-> self root-override scale y) + (seek (-> self root-override scale y) 0.0 (* 0.01 (-> *display* time-adjust-ratio))) + ) + (set! (-> self root-override scale z) + (seek (-> self root-override scale z) 0.0 (* 0.01 (-> *display* time-adjust-ratio))) + ) + (when (< 0.05 (-> self root-override scale x)) + (suspend) + (goto cfg-3) + ) + (ja-channel-set! 0) + (none) + ) + :post + (the-as (function none :behavior mistycannon-missile) ja-post) + ) + +;; failed to figure out what this is: +(defstate mistycannon-missile-explode (mistycannon-missile) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('touched) + (let* ((s4-0 arg0) + (v1-2 (if (and (nonzero? s4-0) (type-type? (-> s4-0 type) process-drawable)) + s4-0 + ) + ) + ) + (when v1-2 + (let* ((v1-3 (-> (the-as mistycannon-missile v1-2) root-override)) + (a1-2 (-> self root-override root-prim prim-core)) + (v1-5 (-> v1-3 root-prim prim-core)) + (a2-1 (new 'stack-no-clear 'vector)) + (t2-0 (new 'stack-no-clear 'collide-mesh-cache-tri)) + ) + 0.0 + (vector-! a2-1 (the-as vector v1-5) (the-as vector a1-2)) + (when (< (dummy-10 *collide-cache* (the-as vector a1-2) a2-1 40.96 1 self (the-as collide-tri-result t2-0) 1) 0.0) + (cond + ((= (-> arg0 type) target) + (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)) + (let ((a0-8 (new 'static 'attack-info :mask #x20))) + (set! (-> a0-8 mode) 'explode) + (set! (-> a1-3 param 1) (the-as uint a0-8)) + ) + (send-event-function arg0 a1-3) + ) + ) + (else + (let ((a1-4 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-4 from) self) + (set! (-> a1-4 num-params) 4) + (set! (-> a1-4 message) 'attack) + (set! (-> a1-4 param 0) (-> arg3 param 0)) + (set! (-> a1-4 param 1) (the-as uint 'explode)) + (let ((v1-18 (+ *global-attack-id* 1))) + (set! *global-attack-id* v1-18) + (set! (-> a1-4 param 2) (the-as uint v1-18)) + ) + (set! (-> a1-4 param 3) (the-as uint 0)) + (send-event-function arg0 a1-4) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + :code + (behavior () + (if (and *target* (= (-> *target* next-state name) 'target-periscope)) + (sound-play-by-spec + (new 'static 'sound-spec + :mask #xc0 + :num 1.0 + :group #x1 + :sound-name (static-sound-name "explosion") + :volume #x400 + :fo-min #xc8 + :fo-max #x190 + ) + (new-sound-id) + (the-as vector #t) + ) + (sound-play-by-spec + (new 'static 'sound-spec :num 1.0 :group #x1 :sound-name (static-sound-name "explosion") :volume #x400) + (new-sound-id) + (the-as vector #t) + ) + ) + (spawn (-> self part2) (-> self root-override trans)) + (ja-channel-set! 0) + (let ((v1-11 (-> self root-override root-prim))) + (set! (-> v1-11 local-sphere w) (-> self blast-radius)) + (set! (-> v1-11 prim-core world-sphere w) (-> self blast-radius)) + (set! (-> v1-11 collide-with) (the-as uint 924)) + (set! (-> v1-11 prim-core collide-as) (the-as uint 256)) + ) + (dummy-47 (-> self root-override)) + (let ((a1-3 (new 'stack-no-clear 'overlaps-others-params))) + (set! (-> a1-3 options) (the-as uint 0)) + (set! (-> a1-3 tlist) *touching-list*) + (dummy-40 (-> self root-override) a1-3) + ) + (suspend) + (clear-collide-with-as (-> self root-override)) + (let ((gp-2 (-> *display* base-frame-counter))) + (until (>= (- (-> *display* base-frame-counter) gp-2) 900) + (spawn (-> self part2) (-> self root-override trans)) + (suspend) + ) + ) + (kill-and-free-particles (-> self part2)) + (deactivate self) + (none) + ) + :post + (the-as (function none :behavior mistycannon-missile) ja-post) + ) + +;; definition for function mistycannon-collision-reaction +;; INFO: Return type mismatch int vs none. +(defun mistycannon-collision-reaction ((arg0 collide-shape-moving) (arg1 collide-shape-intersect)) + (let ((s5-0 0)) + (let ((a1-1 (new 'stack-no-clear 'vector))) + (vector-float*! a1-1 (-> arg1 move-vec) (-> arg1 best-u)) + (TODO-RENAME-28 arg0 a1-1) + ) + (let ((f0-2 (vector-dot (-> arg0 transv) (-> arg1 best-tri normal))) + (v1-6 (new 'stack-no-clear 'vector)) + ) + (vector-float*! v1-6 (-> arg1 best-tri normal) (* 2.0 f0-2)) + (vector-! (-> arg0 transv) (-> arg0 transv) v1-6) + ) + (vector-float*! (-> arg0 transv) (-> arg0 transv) 0.15) + (let ((v0-1 (logior s5-0 7))) + (logior! (-> arg0 status) v0-1) + ) + ) + (none) + ) + +;; definition of type mistycannon-init-data +(deftype mistycannon-init-data (structure) + ((pos vector :offset-assert 0) + (vel vector :offset-assert 4) + (rotate float :offset-assert 8) + (flight-time float :offset-assert 12) + (muzzle-time float :offset-assert 16) + (blast-radius float :offset-assert 20) + ) + :method-count-assert 9 + :size-assert #x18 + :flag-assert #x900000018 + ) + +;; definition for method 3 of type mistycannon-init-data +(defmethod inspect mistycannon-init-data ((obj mistycannon-init-data)) + (format #t "[~8x] ~A~%" obj 'mistycannon-init-data) + (format #t "~Tpos: #~%" (-> obj pos)) + (format #t "~Tvel: #~%" (-> obj vel)) + (format #t "~Trotate: ~f~%" (-> obj rotate)) + (format #t "~Tflight-time: ~f~%" (-> obj flight-time)) + (format #t "~Tmuzzle-time: ~f~%" (-> obj muzzle-time)) + (format #t "~Tblast-radius: ~f~%" (-> obj blast-radius)) + obj + ) + +;; definition for function mistycannon-missile-init-by-other +;; INFO: Return type mismatch object vs none. +;; Used lq/sq +(defbehavior mistycannon-missile-init-by-other mistycannon-missile ((arg0 mistycannon-init-data) (arg1 entity)) + (set! (-> self mask) (logior (process-mask projectile) (-> self mask))) + (logclear! (-> self mask) (process-mask actor-pause)) + (set! (-> self entity) arg1) + (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) + (the-as + (function collide-shape-moving collide-shape-intersect vector vector none) + mistycannon-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 0)))) + (set! (-> s4-0 prim-core collide-as) (the-as uint 256)) + (set! (-> s4-0 collide-with) (the-as uint 925)) + (set! (-> s4-0 prim-core action) (the-as uint 1)) + (set! (-> s4-0 prim-core offense) 1) + (set! (-> s4-0 transform-index) 0) + (set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 1720.3201) + (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! (-> s5-0 event-self) 'touched) + (set! (-> s5-0 max-iteration-count) (the-as uint 4)) + (set! (-> self root-override) s5-0) + ) + (set! (-> self root-override trans quad) (-> arg0 pos quad)) + (set-vector! (-> self root-override scale) 0.0 0.0 0.0 1.0) + (set! (-> self muzzle-time) (-> arg0 muzzle-time)) + (quaternion-axis-angle! (-> self root-override quat) 0.0 1.0 0.0 (-> arg0 rotate)) + (let ((f0-13 (/ 655360.0 (the float (the int (* 300.0 (-> arg0 flight-time))))))) + (quaternion-axis-angle! (-> self tumble-quat) 1.0 0.0 0.0 f0-13) + ) + (initialize-skeleton self *mistycannon-missile-sg* '()) + (set! (-> self root-override transv quad) (-> arg0 vel quad)) + (set! (-> self blast-radius) (-> arg0 blast-radius)) + (set! (-> self water-height) (res-lump-float (-> self entity) 'water-height :default -4096000.0)) + (set! (-> self part) (create-launch-control (-> *part-group-id-table* 117) self)) + (set! (-> self part2) (create-launch-control (-> *part-group-id-table* 118) self)) + (go mistycannon-missile-idle) + (none) + ) + +;; definition for function spawn-mistycannon-missile +;; INFO: Return type mismatch int vs none. +(defun spawn-mistycannon-missile ((arg0 process-tree) + (arg1 vector) + (arg2 vector) + (arg3 float) + (arg4 float) + (arg5 float) + (arg6 float) + (arg7 entity) + ) + (let ((s5-0 (new 'stack-no-clear 'mistycannon-init-data))) + (set! (-> s5-0 pos) arg1) + (set! (-> s5-0 vel) arg2) + (set! (-> s5-0 rotate) arg3) + (set! (-> s5-0 flight-time) arg4) + (set! (-> s5-0 muzzle-time) arg5) + (set! (-> s5-0 blast-radius) arg6) + (let ((s3-0 (get-process *default-dead-pool* mistycannon-missile #x4000))) + (when s3-0 + (let ((t9-1 (method-of-type mistycannon-missile activate))) + (t9-1 (the-as mistycannon-missile s3-0) arg0 'mistycannon-missile (the-as pointer #x70004000)) + ) + (run-now-in-process s3-0 mistycannon-missile-init-by-other s5-0 arg7) + (-> s3-0 ppointer) + ) + ) + ) + 0 + (none) + ) + +;; definition of type mistycannon +(deftype mistycannon (process-drawable) + ((root-override collide-shape-moving :offset 112) + (rotate angle-tracker :inline :offset-assert 176) + (fact-info-override fact-info-enemy :offset 144) + (tilt angle-tracker :inline :offset-assert 192) + (front-wheel float :offset-assert 208) + (rear-wheel float :offset-assert 212) + (last-known-rotation float :offset-assert 216) + (part-timer uint64 :offset-assert 224) + (hellmouth vector :inline :offset-assert 240) + (postbindinfo-ok symbol :offset-assert 256) + (launch-origin vector :inline :offset-assert 272) + (goggles vector :inline :offset-assert 288) + (avoid-entity entity-actor :offset-assert 304) + (center-point vector :inline :offset-assert 320) + (at-point vector :inline :offset-assert 336) + (accuracy-range float :offset-assert 352) + (target-theta float :offset-assert 356) + (sound-id sound-id :offset-assert 360) + (aim-sound-id sound-id :offset-assert 364) + (player-touching-grips? symbol :offset-assert 368) + ) + :heap-base #x110 + :method-count-assert 24 + :size-assert #x174 + :flag-assert #x1801100174 + (:methods + (rotate! (_type_ float) none 20) + (tilt! (_type_ float) none 21) + (dummy-22 (_type_ float float float) none 22) + (dummy-23 (_type_) none 23) + ) + (:states + mistycannon-aim-at-player + mistycannon-idle + mistycannon-player-control + mistycannon-waiting-for-player + mistycannon-waiting-for-player-to-fuck-off + ) + ) + +;; definition for method 3 of type mistycannon +(defmethod inspect mistycannon ((obj mistycannon)) + (let ((t9-0 (method-of-type process-drawable inspect))) + (t9-0 obj) + ) + (format #t "~T~Trotate: #~%" (-> obj rotate)) + (format #t "~T~Ttilt: #~%" (-> obj tilt)) + (format #t "~T~Tfront-wheel: ~f~%" (-> obj front-wheel)) + (format #t "~T~Trear-wheel: ~f~%" (-> obj rear-wheel)) + (format #t "~T~Tlast-known-rotation: ~f~%" (-> obj last-known-rotation)) + (format #t "~T~Tpart-timer: ~D~%" (-> obj part-timer)) + (format #t "~T~Thellmouth: #~%" (-> obj hellmouth)) + (format #t "~T~Tpostbindinfo-ok: ~A~%" (-> obj postbindinfo-ok)) + (format #t "~T~Tlaunch-origin: #~%" (-> obj launch-origin)) + (format #t "~T~Tgoggles: #~%" (-> obj goggles)) + (format #t "~T~Tavoid-entity: ~A~%" (-> obj avoid-entity)) + (format #t "~T~Tcenter-point: #~%" (-> obj center-point)) + (format #t "~T~Tat-point: #~%" (-> obj at-point)) + (format #t "~T~Taccuracy-range: ~f~%" (-> obj accuracy-range)) + (format #t "~T~Ttarget-theta: ~f~%" (-> obj target-theta)) + (format #t "~T~Tsound-id: ~D~%" (-> obj sound-id)) + (format #t "~T~Taim-sound-id: ~D~%" (-> obj aim-sound-id)) + (format #t "~T~Tplayer-touching-grips?: ~A~%" (-> obj player-touching-grips?)) + obj + ) + +;; definition for function mistycannon-pick-random-target-point +(defbehavior mistycannon-pick-random-target-point mistycannon () + (let ((f30-0 (* (sqrtf (rand-vu)) (-> self center-point w))) + (f28-1 (* 65536.0 (rand-vu))) + ) + (set! (-> self at-point x) (+ (-> self center-point x) (* f30-0 (cos f28-1)))) + (set! (-> self at-point y) (-> self center-point y)) + (set! (-> self at-point z) (+ (-> self center-point z) (* f30-0 (sin f28-1)))) + ) + (set! (-> self at-point w) 1.0) + (let ((f0-11 (rand-vu-float-range 2730.6667 12743.111))) + (set! (-> self target-theta) f0-11) + f0-11 + ) + ) + +;; definition for method 20 of type mistycannon +;; INFO: Return type mismatch int vs none. +(defmethod rotate! mistycannon ((obj mistycannon) (arg0 float)) + (angle-tracker-apply-move! (-> obj rotate) arg0) + 0 + (none) + ) + +;; definition for method 21 of type mistycannon +;; INFO: Return type mismatch int vs none. +(defmethod tilt! mistycannon ((obj mistycannon) (arg0 float)) + (angle-tracker-apply-move! (-> obj tilt) arg0) + 0 + (none) + ) + +;; definition for method 22 of type mistycannon +;; INFO: Return type mismatch int vs none. +;; WARN: Expression building failed: Function (method 22 mistycannon) has a return type of none, but the expression builder found a return statement. +(defmethod dummy-22 mistycannon ((obj mistycannon) (arg0 float) (arg1 float) (arg2 float)) + (if (not (-> obj postbindinfo-ok)) + (return #f) + ) + (let* ((s3-0 (-> obj launch-origin)) + (s2-0 (new 'stack-no-clear 'vector)) + (v1-3 (-> obj rotate)) + (f30-0 (the float (sar (shl (the int (+ (-> v1-3 min) (-> v1-3 value))) 48) 48))) + (v1-8 (-> obj tilt)) + (f26-0 (the float (sar (shl (the int (+ (-> v1-8 min) (-> v1-8 value))) 48) 48))) + (f28-0 (/ 24576.0 arg0)) + ) + (let ((f24-0 (cos f26-0))) + (set! (-> s2-0 x) (* arg0 f24-0 (sin f30-0))) + (set! (-> s2-0 z) (* arg0 f24-0 (cos f30-0))) + ) + (set! (-> s2-0 y) (* arg0 (sin f26-0))) + (vector-float*! (-> obj hellmouth) s2-0 f28-0) + (vector+! (-> obj hellmouth) (-> obj hellmouth) s3-0) + (spawn-mistycannon-missile obj s3-0 s2-0 f30-0 arg1 f28-0 arg2 (-> obj entity)) + ) + (sound-play-by-name (static-sound-name "cannon-shot") (new-sound-id) 1024 0 0 1 #t) + (set! (-> obj part local-clock) 0) + (set! (-> obj part-timer) (the-as uint (-> *display* base-frame-counter))) + (mistycannon-pick-random-target-point) + 0 + (none) + ) + +;; definition for method 23 of type mistycannon +;; INFO: Return type mismatch int vs none. +(defmethod dummy-23 mistycannon ((obj mistycannon)) + (when (< (- (-> *display* base-frame-counter) (the-as int (-> obj part-timer))) 900) + (let ((v1-4 (-> obj rotate))) + (set! (-> *part-id-table* 529 init-specs 24 initial-valuef) + (the float (sar (shl (the int (+ (-> v1-4 min) (-> v1-4 value))) 48) 48)) + ) + ) + (let ((v1-12 (-> obj rotate))) + (set! (-> *part-id-table* 530 init-specs 23 initial-valuef) + (the float (sar (shl (the int (+ (-> v1-12 min) (-> v1-12 value))) 48) 48)) + ) + ) + (let ((v1-20 (-> obj rotate))) + (set! (-> *part-id-table* 534 init-specs 21 initial-valuef) + (the float (sar (shl (the int (+ (-> v1-20 min) (-> v1-20 value))) 48) 48)) + ) + ) + (let ((f0-18 16384.0) + (v1-28 (-> obj tilt)) + ) + (set! (-> *part-id-table* 529 init-specs 22 initial-valuef) + (- f0-18 (the float (sar (shl (the int (+ (-> v1-28 min) (-> v1-28 value))) 48) 48))) + ) + ) + (let ((f0-20 16384.0) + (v1-36 (-> obj tilt)) + ) + (set! (-> *part-id-table* 530 init-specs 21 initial-valuef) + (- f0-20 (the float (sar (shl (the int (+ (-> v1-36 min) (-> v1-36 value))) 48) 48))) + ) + ) + (let ((f0-22 16384.0) + (v1-44 (-> obj tilt)) + ) + (set! (-> *part-id-table* 534 init-specs 20 initial-valuef) + (- f0-22 (the float (sar (shl (the int (+ (-> v1-44 min) (-> v1-44 value))) 48) 48))) + ) + ) + (spawn (-> obj part) (-> obj hellmouth)) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defskelgroup *mistycannon-sg* mistycannon + 0 + 3 + ((1 (meters 20)) (2 (meters 999999))) + :bounds (static-spherem 0 5 0 9) + :longest-edge (meters 4) + ) + +;; definition for function mistycannon-prebind-function +;; INFO: Return type mismatch int vs none. +(defun mistycannon-prebind-function ((arg0 mistycannon) (arg1 int) (arg2 mistycannon)) + (let ((t9-0 quaternion-axis-angle!) + (a0-1 (&-> arg0 link)) + (a1-1 0.0) + (a2-1 1.0) + (a3-0 0.0) + (v1-0 (-> arg2 rotate)) + ) + (t9-0 + (the-as quaternion a0-1) + a1-1 + a2-1 + a3-0 + (the float (sar (shl (the int (+ (-> v1-0 min) (-> v1-0 value))) 48) 48)) + ) + ) + (let ((t9-1 quaternion-axis-angle!) + (a0-2 (&-> arg0 tilt min)) + (a1-2 -1.0) + (a2-2 0.0) + (a3-1 0.0) + (v1-4 (-> arg2 tilt)) + ) + (t9-1 + (the-as quaternion a0-2) + a1-2 + a2-2 + a3-1 + (the float (sar (shl (the int (+ (-> v1-4 min) (-> v1-4 value))) 48) 48)) + ) + ) + (let* ((v1-8 (-> arg2 rotate)) + (f0-16 + (- (the float (sar (shl (the int (+ (-> v1-8 min) (-> v1-8 value))) 48) 48)) (-> arg2 last-known-rotation)) + ) + ) + (set! (-> arg2 front-wheel) (the float (sar (shl (the int (+ (-> arg2 front-wheel) (* 5.0 f0-16))) 48) 48))) + (set! (-> arg2 rear-wheel) (the float (sar (shl (the int (+ (-> arg2 rear-wheel) (* 3.0 f0-16))) 48) 48))) + ) + (let ((v1-19 (-> arg2 rotate))) + (set! (-> arg2 last-known-rotation) + (the float (sar (shl (the int (+ (-> v1-19 min) (-> v1-19 value))) 48) 48)) + ) + ) + (quaternion-axis-angle! (the-as quaternion (&-> arg0 stack 324)) -1.0 0.0 0.0 (-> arg2 front-wheel)) + (quaternion-axis-angle! (the-as quaternion (&-> arg0 stack 276)) 1.0 0.0 0.0 (-> arg2 front-wheel)) + (quaternion-axis-angle! (the-as quaternion (&-> arg0 goggles y)) -1.0 0.0 0.0 (-> arg2 rear-wheel)) + (quaternion-axis-angle! (the-as quaternion (&-> arg0 at-point y)) 1.0 0.0 0.0 (-> arg2 rear-wheel)) + 0 + (none) + ) + +;; definition for function mistycannon-postbind-function +;; INFO: Return type mismatch int vs none. +;; Used lq/sq +(defun mistycannon-postbind-function ((arg0 mistycannon)) + (set! (-> arg0 launch-origin quad) (-> arg0 node-list data 4 bone transform vector 3 quad)) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (set-vector! s5-0 0.0 53248.0 -4096.0 1.0) + (vector-matrix*! s5-0 s5-0 (-> arg0 node-list data 3 bone transform)) + (set! (-> arg0 goggles quad) (-> s5-0 quad)) + ) + (set! (-> arg0 postbindinfo-ok) #t) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate mistycannon-idle (mistycannon) + :trans + (behavior () + (if (not (and (-> self entity) (logtest? (-> self entity extra perm status) (entity-perm-status complete)))) + (go mistycannon-waiting-for-player) + ) + (if (and + (-> self postbindinfo-ok) + *target* + (>= (-> self fact-info-override idle-distance) + (vector-vector-distance (-> self root-override trans) (-> *target* control trans)) + ) + ) + (go mistycannon-aim-at-player) + ) + (rider-trans) + (none) + ) + :code + (behavior () + (while #t + (dummy-23 self) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +;; definition of type quadratic-solution +(deftype quadratic-solution (structure) + ((s1 float :offset-assert 0) + (s2 float :offset-assert 4) + ) + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +;; definition for method 3 of type quadratic-solution +(defmethod inspect quadratic-solution ((obj quadratic-solution)) + (format #t "[~8x] ~A~%" obj 'quadratic-solution) + (format #t "~Ts1: ~f~%" (-> obj s1)) + (format #t "~Ts2: ~f~%" (-> obj s2)) + obj + ) + +;; definition for function solve-missile-tilt +(defun solve-missile-tilt ((arg0 quadratic-solution) (arg1 float) (arg2 float) (arg3 float) (arg4 float)) + (let* ((f1-3 (* 0.5 arg2 arg2 arg4)) + (f0-3 f1-3) + (f30-0 (- (* arg2 arg1 arg1))) + (f2-6 (+ f1-3 (* arg1 arg1 arg3))) + (f1-5 (- (* f30-0 f30-0) (* 4.0 f2-6 f0-3))) + (f28-0 (/ 0.5 f0-3)) + ) + (if (< f1-5 0.0) + (return #f) + ) + (let ((f26-0 (sqrtf f1-5))) + (set! (-> arg0 s1) (atan (* (+ (- f30-0) f26-0) f28-0) 1.0)) + (set! (-> arg0 s2) (atan (* (- (- f30-0) f26-0) f28-0) 1.0)) + ) + ) + #t + ) + +;; definition of type trajectory-params +(deftype trajectory-params (structure) + ((x float :offset-assert 0) + (y float :offset-assert 4) + (gravity float :offset-assert 8) + (theta float :offset-assert 12) + (speed float :offset-assert 16) + (time float :offset-assert 20) + ) + :method-count-assert 9 + :size-assert #x18 + :flag-assert #x900000018 + ) + +;; definition for method 3 of type trajectory-params +(defmethod inspect trajectory-params ((obj trajectory-params)) + (format #t "[~8x] ~A~%" obj 'trajectory-params) + (format #t "~Tx: ~f~%" (-> obj x)) + (format #t "~Ty: ~f~%" (-> obj y)) + (format #t "~Tgravity: ~f~%" (-> obj gravity)) + (format #t "~Ttheta: ~f~%" (-> obj theta)) + (format #t "~Tspeed: ~f~%" (-> obj speed)) + (format #t "~Ttime: ~f~%" (-> obj time)) + obj + ) + +;; definition for function solve-missile-velocity +;; INFO: Return type mismatch int vs none. +(defun solve-missile-velocity ((arg0 trajectory-params) (arg1 float)) + (set! (-> arg0 theta) arg1) + (let ((f0-4 (* (- (* (-> arg0 x) (tan arg1)) (-> arg0 y)) (/ 2.0 (-> arg0 gravity))))) + (when (< 0.0 f0-4) + (set! (-> arg0 time) (sqrtf f0-4)) + (set! (-> arg0 speed) (/ (-> arg0 x) (* (-> arg0 time) (cos arg1)))) + ) + ) + 0 + (none) + ) + +;; definition for function mistycannon-find-best-solution +(defbehavior mistycannon-find-best-solution mistycannon ((arg0 quadratic-solution)) + (let ((v1-0 #t) + (a1-0 #t) + (v0-0 -1) + ) + (let ((f1-0 (-> self tilt min)) + (f0-1 (+ (-> self tilt range) (-> self tilt min))) + ) + (if (< (-> arg0 s1) f1-0) + (set! v1-0 #f) + ) + (if (< f0-1 (-> arg0 s1)) + (set! v1-0 #f) + ) + (if (< (-> arg0 s2) f1-0) + (set! a1-0 #f) + ) + (if (< f0-1 (-> arg0 s2)) + (set! a1-0 #f) + ) + ) + (if v1-0 + (set! v0-0 0) + ) + (if a1-0 + (set! v0-0 1) + ) + (set! a1-0 (and v1-0 a1-0)) + (when a1-0 + (if (< (-> arg0 s1) (-> arg0 s2)) + (set! v0-0 0) + (set! v0-0 1) + ) + ) + v0-0 + ) + ) + +;; definition for function mistycannon-find-trajectory +(defbehavior mistycannon-find-trajectory mistycannon ((arg0 trajectory-params)) + (set! (-> arg0 time) 0.0) + (solve-missile-velocity arg0 (-> arg0 theta)) + (none) + ) + +;; definition for function mistycannon-do-aim +;; INFO: Return type mismatch int vs none. +;; WARN: Expression building failed: Function mistycannon-do-aim has a return type of none, but the expression builder found a return statement. +(defbehavior mistycannon-do-aim mistycannon ((arg0 vector) (arg1 vector)) + (if (not (-> self postbindinfo-ok)) + (return #f) + ) + (when (-> self avoid-entity) + (let ((a1-1 (-> self avoid-entity extra trans))) + (if (< (vector-vector-distance arg0 a1-1) 122880.0) + (return #f) + ) + ) + ) + (let ((gp-0 (new 'stack-no-clear 'trajectory-params))) + (let ((s4-0 (new 'stack-no-clear 'vector))) + (vector-! s4-0 arg0 (-> self launch-origin)) + (set! (-> gp-0 x) (vector-xz-length s4-0)) + (set! (-> gp-0 y) (-> s4-0 y)) + ) + (set! (-> gp-0 gravity) (-> *standard-dynamics* gravity-length)) + (set! (-> gp-0 speed) 409600.0) + (set! (-> gp-0 theta) (-> self target-theta)) + (mistycannon-find-trajectory gp-0) + (let ((v1-12 (new 'stack-no-clear 'vector)) + (s4-1 (new 'stack-no-clear 'vector)) + ) + (vector-float*! v1-12 arg1 (* 0.4 (+ 2.0 (-> gp-0 time)))) + (vector+! s4-1 arg0 v1-12) + (let ((f30-0 (* (sqrtf (rand-vu)) (-> self accuracy-range))) + (f28-1 (* 65536.0 (rand-vu))) + ) + (+! (-> s4-1 x) (* f30-0 (cos f28-1))) + (+! (-> s4-1 z) (* f30-0 (sin f28-1))) + ) + (let ((s5-1 (new 'stack-no-clear 'vector))) + (vector-! s5-1 s4-1 (-> self launch-origin)) + (let ((f0-19 (atan (-> s5-1 x) (-> s5-1 z)))) + (angle-tracker-seek! (-> self rotate) f0-19) + ) + (set! (-> gp-0 x) (vector-xz-length s5-1)) + (set! (-> gp-0 y) (-> s5-1 y)) + ) + ) + (mistycannon-find-trajectory gp-0) + (when (= (-> gp-0 time) 0.0) + (when (>= (- (-> *display* base-frame-counter) (-> self state-time)) 900) + (dummy-22 self 409600.0 2.0 20480.0) + (set! (-> self state-time) (-> *display* base-frame-counter)) + ) + (return #f) + ) + (when (angle-tracker-seek! (-> self tilt) (-> gp-0 theta)) + (when (>= (- (-> *display* base-frame-counter) (-> self state-time)) 900) + (dummy-22 self (fmax 163840.0 (fmin 409600.0 (-> gp-0 speed))) (-> gp-0 time) 20480.0) + (set! (-> self state-time) (-> *display* base-frame-counter)) + ) + ) + ) + 0 + (none) + ) + +;; failed to figure out what this is: +(defstate mistycannon-aim-at-player (mistycannon) + :enter + (behavior () (set! (-> self state-time) (-> *display* base-frame-counter)) (none)) + :trans + (behavior () + (if (not (and (-> self entity) (logtest? (-> self entity extra perm status) (entity-perm-status complete)))) + (go mistycannon-waiting-for-player) + ) + (if (not (and *target* (>= (-> self fact-info-override idle-distance) + (vector-vector-distance (-> self root-override trans) (-> *target* control trans)) + ) + ) + ) + (go mistycannon-idle) + ) + (rider-trans) + (none) + ) + :code + (behavior () + (while #t + (if (< (vector-vector-xz-distance (target-pos 0) (-> self center-point)) (-> self center-point w)) + (mistycannon-do-aim (-> *target* control trans) (-> *target* control transv)) + (mistycannon-do-aim (-> self at-point) (new-stack-vector0)) + ) + (dummy-23 self) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +;; failed to figure out what this is: +(defstate mistycannon-waiting-for-player (mistycannon) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('touch) + (when ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry (-> arg3 param 0)) + (-> self root-override) + (the-as uint 1) + ) + (let ((v0-1 (the-as object #t))) + (set! (-> self player-touching-grips?) (the-as symbol v0-1)) + v0-1 + ) + ) + ) + (('change-mode) + (go mistycannon-player-control) + ) + ) + ) + :trans + (behavior () + (if (and (-> self entity) (logtest? (-> self entity extra perm status) (entity-perm-status complete))) + (go mistycannon-aim-at-player) + ) + (rider-trans) + (none) + ) + :code + (behavior () + (set! (-> self player-touching-grips?) #f) + (while #t + (let ((f0-0 2730.6667) + (v1-0 (-> self tilt)) + ) + (if (< f0-0 (the float (sar (shl (the int (+ (-> v1-0 min) (-> v1-0 value))) 48) 48))) + (angle-tracker-seek! (-> self tilt) 2730.6667) + ) + ) + (dummy-23 self) + (when (and (-> self player-touching-grips?) (not (level-hint-displayed?))) + (set! (-> self player-touching-grips?) #f) + (hide-hud) + (level-hint-surpress!) + (kill-current-level-hint '() '(sidekick voicebox) 'exit) + (when (and (hud-hidden?) (can-grab-display? (the-as process-taskable self))) + (let ((gp-0 + (new 'stack 'font-context *font-default-matrix* 32 160 0.0 (font-color default) (font-flags shadow kerning)) + ) + ) + (let ((v1-15 gp-0)) + (set! (-> v1-15 width) (the float 440)) + ) + (let ((v1-16 gp-0)) + (set! (-> v1-16 height) (the float 80)) + ) + (set! (-> gp-0 flags) (font-flags shadow kerning large)) + (print-game-text (lookup-text! *common-text* (game-text-id press-to-use) #f) gp-0 #f 128 22) + ) + (when (cpad-pressed? 0 circle) + (while #t + (send-event *target* 'change-mode 'periscope self) + (suspend) + (suspend) + ) + ) + ) + ) + (suspend) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +;; failed to figure out what this is: +(defstate cam-mistycannon (camera-slave) + :event + cam-standard-event-handler + :enter + (behavior () + (when (not (-> self enter-has-run)) + (set! (-> self blend-from-type) (the-as uint 1)) + (set! (-> self blend-to-type) (the-as uint 1)) + ) + (none) + ) + :trans + (behavior () + (if (zero? (logand (-> *camera* master-options) 2)) + (cam-slave-go cam-free-floating) + ) + (none) + ) + :code + (behavior () + (while #t + (let ((v1-0 (-> self change-event-from))) + (set! (-> self trans quad) (-> (the-as mistycannon (-> v1-0 0)) goggles quad)) + (let ((t9-0 matrix-rotate-yx!) + (a0-1 (-> self tracking)) + (v1-2 (-> (the-as mistycannon (-> v1-0 0)) rotate)) + ) + (t9-0 (the-as matrix a0-1) (the float (sar (shl (the int (+ (-> v1-2 min) (-> v1-2 value))) 48) 48)) 3640.889) + ) + ) + (suspend) + ) + (none) + ) + ) + +;; failed to figure out what this is: +(defstate mistycannon-player-control (mistycannon) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (case arg2 + (('change-mode) + (send-event *camera* 'change-state cam-mistycannon 0) + ) + ) + ) + :exit + (behavior () (sound-stop (-> self sound-id)) (sound-stop (-> self aim-sound-id)) (none)) + :trans + (behavior () (dummy-23 self) (rider-trans) (none)) + :code + (behavior () + (send-event *camera* 'change-state cam-mistycannon 0) + (suspend) + (set! (-> self state-time) (-> *display* base-frame-counter)) + (let ((gp-0 0) + (s5-0 0) + ) + (while #t + (when *camera-read-analog* + (let ((f30-0 (analog-input (the-as int (-> *cpad-list* cpads 0 leftx)) 128.0 48.0 110.0 -1.0)) + (f28-0 (analog-input (the-as int (-> *cpad-list* cpads 0 lefty)) 128.0 48.0 110.0 -1.0)) + ) + (rotate! self f30-0) + (tilt! self (- f28-0)) + (if (or (!= f30-0 0.0) (!= f28-0 0.0)) + (sound-play-by-name (static-sound-name "telescope") (-> self aim-sound-id) 1024 0 0 1 #t) + (sound-stop (-> self aim-sound-id)) + ) + ) + ) + (when (cpad-pressed? 0 triangle) + (process-entity-status! self (entity-perm-status bit-3) #t) + (sound-stop (-> self sound-id)) + (send-event *camera* 'change-to-entity-by-name "camera-111") + (suspend) + (while #t + (let ((a1-8 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-8 from) self) + (set! (-> a1-8 num-params) 0) + (set! (-> a1-8 message) 'end-mode) + (when (send-event-function *target* a1-8) + (send-event *camera* 'change-state *camera-base-mode* 0) + (process-entity-status! self (entity-perm-status bit-3) #f) + (go mistycannon-waiting-for-player-to-fuck-off) + ) + ) + (suspend) + ) + ) + (let ((v1-45 (and (cpad-hold? 0 x) (>= (- (-> *display* base-frame-counter) (-> self state-time)) 300)))) + (when (zero? s5-0) + (when v1-45 + (set! gp-0 (seekl gp-0 300 (- (-> *display* base-frame-counter) (-> *display* old-base-frame-counter)))) + (sound-play-by-name + (static-sound-name "cannon-charge") + (-> self sound-id) + 1024 + (the int (* 1524.0 (* 0.008 (the float gp-0)))) + 0 + 1 + #t + ) + ) + (when (or + (= gp-0 300) + (and (zero? (logand (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons x))) (nonzero? gp-0)) + ) + (let ((gp-1 (+ 50 (the int (* 0.16666667 (the float gp-0)))))) + (level-hint-spawn (game-text-id daxter-get-some) "sksp009f" (the-as entity #f) *entity-pool* (game-task none)) + (dummy-22 self (* 4096.0 (the float gp-1)) 2.0 40960.0) + ) + (set! (-> self state-time) (-> *display* base-frame-counter)) + (set! gp-0 0) + (set! s5-0 1) + (sound-stop (-> self sound-id)) + ) + (if (nonzero? gp-0) + (debug-percent-bar + #t + (bucket-id debug-draw0) + 192 + 160 + (* 0.0033333334 (the float gp-0)) + (new 'static 'rgba :r #xff :a #x80) + ) + ) + ) + ) + (if (zero? (logand (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons x))) + (set! s5-0 0) + ) + (suspend) + ) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +;; failed to figure out what this is: +(defstate mistycannon-waiting-for-player-to-fuck-off (mistycannon) + :event + (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) + (let ((v1-0 arg2)) + (the-as object (when (= v1-0 'touch) + (when ((method-of-type touching-shapes-entry prims-touching?) + (the-as touching-shapes-entry (-> arg3 param 0)) + (-> self root-override) + (the-as uint 1) + ) + (let ((v0-0 (-> *display* base-frame-counter))) + (set! (-> self state-time) v0-0) + v0-0 + ) + ) + ) + ) + ) + ) + :enter + (behavior () (set! (-> self state-time) (-> *display* base-frame-counter)) (none)) + :trans + (the-as (function none :behavior mistycannon) rider-trans) + :code + (behavior () + (while #t + (suspend) + (dummy-23 self) + (if (>= (- (-> *display* base-frame-counter) (-> self state-time)) 300) + (go mistycannon-waiting-for-player) + ) + ) + (none) + ) + :post + (the-as (function none :behavior mistycannon) rider-post) + ) + +;; definition for method 11 of type mistycannon +;; INFO: Return type mismatch object vs none. +;; Used lq/sq +(defmethod init-from-entity! mistycannon ((obj mistycannon) (arg0 entity-actor)) + (local-vars (sv-16 res-tag) (sv-32 res-tag) (sv-48 res-tag)) + (set! (-> obj mask) (logior (process-mask enemy) (-> obj mask))) + (let ((s4-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-others)))) + (set! (-> s4-0 dynam) (copy *standard-dynamics* 'process)) + (set! (-> s4-0 reaction) default-collision-reaction) + (set! (-> s4-0 no-reaction) + (the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing) + ) + (dummy-29 s4-0 1) + (let ((s3-0 (new 'process 'collide-shape-prim-group s4-0 (the-as uint 2) 0))) + (set! (-> s3-0 prim-core collide-as) (the-as uint 2048)) + (set! (-> s3-0 collide-with) (the-as uint 16)) + (set! (-> s3-0 prim-core action) (the-as uint 3)) + (set! (-> s3-0 transform-index) 3) + (set-vector! (-> s3-0 local-sphere) 0.0 20480.0 0.0 40960.0) + (set-root-prim! s4-0 s3-0) + (let ((s2-0 (new 'process 'collide-shape-prim-mesh s4-0 (the-as uint 0) (the-as uint 0)))) + (set! (-> s2-0 prim-core collide-as) (the-as uint 2048)) + (set! (-> s2-0 collide-with) (the-as uint 16)) + (set! (-> s2-0 prim-core action) (the-as uint 3)) + (set! (-> s2-0 prim-core offense) 4) + (set! (-> s2-0 transform-index) 3) + (set-vector! (-> s2-0 local-sphere) 0.0 20480.0 0.0 40960.0) + (append-prim s3-0 s2-0) + ) + (let ((s2-1 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 1)))) + (set! (-> s2-1 prim-core collide-as) (the-as uint 256)) + (set! (-> s2-1 collide-with) (the-as uint 16)) + (set! (-> s2-1 prim-core offense) 4) + (set! (-> s2-1 transform-index) 3) + (set-vector! (-> s2-1 local-sphere) 0.0 28672.0 -8192.0 4096.0) + (append-prim s3-0 s2-1) + ) + ) + (set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w))) + (backup-collide-with-as s4-0) + (set! (-> obj root-override) s4-0) + ) + (process-drawable-from-entity! obj arg0) + (quaternion-identity! (-> obj root-override quat)) + (initialize-skeleton obj *mistycannon-sg* '()) + (logior! (-> obj skel status) 1) + (dummy-47 (-> obj root-override)) + (set! (-> obj skel prebind-function) + (the-as (function pointer int process-drawable none) mistycannon-prebind-function) + ) + (set! (-> obj skel postbind-function) + (the-as (function pointer int process-drawable none) mistycannon-postbind-function) + ) + (set! (-> obj fact-info-override) + (new 'process 'fact-info-enemy obj (pickup-type eco-pill-random) (-> *FACT-bank* default-pill-inc)) + ) + (logclear! (-> obj mask) (process-mask actor-pause)) + (let ((f30-0 (res-lump-float arg0 'rotmin :default 16384.0)) + (f28-0 (res-lump-float arg0 'rotmax :default 32768.0)) + (f0-15 (res-lump-float arg0 'rotspeed :default 3640.889)) + ) + (angle-tracker-init-range! (-> obj rotate) f30-0 f28-0 f0-15) + ) + (let ((f30-1 (res-lump-float arg0 'tiltmin :default -1820.4445)) + (f28-1 (res-lump-float arg0 'tiltmax :default 12743.111)) + (f0-16 (res-lump-float arg0 'tiltspeed :default 3640.889)) + ) + (angle-tracker-init-range! (-> obj tilt) f30-1 f28-1 f0-16) + ) + (set! (-> obj avoid-entity) (entity-actor-lookup (-> obj entity) 'alt-actor 0)) + (set! (-> obj center-point w) (res-lump-float arg0 'center-radius)) + (cond + ((= (-> obj center-point w) 0.0) + (set! (-> obj center-point quad) (-> obj root-override trans quad)) + (set! (-> obj center-point w) (-> obj fact-info-override idle-distance)) + ) + (else + (set! sv-16 (new 'static 'res-tag)) + (let ((v1-64 (res-lump-data arg0 'center-point pointer :tag-ptr (& sv-16)))) + (set! (-> obj center-point x) (if (and v1-64 (< 0.0 (the float (-> sv-16 elt-count)))) + (-> (the-as (pointer float) v1-64)) + 0.0 + ) + ) + ) + (set! sv-32 (new 'static 'res-tag)) + (let ((v1-67 (res-lump-data arg0 'center-point (pointer float) :tag-ptr (& sv-32)))) + (set! (-> obj center-point y) (if (and v1-67 (< 1.0 (the float (-> sv-32 elt-count)))) + (-> v1-67 1) + 0.0 + ) + ) + ) + (set! sv-48 (new 'static 'res-tag)) + (let ((v1-70 (res-lump-data arg0 'center-point (pointer float) :tag-ptr (& sv-48)))) + (set! (-> obj center-point z) (if (and v1-70 (< 2.0 (the float (-> sv-48 elt-count)))) + (-> v1-70 2) + 0.0 + ) + ) + ) + ) + ) + (set! (-> obj accuracy-range) 16384.0) + (mistycannon-pick-random-target-point) + (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 119) obj)) + (set! (-> obj part-timer) (the-as uint (+ (-> *display* base-frame-counter) -3000))) + (set! (-> obj postbindinfo-ok) #f) + (let ((v1-79 (-> obj rotate))) + (set! (-> obj last-known-rotation) + (the float (sar (shl (the int (+ (-> v1-79 min) (-> v1-79 value))) 48) 48)) + ) + ) + (set! (-> obj sound-id) (new-sound-id)) + (set! (-> obj aim-sound-id) (new-sound-id)) + (if (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status complete))) + (go mistycannon-idle) + (go mistycannon-waiting-for-player) + ) + (none) + )