mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-21 17:47:44 -04:00
66e395d547
* detect `seek!` and `seekl!` * fancy struct instead of pair mess * fixes * i think this was wrong? * update refs * update source * More logical branching * even better branching
346 lines
11 KiB
Common Lisp
346 lines
11 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: plat-eco.gc
|
|
;; name in dgo: plat-eco
|
|
;; dgos: GAME, COMMON, L1
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
(deftype plat-eco (plat)
|
|
((notice-dist float :offset-assert 264)
|
|
(sync-offset-dest float :offset-assert 268)
|
|
(sync-offset-faux float :offset-assert 272)
|
|
(sync-linear-val float :offset-assert 276)
|
|
(target handle :offset-assert 280)
|
|
(unlit-look lod-set :inline :offset-assert 288)
|
|
(lit-look lod-set :inline :offset-assert 324)
|
|
)
|
|
:heap-base #x100
|
|
:method-count-assert 33
|
|
:size-assert #x165
|
|
:flag-assert #x2101000165
|
|
(:methods
|
|
(notice-blue (handle) _type_ :replace :state 29)
|
|
)
|
|
)
|
|
|
|
|
|
(defskelgroup *plat-eco-unlit-sg* plat-eco
|
|
0
|
|
8
|
|
((1 (meters 20)) (2 (meters 40)) (3 (meters 999999)))
|
|
:bounds (static-spherem 0 0 0 3)
|
|
:longest-edge (meters 0)
|
|
)
|
|
|
|
(defskelgroup *plat-eco-lit-sg* plat-eco
|
|
0
|
|
8
|
|
((5 (meters 20)) (6 (meters 40)) (7 (meters 999999)))
|
|
:bounds (static-spherem 0 0 0 3)
|
|
:longest-edge (meters 0)
|
|
)
|
|
|
|
(defstate plat-idle (plat-eco)
|
|
:virtual #t
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(case arg2
|
|
(('wake)
|
|
(go-virtual plat-path-active (the-as plat #f))
|
|
)
|
|
(('eco-blue)
|
|
(go-virtual notice-blue (process->handle arg0))
|
|
)
|
|
(('ridden 'edge-grabbed)
|
|
(let ((a1-6 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-6 from) self)
|
|
(set! (-> a1-6 num-params) 2)
|
|
(set! (-> a1-6 message) 'query)
|
|
(set! (-> a1-6 param 0) (the-as uint 'powerup))
|
|
(set! (-> a1-6 param 1) (the-as uint 3))
|
|
(when (send-event-function *target* a1-6)
|
|
(send-to-all (-> self link) 'wake)
|
|
(go-virtual plat-path-active (the-as plat #f))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:enter
|
|
(behavior ()
|
|
(lods-assign! (-> self draw) (-> self unlit-look))
|
|
(none)
|
|
)
|
|
:trans
|
|
(behavior ()
|
|
(when (and (and *target*
|
|
(>= (-> self notice-dist) (vector-vector-distance (-> self root-override trans) (-> *target* control trans)))
|
|
)
|
|
(send-event *target* 'query 'powerup 3)
|
|
)
|
|
(send-to-all (-> self link) 'wake)
|
|
(go-virtual plat-path-active (the-as plat #f))
|
|
)
|
|
(if (and *target*
|
|
(>= (-> self notice-dist) (vector-vector-distance (-> self root-override trans) (-> *target* control trans)))
|
|
)
|
|
(level-hint-spawn
|
|
(game-text-id daxter-blue-eco-plat-tutorial)
|
|
"sksp0073"
|
|
(the-as entity #f)
|
|
*entity-pool*
|
|
(game-task none)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(ja-post)
|
|
(update-transforms! (-> self root-override))
|
|
(anim-loop)
|
|
(none)
|
|
)
|
|
:post
|
|
(the-as (function none :behavior plat-eco) ja-post)
|
|
)
|
|
|
|
(defstate notice-blue (plat-eco)
|
|
:virtual override
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(case arg2
|
|
(('wake)
|
|
(sound-play-by-name
|
|
(static-sound-name "blue-eco-on")
|
|
(new-sound-id)
|
|
1024
|
|
0
|
|
0
|
|
1
|
|
(the-as symbol (-> self root-override trans))
|
|
)
|
|
(go-virtual plat-path-active (the-as plat #f))
|
|
)
|
|
(('ridden 'edge-grabbed)
|
|
(let ((a1-3 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-3 from) self)
|
|
(set! (-> a1-3 num-params) 2)
|
|
(set! (-> a1-3 message) 'query)
|
|
(set! (-> a1-3 param 0) (the-as uint 'powerup))
|
|
(set! (-> a1-3 param 1) (the-as uint 3))
|
|
(when (send-event-function *target* a1-3)
|
|
(send-to-all (-> self link) 'wake)
|
|
(go-virtual plat-path-active (the-as plat #f))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:trans
|
|
(behavior ()
|
|
((-> (method-of-object self plat-idle) trans))
|
|
(let ((a1-0 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-0 from) self)
|
|
(set! (-> a1-0 num-params) 2)
|
|
(set! (-> a1-0 message) 'query)
|
|
(set! (-> a1-0 param 0) (the-as uint 'powerup))
|
|
(set! (-> a1-0 param 1) (the-as uint 3))
|
|
(if (and (not (send-event-function *target* a1-0))
|
|
(begin (logior! (-> self mask) (process-mask sleep-code)) (not (-> self bouncing)))
|
|
)
|
|
(go-virtual plat-idle)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
:code
|
|
(behavior ((arg0 handle))
|
|
(set! (-> self target) arg0)
|
|
(while #t
|
|
(let* ((gp-0 (handle->process (-> self target)))
|
|
(v1-4 (if (and (nonzero? gp-0) (type-type? (-> gp-0 type) process-drawable))
|
|
gp-0
|
|
)
|
|
)
|
|
)
|
|
(when v1-4
|
|
(let* ((gp-1 (-> (the-as process-drawable v1-4) root))
|
|
(v1-6 (if (and (nonzero? gp-1) (type-type? (-> gp-1 type) collide-shape))
|
|
gp-1
|
|
)
|
|
)
|
|
)
|
|
(when v1-6
|
|
(let* ((s5-0 (-> self root-override root-prim prim-core))
|
|
(a1-3 (-> (the-as collide-shape v1-6) root-prim prim-core))
|
|
(f30-0 (vector-vector-distance (the-as vector s5-0) (the-as vector a1-3)))
|
|
)
|
|
(when (rand-vu-percent? 0.5)
|
|
(let ((gp-2 (new 'stack-no-clear 'vector)))
|
|
(set! (-> gp-2 quad) (-> s5-0 world-sphere quad))
|
|
(dotimes (s5-1 3)
|
|
(+! (-> gp-2 data s5-1) (rand-vu-float-range -5324.8 5324.8))
|
|
)
|
|
(eco-blue-glow gp-2)
|
|
)
|
|
)
|
|
(set! (-> self bouncing) #t)
|
|
(activate!
|
|
(-> self smush)
|
|
(lerp-scale
|
|
(rand-vu-float-range 1.1 1.3)
|
|
(rand-vu-float-range 1.0 1.02)
|
|
f30-0
|
|
(-> *FACT-bank* suck-suck-dist)
|
|
(-> *FACT-bank* suck-bounce-dist)
|
|
)
|
|
60
|
|
60
|
|
1.0
|
|
1.0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(suspend)
|
|
)
|
|
(none)
|
|
)
|
|
:post
|
|
(behavior ()
|
|
(plat-trans)
|
|
(plat-post)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defstate plat-path-active (plat-eco)
|
|
:virtual #t
|
|
:enter
|
|
(behavior ((arg0 plat))
|
|
(lods-assign! (-> self draw) (-> self lit-look))
|
|
(sync-now! (-> self sync) (-> self sync-linear-val))
|
|
(set! (-> self sync-offset-faux) (-> self sync offset))
|
|
(let* ((f0-3 (the float (-> self sync period)))
|
|
(f1-1 (* 0.5 f0-3))
|
|
)
|
|
(if (< f1-1 (- (-> self sync-offset-dest) (-> self sync-offset-faux)))
|
|
(+! (-> self sync-offset-faux) f0-3)
|
|
)
|
|
(if (< f1-1 (- (-> self sync-offset-faux) (-> self sync-offset-dest)))
|
|
(set! (-> self sync-offset-faux) (- (-> self sync-offset-faux) f0-3))
|
|
)
|
|
)
|
|
(cond
|
|
(arg0
|
|
(let ((f0-5 (-> self sync-offset-dest)))
|
|
(set! (-> self sync offset) f0-5)
|
|
(set! (-> self sync-offset-faux) f0-5)
|
|
)
|
|
)
|
|
(else
|
|
(process-entity-status! self (entity-perm-status complete) #t)
|
|
(dotimes (gp-1 5)
|
|
(spawn-projectile-blue *target*)
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
:trans
|
|
(behavior ()
|
|
(when (!= (-> self sync-offset-faux) (-> self sync-offset-dest))
|
|
(seek! (-> self sync-offset-faux) (-> self sync-offset-dest) (* 12.0 (-> *display* seconds-per-frame)))
|
|
(let* ((f0-7 (the float (-> self sync period)))
|
|
(f1-3 (+ (-> self sync-offset-faux) f0-7))
|
|
)
|
|
(set! (-> self sync offset) (- f1-3 (* (the float (the int (/ f1-3 f0-7))) f0-7)))
|
|
)
|
|
)
|
|
((-> (method-of-type plat plat-path-active) trans))
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defmethod dummy-24 plat-eco ((obj plat-eco))
|
|
(let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player))))
|
|
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
|
|
(set! (-> s5-0 reaction) default-collision-reaction)
|
|
(set! (-> s5-0 no-reaction)
|
|
(the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing)
|
|
)
|
|
(alloc-riders s5-0 1)
|
|
(let ((s4-0 (new 'process 'collide-shape-prim-mesh s5-0 (the-as uint 0) (the-as uint 0))))
|
|
(set! (-> s4-0 prim-core collide-as) (collide-kind ground-object blue-eco-suck))
|
|
(set! (-> s4-0 collide-with) (collide-kind target))
|
|
(set! (-> s4-0 prim-core action) (collide-action solid ca-1))
|
|
(set! (-> s4-0 prim-core offense) (collide-offense indestructible))
|
|
(set! (-> s4-0 transform-index) 0)
|
|
(set-vector! (-> s4-0 local-sphere) 0.0 -1228.8 0.0 13926.4)
|
|
(set-root-prim! s5-0 s4-0)
|
|
)
|
|
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
|
|
(backup-collide-with-as s5-0)
|
|
(set! (-> obj root-override) s5-0)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defmethod get-unlit-skel plat-eco ((obj plat-eco))
|
|
*plat-eco-unlit-sg*
|
|
)
|
|
|
|
(defmethod get-lit-skel plat-eco ((obj plat-eco))
|
|
*plat-eco-lit-sg*
|
|
)
|
|
|
|
(defmethod init-from-entity! plat-eco ((obj plat-eco) (arg0 entity-actor))
|
|
(set! (-> obj mask) (logior (process-mask platform) (-> obj mask)))
|
|
(set! (-> obj notice-dist) (res-lump-float arg0 'notice-dist :default -1.0))
|
|
(set! (-> obj link) (new 'process 'actor-link-info obj))
|
|
(dummy-24 obj)
|
|
(process-drawable-from-entity! obj arg0)
|
|
(let ((s4-0 (get-unlit-skel obj))
|
|
(s5-1 (get-lit-skel obj))
|
|
)
|
|
(initialize-skeleton obj s4-0 '())
|
|
(setup-lods! (-> obj unlit-look) s4-0 (-> obj draw art-group) (-> obj entity))
|
|
(setup-lods! (-> obj lit-look) s5-1 (-> obj draw art-group) (-> obj entity))
|
|
)
|
|
(logclear! (-> obj mask) (process-mask actor-pause))
|
|
(update-transforms! (-> obj root-override))
|
|
(set! (-> obj part) (create-launch-control (-> *part-group-id-table* 107) obj))
|
|
(set! (-> obj path) (new 'process 'curve-control obj 'path -1000000000.0))
|
|
(logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text))
|
|
(set! (-> obj fact)
|
|
(new 'process 'fact-info obj (pickup-type eco-pill-random) (-> *FACT-bank* default-pill-inc))
|
|
)
|
|
(load-params! (-> obj sync) obj (the-as uint 3000) 0.0 0.15 0.15)
|
|
(set! (-> obj sync-offset-dest) (-> obj sync offset))
|
|
(set! (-> obj sync-linear-val) (get-phase-offset (-> obj sync)))
|
|
(sync-now! (-> obj sync) (-> obj sync-linear-val))
|
|
(set! (-> obj sync-offset-faux) (-> obj sync offset))
|
|
(set! (-> obj path-pos) (get-current-phase-with-mirror (-> obj sync)))
|
|
(eval-path-curve! (-> obj path) (-> obj root-override trans) (-> obj path-pos) 'interp)
|
|
(set! (-> obj sound-id) (new-sound-id))
|
|
(dummy-26 obj)
|
|
(dummy-21 obj)
|
|
(if (or (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status complete)))
|
|
(< (-> obj notice-dist) 0.0)
|
|
)
|
|
(go (method-of-object obj plat-path-active) (the-as plat #t))
|
|
(go (method-of-object obj plat-idle))
|
|
)
|
|
(none)
|
|
)
|
|
|
|
|
|
|
|
|