jak-project/goal_src/jak3/levels/sewer/sew-laser-turret.gc
Hat Kid e2e5289788
decomp3: font widescreen and shadow hacks, generic renderer, misc files (#3483)
- `pecker-ingame`
- `des-bbush-tasks`
- `des-burning-bush`
- `des-bush-part`
- `des-bush`
- `mh-centipede`
- `mh-centipede-part`
- `mh-wasp`
- `mh-wasp-part`
- `needle-fish`
- `des-bush-time-chase`
- `timer-path`
- `mission-squad-control-h`
- `mh-bat`
- `hover-nav-factoryd`
- `hover-nav-factoryc`
- `conveyor`
- `fac-part`
- `factory-part`
- `factoryc-mood`
- `factoryc-obs`
- `factoryc-obs2`
- `lfaccar-init`
- `factory-boss-part`
- `factory-boss-scenes`
- `factory-boss-setup`
- `factory-boss-states`
- `factory-mood`
- `factoryc-manager`
- `lfacrm1-mood`
- `lfacrm2-mood`
- `missile-bot`
- `sew-laser-turret`
- `ai-task-h`
- `ash-h`
- `ash-shot`
- `ash-states`
- `ash-task`
- `ash`
- `bot-h`
- `bot-states`
- `bot`
- `ash-oasis-course`
- `oasis-defense`
- `comb-field`
- `comb-mood`
- `comb-obs`
- `comb-part`
- `comb-scenes`
- `comb-sentry`
- `comb-travel`
- `comba-init`
- `combx-scenes`
- `h-sled`
- `destroy-dark-eco`
- `fac-gunturret`
- `fac-robotank-turret`
- `fac-robotank`
- `fac-tower`
- `factory-h`
- `factory-hud`
- `factory-manager`
- `factorya-init`
- `ffight-projectile`
- `ftank-projectile`
- `fturret-projectile`
- `h-warf`
- `warf-projectile`
2024-04-28 08:59:46 -04:00

1214 lines
39 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: sew-laser-turret.gc
;; name in dgo: sew-laser-turret
;; dgos: SEA
;; DECOMP BEGINS
(deftype gun-turret-params (structure)
((normal-sg skeleton-group)
(explode-sg skeleton-group)
(enemy-info enemy-info)
(idle-anim int32)
(shoot-anim int32)
(track-joint int32)
(barrel-joint int32)
(gun-joint int32)
(hole-joints int32 8)
)
)
(deftype sew-laser-turret (enemy)
((params gun-turret-params)
(aim-pos vector :inline)
(smoke-part sparticle-launch-control)
(casing-part sparticle-launch-control)
(flash-state symbol)
(can-shoot symbol)
(last-active-time time-frame)
(target-distance float)
(target-on-ground symbol)
(was-hit symbol)
(awareness-radius float)
(ring-rate time-frame)
(max-num-rings int32)
(last-spawn-index int32)
(spin-sound-id sound-id)
(last-play-time time-frame)
(strip prim-strip)
)
(:state-methods
alert
spinning-up
spinning-down
turn-off
)
(:methods
(start-firing (_type_ symbol int) none)
(sew-laser-turret-method-160 (_type_) none)
(generate-prim-verts! (_type_ float float) none)
(check-suitable-focus (_type_) symbol)
(sew-laser-turret-method-163 (_type_) none)
)
)
(defpartgroup group-sew-laser-turret-hit
:id 1518
:duration (seconds 0.5)
:linger-duration (seconds 1)
:flags (sp0)
:bounds (static-bspherem 0 0 0 15)
:parts ((sp-item 4757 :period (seconds 5) :length (seconds 0.085) :offset -10)
(sp-item 4758 :fade-after (meters 60) :period (seconds 5) :length (seconds 0.1))
(sp-item 4759 :fade-after (meters 60) :falloff-to (meters 60) :period (seconds 5) :length (seconds 0.335))
(sp-item 4760 :fade-after (meters 200) :falloff-to (meters 200) :period (seconds 5) :length (seconds 0.167))
(sp-item 4761 :period (seconds 5) :length (seconds 0.017) :offset -10)
(sp-item 4762 :fade-after (meters 150) :falloff-to (meters 150) :period (seconds 5) :length (seconds 0.167))
)
)
(defpart 4760
:init-specs ((:texture (explosion-edge level-default-sprite))
(: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 sp-cpuinfo-flag-3))
(:func 'sparticle-motion-blur)
(:next-time (seconds 0.085) (seconds 0.015))
(:next-launcher 4962)
(:conerot-x '*sp-temp*)
)
)
(defpart 4762
:init-specs ((:texture (explosion-nebula level-default-sprite))
(: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 4962)
(:conerot-x (degrees 0) (degrees 360))
)
)
(defpart 4962
:init-specs ((:fade-r 0.0) (:fade-g 0.0) (:fade-b 0.0) (:next-time (seconds 0.017) (seconds 0.065)) (:next-launcher 4963))
)
(defpart 4963
: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 4964)
)
)
(defpart 4964
: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 4965)
)
)
(defpart 4965
:init-specs ((:fade-r 0.0) (:fade-g 0.0) (:fade-b 0.0))
)
(defpart 4761
:init-specs ((:texture (glow level-default-sprite))
(: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 4966)
)
)
(defpart 4966
: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 4759
:init-specs ((:texture (specs level-default-sprite))
(: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 4967)
(:conerot-x (degrees 0) (degrees 360))
)
)
(defpart 4967
: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 4968)
)
)
(defpart 4968
:init-specs ((:fade-r -0.5543478) (:fade-g -0.5543478) (:fade-a -0.13913043))
)
(defpart 4757
:init-specs ((:texture (bigpuff level-default-sprite))
(: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 4969)
(:conerot-x (degrees 0) (degrees 360))
(:conerot-y (degrees 0) (degrees 360))
)
)
(defpart 4969
: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 4970)
)
)
(defpart 4970
: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 4758
:init-specs ((:texture (motion-blur-part level-default-sprite))
(: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-laser-turret-smoke
:id 1519
:duration (seconds 0.017)
:flags (sp0)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 4971 :flags (sp7)))
)
(defpart 4971
:init-specs ((:texture (bigpuff level-default-sprite))
(: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 #x400000 #x400000 #x400700))
(:rotate-y (degrees 0))
)
)
(defpartgroup group-sew-laser-turret-casing
:id 1520
:duration (seconds 0.017)
:flags (sp0)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 4972 :fade-after (meters 80) :falloff-to (meters 100) :flags (sp7))
(sp-item 4973 :fade-after (meters 80) :falloff-to (meters 100) :flags (sp7))
)
)
(defpart 4973
:init-specs ((:texture (bigpuff level-default-sprite))
(: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 #x400000 #x400000 #x400700))
(:next-time (seconds 0.167))
(:next-launcher 4974)
(:rotate-y (degrees 0))
)
)
(defpart 4974
:init-specs ((:fade-r 0.0) (:fade-g 0.0) (:fade-b 0.0) (:fade-a -0.026666667 -0.10666667))
)
(defpart 4972
:init-specs ((:texture (motion-blur-part level-default-sprite))
(: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 4975)
(:conerot-x (degrees -20) (degrees 40))
(:conerot-z (degrees 0) (degrees 360))
(:rotate-y (degrees 0))
)
)
(defpart 4975
: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-laser-turret sew-laser-turret sew-laser-turret-lod0-jg sew-laser-turret-idle-ja
((sew-laser-turret-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 5)
)
(define *sew-laser-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 'inline-array idle-control-frame 2
(new 'static 'idle-control-frame
:command (idle-control-cmd play)
:anim #x3
:param0 1
:param1 1
:param2 '((new 'static 'bfloat :data 1.0) (new 'static 'bfloat :data 1.0))
)
(new 'static 'idle-control-frame)
)
:idle-anim 3
:notice-anim 3
:hostile-anim 3
:hit-anim 3
:knocked-anim -1
:knocked-land-anim -1
:die-anim 3
: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 10.0
: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
:recover-gnd-collide-with (collide-spec backgnd crate obstacle hit-by-others-list pusher)
:knocked-can-land-timeout (seconds 0.1)
:knocked-recover-timeout (seconds 2)
:ragdoll-blend-out-time (seconds 0.25)
:ragdoll-rotate-velocity-mult 1.0
: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
:ragdoll-info #f
: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)
:knocked-off #t
)
)
(set! (-> *sew-laser-turret-enemy-info* fact-defaults) *fact-info-enemy-defaults*)
;; WARN: Return type mismatch symbol vs none.
(defmethod start-firing ((this sew-laser-turret) (arg0 symbol) (arg1 int))
(let ((a0-2 (vector<-cspace! (new 'stack-no-clear 'vector) (-> this node-list data arg1))))
(new 'stack-no-clear 'vector)
(let ((a1-3 (new 'stack-no-clear 'vector)))
(-> a0-2 y)
(set! (-> a1-3 quad) (-> this node-list data arg1 bone transform fvec quad))
(set! (-> a1-3 y) (* 0.5 (-> a1-3 y)))
(fire-laser! a0-2 a1-3 (the-as sew-laser-guard this) 491520.0)
)
)
(if arg0
(sound-play "gtur-shot-fire")
)
(set! (-> this flash-state) #t)
(none)
)
(defun do-spin ((arg0 sew-laser-turret) (arg1 float))
(let ((s5-0 (new 'stack-no-clear 'quaternion)))
(quaternion-vector-angle! s5-0 *up-vector* (* 182.04445 (seconds-per-frame) arg1))
(quaternion*! (-> arg0 root quat) (-> arg0 root quat) s5-0)
)
(quaternion-normalize! (-> arg0 root quat))
)
;; WARN: Return type mismatch symbol vs none.
(defmethod sew-laser-turret-method-163 ((this sew-laser-turret))
(let* ((s5-0 *target*)
(a0-2 (if (type? s5-0 process-focusable)
s5-0
)
)
)
(cond
(a0-2
(set! (-> this target-distance) (vector-vector-xz-distance (get-trans a0-2 0) (-> this root trans)))
(set! (-> this target-on-ground) (logtest? (-> *target* control status) (collide-status on-surface)))
)
(else
(set! (-> this target-on-ground) #f)
)
)
)
(none)
)
(defmethod check-suitable-focus ((this sew-laser-turret))
(let ((s5-0 (new 'stack-no-clear 'vector)))
(set! (-> s5-0 quad) (-> this root trans quad))
(set! (-> s5-0 w) (-> this awareness-radius))
(let ((s4-0 (new 'stack-no-clear 'array 'collide-shape 384)))
(countdown (s3-0 (fill-actor-list-for-box *actor-hash* s5-0 s4-0 384))
(let* ((s2-0 (-> s4-0 s3-0))
(v1-4 (if (type? s2-0 collide-shape)
s2-0
)
)
)
(when v1-4
(let* ((s2-1 (-> v1-4 process))
(v1-5 (if (type? s2-1 process-focusable)
s2-1
)
)
)
(when v1-5
(if (and (!= this v1-5)
(not (focus-test? (the-as process-focusable v1-5) inactive))
(not (focus-test? (the-as process-focusable v1-5) disable))
(not (focus-test? (the-as process-focusable v1-5) dead))
(not (logtest? (process-mask crate) (-> v1-5 mask)))
(not (logtest? (process-mask vehicle) (-> v1-5 mask)))
)
(return #t)
)
)
)
)
)
)
)
(let* ((s3-1 *target*)
(s4-1 (if (type? s3-1 process-focusable)
s3-1
)
)
)
(when (and s4-1 (< (vector-vector-distance (get-trans s4-1 0) s5-0) (-> s5-0 w)))
(if (and (!= this s4-1)
(not (focus-test? s4-1 inactive))
(not (focus-test? s4-1 disable))
(not (focus-test? s4-1 dead))
(not (logtest? (process-mask crate) (-> s4-1 mask)))
(not (logtest? (process-mask vehicle) (-> s4-1 mask)))
)
(return #t)
)
)
)
)
#f
)
(defun compute-ring-period ((arg0 int))
(/ 1.0 (the float arg0))
)
(defun compute-ring-position ((arg0 int) (arg1 int))
(* (compute-ring-period arg1) (the float (- arg1 arg0)))
)
(defun compute-num-rings-to-draw ((arg0 time-frame) (arg1 time-frame) (arg2 float) (arg3 int))
(if (< arg1 arg0)
arg3
(+ (the int (/ arg2 (compute-ring-period arg3))) 1)
)
)
(defun compute-ring-size ((arg0 float) (arg1 float))
(let ((f0-1 (- arg0 (- 1.0 arg1))))
(if (< f0-1 0.0)
(set! f0-1 (+ 1.0 f0-1))
)
f0-1
)
)
;; og:preserve-this decompiled manually
(defun check-enemy ((turret sew-laser-turret) (radius float) (pfoc process-focusable))
(let ((dist (-> turret target-distance)))
(and (-> turret target-on-ground)
(>= dist (+ radius (meters -0.1)))
(>= dist (+ radius (meters 0.1)))
)
)
)
(defstate spinning-up (sew-laser-turret)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
(set-time! (-> self state-time))
)
:exit (behavior ()
'()
)
:trans (behavior ()
(if (and (logtest? (-> self enemy-flags) (enemy-flag victory)) (-> self enemy-info use-victory))
(go-virtual victory)
)
(set! (-> self root penetrated-by) (get-penetrated-by self))
)
:code (behavior ()
(until #f
(if (time-elapsed? (-> self state-time) (seconds 1.2))
(go-hostile self)
)
(let ((f0-1 (* 0.0027777778 (the float (mod (- (current-time) (-> self state-time)) 360)))))
(do-spin self (* 240.0 f0-1))
)
(suspend)
)
#f
)
:post enemy-simple-post
)
(defstate spinning-down (sew-laser-turret)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
(set-time! (-> self state-time))
)
:exit (behavior ()
'()
)
:trans (behavior ()
(if (and (logtest? (-> self enemy-flags) (enemy-flag victory)) (-> self enemy-info use-victory))
(go-virtual victory)
)
(set! (-> self root penetrated-by) (get-penetrated-by self))
)
:code (behavior ()
(until #f
(if (time-elapsed? (-> self state-time) (seconds 1.2))
(go-virtual alert)
)
(let ((f0-1 (* 0.0027777778 (the float (mod (- (current-time) (-> self state-time)) 360)))))
(do-spin self (* 240.0 (- 1.0 f0-1)))
)
(suspend)
)
#f
)
:post enemy-simple-post
)
;; WARN: Return type mismatch uint vs none.
(defmethod generate-prim-verts! ((this sew-laser-turret) (arg0 float) (arg1 float))
(let ((s3-0 (new 'stack-no-clear 'vector)))
(set! (-> s3-0 quad) (-> *x-vector* quad))
(let ((s5-0 (new 'stack-no-clear 'vector)))
(set! (-> s5-0 quad) (-> *z-vector* quad))
(let ((s4-0 (new 'stack-no-clear 'vector))
;; og:preserve-this
;; (s0-0 (new 'stack-no-clear 'rgbaf))
(s0-0 (new 'static 'rgba))
)
0.0
(let* ((s2-0 (* arg1 arg1))
(f30-0 (lerp 128.0 0.0 s2-0))
(s2-1 (* s2-0 s2-0))
(s2-2
(logior (logand (logior (logand (logior (logand (logior (logand s0-0 (the-as uint -256))
(shr (shl (the int (lerp (the float (-> *color-red* r)) (the float (-> *color-green* r)) s2-1)) 56) 56)
)
-65281
)
(shr (shl (the int (lerp (the float (-> *color-red* g)) (the float (-> *color-green* g)) s2-1)) 56) 48)
)
-16711681
)
(shr (shl (the int (lerp (the float (-> *color-red* b)) (the float (-> *color-green* b)) s2-1)) 56) 40)
)
(the-as uint #xffffffff00ffffff)
)
(shr (shl (-> *color-gray* a) 56) 32)
)
)
)
(set! (-> s3-0 y) 0.0)
(set! (-> s3-0 z) 0.0)
(vector-normalize! s3-0 arg0)
(vector-normalize! s5-0 arg0)
(vector+! s4-0 (-> this root trans) s3-0)
(vector+! s4-0 s4-0 s5-0)
(dotimes (v1-39 3)
(let ((a0-21 (-> this strip data (-> this strip num-verts))))
(set! (-> a0-21 pos quad) (-> s4-0 quad))
(set! (-> a0-21 stq z) (the-as float #x1))
)
(+! (-> this strip num-verts) 1)
)
(let ((v1-46 (-> this strip data (-> this strip num-verts))))
(set! (-> v1-46 pos quad) (-> s4-0 quad))
(set! (-> v1-46 stq z) 0.0)
(set! (-> v1-46 stq x) 0.0)
(set! (-> v1-46 stq y) 0.0)
(set! (-> v1-46 col) (the-as rgba s2-2))
(set! (-> v1-46 col a) (the int f30-0))
(let ((v1-47 (&+ v1-46 32)))
(vector+float*! s4-0 (-> this root trans) s3-0 -1.0)
(vector+! s4-0 s4-0 s5-0)
(set! (-> v1-47 pos quad) (-> s4-0 quad))
(set! (-> v1-47 stq z) 0.0)
(set! (-> v1-47 stq x) 1.0)
(set! (-> v1-47 stq y) 0.0)
(set! (-> v1-47 col) (the-as rgba s2-2))
(set! (-> v1-47 col a) (the int f30-0))
(let ((v1-48 (&+ v1-47 32)))
(vector+! s4-0 (-> this root trans) s3-0)
(vector+float*! s4-0 s4-0 s5-0 -1.0)
(set! (-> v1-48 pos quad) (-> s4-0 quad))
(set! (-> v1-48 stq z) 0.0)
(set! (-> v1-48 stq x) 0.0)
(set! (-> v1-48 stq y) 1.0)
(set! (-> v1-48 col) (the-as rgba s2-2))
(set! (-> v1-48 col a) (the int f30-0))
(let ((v1-49 (&+ v1-48 32)))
(vector+float*! s4-0 (-> this root trans) s3-0 -1.0)
(vector+float*! s4-0 s4-0 s5-0 -1.0)
(set! (-> v1-49 pos quad) (-> s4-0 quad))
(set! (-> v1-49 stq z) 0.0)
(set! (-> v1-49 stq x) 1.0)
(set! (-> v1-49 stq y) 1.0)
(set! (-> v1-49 col) (the-as rgba s2-2))
(set! (-> v1-49 col a) (the int f30-0))
(&+ v1-49 32)
)
)
)
)
)
)
)
)
(+! (-> this strip num-verts) 4)
(none)
)
(defstate alert (sew-laser-turret)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
(set! (-> self last-spawn-index) -1)
(set-time! (-> self state-time))
)
:exit (behavior ()
(set! (-> self strip num-verts) (the-as uint 0))
0
)
:trans (behavior ()
(sew-laser-turret-method-163 self)
(when (-> self was-hit)
(set! (-> self was-hit) #f)
(go-virtual spinning-up)
)
(if (and (logtest? (-> self enemy-flags) (enemy-flag victory)) (-> self enemy-info use-victory))
(go-virtual victory)
)
(set! (-> self root penetrated-by) (get-penetrated-by self))
(set! (-> self strip num-verts) (the-as uint 0))
(set! (-> self strip alpha) (new 'static 'gs-alpha :b #x2 :d #x1))
(set! (-> self strip adnops 0 cmds) (gs-reg64 test-1))
(set! (-> self strip data0) (new 'static 'gs-test
:ate #x1
:atst (gs-atest greater-equal)
:aref #x80
:afail #x1
:zte #x1
:ztst (gs-ztest greater-equal)
)
)
(setup-dma-and-tex (-> self strip) (-> self draw))
(let ((gp-0 (new 'stack-no-clear 'vector)))
(set! (-> gp-0 quad) (-> self root trans quad))
(set! (-> gp-0 w) (-> self awareness-radius))
(let* ((s5-0 (new 'stack-no-clear 'array 'collide-shape 384))
(s4-0 (fill-actor-list-for-box *actor-hash* gp-0 s5-0 384))
(f30-0 (/ (the float (mod (- (current-time) (-> self state-time)) (-> self ring-rate)))
(the float (-> self ring-rate))
)
)
(s3-1 (min (-> self max-num-rings) (compute-num-rings-to-draw
(- (current-time) (-> self state-time))
(-> self ring-rate)
f30-0
(-> self max-num-rings)
)
)
)
)
(dotimes (s2-0 s3-1)
(let* ((f0-3 (compute-ring-position s2-0 (-> self max-num-rings)))
(f26-0 (compute-ring-size f0-3 f30-0))
(f28-0 (* (-> self awareness-radius) f26-0))
)
(generate-prim-verts! self (* 1.15 f28-0) f26-0)
(when (and (!= (-> self last-spawn-index) s2-0) (< f26-0 0.1))
(set! (-> self last-spawn-index) s2-0)
(sound-play "las-tur-sonar")
)
(if (and (< 0.1 f26-0) (= (-> self last-spawn-index) s2-0))
(set! (-> self last-spawn-index) -1)
)
(when (< f26-0 0.9)
(countdown (s1-1 s4-0)
(let* ((s0-1 (-> s5-0 s1-1))
(v1-53 (if (type? s0-1 collide-shape)
s0-1
)
)
)
(when v1-53
(let* ((s0-2 (-> v1-53 process))
(a2-4 (if (type? s0-2 process-focusable)
s0-2
)
)
)
(when a2-4
(when (and (!= self a2-4)
(not (focus-test? (the-as process-focusable a2-4) inactive))
(not (focus-test? (the-as process-focusable a2-4) disable))
(not (focus-test? (the-as process-focusable a2-4) dead))
(not (logtest? (process-mask crate) (-> a2-4 mask)))
(not (logtest? (process-mask vehicle) (-> a2-4 mask)))
)
(if (check-enemy self f28-0 (the-as process-focusable a2-4))
(go-virtual spinning-up)
)
)
)
)
)
)
)
(let* ((s0-3 *target*)
(s1-2 (if (type? s0-3 process-focusable)
s0-3
)
)
)
(when (and s1-2 (< (vector-vector-distance (get-trans s1-2 0) gp-0) (-> gp-0 w)))
(when (and (!= self s1-2)
(not (focus-test? s1-2 inactive))
(not (focus-test? s1-2 disable))
(not (focus-test? s1-2 dead))
(not (logtest? (process-mask crate) (-> s1-2 mask)))
(not (logtest? (process-mask vehicle) (-> s1-2 mask)))
)
(if (check-enemy self f28-0 s1-2)
(go-virtual spinning-up)
)
)
)
)
)
)
)
)
)
)
:code sleep-code
:post enemy-simple-post
)
(defstate turn-off (sew-laser-turret)
:virtual #t
:code sleep-code
:post ja-post
)
(defstate hostile (sew-laser-turret)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
(set-time! (-> self state-time))
(sound-play "las-tur-whoosh")
(set-time! (-> self last-play-time))
(set! (-> self spin-sound-id) (new-sound-id))
(set-sewd-light! 1.0)
)
:exit (behavior ()
(let ((t9-0 (-> (method-of-type enemy hostile) exit)))
(if t9-0
(t9-0)
)
)
(set! (-> self flash-state) #f)
(if (not (and (-> self next-state) (= (-> self next-state name) 'hit)))
(set! (-> self was-hit) #f)
)
(if (nonzero? (-> self spin-sound-id))
(sound-stop (-> self spin-sound-id))
)
(set! (-> self spin-sound-id) (new 'static 'sound-id))
(set-sewd-light! 0.0)
)
:trans (behavior ()
(sew-laser-turret-method-163 self)
(if (check-suitable-focus self)
(set-time! (-> self state-time))
)
(sound-play "las-tur-loop" :id (-> self spin-sound-id))
(if (time-elapsed? (-> self state-time) (seconds 4))
(go-virtual spinning-down)
)
(when (time-elapsed? (-> self last-play-time) (seconds 0.5))
(sound-play "las-tur-whoosh")
(set-time! (-> self last-play-time))
)
(set! (-> self root penetrated-by) (get-penetrated-by self))
)
:code (behavior ()
(let ((f30-0 0.0))
(until #f
(do-spin self 240.0)
(start-firing self #t 5)
(start-firing self #t 7)
(start-firing self #t 9)
(+! f30-0 (seconds-per-frame))
(suspend)
)
)
#f
)
)
(defmethod event-handler ((this sew-laser-turret) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(case arg2
(('start)
(let ((v0-0 (the-as object #t)))
(set! (-> this can-shoot) (the-as symbol v0-0))
v0-0
)
)
(('attack)
(set! (-> this was-hit) #t)
((method-of-type enemy event-handler) this arg0 arg1 arg2 arg3)
)
(('stop)
(set! (-> this can-shoot) #f)
#f
)
(('open)
(go (method-of-object this turn-off))
)
(('bonk)
(send-event arg0 'target-mech-get-off (seconds 0.3))
(send-event arg0 'shove #f (static-attack-info :mask (vehicle-impulse-factor) ((id (new-attack-id))
(damage 2.0)
(vehicle-damage-factor 1.0)
(vehicle-impulse-factor 1.0)
(shove-back (meters 2))
(shove-up (meters 0.5))
)
)
)
#f
)
(('flash-state)
(-> this flash-state)
)
(else
((method-of-type enemy event-handler) this arg0 arg1 arg2 arg3)
)
)
)
(defstate die (sew-laser-turret)
:virtual #t
:enter (behavior ()
(if (nonzero? (-> self spin-sound-id))
(sound-stop (-> self spin-sound-id))
)
(set! (-> self spin-sound-id) (new 'static 'sound-id))
(on-dying self)
(let ((v1-6 (-> self root root-prim)))
(set! (-> v1-6 prim-core collide-as) (collide-spec))
(set! (-> v1-6 prim-core collide-with) (collide-spec))
)
0
(set! (-> self hit-points) 0.0)
(play-communicator-speech! (-> *talker-speech* 49))
)
:code (behavior ()
(new 'stack 'joint-exploder-tuning (the-as uint 0))
(activate! *camera-smush-control* 819.2 37 210 1.0 0.995 (-> *display* camera-clock))
(sound-play "laser-tur-explo")
(suspend)
(cleanup-for-death self)
(ja-channel-set! 0)
(let ((gp-1 (new 'stack-no-clear 'vector)))
(set! (-> gp-1 quad) (-> self root trans quad))
(+! (-> gp-1 y) 10240.0)
(let ((s5-1 (current-time)))
(until (time-elapsed? s5-1 (seconds 2))
(spawn (-> self part) gp-1)
(suspend)
)
)
)
(let ((gp-2 (current-time)))
(until (time-elapsed? gp-2 (seconds 1))
(suspend)
)
)
(send-event self 'death-end)
(while (-> self child)
(suspend)
)
)
:post (behavior ()
(enemy-common-post self)
)
)
(defmethod init-enemy-collision! ((this sew-laser-turret))
(let ((s5-0 (new 'process 'collide-shape-moving this (collide-list-enum usually-hit-by-player))))
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s5-0 reaction) cshape-reaction-default)
(set! (-> s5-0 no-reaction)
(the-as (function collide-shape-moving collide-query vector vector object) nothing)
)
(set! (-> s5-0 penetrated-by) (penetrate
generic-attack
lunge
flop
punch
spin
roll
uppercut
bonk
tube
flut-attack
board
mech-punch
dark-punch
dark-smack
flut
)
)
(let ((v1-7 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> v1-7 prim-core collide-as) (collide-spec enemy))
(set! (-> v1-7 prim-core collide-with) (collide-spec jak player-list))
(set! (-> v1-7 prim-core action) (collide-action solid no-standon))
(set! (-> v1-7 transform-index) 3)
(set-vector! (-> v1-7 local-sphere) 0.0 -2048.0 0.0 10240.0)
(set! (-> s5-0 total-prims) (the-as uint 1))
(set! (-> s5-0 root-prim) v1-7)
)
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
(let ((v1-10 (-> s5-0 root-prim)))
(set! (-> s5-0 backup-collide-as) (-> v1-10 prim-core collide-as))
(set! (-> s5-0 backup-collide-with) (-> v1-10 prim-core collide-with))
)
(set! (-> this root) s5-0)
)
0
(none)
)
(defmethod deactivate ((this sew-laser-turret))
"Make a process dead, clean it up, remove it from the active pool, and return to dead pool."
(if (nonzero? (-> this smoke-part))
(kill-particles (-> this smoke-part))
)
(if (nonzero? (-> this casing-part))
(kill-particles (-> this casing-part))
)
(if (nonzero? (-> this spin-sound-id))
(sound-stop (-> this spin-sound-id))
)
((method-of-type enemy deactivate) this)
(none)
)
(defmethod coin-flip? ((this sew-laser-turret))
#f
)
;; WARN: Return type mismatch enemy vs sew-laser-turret.
(defmethod relocate ((this sew-laser-turret) (offset int))
(if (nonzero? (-> this smoke-part))
(&+! (-> this smoke-part) offset)
)
(if (nonzero? (-> this casing-part))
(&+! (-> this casing-part) offset)
)
(if (nonzero? (-> this strip))
(&+! (-> this strip) offset)
)
(the-as sew-laser-turret ((method-of-type enemy relocate) this offset))
)
(defmethod sew-laser-turret-method-160 ((this sew-laser-turret))
0
(none)
)
(defmethod init-enemy! ((this sew-laser-turret))
(initialize-skeleton
this
(the-as skeleton-group (art-group-get-by-name *level* "skel-sew-laser-turret" (the-as (pointer level) #f)))
(the-as pair 0)
)
(init-enemy-defaults! this *sew-laser-turret-enemy-info*)
(logclear! (-> this mask) (process-mask actor-pause))
(logclear! (-> this enemy-flags) (enemy-flag actor-pause-backup))
(set! (-> this part) (create-launch-control (-> *part-group-id-table* 1518) this))
(set! (-> this smoke-part) (create-launch-control (-> *part-group-id-table* 1519) this))
(set! (-> this casing-part) (create-launch-control (-> *part-group-id-table* 1520) this))
(set! (-> this max-num-rings)
(res-lump-value (-> this entity) 'sdt-num-rings int :default (the-as uint128 2) :time -1000000000.0)
)
(set! (-> this ring-rate)
(the-as time-frame (the int (* 300.0 (res-lump-float (-> this entity) 'sdt-ring-rate :default 4.0))))
)
(set! (-> this awareness-radius) (res-lump-float (-> this entity) 'sdt-awareness-radius :default 90112.0))
(let ((s5-1 (* 7 (-> this max-num-rings))))
(set! (-> this strip)
(new 'process 'prim-strip s5-1 (lookup-texture-id-by-name "sonar-wave" (the-as string #f)) (the-as string #f))
)
)
(logclear! (-> this enemy-flags) (enemy-flag vulnerable))
(set! (-> this flash-state) #f)
(set! (-> this can-shoot) #t)
(set! (-> this was-hit) #f)
0
(none)
)
(defmethod go-idle2 ((this sew-laser-turret))
(go (method-of-object this alert))
)
(defmethod go-hostile ((this sew-laser-turret))
(cond
((and (not (and (-> this next-state) (let ((v1-3 (-> this next-state name)))
(or (= v1-3 'spinning-up) (= v1-3 'hostile))
)
)
)
(not (-> this was-hit))
)
(go (method-of-object this spinning-up))
)
((not (and (-> this next-state) (= (-> this next-state name) 'hostile)))
(go (method-of-object this hostile))
)
)
)