jak-project/goal_src/jak2/levels/sewer/sew-gunturret.gc
2023-07-14 18:01:09 -04:00

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)
)