jak-project/goal_src/jak2/levels/under/under-laser.gc
ManDude ebd8643d28
rework jak 2 goal file structure (#2806)
Changes the DGO build order so that the city gets compiled first, and a
random guess at an "order" of which levels people might edit more often.
Most of the data-only borrow files are moved to the end as well.

Also moves around files in the `goal_src` tree to a structure that makes
a bit more sense, some files were either in the completely wrong place,
their folders had strange names, were too deep for no reason or were
just too far away from other relevant files. This structure should make
it easier to guess a file's location.
2023-07-06 15:23:25 +01:00

524 lines
20 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: under-laser.gc
;; name in dgo: under-laser
;; dgos: UNB
;; DECOMP BEGINS
(deftype under-laser-info (basic)
((options uint8 :offset-assert 4)
(laser-radius float :offset-assert 8)
(laser-move-dist float :offset-assert 12)
(shadow-top-y float :offset-assert 16)
(shadow-height float :offset-assert 20)
(shadow-radius-adjust float :offset-assert 24)
)
:method-count-assert 9
:size-assert #x1c
:flag-assert #x90000001c
)
(define *under-laser-infos* (new 'static 'boxed-array :type under-laser-info
(new 'static 'under-laser-info
:laser-radius 28508.16
:laser-move-dist 35840.0
:shadow-top-y -271360.0
:shadow-height 3072.0
:shadow-radius-adjust 4096.0
)
(new 'static 'under-laser-info
:options #x1
:laser-radius 27443.2
:laser-move-dist 35512.32
:shadow-top-y -288768.0
:shadow-height 3276.8
:shadow-radius-adjust 1024.0
)
(new 'static 'under-laser-info
:options #x1
:laser-radius 27443.2
:laser-move-dist 35512.32
:shadow-top-y -288768.0
:shadow-height 3276.8
:shadow-radius-adjust 1024.0
)
(new 'static 'under-laser-info
:laser-radius 29573.12
:laser-move-dist 35430.4
:shadow-top-y -288153.6
:shadow-height 3276.8
:shadow-radius-adjust 1638.4
)
(new 'static 'under-laser-info
:laser-radius 33423.36
:laser-move-dist 35225.6
:shadow-top-y -289382.4
:shadow-height 2048.0
:shadow-radius-adjust 2048.0
)
(new 'static 'under-laser-info
:laser-radius 44933.12
:laser-move-dist 35430.4
:shadow-top-y -290406.4
:shadow-height 4587.52
:shadow-radius-adjust -4096.0
)
)
)
(deftype under-laser-shadow (process-drawable)
((root collide-shape-moving :override)
(info under-laser-info :offset-assert 200)
(trans-xz-offset vector :inline :offset-assert 208)
)
:heap-base #x60
:method-count-assert 21
:size-assert #xe0
:flag-assert #x15006000e0
(:methods
(idle () _type_ :state 20)
)
)
(deftype under-laser-slave (process-drawable)
((root collide-shape-moving :override)
)
:heap-base #x50
:method-count-assert 21
:size-assert #xc8
:flag-assert #x15005000c8
(:methods
(idle () _type_ :state 20)
)
)
(deftype under-laser (process-drawable)
((root collide-shape-moving :override)
(info under-laser-info :offset-assert 200)
(id int8 :offset-assert 204)
(lightning lightning-control :offset-assert 208)
(draw-test-script script-context :offset-assert 212)
(sync sync-eased :inline :offset-assert 216)
(laser-dir vector :inline :offset-assert 272)
(slave-trans-offset vector :inline :offset-assert 288)
(zero-pos vector :inline :offset-assert 304)
(one-pos vector :inline :offset-assert 320)
)
:heap-base #xd0
:method-count-assert 23
:size-assert #x150
:flag-assert #x1700d00150
(:methods
(dormant () _type_ :state 20)
(idle () _type_ :state 21)
(under-laser-method-22 (_type_) none 22)
)
)
(defskelgroup skel-under-laser under-laser under-laser-lod0-jg under-laser-idle-ja
((under-laser-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 1)
)
(defskelgroup skel-under-laser-shadow under-laser-shadow under-laser-shadow-lod0-jg under-laser-shadow-idle-ja
((under-laser-shadow-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 14)
:shadow under-laser-shadow-shadow-mg
:origin-joint-index 3
:shadow-joint-index 3
)
(defstate idle (under-laser-shadow)
:virtual #t
:trans (behavior ()
(let ((a1-0 (ppointer->process (-> self parent)))
(v1-2 (-> self root))
)
(let ((f0-0 (-> v1-2 trans y)))
(set! (-> v1-2 trans quad) (-> (the-as process-drawable a1-0) root trans quad))
(vector+! (-> v1-2 trans) (-> v1-2 trans) (-> self trans-xz-offset))
(set! (-> v1-2 trans y) f0-0)
)
(let ((a0-3 (-> self draw shadow-ctrl)))
(let ((a1-5 (-> a0-3 settings)))
(logclear! (-> a1-5 flags) (shadow-flags disable-draw))
(set! (-> a1-5 center quad) (-> v1-2 trans quad))
)
(shadow-control-method-14
a0-3
(-> v1-2 trans)
(new 'static 'vector :y -1.0 :w 1.0)
409600.0
819.2
(+ 819.2 (-> self info shadow-height))
)
)
)
(let ((f0-3 (vector-vector-distance (math-camera-pos) (-> self root trans))))
(set! (-> self root scale x) (lerp-scale 0.5 3.5 f0-3 32768.0 245760.0))
)
(none)
)
:code (the-as (function none :behavior under-laser-shadow) sleep-code)
:post (the-as (function none :behavior under-laser-shadow) ja-post)
)
;; WARN: Return type mismatch object vs none.
(defbehavior under-laser-shadow-init-by-other under-laser-shadow ((arg0 under-laser-info) (arg1 vector) (arg2 vector))
(set! (-> self info) arg0)
(set! (-> self trans-xz-offset quad) (-> arg1 quad))
(set! (-> self root) (the-as collide-shape-moving (new 'process 'trsqv)))
(logclear! (-> self mask) (process-mask actor-pause))
(let ((s3-0 (-> self root)))
(let ((v1-4 (ppointer->process (-> self parent))))
(set! (-> s3-0 scale quad) (-> arg2 quad))
(set! (-> s3-0 trans quad) (-> (the-as under-laser v1-4) root trans quad))
)
(vector+! (-> s3-0 trans) (-> s3-0 trans) arg1)
(set! (-> s3-0 trans y) (+ 819.2 (-> arg0 shadow-top-y)))
(let ((s4-1 (new 'stack-no-clear 'vector)))
(set! (-> s4-1 quad) (-> arg1 quad))
(vector-normalize! s4-1 1.0)
(quaternion-look-at! (-> s3-0 quat) s4-1 *up-vector*)
)
)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-under-laser-shadow" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
(set! (-> self draw bounds w) (+ 12288.0 (* 20480.0 (-> arg2 z))))
(set! (-> self draw shadow-ctrl)
(new 'process 'shadow-control -2048.0 -61440.0 69632.0 (shadow-flags shdf03 disable-draw) 245760.0)
)
(set! (-> self draw shadow-ctrl settings shadow-type) 1)
(go-virtual idle)
(none)
)
(defstate idle (under-laser-slave)
:virtual #t
:trans (behavior ()
(let ((v1-0 (ppointer->process (-> self parent)))
(a0-1 (-> self root))
)
(set! (-> a0-1 trans quad) (-> (the-as under-laser v1-0) root trans quad))
(vector+! (-> a0-1 trans) (-> a0-1 trans) (-> (the-as under-laser v1-0) slave-trans-offset))
)
(none)
)
:code (the-as (function none :behavior under-laser-slave) sleep-code)
:post (the-as (function none :behavior under-laser-slave) ja-post)
)
;; WARN: Return type mismatch object vs none.
(defbehavior under-laser-slave-init-by-other under-laser-slave ()
(set! (-> self root) (the-as collide-shape-moving (new 'process 'trsqv)))
(logclear! (-> self mask) (process-mask actor-pause))
(let ((gp-0 (-> self root))
(s5-0 (ppointer->process (-> self parent)))
)
(set! (-> gp-0 trans quad) (-> (the-as under-laser s5-0) root trans quad))
(vector+! (-> gp-0 trans) (-> gp-0 trans) (-> (the-as under-laser s5-0) slave-trans-offset))
(quaternion-copy! (-> gp-0 quat) (-> (the-as under-laser s5-0) root quat))
(quaternion-rotate-y! (-> gp-0 quat) (-> gp-0 quat) 32768.0)
(set! (-> gp-0 scale quad) (-> (the-as under-laser s5-0) root scale quad))
)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-under-laser" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
(go-virtual idle)
(none)
)
;; WARN: Return type mismatch sound-id vs none.
(defmethod under-laser-method-22 under-laser ((obj under-laser))
(with-pp
(let ((s5-0 (new 'stack-no-clear 'collide-query)))
(set! (-> s5-0 start-pos quad) (-> obj root trans quad))
(set! (-> s5-0 move-dist quad) (-> obj slave-trans-offset quad))
(let ((v1-2 s5-0))
(set! (-> v1-2 radius) 409.6)
(set! (-> v1-2 collide-with) (collide-spec jak bot player-list))
(set! (-> v1-2 ignore-process0) obj)
(set! (-> v1-2 ignore-process1) #f)
(set! (-> v1-2 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1))
(set! (-> v1-2 action-mask) (collide-action solid))
)
(when (>= (fill-and-probe-using-line-sphere *collide-cache* s5-0) 0.0)
(let* ((s4-0 (-> s5-0 best-other-tri collide-ptr))
(s5-1 (if (type? s4-0 collide-shape-prim-sphere)
s4-0
)
)
)
(when s5-1
(let ((s4-1 (new 'stack-no-clear 'vector)))
(vector-rotate-around-y! s4-1 (-> obj slave-trans-offset) (if (logtest? (-> obj info options) 1)
16384.0
-16384.0
)
)
(vector-normalize! s4-1 1.0)
(let ((a1-4 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-4 from) (process->ppointer pp))
(set! (-> a1-4 num-params) 2)
(set! (-> a1-4 message) 'attack)
(set! (-> a1-4 param 0) (the-as uint #f))
(let ((v1-11 (new 'static 'attack-info :mask (attack-info-mask vector shove-back shove-up id damage))))
(let* ((a0-15 *game-info*)
(a2-2 (+ (-> a0-15 attack-id) 1))
)
(set! (-> a0-15 attack-id) a2-2)
(set! (-> v1-11 id) a2-2)
)
(set! (-> v1-11 vector quad) (-> s4-1 quad))
(set! (-> v1-11 shove-back) 12288.0)
(set! (-> v1-11 shove-up) 8192.0)
(set! (-> v1-11 damage) 1.0)
(set! (-> a1-4 param 1) (the-as uint v1-11))
)
(if (send-event-function (-> (the-as collide-shape-prim-sphere s5-1) cshape process) a1-4)
(sound-play "und-laser-hit")
)
)
)
)
)
)
)
(none)
)
)
(defstate dormant (under-laser)
:virtual #t
:enter (behavior ()
(logior! (-> self draw status) (draw-control-status no-draw))
(none)
)
:exit (behavior ()
(logclear! (-> self draw status) (draw-control-status no-draw))
(none)
)
:trans (behavior ()
(if (not (script-eval (the-as pair (-> self draw-test-script))))
(go-virtual idle)
)
(none)
)
:code (the-as (function none :behavior under-laser) sleep-code)
)
(defstate idle (under-laser)
:virtual #t
:enter (behavior ()
(process-spawn under-laser-slave :to self)
(let ((gp-1 (new 'stack-no-clear 'vector))
(s5-0 (new 'stack-no-clear 'vector))
)
(vector-float*! gp-1 (-> self slave-trans-offset) 0.5)
(set! (-> gp-1 y) 0.0)
(let* ((f0-2 0.000048828126)
(v1-9 gp-1)
(f0-3
(* f0-2
(+ (sqrtf (+ (* (-> v1-9 x) (-> v1-9 x)) (* (-> v1-9 z) (-> v1-9 z)))) (-> self info shadow-radius-adjust))
)
)
)
(set-vector! s5-0 3.5 1.0 f0-3 1.0)
)
(process-spawn under-laser-shadow (-> self info) gp-1 s5-0 :to self)
)
(update-vol! (-> self sound) 1.0)
(none)
)
:code (the-as (function none :behavior under-laser) sleep-code)
:post (behavior ()
(let ((f30-0 (get-norm! (-> self sync) 0)))
(vector-lerp! (-> self root trans) (-> self zero-pos) (-> self one-pos) f30-0)
(if (!= (-> self sync offset) 0.0)
(set! f30-0 (- 1.0 f30-0))
)
(set-under-laser! f30-0)
)
(let ((s5-0 (new 'stack-no-clear 'vector))
(s4-0 (new 'stack-no-clear 'vector))
(gp-0 (new 'stack-no-clear 'vector))
)
(vector-lerp!
s5-0
(-> self zero-pos)
(-> self one-pos)
(get-norm! (-> self sync) (the-as int (+ (current-time) (seconds 0.15))))
)
(vector-normalize-copy! s4-0 (-> self laser-dir) 1228.8)
(vector+! s4-0 s4-0 s5-0)
(set! (-> self lightning state meet data 0 quad) (-> s4-0 quad))
(vector-normalize-copy! gp-0 (-> self laser-dir) -1228.8)
(vector+! gp-0 gp-0 (-> self slave-trans-offset))
(vector+! gp-0 gp-0 s5-0)
(let ((v1-16 (-> self lightning)))
(set! (-> v1-16 state meet data (+ (-> v1-16 state points-to-draw) -1) quad) (-> gp-0 quad))
)
)
(let ((a1-10 (new 'stack-no-clear 'vector)))
(vector-float*! a1-10 (-> self slave-trans-offset) 0.5)
(vector+! a1-10 a1-10 (-> self root trans))
(update-trans! (-> self sound) a1-10)
)
(update! (-> self sound))
(under-laser-method-22 self)
(ja-post)
(none)
)
)
;; WARN: Return type mismatch process-drawable vs under-laser.
(defmethod relocate under-laser ((obj under-laser) (arg0 int))
(if (nonzero? (-> obj lightning))
(&+! (-> obj lightning) arg0)
)
(the-as under-laser ((method-of-type process-drawable relocate) obj arg0))
)
;; WARN: Return type mismatch object vs none.
(defmethod init-from-entity! under-laser ((obj under-laser) (arg0 entity-actor))
"Typically the method that does the initial setup on the process, potentially using the [[entity-actor]] provided as part of that.
This commonly includes things such as:
- stack size
- collision information
- loading the skeleton group / bones
- sounds"
(local-vars (sv-64 res-tag))
(set! (-> obj root) (the-as collide-shape-moving (new 'process 'trsqv)))
(process-drawable-from-entity! obj arg0)
(logclear! (-> obj mask) (process-mask actor-pause))
(initialize-skeleton
obj
(the-as skeleton-group (art-group-get-by-name *level* "skel-under-laser" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
(let ((v1-7 (res-lump-value (-> obj entity) 'extra-id uint128 :time -1000000000.0)))
(set! (-> obj id) (the-as int v1-7))
(set! (-> obj info) (-> *under-laser-infos* v1-7))
)
(let ((a1-6 (new 'stack-no-clear 'sync-info-params)))
(let ((v1-11 0))
(if #t
(set! v1-11 (logior v1-11 1))
)
(set! (-> a1-6 sync-type) 'sync-eased)
(set! (-> a1-6 sync-flags) (the-as sync-flags v1-11))
)
(set! (-> a1-6 period) (the-as uint 1800))
(set! (-> a1-6 entity) arg0)
(set! (-> a1-6 percent) 0.0)
(set! (-> a1-6 ease-in) 0.15)
(set! (-> a1-6 ease-out) 0.15)
(set! (-> a1-6 pause-in) 0.0)
(set! (-> a1-6 pause-out) 0.0)
(initialize! (-> obj sync) a1-6)
)
(set! (-> obj clock) (-> *display* user0-clock))
(let ((s5-1 (-> obj root)))
(set-vector! (-> s5-1 scale) 1.25 1.25 1.25 1.0)
(set! sv-64 (new 'static 'res-tag))
(let ((v1-22 (res-lump-data arg0 'trans-offset (pointer float) :tag-ptr (& sv-64))))
(when v1-22
(+! (-> s5-1 trans x) (-> v1-22 0))
(+! (-> s5-1 trans y) (-> v1-22 1))
(+! (-> s5-1 trans z) (-> v1-22 2))
)
)
(let ((f0-15 (res-lump-float arg0 'rotoffset)))
(if (!= f0-15 0.0)
(quaternion-rotate-y! (-> s5-1 quat) (-> s5-1 quat) f0-15)
)
)
(vector-z-quaternion! (-> obj laser-dir) (-> s5-1 quat))
(vector-normalize! (-> obj laser-dir) 1.0)
(quaternion-rotate-y! (-> s5-1 quat) (-> s5-1 quat) -16384.0)
(when (logtest? (-> obj info options) 1)
(let ((s4-1 (new 'stack-no-clear 'quaternion)))
(quaternion-vector-angle! s4-1 (-> obj laser-dir) 16384.0)
(quaternion*! (-> s5-1 quat) s4-1 (-> s5-1 quat))
)
)
(let ((f30-0 (-> obj info laser-radius)))
(let ((s4-2 (new 'stack-no-clear 'vector)))
(vector-normalize-copy! s4-2 (-> obj laser-dir) (- f30-0))
(vector+! (-> s5-1 trans) (-> s5-1 trans) s4-2)
)
(vector-normalize-copy! (-> obj slave-trans-offset) (-> obj laser-dir) (* 2.0 f30-0))
)
(set! (-> obj zero-pos quad) (-> s5-1 trans quad))
(let ((f30-1 (-> obj info laser-move-dist)))
(cond
((logtest? (-> obj info options) 1)
(set! (-> obj one-pos quad) (-> obj zero-pos quad))
(+! (-> obj one-pos y) f30-1)
)
(else
(let ((s4-3 (new 'stack-no-clear 'vector)))
(vector-rotate-around-y! s4-3 (-> obj laser-dir) 16384.0)
(vector-normalize! s4-3 f30-1)
(vector+! (-> obj one-pos) (-> obj zero-pos) s4-3)
)
)
)
)
(vector-lerp! (-> s5-1 trans) (-> obj zero-pos) (-> obj one-pos) (get-norm! (-> obj sync) 0))
)
(let ((a2-13 (new 'static 'lightning-spec
:name #f
:flags (lightning-spec-flags lsf2)
:start-color (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
:end-color (new 'static 'rgba :a #x80)
:fade-to-color (new 'static 'rgba :r #xbf :b #x8f :a #x5)
:fade-start-factor 0.2
:fade-time 120.0
:texture (new 'static 'texture-id :index #x83 :page #xc)
:reduction 0.42
:num-points 16
:box-size 8192.0
:merge-factor 0.1
:merge-count 4
:radius 2048.0
:duration -1.0
:sound #f
)
)
)
(set! (-> obj lightning) (new 'process 'lightning-control a2-13 obj 0.0))
)
(let ((a3-5 (new 'stack-no-clear 'vector)))
(vector-float*! a3-5 (-> obj slave-trans-offset) 0.5)
(vector+! a3-5 a3-5 (-> obj root trans))
(if (zero? (-> obj id))
(set! (-> obj sound) (new 'process 'ambient-sound (static-sound-spec "und-laser-near" :fo-max 40) a3-5))
(set! (-> obj sound) (new 'process 'ambient-sound (static-sound-spec "und-laser-beam" :fo-max 40) a3-5))
)
)
(set! (-> obj draw-test-script) (res-lump-struct (-> obj entity) 'on-activate script-context))
(cond
((and (script-eval (the-as pair (-> obj draw-test-script))) (= *bot-record-path* -1))
(update-vol! (-> obj sound) 0.0)
(go (method-of-object obj dormant))
)
(else
(go (method-of-object obj idle))
)
)
(none)
)