mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
e546fce370
Fixes #2825
1227 lines
42 KiB
Common Lisp
1227 lines
42 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: sew-gunturret.gc
|
|
;; name in dgo: sew-gunturret
|
|
;; dgos: SEB, SWB, PAE, PAC
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
(defpartgroup group-sew-gunturret-hit
|
|
:id 1126
|
|
:duration (seconds 0.5)
|
|
:linger-duration (seconds 1)
|
|
:flags (use-local-clock)
|
|
:bounds (static-bspherem 0 0 0 15)
|
|
:parts ((sp-item 4867 :period (seconds 5) :length (seconds 0.085) :offset -10)
|
|
(sp-item 4868 :fade-after (meters 60) :period (seconds 5) :length (seconds 0.1))
|
|
(sp-item 4869 :fade-after (meters 60) :falloff-to (meters 60) :period (seconds 5) :length (seconds 0.335))
|
|
(sp-item 4870 :fade-after (meters 200) :falloff-to (meters 200) :period (seconds 5) :length (seconds 0.167))
|
|
(sp-item 4871 :period (seconds 5) :length (seconds 0.017) :offset -10)
|
|
(sp-item 4872 :fade-after (meters 150) :falloff-to (meters 150) :period (seconds 5) :length (seconds 0.167))
|
|
)
|
|
)
|
|
|
|
(defpart 4870
|
|
:init-specs ((:texture (new 'static 'texture-id :index #x34 :page #xc))
|
|
(:num 1.0 1.0)
|
|
(:scale-x (meters 1) (meters 1))
|
|
(:rot-z (degrees 0) (degrees 360) :store)
|
|
(:scale-y (meters 0.8) (meters 0.2))
|
|
(:r 255.0)
|
|
(:g 255.0)
|
|
(:b 255.0)
|
|
(:a 32.0 32.0)
|
|
(:vel-y (meters 0.02) (meters 0.01))
|
|
(:scalevel-x (meters 0.01) (meters 0.13333334))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r 0.0)
|
|
(:fade-g -0.36)
|
|
(:fade-b -4.24)
|
|
(:fade-a -0.22068965)
|
|
(:friction 0.95)
|
|
(:timer (seconds 3.335))
|
|
(:flags (sp-cpuinfo-flag-2))
|
|
(:func 'sparticle-motion-blur)
|
|
(:next-time (seconds 0.085) (seconds 0.015))
|
|
(:next-launcher 4873)
|
|
(:conerot-x '*sp-temp*)
|
|
)
|
|
)
|
|
|
|
(defpart 4872
|
|
:init-specs ((:texture (new 'static 'texture-id :index #x33 :page #xc))
|
|
(:num 1.0 1.0)
|
|
(:scale-x (meters 1) (meters 1))
|
|
(:rot-z (degrees 0))
|
|
(:scale-y :copy scale-x)
|
|
(:r 255.0)
|
|
(:g 255.0)
|
|
(:b 255.0)
|
|
(:a 0.0)
|
|
(:vel-y (meters 0.02) (meters 0.01))
|
|
(:scalevel-x (meters 0.01) (meters 0.13333334))
|
|
(:rotvel-z (degrees -0.12) (degrees 0.24))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r 0.0)
|
|
(:fade-g -0.36)
|
|
(:fade-b -4.24)
|
|
(:fade-a 0.22068965)
|
|
(:friction 0.95)
|
|
(:timer (seconds 3.335))
|
|
(:flags (sp-cpuinfo-flag-2))
|
|
(:next-time (seconds 0.085) (seconds 0.015))
|
|
(:next-launcher 4873)
|
|
(:conerot-x (degrees 0) (degrees 360))
|
|
)
|
|
)
|
|
|
|
(defpart 4873
|
|
:init-specs ((:fade-r 0.0) (:fade-g 0.0) (:fade-b 0.0) (:next-time (seconds 0.017) (seconds 0.065)) (:next-launcher 4874))
|
|
)
|
|
|
|
(defpart 4874
|
|
:init-specs ((:scalevel-x (meters 0.016666668) (meters 0.016666668))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r -0.44)
|
|
(:fade-g -2.36)
|
|
(:fade-b -2.64)
|
|
(:next-time (seconds 0.117) (seconds 0.047))
|
|
(:next-launcher 4875)
|
|
)
|
|
)
|
|
|
|
(defpart 4875
|
|
:init-specs ((:scalevel-x (meters 0.008333334) (meters 0.008333334))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r -1.2944444)
|
|
(:fade-g -0.7111111)
|
|
(:fade-b -0.094444446)
|
|
(:fade-a -0.06545454 -0.06545454)
|
|
(:next-time (seconds 0.5) (seconds 0.097))
|
|
(:next-launcher 4876)
|
|
)
|
|
)
|
|
|
|
(defpart 4876
|
|
:init-specs ((:fade-r 0.0) (:fade-g 0.0) (:fade-b 0.0))
|
|
)
|
|
|
|
(defpart 4871
|
|
:init-specs ((:texture (new 'static 'texture-id :index #x47 :page #xc))
|
|
(:num 1.0)
|
|
(:scale-x (meters 5))
|
|
(:scale-y :copy scale-x)
|
|
(:r 255.0)
|
|
(:g 255.0)
|
|
(:b 255.0)
|
|
(:a 96.0)
|
|
(:scalevel-x (meters 0.5))
|
|
(:rotvel-z (degrees 0.3))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r 0.0)
|
|
(:fade-g -1.28)
|
|
(:fade-b -5.1)
|
|
(:fade-a 0.0)
|
|
(:timer (seconds 0.335))
|
|
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3))
|
|
(:next-time (seconds 0.167))
|
|
(:next-launcher 4877)
|
|
)
|
|
)
|
|
|
|
(defpart 4877
|
|
:init-specs ((:scalevel-x (meters -0.2))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r 0.0)
|
|
(:fade-g -2.56)
|
|
(:fade-b 0.0)
|
|
(:fade-a -1.92)
|
|
)
|
|
)
|
|
|
|
(defpart 4869
|
|
:init-specs ((:texture (new 'static 'texture-id :index #x32 :page #xc))
|
|
(:num 5.0 3.0)
|
|
(:x (meters 0.25))
|
|
(:scale-x (meters 1) (meters 0.25))
|
|
(:rot-z (degrees 0) (degrees 360))
|
|
(:scale-y :copy scale-x)
|
|
(:r 255.0)
|
|
(:g 255.0)
|
|
(:b 255.0)
|
|
(:a 16.0 48.0)
|
|
(:vel-y (meters 0.083333336) (meters 0.083333336))
|
|
(:scalevel-x (meters 0.006666667) (meters 0.0016666667))
|
|
(:rotvel-z (degrees -0.12) (degrees 0.24))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r 0.0)
|
|
(:fade-g -0.18)
|
|
(:fade-b -2.12)
|
|
(:accel-y (meters -0.00016666666) (meters -0.00033333333))
|
|
(:friction 0.87)
|
|
(:timer (seconds 3.335))
|
|
(:flags (sp-cpuinfo-flag-2))
|
|
(:next-time (seconds 0.117) (seconds 0.047))
|
|
(:next-launcher 4878)
|
|
(:conerot-x (degrees 0) (degrees 360))
|
|
)
|
|
)
|
|
|
|
(defpart 4878
|
|
:init-specs ((:scalevel-x (meters 0.0016666667))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r 0.0)
|
|
(:fade-g 0.02)
|
|
(:fade-b 0.23555556)
|
|
(:next-time (seconds 0.15) (seconds 0.047))
|
|
(:next-launcher 4879)
|
|
)
|
|
)
|
|
|
|
(defpart 4879
|
|
:init-specs ((:fade-r -0.5543478) (:fade-g -0.5543478) (:fade-a -0.13913043))
|
|
)
|
|
|
|
(defpart 4867
|
|
:init-specs ((:texture (new 'static 'texture-id :page #xc))
|
|
(:num 3.0 1.0)
|
|
(:x (meters 0) (meters 0.6))
|
|
(:scale-x (meters 2) (meters 1.5))
|
|
(:rot-z (degrees 0) (degrees 360))
|
|
(:scale-y :copy scale-x)
|
|
(:r 70.0 20.0)
|
|
(:g 70.0 20.0)
|
|
(:b 70.0 20.0)
|
|
(:a 0.0 40.0)
|
|
(:vel-y (meters 0) (meters 0.1))
|
|
(:scalevel-x (meters 0.033333335) (meters 0.016666668))
|
|
(:rotvel-z (degrees -0.12) (degrees 0.24))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r 3.3)
|
|
(:fade-g 3.12)
|
|
(:fade-b 1.18)
|
|
(:fade-a 1.76)
|
|
(:friction 0.88)
|
|
(:timer (seconds 2.367))
|
|
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3))
|
|
(:next-time (seconds 0.117) (seconds 0.047))
|
|
(:next-launcher 4880)
|
|
(:conerot-x (degrees 0) (degrees 360))
|
|
(:conerot-y (degrees 0) (degrees 360))
|
|
)
|
|
)
|
|
|
|
(defpart 4880
|
|
:init-specs ((:scalevel-x (meters 0.0033333334))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r -0.53333336)
|
|
(:fade-g -1.9666667)
|
|
(:fade-b -2.2)
|
|
(:fade-a -0.41666666)
|
|
(:next-time (seconds 0.15) (seconds 0.047))
|
|
(:next-launcher 4881)
|
|
)
|
|
)
|
|
|
|
(defpart 4881
|
|
:init-specs ((:scalevel-x (meters 0))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r -0.38833332)
|
|
(:fade-g -0.21333334)
|
|
(:fade-b -0.028333334)
|
|
(:fade-a -0.38833332)
|
|
)
|
|
)
|
|
|
|
(defpart 4868
|
|
:init-specs ((:texture (new 'static 'texture-id :index #x31 :page #xc))
|
|
(:num 4.0 2.0)
|
|
(:scale-x (meters 0.1) (meters 0.25))
|
|
(:rot-x 4)
|
|
(:rot-z (degrees 0) (degrees 360))
|
|
(:scale-y (meters 0.2) (meters 0.1))
|
|
(:r 128.0 128.0)
|
|
(:g 96.0)
|
|
(:b 64.0)
|
|
(:a 64.0 64.0)
|
|
(:scalevel-x (meters 0.13333334) (meters 0.02))
|
|
(:fade-g 1.6)
|
|
(:fade-b 3.2)
|
|
(:fade-a -1.6)
|
|
(:timer (seconds 0.267))
|
|
(:flags (sp-cpuinfo-flag-2))
|
|
)
|
|
)
|
|
|
|
(defpartgroup group-sew-gunturret-smoke
|
|
:id 1127
|
|
:duration (seconds 0.017)
|
|
:flags (use-local-clock)
|
|
:bounds (static-bspherem 0 0 0 8)
|
|
:parts ((sp-item 4882 :flags (bit7)))
|
|
)
|
|
|
|
(defpart 4882
|
|
:init-specs ((:texture (new 'static 'texture-id :page #xc))
|
|
(:num 0.5)
|
|
(:scale-x (meters 0.5) (meters 0.25))
|
|
(:rot-z (degrees 0) (degrees 360))
|
|
(:scale-y :copy scale-x)
|
|
(:r 64.0 64.0)
|
|
(:g :copy r)
|
|
(:b :copy g)
|
|
(:a 16.0)
|
|
(:vel-z (meters 0.006666667) (meters 0.006666667))
|
|
(:scalevel-x (meters 0.0033333334) (meters 0.004))
|
|
(:rotvel-z (degrees -0.3) (degrees 0.6))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-a -0.026666667 -0.10666667)
|
|
(:accel-y (meters 0.0001) (meters 0.000033333334))
|
|
(:friction 0.98)
|
|
(:timer (seconds 2))
|
|
(:flags (sp-cpuinfo-flag-2))
|
|
(:userdata :data (new 'static 'boxed-array :type int32 40 1 0 #xc00000 #xc00000 #xc03300))
|
|
(:rotate-y (degrees 0))
|
|
)
|
|
)
|
|
|
|
(defpartgroup group-sew-gunturret-casing
|
|
:id 1128
|
|
:duration (seconds 0.017)
|
|
:flags (use-local-clock)
|
|
:bounds (static-bspherem 0 0 0 8)
|
|
:parts ((sp-item 4883 :fade-after (meters 80) :falloff-to (meters 100) :flags (bit7))
|
|
(sp-item 4884 :fade-after (meters 80) :falloff-to (meters 100) :flags (bit7))
|
|
)
|
|
)
|
|
|
|
(defpart 4884
|
|
:init-specs ((:texture (new 'static 'texture-id :page #xc))
|
|
(:num 3.0)
|
|
(:scale-x (meters 0.5) (meters 0.25))
|
|
(:rot-z (degrees 0) (degrees 360))
|
|
(:scale-y :copy scale-x)
|
|
(:r 255.0)
|
|
(:g 255.0)
|
|
(:b 0.0)
|
|
(:a 32.0)
|
|
(:vel-z (meters 0.006666667) (meters 0.006666667))
|
|
(:scalevel-x (meters 0.0033333334) (meters 0.004))
|
|
(:rotvel-z (degrees -0.3) (degrees 0.6))
|
|
(:scalevel-y :copy scalevel-x)
|
|
(:fade-r -2.56)
|
|
(:fade-g -2.56)
|
|
(:fade-b 2.56)
|
|
(:fade-a -0.32)
|
|
(:accel-y (meters 0.0001) (meters 0.000033333334))
|
|
(:friction 0.98)
|
|
(:timer (seconds 2))
|
|
(:flags (sp-cpuinfo-flag-2))
|
|
(:userdata :data (new 'static 'boxed-array :type int32 40 1 0 #xc00000 #xc00000 #xc03300))
|
|
(:next-time (seconds 0.167))
|
|
(:next-launcher 4885)
|
|
(:rotate-y (degrees 0))
|
|
)
|
|
)
|
|
|
|
(defpart 4885
|
|
:init-specs ((:fade-r 0.0) (:fade-g 0.0) (:fade-b 0.0) (:fade-a -0.026666667 -0.10666667))
|
|
)
|
|
|
|
(defpart 4883
|
|
:init-specs ((:texture (new 'static 'texture-id :index #x92 :page #xc))
|
|
(:num 1.0)
|
|
(:z (meters -0.4))
|
|
(:scale-x (meters 2.5))
|
|
(:rot-x 4)
|
|
(:scale-y (meters 0.15) (meters 0.02))
|
|
(:r 255.0)
|
|
(:g 255.0)
|
|
(:b 255.0)
|
|
(:a 64.0 32.0)
|
|
(:omega (degrees 0.03375))
|
|
(:vel-z (meters 0.033333335) (meters 0.06666667))
|
|
(:fade-b -8.0)
|
|
(:accel-y (meters -0.0016666667) (meters -0.0016666667))
|
|
(:friction 0.9 0.04)
|
|
(:timer (seconds 1))
|
|
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3))
|
|
(:func 'sparticle-motion-blur)
|
|
(:next-time (seconds 0.05))
|
|
(:next-launcher 4886)
|
|
(:conerot-x (degrees -20) (degrees 40))
|
|
(:conerot-z (degrees 0) (degrees 360))
|
|
(:rotate-y (degrees 0))
|
|
)
|
|
)
|
|
|
|
(defpart 4886
|
|
:init-specs ((:r 255.0) (:g 255.0) (:b 0.0) (:fade-r 0.0) (:fade-g -2.45) (:fade-a -0.384 -0.96))
|
|
)
|
|
|
|
(defskelgroup skel-sew-gunturret sew-gunturret sew-gunturret-lod0-jg sew-gunturret-idle-ja
|
|
((sew-gunturret-lod0-mg (meters 999999)))
|
|
:bounds (static-spherem 0 0 0 5)
|
|
)
|
|
|
|
(defskelgroup skel-sew-gunturret-explode sew-gunturret sew-gunturret-explode-lod0-jg sew-gunturret-explode-idle-ja
|
|
((sew-gunturret-explode-lod0-mg (meters 999999)))
|
|
:bounds (static-spherem 0 0 0 15)
|
|
)
|
|
|
|
(define *sew-gunturret-exploder-params*
|
|
(new 'static 'joint-exploder-static-params
|
|
:joints (new 'static 'boxed-array :type joint-exploder-static-joint-params
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 4 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 5 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 6 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 7 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 8 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 9 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 10 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 11 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 12 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 13 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 14 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 15 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 16 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 17 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 18 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 19 :parent-joint-index -1)
|
|
(new 'static 'joint-exploder-static-joint-params :joint-index 20 :parent-joint-index -1)
|
|
)
|
|
:collide-spec #x1
|
|
)
|
|
)
|
|
|
|
(deftype gun-turret-params (structure)
|
|
((normal-sg skeleton-group :offset-assert 0)
|
|
(explode-sg skeleton-group :offset-assert 4)
|
|
(enemy-info enemy-info :offset-assert 8)
|
|
(idle-anim int32 :offset-assert 12)
|
|
(shoot-anim int32 :offset-assert 16)
|
|
(track-joint int32 :offset-assert 20)
|
|
(barrel-joint int32 :offset-assert 24)
|
|
(gun-joint int32 :offset-assert 28)
|
|
(hole-joints int32 8 :offset-assert 32)
|
|
)
|
|
:method-count-assert 9
|
|
:size-assert #x40
|
|
:flag-assert #x900000040
|
|
)
|
|
|
|
|
|
(deftype sew-gunturret (enemy)
|
|
((gun-tilt-jm joint-mod :offset-assert 532)
|
|
(params gun-turret-params :offset-assert 536)
|
|
(aim-pos vector :inline :offset-assert 544)
|
|
(gun-twist float :offset-assert 560)
|
|
(gun-tilt float :offset-assert 564)
|
|
(desired-twist float :offset-assert 568)
|
|
(desired-tilt float :offset-assert 572)
|
|
(los-clear symbol :offset-assert 576)
|
|
(smoke-part sparticle-launch-control :offset-assert 580)
|
|
(casing-part sparticle-launch-control :offset-assert 584)
|
|
(flash-state symbol :offset-assert 588)
|
|
(can-shoot symbol :offset-assert 592)
|
|
(last-hit-time time-frame :offset-assert 600)
|
|
(init-mat matrix :inline :offset-assert 608)
|
|
(activate-distance float :offset-assert 672)
|
|
)
|
|
:heap-base #x230
|
|
:method-count-assert 142
|
|
:size-assert #x2a4
|
|
:flag-assert #x8e023002a4
|
|
(:methods
|
|
(aim-turret! (_type_ symbol) none 137)
|
|
(update-collision! (_type_) none 138)
|
|
(set-aim-at-default! (_type_) none 139)
|
|
(fire-turret! (_type_ symbol) none 140)
|
|
(init-turret-params! (_type_) none 141)
|
|
)
|
|
)
|
|
|
|
|
|
(define *sew-gunturret-enemy-info*
|
|
(new 'static 'enemy-info
|
|
:use-die-falling #f
|
|
:use-victory #f
|
|
:use-jump-blocked #f
|
|
:debug-draw-neck #f
|
|
:jump-debug-draw #f
|
|
:move-to-ground #f
|
|
:hover-if-no-ground #f
|
|
:idle-anim-script (new 'static 'array idle-control-frame 4
|
|
(new 'static 'idle-control-frame :command (ic-cmd play) :anim #x2 :param0 #x1 :param1 #x1)
|
|
(new 'static 'idle-control-frame)
|
|
(new 'static 'idle-control-frame)
|
|
(new 'static 'idle-control-frame)
|
|
)
|
|
:idle-anim 2
|
|
:notice-anim 2
|
|
:hostile-anim 2
|
|
:hit-anim 2
|
|
:knocked-anim -1
|
|
:knocked-land-anim -1
|
|
:die-anim 2
|
|
:die-falling-anim -1
|
|
:victory-anim -1
|
|
:jump-wind-up-anim -1
|
|
:jump-in-air-anim -1
|
|
:jump-land-anim -1
|
|
:neck-joint -1
|
|
:notice-distance (meters 150)
|
|
:notice-distance-delta (meters 10)
|
|
:proximity-notice-distance (meters 150)
|
|
:default-hit-points 1
|
|
:gnd-collide-with (collide-spec backgnd)
|
|
:overlaps-others-collide-with-filter (collide-spec jak bot player-list)
|
|
:movement-gravity (meters -100)
|
|
:friction 0.8
|
|
:attack-shove-back (meters 3)
|
|
:attack-shove-up (meters 2)
|
|
:attack-mode 'generic
|
|
:attack-damage 2
|
|
:jump-height-min (meters 3)
|
|
:jump-height-factor 0.5
|
|
:knocked-seek-ry-clamp 2730.6667
|
|
:knocked-soft-vxz-lo 72089.6
|
|
:knocked-soft-vxz-hi 108134.4
|
|
:knocked-soft-vy-lo 81920.0
|
|
:knocked-soft-vy-hi 122880.0
|
|
:knocked-medium-vxz-lo 147456.0
|
|
:knocked-medium-vxz-hi 196608.0
|
|
:knocked-medium-vy-lo 135168.0
|
|
:knocked-medium-vy-hi 151552.0
|
|
:knocked-hard-vxz-lo 78643.2
|
|
:knocked-hard-vxz-hi 117964.8
|
|
:knocked-hard-vy-lo 183500.8
|
|
:knocked-hard-vy-hi 209715.2
|
|
:knocked-huge-vxz-lo 164659.2
|
|
:knocked-huge-vxz-hi 249036.8
|
|
:knocked-huge-vy-lo 183500.8
|
|
:knocked-huge-vy-hi 217907.2
|
|
:knocked-yellow-vxz-lo 40960.0
|
|
:knocked-yellow-vxz-hi 49152.0
|
|
:knocked-yellow-vy-lo 57344.0
|
|
:knocked-yellow-vy-hi 81920.0
|
|
:knocked-red-vxz-lo 24576.0
|
|
:knocked-red-vxz-hi 196608.0
|
|
:knocked-red-vy-lo 94208.0
|
|
:knocked-red-vy-hi 151552.0
|
|
:knocked-blue-vxz-lo 40960.0
|
|
:knocked-blue-vxz-hi 49152.0
|
|
:knocked-blue-vy-lo 24576.0
|
|
:knocked-blue-vy-hi 81920.0
|
|
:shadow-size (meters 1)
|
|
:shadow-max-y (meters 1)
|
|
:shadow-min-y (meters -1)
|
|
:shadow-locus-dist (meters 150)
|
|
:gem-joint -1
|
|
:gem-offset (new 'static 'sphere :r 163840.0)
|
|
)
|
|
)
|
|
|
|
(set! (-> *sew-gunturret-enemy-info* fact-defaults) *fact-info-enemy-defaults*)
|
|
|
|
(defmethod aim-turret! sew-gunturret ((obj sew-gunturret) (aim-at-target? symbol))
|
|
"Calculates the angle and tilt for the turret to either aim at the target, or it's default direction
|
|
@param aim-at-target? Whether or not the turret should aim at the target, will ignore the target if #f"
|
|
(cond
|
|
((and aim-at-target? (-> obj los-clear))
|
|
(let ((target-proc (handle->process (-> obj focus handle))))
|
|
(if target-proc
|
|
(set! (-> obj aim-pos quad) (-> (get-trans (the-as process-focusable target-proc) 3) quad))
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(set-aim-at-default! obj)
|
|
)
|
|
)
|
|
(let ((s4-0 (new 'stack-no-clear 'vector))
|
|
(s5-2 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data (-> obj params track-joint))))
|
|
)
|
|
(let ((s3-0 (new 'stack-no-clear 'vector)))
|
|
(vector-! s4-0 (-> obj aim-pos) (-> obj root trans))
|
|
(vector-flatten! s4-0 s4-0 (-> obj init-mat vector 1))
|
|
(vector-normalize! s4-0 1.0)
|
|
(set! (-> obj desired-twist) (asin (vector-dot (the-as vector (-> obj init-mat)) s4-0)))
|
|
(set! (-> obj desired-twist) (fmin 5461.3335 (fmax -5461.3335 (-> obj desired-twist))))
|
|
(cond
|
|
((< 0.0 (vector-dot (-> obj init-mat vector 2) s4-0))
|
|
)
|
|
((< (-> obj desired-twist) 0.0)
|
|
(set! (-> obj desired-twist) -5461.3335)
|
|
)
|
|
(else
|
|
(set! (-> obj desired-twist) 5461.3335)
|
|
)
|
|
)
|
|
(cond
|
|
((and (!= (-> obj activate-distance) 0.0) (< (fabs (-> obj desired-twist)) 5461.3335))
|
|
(vector-normalize-copy! s3-0 (-> obj node-list data (-> obj params track-joint) bone transform vector 1) 1.0)
|
|
(vector-! s4-0 (-> obj aim-pos) s5-2)
|
|
(vector-normalize! s4-0 1.0)
|
|
(set! (-> obj desired-tilt) (- (asin (vector-dot s3-0 s4-0))))
|
|
(set! (-> obj desired-tilt) (fmin 5461.3335 (fmax 0.0 (-> obj desired-tilt))))
|
|
)
|
|
(else
|
|
(set! (-> obj desired-tilt) 0.0)
|
|
)
|
|
)
|
|
)
|
|
(vector-normalize-copy!
|
|
(-> obj aim-pos)
|
|
(-> obj node-list data (-> obj params barrel-joint) bone transform vector 2)
|
|
(vector-vector-distance s5-2 (-> obj aim-pos))
|
|
)
|
|
)
|
|
(vector+!
|
|
(-> obj aim-pos)
|
|
(-> obj aim-pos)
|
|
(vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data (-> obj params gun-joint)))
|
|
)
|
|
(let ((matrix (new 'stack-no-clear 'matrix)))
|
|
(+! (-> obj gun-twist) (fmax -364.0889 (fmin 364.0889 (* 0.3 (- (-> obj desired-twist) (-> obj gun-twist))))))
|
|
(matrix-rotate-y! matrix (-> obj gun-twist))
|
|
(matrix*! matrix matrix (-> obj init-mat))
|
|
(matrix->quaternion (-> obj root quat) matrix)
|
|
)
|
|
(+! (-> obj gun-tilt) (fmax -364.0889 (fmin 364.0889 (* 0.3 (- (-> obj desired-tilt) (-> obj gun-tilt))))))
|
|
(quaternion-axis-angle! (-> obj gun-tilt-jm quat) 1.0 0.0 0.0 (-> obj gun-tilt))
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defmethod update-collision! sew-gunturret ((obj sew-gunturret))
|
|
"Updates the collision for the turret based on it's aiming direction"
|
|
(let ((target-proc (handle->process (-> obj focus handle))))
|
|
(if target-proc
|
|
(set! (-> obj aim-pos quad) (-> (get-trans (the-as process-focusable target-proc) 3) quad))
|
|
)
|
|
)
|
|
(let* ((s4-0 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data (-> obj params gun-joint))))
|
|
(s5-3 (vector-! (new 'stack-no-clear 'vector) (-> obj aim-pos) s4-0))
|
|
)
|
|
(when (< (vector-dot (vector-normalize-copy! (new 'stack-no-clear 'vector) s5-3 1.0) (-> obj init-mat vector 2))
|
|
(cos 364.0889)
|
|
)
|
|
(let ((cquery (new 'stack-no-clear 'collide-query)))
|
|
(set! (-> cquery start-pos quad) (-> s4-0 quad))
|
|
(set! (-> cquery move-dist quad) (-> s5-3 quad))
|
|
(let ((_cquery cquery))
|
|
(set! (-> _cquery radius) 409.6)
|
|
(set! (-> _cquery collide-with)
|
|
(collide-spec backgnd crate obstacle hit-by-player-list hit-by-others-list pusher)
|
|
)
|
|
(set! (-> _cquery ignore-process0) obj)
|
|
(set! (-> _cquery ignore-process1) #f)
|
|
(set! (-> _cquery ignore-pat)
|
|
(new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1)
|
|
)
|
|
(set! (-> _cquery action-mask) (collide-action solid))
|
|
)
|
|
(if (>= (fill-and-probe-using-line-sphere *collide-cache* cquery) 0.0)
|
|
(set! (-> obj los-clear) #f)
|
|
(set! (-> obj los-clear) #t)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defmethod set-aim-at-default! sew-gunturret ((obj sew-gunturret))
|
|
"Aims the turret at it's default direction. Sets `aim-pos` accordingly"
|
|
(vector+float*! (-> obj aim-pos) (-> obj root trans) (-> obj init-mat vector 2) 163840.0)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defmethod fire-turret! sew-gunturret ((obj sew-gunturret) (fire-sound? symbol))
|
|
"Actually fires the turret, sets `flash-state` to [[#t]]
|
|
@param fire-sound? Whether to play the fire sound effect or not"
|
|
(let ((v1-4 (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data (-> obj params gun-joint))))
|
|
(proj-params (new 'stack-no-clear 'projectile-init-by-other-params))
|
|
)
|
|
(let* ((s2-1 (vector-! (new 'stack-no-clear 'vector) (-> obj aim-pos) v1-4))
|
|
(f30-0 (/ 2013265900.0 (vector-length s2-1)))
|
|
(temp-vec (new 'stack-no-clear 'vector))
|
|
)
|
|
(set! (-> proj-params ent) (-> obj entity))
|
|
(set! (-> proj-params charge) 1.0)
|
|
(set! (-> proj-params options) (projectile-options))
|
|
(set! (-> proj-params pos quad) (-> v1-4 quad))
|
|
(set! (-> proj-params notify-handle) (process->handle obj))
|
|
(set! (-> proj-params owner-handle) (the-as handle #f))
|
|
(set! (-> proj-params ignore-handle) (process->handle obj))
|
|
(let* ((v1-12 *game-info*)
|
|
(a0-18 (+ (-> v1-12 attack-id) 1))
|
|
)
|
|
(set! (-> v1-12 attack-id) a0-18)
|
|
(set! (-> proj-params attack-id) a0-18)
|
|
)
|
|
(set! (-> proj-params timeout) (seconds 4))
|
|
(vector-normalize-copy! (-> proj-params vel) s2-1 491520.0)
|
|
(let ((f30-1 (fmin 16384.0 f30-0)))
|
|
(set-vector! temp-vec (-> s2-1 z) (-> s2-1 y) (- (-> s2-1 x)) 1.0)
|
|
(vector-normalize! temp-vec (rand-vu-float-range (- f30-1) f30-1))
|
|
(vector+! (-> proj-params vel) (-> proj-params vel) temp-vec)
|
|
(vector-cross! temp-vec temp-vec (-> proj-params vel))
|
|
(vector-normalize! temp-vec (rand-vu-float-range (- f30-1) f30-1))
|
|
)
|
|
(vector+! (-> proj-params vel) (-> proj-params vel) temp-vec)
|
|
)
|
|
(spawn-projectile guard-shot proj-params obj *default-dead-pool*)
|
|
)
|
|
(if fire-sound?
|
|
(sound-play "gtur-shot-fire")
|
|
)
|
|
(set! (-> obj flash-state) #t)
|
|
(spawn-with-cspace (-> obj casing-part) (-> obj node-list data (-> obj params hole-joints 0)))
|
|
(spawn-with-cspace (-> obj casing-part) (-> obj node-list data (-> obj params hole-joints 1)))
|
|
(spawn-with-cspace (-> obj casing-part) (-> obj node-list data (-> obj params hole-joints 2)))
|
|
(spawn-with-cspace (-> obj casing-part) (-> obj node-list data (-> obj params hole-joints 3)))
|
|
(spawn-with-cspace (-> obj casing-part) (-> obj node-list data (-> obj params hole-joints 4)))
|
|
(spawn-with-cspace (-> obj casing-part) (-> obj node-list data (-> obj params hole-joints 5)))
|
|
(spawn-with-cspace (-> obj casing-part) (-> obj node-list data (-> obj params hole-joints 6)))
|
|
(spawn-with-cspace (-> obj casing-part) (-> obj node-list data (-> obj params hole-joints 7)))
|
|
(none)
|
|
)
|
|
|
|
(defstate hostile (sew-gunturret)
|
|
:virtual #t
|
|
:exit (behavior ()
|
|
(let ((func (-> (method-of-type enemy hostile) exit)))
|
|
(if func
|
|
(func)
|
|
)
|
|
)
|
|
(ja :group! (-> self draw art-group data (-> self params idle-anim)))
|
|
(set! (-> self flash-state) #f)
|
|
(none)
|
|
)
|
|
:trans (behavior ()
|
|
(if (and (logtest? (-> self enemy-flags) (enemy-flag look-at-focus)) (-> self enemy-info use-victory))
|
|
(go-virtual victory)
|
|
)
|
|
(when (>= (- (current-time) (-> self state-time)) (-> self reaction-time))
|
|
(if (>= 2 (the-as int (-> self focus aware)))
|
|
(go-stare self)
|
|
)
|
|
)
|
|
(set! (-> self root penetrated-by) (get-penetrate-info self))
|
|
(none)
|
|
)
|
|
:code (behavior ()
|
|
(set-aim-at-default! self)
|
|
(until #f
|
|
(current-time)
|
|
(until (>= (- (current-time) (-> self last-hit-time)) (seconds 2))
|
|
(suspend)
|
|
)
|
|
(update-collision! self)
|
|
(sound-play "sew-gun-lock")
|
|
(let ((frame-counter (current-time)))
|
|
(until (>= (- (current-time) frame-counter) (seconds 0.75))
|
|
(aim-turret! self #t)
|
|
(suspend)
|
|
)
|
|
)
|
|
(ja :group! (-> self draw art-group data (-> self params shoot-anim)))
|
|
(let ((frames 0)
|
|
(fire-sound? #t)
|
|
)
|
|
(sound-play "gturret")
|
|
(let ((s4-1 (current-time)))
|
|
(until (>= (- (current-time) s4-1) (seconds 0.125))
|
|
(cond
|
|
((not (-> self can-shoot))
|
|
)
|
|
((>= (- (current-time) (the-as time-frame frames)) (seconds 0.05))
|
|
(fire-turret! self fire-sound?)
|
|
(set! frames (the-as int (current-time)))
|
|
(set! fire-sound? (not fire-sound?))
|
|
)
|
|
(else
|
|
(set! (-> self flash-state) #f)
|
|
)
|
|
)
|
|
(ja :num! (loop!))
|
|
(suspend)
|
|
)
|
|
)
|
|
)
|
|
(set! (-> self flash-state) #f)
|
|
(ja-channel-push! 1 (seconds 0.2))
|
|
(ja :group! (-> self draw art-group data (-> self params idle-anim)))
|
|
(let ((_frame-counter (current-time)))
|
|
(until (>= (- (current-time) _frame-counter) (seconds 0.5))
|
|
(spawn-with-cspace (-> self smoke-part) (-> self node-list data (-> self params hole-joints 0)))
|
|
(spawn-with-cspace (-> self smoke-part) (-> self node-list data (-> self params hole-joints 1)))
|
|
(spawn-with-cspace (-> self smoke-part) (-> self node-list data (-> self params hole-joints 2)))
|
|
(spawn-with-cspace (-> self smoke-part) (-> self node-list data (-> self params hole-joints 3)))
|
|
(spawn-with-cspace (-> self smoke-part) (-> self node-list data (-> self params hole-joints 4)))
|
|
(spawn-with-cspace (-> self smoke-part) (-> self node-list data (-> self params hole-joints 5)))
|
|
(spawn-with-cspace (-> self smoke-part) (-> self node-list data (-> self params hole-joints 6)))
|
|
(spawn-with-cspace (-> self smoke-part) (-> self node-list data (-> self params hole-joints 7)))
|
|
(suspend)
|
|
)
|
|
)
|
|
)
|
|
#f
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defstate stare (sew-gunturret)
|
|
:virtual #t
|
|
:trans (behavior ()
|
|
(let ((func (-> (method-of-type enemy stare) trans)))
|
|
(if func
|
|
(func)
|
|
)
|
|
)
|
|
(if (!= (-> self activate-distance) 0.0)
|
|
(aim-turret! self #f)
|
|
)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defmethod general-event-handler sew-gunturret ((obj sew-gunturret) (proc process) (arg2 int) (event-type symbol) (event event-message-block))
|
|
"Handles various events for the enemy
|
|
@TODO - unsure if there is a pattern for the events and this should have a more specific name"
|
|
(with-pp
|
|
(if (and (= event-type 'notify) (< 1 arg2) (= (-> event param 0) 'attack) (= (-> event param 1) *target*))
|
|
(set! (-> obj last-hit-time) (current-time))
|
|
)
|
|
(case event-type
|
|
(('start)
|
|
(let ((v0-0 (the-as object #t)))
|
|
(set! (-> obj can-shoot) (the-as symbol v0-0))
|
|
v0-0
|
|
)
|
|
)
|
|
(('stop)
|
|
(set! (-> obj can-shoot) #f)
|
|
#f
|
|
)
|
|
(('bonk)
|
|
(send-event proc 'target-mech-get-off (seconds 0.3))
|
|
(let ((evt (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> evt from) (process->ppointer pp))
|
|
(set! (-> evt num-params) 2)
|
|
(set! (-> evt message) 'shove)
|
|
(set! (-> evt param 0) (the-as uint #f))
|
|
(let ((attack-info (new 'static 'attack-info :mask (attack-info-mask shove-back shove-up id))))
|
|
(let* ((game-info *game-info*)
|
|
(id (+ (-> game-info attack-id) 1))
|
|
)
|
|
(set! (-> game-info attack-id) id)
|
|
(set! (-> attack-info id) id)
|
|
)
|
|
(set! (-> attack-info shove-back) 8192.0)
|
|
(set! (-> attack-info shove-up) 2048.0)
|
|
(set! (-> evt param 1) (the-as uint attack-info))
|
|
)
|
|
(send-event-function proc evt)
|
|
)
|
|
#f
|
|
)
|
|
(('flash-state)
|
|
(-> obj flash-state)
|
|
)
|
|
(else
|
|
((method-of-type enemy general-event-handler) obj proc arg2 event-type event)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defstate die (sew-gunturret)
|
|
:virtual #t
|
|
:enter (behavior ()
|
|
(dispose! self)
|
|
(let ((root-prim (-> self root root-prim)))
|
|
(set! (-> root-prim prim-core collide-as) (collide-spec))
|
|
(set! (-> root-prim prim-core collide-with) (collide-spec))
|
|
)
|
|
0
|
|
(set! (-> self hit-points) 0)
|
|
(play-communicator-speech! (-> *talker-speech* 53))
|
|
(none)
|
|
)
|
|
:code (behavior ()
|
|
(let ((exploder-tuning (new 'stack 'joint-exploder-tuning (the-as uint 0))))
|
|
(process-spawn
|
|
joint-exploder
|
|
(-> self params explode-sg)
|
|
6
|
|
exploder-tuning
|
|
*sew-gunturret-exploder-params*
|
|
:to self
|
|
)
|
|
)
|
|
(activate! *camera-smush-control* 819.2 37 210 1.0 0.995 (-> self clock))
|
|
(sound-play "turret-explode")
|
|
(suspend)
|
|
(cleanup-for-death self)
|
|
(ja-channel-set! 0)
|
|
(let ((vec (new 'stack-no-clear 'vector)))
|
|
(set! (-> vec quad) (-> self root trans quad))
|
|
(+! (-> vec y) 10240.0)
|
|
(let ((frame-counter (current-time)))
|
|
(until (>= (- (current-time) frame-counter) (seconds 2))
|
|
(spawn (-> self part) vec)
|
|
(suspend)
|
|
)
|
|
)
|
|
)
|
|
(let ((_frame-counter (current-time)))
|
|
(until (>= (- (current-time) _frame-counter) (seconds 1))
|
|
(suspend)
|
|
)
|
|
)
|
|
(send-event self 'death-end)
|
|
(while (-> self child)
|
|
(suspend)
|
|
)
|
|
(none)
|
|
)
|
|
:post (behavior ()
|
|
(track-target! self)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defmethod init-enemy-collision! sew-gunturret ((obj sew-gunturret))
|
|
"Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly"
|
|
(let ((cshape (new 'process 'collide-shape-moving obj (collide-list-enum usually-hit-by-player))))
|
|
(set! (-> cshape dynam) (copy *standard-dynamics* 'process))
|
|
(set! (-> cshape reaction) cshape-reaction-default)
|
|
(set! (-> cshape no-reaction)
|
|
(the-as (function collide-shape-moving collide-query vector vector object) nothing)
|
|
)
|
|
(set! (-> cshape penetrated-by) (penetrate
|
|
generic-attack
|
|
lunge
|
|
flop
|
|
punch
|
|
spin
|
|
roll
|
|
uppercut
|
|
bonk
|
|
tube
|
|
vehicle
|
|
flut-attack
|
|
board
|
|
mech-punch
|
|
dark-punch
|
|
dark-giant
|
|
)
|
|
)
|
|
(let ((prim-group (new 'process 'collide-shape-prim-group cshape (the-as uint 2) 0)))
|
|
(set! (-> cshape total-prims) (the-as uint 3))
|
|
(set! (-> prim-group prim-core collide-as) (collide-spec enemy))
|
|
(set! (-> prim-group prim-core collide-with) (collide-spec jak player-list))
|
|
(set! (-> prim-group prim-core action) (collide-action solid no-standon))
|
|
(set! (-> prim-group transform-index) 3)
|
|
(set-vector! (-> prim-group local-sphere) 0.0 9216.0 4096.0 18432.0)
|
|
(set! (-> cshape root-prim) prim-group)
|
|
)
|
|
(let ((prim-sphere (new 'process 'collide-shape-prim-sphere cshape (the-as uint 0))))
|
|
(set! (-> prim-sphere prim-core collide-as) (collide-spec enemy))
|
|
(set! (-> prim-sphere prim-core collide-with) (collide-spec jak player-list))
|
|
(set! (-> prim-sphere prim-core action) (collide-action solid no-standon))
|
|
(set! (-> prim-sphere transform-index) 3)
|
|
(set-vector! (-> prim-sphere local-sphere) 0.0 6144.0 0.0 11264.0)
|
|
)
|
|
(let ((_prim-sphere (new 'process 'collide-shape-prim-sphere cshape (the-as uint 0))))
|
|
(set! (-> _prim-sphere prim-core collide-as) (collide-spec enemy))
|
|
(set! (-> _prim-sphere prim-core collide-with) (collide-spec jak player-list))
|
|
(set! (-> _prim-sphere prim-core action) (collide-action solid no-standon))
|
|
(set! (-> _prim-sphere transform-index) 5)
|
|
(set-vector! (-> _prim-sphere local-sphere) 0.0 0.0 -5120.0 4096.0)
|
|
)
|
|
(set! (-> cshape nav-radius) (* 0.75 (-> cshape root-prim local-sphere w)))
|
|
(let ((root-prim (-> cshape root-prim)))
|
|
(set! (-> cshape backup-collide-as) (-> root-prim prim-core collide-as))
|
|
(set! (-> cshape backup-collide-with) (-> root-prim prim-core collide-with))
|
|
)
|
|
(set! (-> obj root) cshape)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defmethod in-aggro-range? sew-gunturret ((obj sew-gunturret) (proc process-focusable) (arg1 vector))
|
|
"Should the enemy activate.
|
|
- if `activate-distance` is `0.0`, always true
|
|
- otherwise, check if the provided process is close enough
|
|
@param proc The process used to distance check
|
|
@returns true/false"
|
|
(cond
|
|
((= (-> obj activate-distance) 0.0)
|
|
(return #t)
|
|
)
|
|
(else
|
|
(let ((dist (vector-dot
|
|
(vector-! (new 'stack-no-clear 'vector) (get-trans proc 3) (-> obj root trans))
|
|
(-> obj init-mat vector 2)
|
|
)
|
|
)
|
|
)
|
|
(return (and (< 0.0 dist) (< dist (-> obj activate-distance))))
|
|
)
|
|
)
|
|
)
|
|
(the-as symbol 0)
|
|
)
|
|
|
|
(defmethod deactivate sew-gunturret ((obj sew-gunturret))
|
|
(if (nonzero? (-> obj smoke-part))
|
|
(kill-and-free-particles (-> obj smoke-part))
|
|
)
|
|
(if (nonzero? (-> obj casing-part))
|
|
(kill-and-free-particles (-> obj casing-part))
|
|
)
|
|
((method-of-type enemy deactivate) obj)
|
|
(none)
|
|
)
|
|
|
|
(defmethod coin-flip? sew-gunturret ((obj sew-gunturret))
|
|
"@returns The result of a 50/50 RNG roll"
|
|
#f
|
|
)
|
|
|
|
;; WARN: Return type mismatch enemy vs sew-gunturret.
|
|
(defmethod relocate sew-gunturret ((obj sew-gunturret) (arg0 int))
|
|
(if (nonzero? (-> obj gun-tilt-jm))
|
|
(&+! (-> obj gun-tilt-jm) arg0)
|
|
)
|
|
(if (nonzero? (-> obj smoke-part))
|
|
(&+! (-> obj smoke-part) arg0)
|
|
)
|
|
(if (nonzero? (-> obj casing-part))
|
|
(&+! (-> obj casing-part) arg0)
|
|
)
|
|
(the-as sew-gunturret ((method-of-type enemy relocate) obj arg0))
|
|
)
|
|
|
|
(defmethod init-turret-params! sew-gunturret ((obj sew-gunturret))
|
|
(let ((turret-params
|
|
(new 'static 'gun-turret-params
|
|
:idle-anim 2
|
|
:shoot-anim 3
|
|
:track-joint 6
|
|
:barrel-joint 4
|
|
:gun-joint 5
|
|
:hole-joints (new 'static 'array int32 8 7 8 9 10 11 12 13 14)
|
|
)
|
|
)
|
|
)
|
|
(set! (-> turret-params normal-sg)
|
|
(the-as skeleton-group (art-group-get-by-name *level* "skel-sew-gunturret" (the-as (pointer uint32) #f)))
|
|
)
|
|
(set! (-> turret-params explode-sg)
|
|
(the-as
|
|
skeleton-group
|
|
(art-group-get-by-name *level* "skel-sew-gunturret-explode" (the-as (pointer uint32) #f))
|
|
)
|
|
)
|
|
(set! (-> turret-params enemy-info) *sew-gunturret-enemy-info*)
|
|
(set! (-> obj params) turret-params)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defmethod init-enemy! sew-gunturret ((obj sew-gunturret))
|
|
"Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods"
|
|
(init-turret-params! obj)
|
|
(initialize-skeleton obj (-> obj params normal-sg) (the-as pair 0))
|
|
(init-enemy-behaviour-and-stats! obj (-> obj params enemy-info))
|
|
(logclear! (-> obj mask) (process-mask actor-pause))
|
|
(logclear! (-> obj enemy-flags) (enemy-flag notice))
|
|
(set! (-> obj part) (create-launch-control (-> *part-group-id-table* 1126) obj))
|
|
(set! (-> obj smoke-part) (create-launch-control (-> *part-group-id-table* 1127) obj))
|
|
(set! (-> obj casing-part) (create-launch-control (-> *part-group-id-table* 1128) obj))
|
|
(set! (-> obj gun-tilt-jm)
|
|
(new 'process 'joint-mod (joint-mod-mode joint-set*) obj (-> obj params barrel-joint))
|
|
)
|
|
(set! (-> obj los-clear) #f)
|
|
(set! (-> obj gun-twist) 0.0)
|
|
(set! (-> obj gun-tilt) 0.0)
|
|
(set! (-> obj desired-twist) 0.0)
|
|
(set! (-> obj desired-tilt) 0.0)
|
|
(set! (-> obj flash-state) #f)
|
|
(set! (-> obj can-shoot) #t)
|
|
(set! (-> obj last-hit-time) 0)
|
|
(quaternion->matrix (-> obj init-mat) (-> obj root quat))
|
|
(set! (-> obj activate-distance) (res-lump-float (-> obj entity) 'distance))
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; WARN: Return type mismatch object vs none.
|
|
(defmethod go-idle sew-gunturret ((obj sew-gunturret))
|
|
(cond
|
|
((task-node-closed? (game-task-node sewer-enemy-blow-up-turrets))
|
|
(cleanup-for-death obj)
|
|
(go (method-of-object obj die-fast))
|
|
)
|
|
(else
|
|
(go (method-of-object obj idle))
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
(defskelgroup skel-pal-gun-turret pal-gun-turret pal-gun-turret-lod0-jg pal-gun-turret-idle-ja
|
|
((pal-gun-turret-lod0-mg (meters 999999)))
|
|
:bounds (static-spherem 0 0 0 4)
|
|
)
|
|
|
|
(defskelgroup skel-pal-gun-turret-explode pal-gun-turret pal-gun-turret-explode-lod0-jg pal-gun-turret-explode-idle-ja
|
|
((pal-gun-turret-explode-lod0-mg (meters 999999)))
|
|
:bounds (static-spherem 0 0 0 15)
|
|
)
|
|
|
|
(define *pal-gun-turret-enemy-info*
|
|
(new 'static 'enemy-info
|
|
:use-die-falling #f
|
|
:use-victory #f
|
|
:use-jump-blocked #f
|
|
:debug-draw-neck #f
|
|
:jump-debug-draw #f
|
|
:move-to-ground #f
|
|
:hover-if-no-ground #f
|
|
:idle-anim-script (new 'static 'array idle-control-frame 4
|
|
(new 'static 'idle-control-frame :command (ic-cmd play) :anim #x2 :param0 #x2 :param1 #x2)
|
|
(new 'static 'idle-control-frame)
|
|
(new 'static 'idle-control-frame)
|
|
(new 'static 'idle-control-frame)
|
|
)
|
|
:idle-anim 2
|
|
:notice-anim 2
|
|
:hostile-anim 2
|
|
:hit-anim 2
|
|
:knocked-anim -1
|
|
:knocked-land-anim -1
|
|
:die-anim 2
|
|
:die-falling-anim -1
|
|
:victory-anim -1
|
|
:jump-wind-up-anim -1
|
|
:jump-in-air-anim -1
|
|
:jump-land-anim -1
|
|
:neck-joint -1
|
|
:notice-distance (meters 150)
|
|
:notice-distance-delta (meters 10)
|
|
:proximity-notice-distance (meters 150)
|
|
:default-hit-points 1
|
|
:gnd-collide-with (collide-spec backgnd)
|
|
:overlaps-others-collide-with-filter (collide-spec jak bot player-list)
|
|
:movement-gravity (meters -100)
|
|
:friction 0.8
|
|
:attack-shove-back (meters 3)
|
|
:attack-shove-up (meters 2)
|
|
:attack-mode 'generic
|
|
:attack-damage 2
|
|
:jump-height-min (meters 3)
|
|
:jump-height-factor 0.5
|
|
:knocked-seek-ry-clamp 2730.6667
|
|
:knocked-soft-vxz-lo 72089.6
|
|
:knocked-soft-vxz-hi 108134.4
|
|
:knocked-soft-vy-lo 81920.0
|
|
:knocked-soft-vy-hi 122880.0
|
|
:knocked-medium-vxz-lo 147456.0
|
|
:knocked-medium-vxz-hi 196608.0
|
|
:knocked-medium-vy-lo 135168.0
|
|
:knocked-medium-vy-hi 151552.0
|
|
:knocked-hard-vxz-lo 78643.2
|
|
:knocked-hard-vxz-hi 117964.8
|
|
:knocked-hard-vy-lo 183500.8
|
|
:knocked-hard-vy-hi 209715.2
|
|
:knocked-huge-vxz-lo 164659.2
|
|
:knocked-huge-vxz-hi 249036.8
|
|
:knocked-huge-vy-lo 183500.8
|
|
:knocked-huge-vy-hi 217907.2
|
|
:knocked-yellow-vxz-lo 40960.0
|
|
:knocked-yellow-vxz-hi 49152.0
|
|
:knocked-yellow-vy-lo 57344.0
|
|
:knocked-yellow-vy-hi 81920.0
|
|
:knocked-red-vxz-lo 24576.0
|
|
:knocked-red-vxz-hi 196608.0
|
|
:knocked-red-vy-lo 94208.0
|
|
:knocked-red-vy-hi 151552.0
|
|
:knocked-blue-vxz-lo 40960.0
|
|
:knocked-blue-vxz-hi 49152.0
|
|
:knocked-blue-vy-lo 24576.0
|
|
:knocked-blue-vy-hi 81920.0
|
|
:shadow-size (meters 1)
|
|
:shadow-max-y (meters 1)
|
|
:shadow-min-y (meters -1)
|
|
:shadow-locus-dist (meters 150)
|
|
:gem-joint -1
|
|
:gem-offset (new 'static 'sphere :r 163840.0)
|
|
)
|
|
)
|
|
|
|
(set! (-> *pal-gun-turret-enemy-info* fact-defaults) *fact-info-enemy-defaults*)
|
|
|
|
(deftype pal-gun-turret (sew-gunturret)
|
|
()
|
|
:heap-base #x230
|
|
:method-count-assert 142
|
|
:size-assert #x2a4
|
|
:flag-assert #x8e023002a4
|
|
(:methods
|
|
(fire-turret! (_type_ symbol) float :replace 140)
|
|
)
|
|
)
|
|
|
|
|
|
(defmethod fire-turret! pal-gun-turret ((obj pal-gun-turret) (arg0 symbol))
|
|
"@overrides Calls [[sew-gunturret::140]] but also customizes the turret flash via [[set-palcab-turret-flash!]]"
|
|
((the-as (function sew-gunturret symbol none) (find-parent-method pal-gun-turret 140)) obj arg0)
|
|
(set-palcab-turret-flash! 1.0)
|
|
)
|
|
|
|
;; WARN: Return type mismatch object vs none.
|
|
(defmethod go-idle pal-gun-turret ((obj pal-gun-turret))
|
|
(go (method-of-object obj idle))
|
|
(none)
|
|
)
|
|
|
|
(defmethod init-turret-params! pal-gun-turret ((obj pal-gun-turret))
|
|
(let ((turret-params
|
|
(new 'static 'gun-turret-params
|
|
:idle-anim 2
|
|
:shoot-anim 3
|
|
:track-joint 6
|
|
:barrel-joint 4
|
|
:gun-joint 5
|
|
:hole-joints (new 'static 'array int32 8 7 8 9 10 11 12 13 14)
|
|
)
|
|
)
|
|
)
|
|
(set! (-> turret-params normal-sg)
|
|
(the-as skeleton-group (art-group-get-by-name *level* "skel-pal-gun-turret" (the-as (pointer uint32) #f)))
|
|
)
|
|
(set! (-> turret-params explode-sg)
|
|
(the-as
|
|
skeleton-group
|
|
(art-group-get-by-name *level* "skel-pal-gun-turret-explode" (the-as (pointer uint32) #f))
|
|
)
|
|
)
|
|
(set! (-> turret-params enemy-info) *pal-gun-turret-enemy-info*)
|
|
(set! (-> obj params) turret-params)
|
|
)
|
|
0
|
|
(none)
|
|
)
|