mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
24578b64b9
* hardcode `time-frame`things * Update cam-states_REF.gc * Update level-info_REF.gc * update refs 1 * update refs 2 * update refs 3 * update refs 4 * update refs 5 * update detection and casting * Update FormExpressionAnalysis.cpp * update refs 6 * update mood decomp * update refs 7 * update refs 8 * remove temp entity birth code * update time-frame casts * fix compiler * hardcode stuff and fix some types * fix some bitfield detection being wrong * bug fixes * detect seconds on adds with immediate * update refs 9 * fix casts and rand-vu-int-range bugs (update refs 10) * update refs 11 * update 12 * update 13 * update 14 * Update game-info_REF.gc * improve cpad macros detection * remove unused code * update refs * clang * update source code * Update cam-states.gc * `lavatube-energy` finish * update refs * fix actor bank stuff * Update navigate.gc * reduce entity default stack size * Update transformq-h.gc * oops forgot these * fix code and tests * fix mood sound stuff * Update load-dgo.gc * Update README.md
377 lines
12 KiB
Common Lisp
377 lines
12 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: cave-trap.gc
|
|
;; name in dgo: cave-trap
|
|
;; dgos: L1, ROB
|
|
|
|
(declare-type spider-egg process-drawable)
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
(deftype cave-trap (process-drawable)
|
|
((root-override collide-shape :offset 112)
|
|
(spider-count int32 :offset-assert 176)
|
|
(alt-actors (array entity-actor) :offset-assert 180)
|
|
(spawn-delay time-frame :offset-assert 184)
|
|
(last-spawn-time time-frame :offset-assert 192)
|
|
(debug-targ-pos vector :inline :offset-assert 208)
|
|
)
|
|
:heap-base #x70
|
|
:method-count-assert 21
|
|
:size-assert #xe0
|
|
:flag-assert #x15007000e0
|
|
(:methods
|
|
(TODO-RENAME-20 (_type_) symbol 20)
|
|
)
|
|
(:states
|
|
cave-trap-active
|
|
cave-trap-give-up
|
|
cave-trap-idle
|
|
)
|
|
)
|
|
|
|
|
|
(deftype spider-vent (process-drawable)
|
|
((last-spawn-time time-frame :offset-assert 176)
|
|
)
|
|
:heap-base #x50
|
|
:method-count-assert 20
|
|
:size-assert #xb8
|
|
:flag-assert #x14005000b8
|
|
(:states
|
|
spider-vent-idle
|
|
)
|
|
)
|
|
|
|
|
|
(defstate spider-vent-idle (spider-vent)
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(local-vars (v0-0 object))
|
|
(case arg2
|
|
(('can-spawn?)
|
|
(return (>= (- (-> *display* base-frame-counter) (-> self last-spawn-time)) (seconds 1)))
|
|
v0-0
|
|
)
|
|
(('notify-spawned)
|
|
(set! v0-0 (-> *display* base-frame-counter))
|
|
(set! (-> self last-spawn-time) (the-as time-frame v0-0))
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(logior! (-> self mask) (process-mask sleep-code))
|
|
(suspend)
|
|
0
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defmethod init-from-entity! spider-vent ((obj spider-vent) (arg0 entity-actor))
|
|
(set! (-> obj last-spawn-time) 0)
|
|
(set! (-> obj root) (new 'process 'trsqv))
|
|
(process-drawable-from-entity! obj arg0)
|
|
(go spider-vent-idle)
|
|
(none)
|
|
)
|
|
|
|
(defbehavior cave-trap-default-event-handler cave-trap ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(case arg2
|
|
(('untrigger)
|
|
(when (= (-> arg0 type) baby-spider)
|
|
(let ((v0-0 (the-as object (max 0 (+ (-> self spider-count) -1)))))
|
|
(set! (-> self spider-count) (the-as int v0-0))
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
(('notify)
|
|
(if (and (= (-> arg0 type) spider-egg) (= (-> self next-state name) 'cave-trap-idle))
|
|
(go cave-trap-active)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(deftype spawn-baby-spider-best (structure)
|
|
((index int32 :offset-assert 0)
|
|
(dist float :offset-assert 4)
|
|
)
|
|
:method-count-assert 9
|
|
:size-assert #x8
|
|
:flag-assert #x900000008
|
|
)
|
|
|
|
|
|
(deftype spawn-baby-spider-work (structure)
|
|
((best spawn-baby-spider-best 4 :inline :offset-assert 0)
|
|
)
|
|
:method-count-assert 9
|
|
:size-assert #x40
|
|
:flag-assert #x900000040
|
|
)
|
|
|
|
|
|
(defmethod TODO-RENAME-20 cave-trap ((obj cave-trap))
|
|
(with-pp
|
|
(set! (-> obj last-spawn-time) (-> *display* base-frame-counter))
|
|
(set! (-> obj spawn-delay) (rand-vu-int-range (seconds 0.1) (seconds 0.5)))
|
|
(let ((s5-0 (new 'stack-no-clear 'spawn-baby-spider-work)))
|
|
(let ((s4-0 (new 'stack-no-clear 'vector)))
|
|
(dotimes (v1-2 4)
|
|
(set! (-> s5-0 best v1-2 index) -1)
|
|
)
|
|
(set! (-> s4-0 quad) (-> (matrix-local->world #f #f) vector 2 quad))
|
|
(set! (-> s4-0 y) 0.0)
|
|
(vector-normalize! s4-0 102400.0)
|
|
(vector+! s4-0 s4-0 (camera-pos))
|
|
(set! (-> s4-0 y) (-> (target-pos 0) y))
|
|
(dotimes (s3-2 (-> obj alt-actors length))
|
|
(let* ((v1-10 (-> obj alt-actors s3-2))
|
|
(s1-0 (if v1-10
|
|
(-> v1-10 extra process)
|
|
)
|
|
)
|
|
(s2-2 (if (and (nonzero? s1-0) (type-type? (-> s1-0 type) process-drawable))
|
|
s1-0
|
|
)
|
|
)
|
|
)
|
|
(when s2-2
|
|
(let ((a1-6 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-6 from) pp)
|
|
(set! (-> a1-6 num-params) 0)
|
|
(set! (-> a1-6 message) 'can-spawn?)
|
|
(when (send-event-function s2-2 a1-6)
|
|
(let ((f30-0 (vector-vector-distance s4-0 (-> (the-as process-drawable s2-2) root trans)))
|
|
(a0-12 (new 'stack-no-clear 'sphere))
|
|
)
|
|
(let ((v1-16 (-> s5-0 best 3)))
|
|
(when (or (< (-> v1-16 index) 0) (< f30-0 (-> v1-16 dist)))
|
|
(set! (-> v1-16 index) s3-2)
|
|
(set! (-> v1-16 dist) f30-0)
|
|
)
|
|
)
|
|
(set! (-> a0-12 quad) (-> (the-as process-drawable s2-2) root trans quad))
|
|
(set! (-> a0-12 w) 4096.0)
|
|
(when (sphere-in-view-frustum? a0-12)
|
|
(let ((v1-18 (-> s5-0 best 2)))
|
|
(when (or (< (-> v1-18 index) 0) (< f30-0 (-> v1-18 dist)))
|
|
(set! (-> v1-18 index) s3-2)
|
|
(set! (-> v1-18 dist) f30-0)
|
|
)
|
|
)
|
|
(when (>= 40960.0 f30-0)
|
|
(let ((v1-19 (-> s5-0 best 1)))
|
|
(when (or (< (-> v1-19 index) 0) (< f30-0 (-> v1-19 dist)))
|
|
(set! (-> v1-19 index) s3-2)
|
|
(set! (-> v1-19 dist) f30-0)
|
|
)
|
|
)
|
|
(when (= (-> s2-2 type) spider-egg)
|
|
(let ((v1-21 (-> s5-0 best)))
|
|
(when (or (< (-> v1-21 0 index) 0) (< f30-0 (-> v1-21 0 dist)))
|
|
(set! (-> v1-21 0 index) s3-2)
|
|
(set! (-> v1-21 0 dist) f30-0)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(dotimes (s4-1 4)
|
|
(let ((v1-29 (-> s5-0 best s4-1 index)))
|
|
(when (>= v1-29 0)
|
|
(let* ((v1-32 (-> obj alt-actors v1-29))
|
|
(s2-3 (if v1-32
|
|
(-> v1-32 extra process)
|
|
)
|
|
)
|
|
(s3-3 (if (and (nonzero? s2-3) (type-type? (-> s2-3 type) process-drawable))
|
|
s2-3
|
|
)
|
|
)
|
|
(s2-4 (new 'stack-no-clear 'vector))
|
|
(s1-1 (new 'stack-no-clear 'baby-spider-spawn-params))
|
|
)
|
|
(vector-! s2-4 (target-pos 0) (-> (the-as process-drawable s3-3) root trans))
|
|
(vector-normalize! s2-4 1.0)
|
|
(init! s1-1 (= (-> s3-3 type) spider-egg) #t #t #t 7 1 'untrigger)
|
|
(let* ((s0-2 (get-process *default-dead-pool* baby-spider #x4000))
|
|
(v1-40 (when s0-2
|
|
(let ((t9-14 (method-of-type baby-spider activate)))
|
|
(t9-14 (the-as baby-spider s0-2) obj 'baby-spider (the-as pointer #x70004000))
|
|
)
|
|
(run-now-in-process
|
|
s0-2
|
|
baby-spider-init-by-other
|
|
obj
|
|
(-> (the-as process-drawable s3-3) root trans)
|
|
s2-4
|
|
s1-1
|
|
)
|
|
(-> s0-2 ppointer)
|
|
)
|
|
)
|
|
)
|
|
(when v1-40
|
|
(set! (-> (the-as baby-spider (-> v1-40 0)) die-if-not-visible?) #t)
|
|
(+! (-> obj spider-count) 1)
|
|
(send-event s3-3 'notify-spawned)
|
|
(return #f)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
|
|
(defstate cave-trap-idle (cave-trap)
|
|
:event
|
|
cave-trap-default-event-handler
|
|
:trans
|
|
(behavior ()
|
|
(when *target*
|
|
(let* ((gp-0 (target-pos 0))
|
|
(f0-0 (vector-vector-xz-distance (-> self root-override trans) (target-pos 0)))
|
|
(f1-1 (- (-> gp-0 y) (-> self root-override trans y)))
|
|
)
|
|
(when (and (>= 61440.0 f1-1) (>= f1-1 -16384.0))
|
|
(when (>= 274432.0 f0-0)
|
|
(when (or (>= 188416.0 f0-0) (send-event *target* 'query 'powerup 1))
|
|
(level-hint-spawn
|
|
(game-text-id cave-trap-nest-hint)
|
|
"sksp0341"
|
|
(the-as entity #f)
|
|
*entity-pool*
|
|
(game-task none)
|
|
)
|
|
(close-specific-task! (game-task cave-spider-tunnel) (task-status need-hint))
|
|
(go cave-trap-active)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(logior! (-> self mask) (process-mask sleep-code))
|
|
(suspend)
|
|
0
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defstate cave-trap-active (cave-trap)
|
|
:event
|
|
cave-trap-default-event-handler
|
|
:enter
|
|
(behavior ()
|
|
(set! (-> self spawn-delay) (seconds 0.5))
|
|
(none)
|
|
)
|
|
:trans
|
|
(behavior ()
|
|
(cond
|
|
(*target*
|
|
(let* ((gp-0 (target-pos 0))
|
|
(f0-0 (vector-vector-xz-distance (-> self root-override trans) (target-pos 0)))
|
|
(f1-1 (- (-> gp-0 y) (-> self root-override trans y)))
|
|
)
|
|
(if (or (< 73728.0 f1-1) (< f1-1 -24576.0) (< 368640.0 f0-0))
|
|
(go cave-trap-give-up)
|
|
)
|
|
)
|
|
(if (and (< (-> self spider-count) 8)
|
|
(>= (- (-> *display* base-frame-counter) (-> self last-spawn-time)) (-> self spawn-delay))
|
|
)
|
|
(TODO-RENAME-20 self)
|
|
)
|
|
)
|
|
(else
|
|
(go cave-trap-give-up)
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(logior! (-> self mask) (process-mask sleep-code))
|
|
(suspend)
|
|
0
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defstate cave-trap-give-up (cave-trap)
|
|
:event
|
|
cave-trap-default-event-handler
|
|
:code
|
|
(behavior ()
|
|
(suspend)
|
|
(go cave-trap-idle)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defmethod relocate cave-trap ((obj cave-trap) (arg0 int))
|
|
(if (nonzero? (-> obj alt-actors))
|
|
(&+! (-> obj alt-actors) arg0)
|
|
)
|
|
(the-as
|
|
cave-trap
|
|
((the-as (function process-drawable int process-drawable) (find-parent-method cave-trap 7)) obj arg0)
|
|
)
|
|
)
|
|
|
|
(defmethod init-from-entity! cave-trap ((obj cave-trap) (arg0 entity-actor))
|
|
(set! (-> obj spider-count) 0)
|
|
(set! (-> obj spawn-delay) 0)
|
|
(set! (-> obj last-spawn-time) 0)
|
|
(let ((s4-0 (new 'process 'collide-shape obj (collide-list-enum hit-by-player))))
|
|
(let ((s3-0 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
|
|
(set! (-> s3-0 prim-core offense) (collide-offense no-offense))
|
|
(set-vector! (-> s3-0 local-sphere) 0.0 0.0 0.0 4096.0)
|
|
(set-root-prim! s4-0 s3-0)
|
|
)
|
|
(set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w)))
|
|
(backup-collide-with-as s4-0)
|
|
(set! (-> obj root-override) s4-0)
|
|
)
|
|
(process-drawable-from-entity! obj arg0)
|
|
(set! (-> obj nav) (new 'process 'nav-control (-> obj root-override) 16 40960.0))
|
|
(logior! (-> obj nav flags) (nav-control-flags display-marks bit3 bit5 bit6 bit7))
|
|
(set! (-> obj nav nearest-y-threshold) 409600.0)
|
|
(set! (-> obj root-override nav-flags) (logand -2 (-> obj root-override nav-flags)))
|
|
(set! (-> obj path) (new 'process 'path-control obj 'path 0.0))
|
|
(logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text))
|
|
(let ((s4-1 (entity-actor-count arg0 'alt-actor)))
|
|
(set! (-> obj alt-actors) (the-as (array entity-actor) (new 'process 'boxed-array entity-actor s4-1)))
|
|
(dotimes (s3-1 s4-1)
|
|
(set! (-> obj alt-actors s3-1) (entity-actor-lookup arg0 'alt-actor s3-1))
|
|
)
|
|
)
|
|
(go cave-trap-idle)
|
|
(none)
|
|
)
|
|
|
|
|
|
|
|
|