jak-project/goal_src/jak2/levels/mars_tomb/widow-more-extras.gc
Hat Kid 1d868a2bd9
decomp: kor-*|kid-*|widow-*|hal-*|atoll-* files, spyder, sniper, juicer and more (#2134)
Full list:

- `atoll-obs`
- `atoll-tank`
- `juicer`
- `sniper`
- `transport`
- `yakow`
- `kid-h`
- `kid-states`
- `kid-task`
- `kid3-course`
- `kid`
- `kor-h`
- `kor-states`
- `kor-task`
- `kor3-course`
- `kor`
- `spyder`
- `spydroid`
- `widow-baron`
- `widow-extras`
- `widow-more-extras`
- `widow2`
- `widow`
- `flying-spider`
- `mammoth`
- `mantis`
- `nest-obs`
- `hal-task`
- `hal`
- `hal3-course`

Manual patches:
- `widow`: `handle->process` stack var
- `nestb-scenes`: Commented out `nav-network` stuff, was causing crashes
in `nest`

Also fixes `ginsu` crash (`blade-part` had the wrong type)
2023-01-21 19:50:48 -05:00

516 lines
19 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: widow-more-extras.gc
;; name in dgo: widow-more-extras
;; dgos: TOA
;; DECOMP BEGINS
(deftype tomb-boss-debris (process-drawable)
((root-override collide-shape-moving :offset 128)
(y-velocity float :offset-assert 200)
(floor float :offset-assert 204)
(sound-floor float :offset-assert 208)
(rot quaternion :inline :offset-assert 224)
(look int32 :offset-assert 240)
)
:heap-base #x80
:method-count-assert 22
:size-assert #xf4
:flag-assert #x16008000f4
(:methods
(die () _type_ :state 20)
(idle () _type_ :state 21)
)
)
(defskelgroup skel-tomb-boss-debris-a tomb-boss-debris tomb-boss-debris-a-lod0-jg tomb-boss-debris-a-idle-ja
((tomb-boss-debris-a-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
)
(defskelgroup skel-tomb-boss-debris-b tomb-boss-debris tomb-boss-debris-b-lod0-jg tomb-boss-debris-b-idle-ja
((tomb-boss-debris-b-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
)
(defskelgroup skel-tomb-boss-debris-c tomb-boss-debris tomb-boss-debris-c-lod0-jg tomb-boss-debris-c-idle-ja
((tomb-boss-debris-c-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
)
(defskelgroup skel-tomb-boss-debris-d tomb-boss-debris tomb-boss-debris-d-lod0-jg tomb-boss-debris-d-idle-ja
((tomb-boss-debris-d-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
)
(defskelgroup skel-tomb-boss-debris-e tomb-boss-debris tomb-boss-debris-e-lod0-jg tomb-boss-debris-e-idle-ja
((tomb-boss-debris-e-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
)
(defskelgroup skel-tomb-boss-debris-f tomb-boss-debris tomb-boss-debris-f-lod0-jg tomb-boss-debris-f-idle-ja
((tomb-boss-debris-f-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
)
(defskelgroup skel-tomb-boss-debris-g tomb-boss-debris tomb-boss-debris-g-lod0-jg tomb-boss-debris-g-idle-ja
((tomb-boss-debris-g-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
)
(defskelgroup skel-tomb-boss-debris-h tomb-boss-debris tomb-boss-debris-h-lod0-jg tomb-boss-debris-h-idle-ja
((tomb-boss-debris-h-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
)
(defskelgroup skel-tomb-boss-debris-i tomb-boss-debris tomb-boss-debris-i-lod0-jg tomb-boss-debris-i-idle-ja
((tomb-boss-debris-i-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
)
(defstate die (tomb-boss-debris)
:virtual #t
:enter (behavior ()
(let ((v1-1 (-> self root-override root-prim)))
(set! (-> v1-1 prim-core collide-as) (collide-spec))
(set! (-> v1-1 prim-core collide-with) (collide-spec))
)
0
(logior! (-> self draw status) (draw-control-status no-draw))
(none)
)
:code (behavior ()
(suspend)
(suspend)
0
(none)
)
)
(defstate idle (tomb-boss-debris)
:virtual #t
:event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block))
(case event-type
(('touched 'touch 'attack)
(let ((v1-2 (-> self look)))
(cond
((or (zero? v1-2) (= v1-2 1) (= v1-2 2))
(let ((s5-0 (get-process *default-dead-pool* part-tracker #x4000)))
(when s5-0
(let ((t9-1 (method-of-type part-tracker activate)))
(t9-1
(the-as part-tracker s5-0)
*entity-pool*
(symbol->string (-> part-tracker symbol))
(the-as pointer #x70004000)
)
)
(let ((t9-2 run-function-in-process)
(a0-8 s5-0)
(a1-7 part-tracker-init)
(a2-5 (-> *part-group-id-table* 734))
(a3-2 5)
(t0-0 #f)
(t1-0 #f)
(t2-0 #f)
(t3-0 *launch-matrix*)
)
(set! (-> t3-0 trans quad) (-> self root-override trans quad))
((the-as (function object object object object object object object object none) t9-2)
a0-8
a1-7
a2-5
a3-2
t0-0
t1-0
t2-0
t3-0
)
)
(-> s5-0 ppointer)
)
)
(send-event proc 'debris-hit 1)
)
((or (= v1-2 3) (= v1-2 4) (= v1-2 5))
(let ((s5-1 (get-process *default-dead-pool* part-tracker #x4000)))
(when s5-1
(let ((t9-5 (method-of-type part-tracker activate)))
(t9-5
(the-as part-tracker s5-1)
*entity-pool*
(symbol->string (-> part-tracker symbol))
(the-as pointer #x70004000)
)
)
(let ((t9-6 run-function-in-process)
(a0-16 s5-1)
(a1-13 part-tracker-init)
(a2-10 (-> *part-group-id-table* 735))
(a3-4 5)
(t0-1 #f)
(t1-1 #f)
(t2-1 #f)
(t3-1 *launch-matrix*)
)
(set! (-> t3-1 trans quad) (-> self root-override trans quad))
((the-as (function object object object object object object object object none) t9-6)
a0-16
a1-13
a2-10
a3-4
t0-1
t1-1
t2-1
t3-1
)
)
(-> s5-1 ppointer)
)
)
(send-event proc 'debris-hit 2)
)
(else
(let ((s5-2 (get-process *default-dead-pool* part-tracker #x4000)))
(when s5-2
(let ((t9-9 (method-of-type part-tracker activate)))
(t9-9
(the-as part-tracker s5-2)
*entity-pool*
(symbol->string (-> part-tracker symbol))
(the-as pointer #x70004000)
)
)
(let ((t9-10 run-function-in-process)
(a0-21 s5-2)
(a1-17 part-tracker-init)
(a2-15 (-> *part-group-id-table* 736))
(a3-6 5)
(t0-2 #f)
(t1-2 #f)
(t2-2 #f)
(t3-2 *launch-matrix*)
)
(set! (-> t3-2 trans quad) (-> self root-override trans quad))
((the-as (function object object object object object object object object none) t9-10)
a0-21
a1-17
a2-15
a3-6
t0-2
t1-2
t2-2
t3-2
)
)
(-> s5-2 ppointer)
)
)
(send-event proc 'debris-hit 3)
)
)
)
(go-virtual die)
)
)
)
:enter (behavior ()
(set! (-> self sound-floor) 81920.0)
(none)
)
:trans (behavior ()
(local-vars (sv-16 float))
(+! (-> self root-override trans y) (* (-> self y-velocity) (-> self clock time-adjust-ratio)))
(set! (-> self y-velocity)
(fmax -3686.4 (- (-> self y-velocity) (* 204.8 (-> self clock time-adjust-ratio))))
)
(if (< (-> self root-override trans y) (-> self floor))
(deactivate self)
)
(when (and (logtest? (-> self draw status) (draw-control-status on-screen))
(< (-> self root-override trans y) (+ (-> (camera-pos) y) (-> self sound-floor)))
)
(sound-play "wid-debris-fall")
(set! (-> self sound-floor) -4096000.0)
)
(quaternion-normalize! (quaternion*! (-> self root-override quat) (-> self rot) (-> self root-override quat)))
(let ((f30-1 (lerp-scale 1.0 0.0 (-> self root-override trans y) -368640.0 -442368.0)))
(when (< -442368.0 (-> self root-override trans y))
(let ((f28-0 (-> *part-id-table* 3266 init-specs 6 initial-valuef))
(f26-0 (-> *part-id-table* 3266 init-specs 6 random-rangef))
(f24-0 (-> *part-id-table* 3266 init-specs 7 initial-valuef))
(f22-0 (-> *part-id-table* 3266 init-specs 7 random-rangef))
(f20-0 (-> *part-id-table* 3266 init-specs 8 initial-valuef))
)
(set! sv-16 (-> *part-id-table* 3266 init-specs 8 random-rangef))
(set! (-> *part-id-table* 3266 init-specs 6 initial-valuef)
(* (-> *part-id-table* 3266 init-specs 6 initial-valuef) f30-1)
)
(set! (-> *part-id-table* 3266 init-specs 6 random-rangef)
(* (-> *part-id-table* 3266 init-specs 6 random-rangef) f30-1)
)
(set! (-> *part-id-table* 3266 init-specs 7 initial-valuef)
(* (-> *part-id-table* 3266 init-specs 7 initial-valuef) f30-1)
)
(set! (-> *part-id-table* 3266 init-specs 7 random-rangef)
(* (-> *part-id-table* 3266 init-specs 7 random-rangef) f30-1)
)
(set! (-> *part-id-table* 3266 init-specs 8 initial-valuef)
(* (-> *part-id-table* 3266 init-specs 8 initial-valuef) f30-1)
)
(set! (-> *part-id-table* 3266 init-specs 8 random-rangef)
(* (-> *part-id-table* 3266 init-specs 8 random-rangef) f30-1)
)
(spawn (-> self part) (-> self root-override trans))
(set! (-> *part-id-table* 3266 init-specs 6 initial-valuef) f28-0)
(set! (-> *part-id-table* 3266 init-specs 6 random-rangef) f26-0)
(set! (-> *part-id-table* 3266 init-specs 7 initial-valuef) f24-0)
(set! (-> *part-id-table* 3266 init-specs 7 random-rangef) f22-0)
(set! (-> *part-id-table* 3266 init-specs 8 initial-valuef) f20-0)
)
(set! (-> *part-id-table* 3266 init-specs 8 random-rangef) sv-16)
sv-16
)
(set-vector! (-> self draw color-mult) f30-1 f30-1 f30-1 1.0)
)
(none)
)
:code (the-as (function none :behavior tomb-boss-debris) sleep-code)
:post (behavior ()
(transform-post)
(let ((a1-0 (new 'stack-no-clear 'overlaps-others-params)))
(set! (-> a1-0 options) (overlaps-others-options oo0))
(set! (-> a1-0 collide-with-filter) (the-as collide-spec -1))
(set! (-> a1-0 tlist) *touching-list*)
(find-overlapping-shapes (-> self root-override) a1-0)
)
(none)
)
)
;; WARN: Return type mismatch object vs none.
(defbehavior tomb-boss-debris-init-by-other tomb-boss-debris ((arg0 vector) (arg1 int))
(let ((s4-0 (new 'process 'collide-shape-moving self (collide-list-enum usually-hit-by-player))))
(set! (-> s4-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s4-0 reaction) cshape-reaction-default)
(set! (-> s4-0 no-reaction)
(the-as (function collide-shape-moving collide-query vector vector object) nothing)
)
(set! (-> s4-0 penetrated-by) (penetrate
generic-attack
lunge
flop
punch
spin
roll
uppercut
bonk
tube
vehicle
flut-attack
board
mech-punch
dark-punch
dark-giant
)
)
(let ((v1-7 (new 'process 'collide-shape-prim-sphere s4-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 bot enemy hit-by-others-list player-list))
(set! (-> v1-7 prim-core action) (collide-action solid))
(set-vector! (-> v1-7 local-sphere) 0.0 0.0 0.0 6144.0)
(set! (-> s4-0 total-prims) (the-as uint 1))
(set! (-> s4-0 root-prim) v1-7)
)
(set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w)))
(let ((v1-10 (-> s4-0 root-prim)))
(set! (-> s4-0 backup-collide-as) (-> v1-10 prim-core collide-as))
(set! (-> s4-0 backup-collide-with) (-> v1-10 prim-core collide-with))
)
(set! (-> s4-0 event-self) 'touched)
(set! (-> self root-override) s4-0)
)
(set! (-> self root-override trans quad) (-> arg0 quad))
(let ((v1-15 arg1))
(cond
((zero? v1-15)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-boss-debris-a" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
)
((= v1-15 1)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-boss-debris-b" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
)
((= v1-15 2)
(set! (-> self root-override root-prim local-sphere w) 5120.0)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-boss-debris-c" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
)
((= v1-15 3)
(set! (-> self root-override root-prim local-sphere w) 3276.8)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-boss-debris-d" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
)
((= v1-15 4)
(set! (-> self root-override root-prim local-sphere w) 3276.8)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-boss-debris-e" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
)
((= v1-15 5)
(set! (-> self root-override root-prim local-sphere w) 4096.0)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-boss-debris-f" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
)
((= v1-15 6)
(set! (-> self root-override root-prim local-sphere w) 1638.4)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-boss-debris-g" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
)
((= v1-15 7)
(set! (-> self root-override root-prim local-sphere w) 1638.4)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-boss-debris-h" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
)
(else
(set! (-> self root-override root-prim local-sphere w) 1638.4)
(initialize-skeleton
self
(the-as skeleton-group (art-group-get-by-name *level* "skel-tomb-boss-debris-i" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
)
)
)
(set! (-> self look) arg1)
(set! (-> self y-velocity) -409.6)
(set! (-> self floor) (+ -655360.0 (-> self root-override trans y)))
(logclear! (-> self mask) (process-mask actor-pause))
(let ((f30-0 (rand-vu-float-range 0.0 65536.0))
(f28-0 (rand-vu-float-range 546.13336 1638.4))
)
(quaternion-axis-angle! (-> self rot) (sin f30-0) 0.0 (cos f30-0) f28-0)
)
(set! (-> self part) (create-launch-control (-> *part-group-id-table* 733) self))
(go-virtual idle)
(none)
)
(deftype cave-in-master (process-drawable)
((prev-points int32 100 :offset-assert 200)
)
:heap-base #x1e0
:method-count-assert 22
:size-assert #x258
:flag-assert #x1601e00258
(:methods
(idle () _type_ :state 20)
(wait () _type_ :state 21)
)
)
(defbehavior cavein-get-random-point cave-in-master ((arg0 vector))
(when (> (-> self path curve num-cverts) 0)
(let* ((s5-1 (min 100 (-> self path curve num-cverts)))
(v1-5 (rand-vu-int-count s5-1))
)
(while (> (-> self prev-points v1-5) 0)
(+! (-> self prev-points v1-5) -1)
(+! v1-5 1)
(if (>= v1-5 s5-1)
(set! v1-5 (- v1-5 s5-1))
)
)
(set! (-> self prev-points v1-5) 6)
(set! (-> arg0 quad) (-> self path curve cverts v1-5 quad))
)
)
arg0
)
(defstate idle (cave-in-master)
:virtual #t
:enter (behavior ()
(set! (-> self state-time) (-> self clock frame-counter))
(none)
)
:trans (behavior ()
(spawn (-> self part) (-> self root trans))
(when (>= (- (-> self clock frame-counter) (-> self state-time)) 0)
(let ((gp-0 (new 'stack-no-clear 'vector)))
(cavein-get-random-point gp-0)
(set! (-> gp-0 y) (+ 327680.0 (-> gp-0 y)))
(process-spawn tomb-boss-debris gp-0 (rand-vu-int-count 8) :to self)
)
(set! (-> self state-time)
(+ (-> self clock frame-counter) (the int (* 300.0 (rand-vu-float-range 0.1 0.5))))
)
)
(none)
)
:code (the-as (function none :behavior cave-in-master) sleep-code)
)
(defstate wait (cave-in-master)
:virtual #t
:event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block))
(case event-type
(('start)
(go-virtual idle)
)
)
)
:code (the-as (function none :behavior cave-in-master) sleep-code)
)
;; WARN: Return type mismatch object vs none.
(defmethod init-from-entity! cave-in-master ((obj cave-in-master) (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"
(set! (-> obj root) (new 'process 'trsqv))
(process-drawable-from-entity! obj arg0)
(set! (-> obj path) (new 'process 'path-control obj 'path 0.0 (the-as entity #f) #f))
(if (-> obj path)
(logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text))
)
(set! (-> obj root trans y) (+ 327680.0 (-> obj root trans y)))
(logclear! (-> obj mask) (process-mask actor-pause))
(dotimes (v1-12 100)
(set! (-> obj prev-points v1-12) 0)
)
(set! (-> obj part) (create-launch-control (-> *part-group-id-table* 737) obj))
(go (method-of-object obj wait))
(none)
)