mirror of
https://github.com/open-goal/jak-project
synced 2026-06-20 00:08:14 -04:00
93afb02cf4
This includes all the collision stuff needed to spawn `target`, decompiles the sparticle code and adds some of the PC hacks needed for merc to run (it doesn't work quite right and looks bad, likely due to a combination of code copied from Jak 2 and the time of day hacks). There are a bunch of temporary hacks (see commits) in place to prevent the game from crashing quite as much, but it is still extremely prone to doing so due to lots of missing functions/potentially bad decomp. --------- Co-authored-by: water <awaterford111445@gmail.com>
360 lines
10 KiB
Common Lisp
Vendored
Generated
360 lines
10 KiB
Common Lisp
Vendored
Generated
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; definition of type plat
|
|
(deftype plat (base-plat)
|
|
((path-pos float)
|
|
(sound-id sound-id)
|
|
(sync sync-eased :inline)
|
|
)
|
|
(:state-methods
|
|
plat-idle
|
|
plat-path-active
|
|
)
|
|
(:methods
|
|
(go-initial-state (_type_) object)
|
|
)
|
|
)
|
|
|
|
;; definition for method 3 of type plat
|
|
(defmethod inspect ((this plat))
|
|
(when (not this)
|
|
(set! this this)
|
|
(goto cfg-4)
|
|
)
|
|
(let ((t9-0 (method-of-type base-plat inspect)))
|
|
(t9-0 this)
|
|
)
|
|
(format #t "~2Tpath-pos: ~f~%" (-> this path-pos))
|
|
(format #t "~2Tsound-id: ~D~%" (-> this sound-id))
|
|
(format #t "~2Tsync: #<sync-eased @ #x~X>~%" (-> this sync))
|
|
(label cfg-4)
|
|
this
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defskelgroup skel-plat plat plat-lod0-jg plat-idle-ja
|
|
((plat-lod0-mg (meters 20)) (plat-lod1-mg (meters 40)) (plat-lod2-mg (meters 999999)))
|
|
:bounds (static-spherem 0 -0.5 0 3)
|
|
)
|
|
|
|
;; definition for method 31 of type plat
|
|
(defmethod get-art-group ((this plat))
|
|
(art-group-get-by-name *level* "skel-plat" (the-as (pointer level) #f))
|
|
)
|
|
|
|
;; definition for method 32 of type plat
|
|
;; WARN: Return type mismatch int vs none.
|
|
(defmethod init-collision! ((this plat))
|
|
(let ((s5-0 (new 'process 'collide-shape this (collide-list-enum hit-by-player))))
|
|
(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-spec pusher))
|
|
(set! (-> s4-0 prim-core collide-with) (collide-spec jak player-list))
|
|
(set! (-> s4-0 prim-core action) (collide-action solid rideable))
|
|
(set! (-> s4-0 transform-index) 0)
|
|
(set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 13107.2)
|
|
(set! (-> s5-0 total-prims) (the-as uint 1))
|
|
(set! (-> s5-0 root-prim) s4-0)
|
|
)
|
|
(pusher-init s5-0)
|
|
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
|
|
(let ((v1-11 (-> s5-0 root-prim)))
|
|
(set! (-> s5-0 backup-collide-as) (-> v1-11 prim-core collide-as))
|
|
(set! (-> s5-0 backup-collide-with) (-> v1-11 prim-core collide-with))
|
|
)
|
|
(set! (-> this root) s5-0)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 34 of type plat
|
|
;; WARN: Return type mismatch int vs none.
|
|
(defmethod base-plat-method-34 ((this plat))
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 33 of type plat
|
|
;; WARN: Return type mismatch int vs none.
|
|
(defmethod base-plat-method-33 ((this plat))
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 37 of type plat
|
|
(defmethod go-initial-state ((this plat))
|
|
(cond
|
|
((logtest? (-> this path flags) (path-control-flag not-found))
|
|
(go (method-of-object this plat-idle))
|
|
)
|
|
((> (-> this sync period) 0)
|
|
(go (method-of-object this plat-path-active))
|
|
)
|
|
(else
|
|
(go (method-of-object this plat-idle))
|
|
)
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate plat-idle (plat)
|
|
:virtual #t
|
|
:event plat-event
|
|
:trans (behavior ()
|
|
(update-part-and-sfx! self)
|
|
)
|
|
:code (behavior ()
|
|
(plat-trans)
|
|
(rider-post)
|
|
(suspend)
|
|
(until #f
|
|
(when (not (-> self bouncing))
|
|
(plat-trans)
|
|
(rider-post)
|
|
(logior! (-> self mask) (process-mask sleep-code))
|
|
(suspend)
|
|
0
|
|
)
|
|
(while (-> self bouncing)
|
|
(plat-trans)
|
|
(rider-post)
|
|
(suspend)
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate plat-path-active (plat)
|
|
:virtual #t
|
|
:event plat-event
|
|
:exit (behavior ()
|
|
(sound-stop (-> self sound-id))
|
|
)
|
|
:trans (behavior ()
|
|
(set! (-> self path-pos) (get-norm! (-> self sync) 0))
|
|
(get-point-at-percent-along-path! (-> self path) (-> self basetrans) (-> self path-pos) 'interp)
|
|
(if (< (vector-vector-distance (-> self root trans) (ear-trans 0)) 81920.0)
|
|
(sound-play "eco-plat-hover" :id (-> self sound-id) :position (-> self root trans))
|
|
)
|
|
(plat-trans)
|
|
)
|
|
:code (behavior ()
|
|
(until #f
|
|
(ja-no-eval :group! (ja-group) :num! (seek!) :frame-num 0.0)
|
|
(until (ja-done? 0)
|
|
(suspend)
|
|
(ja :num! (seek!))
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
:post plat-post
|
|
)
|
|
|
|
;; definition for method 11 of type plat
|
|
(defmethod init-from-entity! ((this plat) (arg0 entity-actor))
|
|
(logior! (-> this mask) (process-mask platform))
|
|
(init-collision! this)
|
|
(process-drawable-from-entity! this arg0)
|
|
(initialize-skeleton this (the-as skeleton-group (get-art-group this)) (the-as pair 0))
|
|
(update-transforms (-> this root))
|
|
(init-bounce-params! this)
|
|
(base-plat-method-33 this)
|
|
(set! (-> this fact)
|
|
(new 'process 'fact-info this (pickup-type eco-pill-random) (-> *FACT-bank* default-eco-pill-green-inc))
|
|
)
|
|
(let ((a1-4 (new 'stack-no-clear 'sync-info-params)))
|
|
(let ((v1-15 0))
|
|
(if (not (logtest? (-> this fact options) (actor-option loop)))
|
|
(set! v1-15 (logior v1-15 1))
|
|
)
|
|
(set! (-> a1-4 sync-type) 'sync-eased)
|
|
(set! (-> a1-4 sync-flags) (the-as sync-flags v1-15))
|
|
)
|
|
(set! (-> a1-4 period) (the-as uint 1200))
|
|
(set! (-> a1-4 entity) arg0)
|
|
(set! (-> a1-4 percent) 0.0)
|
|
(set! (-> a1-4 ease-in) 0.15)
|
|
(set! (-> a1-4 ease-out) 0.15)
|
|
(set! (-> a1-4 pause-in) 0.0)
|
|
(set! (-> a1-4 pause-out) 0.0)
|
|
(initialize! (-> this sync) a1-4)
|
|
)
|
|
(set! (-> this path) (new 'process 'curve-control this 'path -1000000000.0))
|
|
(logior! (-> this path flags) (path-control-flag display draw-line draw-point draw-text))
|
|
(set! (-> this sound-id) (new-sound-id))
|
|
(cond
|
|
((logtest? (-> this path flags) (path-control-flag not-found))
|
|
(set! (-> this path-pos) 0.0)
|
|
(base-plat-method-34 this)
|
|
(go-initial-state this)
|
|
)
|
|
((> (-> this sync period) 0)
|
|
(set! (-> this path-pos) (get-norm! (-> this sync) 0))
|
|
(get-point-at-percent-along-path! (-> this path) (-> this root trans) (-> this path-pos) 'interp)
|
|
(base-plat-method-34 this)
|
|
(go-initial-state this)
|
|
)
|
|
(else
|
|
(set! (-> this path-pos) 0.0)
|
|
(get-point-at-percent-along-path! (-> this path) (-> this root trans) (-> this path-pos) 'interp)
|
|
(base-plat-method-34 this)
|
|
(go-initial-state this)
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition of type drop-plat
|
|
(deftype drop-plat (base-plat)
|
|
((art-name string)
|
|
(anim spool-anim)
|
|
(break-anim-name string)
|
|
(safe-time time-frame)
|
|
(hit-point vector :inline)
|
|
)
|
|
(:state-methods
|
|
idle
|
|
(fall symbol)
|
|
)
|
|
)
|
|
|
|
;; definition for method 3 of type drop-plat
|
|
(defmethod inspect ((this drop-plat))
|
|
(when (not this)
|
|
(set! this this)
|
|
(goto cfg-4)
|
|
)
|
|
(let ((t9-0 (method-of-type base-plat inspect)))
|
|
(t9-0 this)
|
|
)
|
|
(format #t "~2Tart-name: ~A~%" (-> this art-name))
|
|
(format #t "~2Tanim: ~A~%" (-> this anim))
|
|
(format #t "~2Tbreak-anim-name: ~A~%" (-> this break-anim-name))
|
|
(format #t "~2Tsafe-time: ~D~%" (-> this safe-time))
|
|
(format #t "~2Thit-point: ~`vector`P~%" (-> this hit-point))
|
|
(label cfg-4)
|
|
this
|
|
)
|
|
|
|
;; definition for method 7 of type drop-plat
|
|
;; WARN: Return type mismatch base-plat vs drop-plat.
|
|
(defmethod relocate ((this drop-plat) (offset int))
|
|
(if (nonzero? (-> this break-anim-name))
|
|
(&+! (-> this break-anim-name) offset)
|
|
)
|
|
(let ((v1-5 (-> this anim anim-name)))
|
|
(if (and (>= (the-as int v1-5) (-> *kernel-context* relocating-min))
|
|
(< (the-as int v1-5) (-> *kernel-context* relocating-max))
|
|
)
|
|
(&+! (-> this anim anim-name) offset)
|
|
)
|
|
)
|
|
(the-as drop-plat ((method-of-type base-plat relocate) this offset))
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate idle (drop-plat)
|
|
:virtual #t
|
|
:event (behavior ((proc process) (argc int) (message symbol) (block event-message-block))
|
|
(case message
|
|
(('touch 'attack 'bonk)
|
|
(let* ((s5-0 proc)
|
|
(a0-5 (if (type? s5-0 process-focusable)
|
|
s5-0
|
|
)
|
|
)
|
|
)
|
|
(cond
|
|
((and a0-5 (focus-test? (the-as process-focusable a0-5) edge-grab))
|
|
(set! (-> self safe-time) (+ (current-time) (seconds 0.2)))
|
|
(return (the-as object #f))
|
|
)
|
|
((not (time-elapsed? (-> self safe-time) (seconds 0.05)))
|
|
(return (the-as object #f))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> self hit-point quad) (-> self root trans quad))
|
|
(let ((a0-13 (if (type? proc process-focusable)
|
|
proc
|
|
)
|
|
)
|
|
)
|
|
(set! (-> self hit-point quad) (-> (get-trans (the-as process-focusable a0-13) 0) quad))
|
|
)
|
|
(if (zero? (-> self bounce-time))
|
|
(start-bounce! self)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
:trans plat-trans
|
|
:code (behavior ()
|
|
(add-process *gui-control* self (gui-channel art-load) (gui-action queue) (-> self anim name) -99.0 0)
|
|
(until #f
|
|
(when (not (-> self bouncing))
|
|
(logior! (-> self mask) (process-mask sleep-code))
|
|
(suspend)
|
|
0
|
|
)
|
|
(while (-> self bouncing)
|
|
(suspend)
|
|
)
|
|
(go-virtual fall #f)
|
|
)
|
|
#f
|
|
)
|
|
:post plat-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate fall (drop-plat)
|
|
:virtual #t
|
|
:event (behavior ((proc process) (argc int) (message symbol) (block event-message-block))
|
|
(case message
|
|
(('edge-grabbed)
|
|
(if (time-elapsed? (-> self state-time) (seconds 0.5))
|
|
(send-event proc 'end-mode 'edge-grab)
|
|
)
|
|
)
|
|
(('die)
|
|
(go-virtual fall #t)
|
|
)
|
|
)
|
|
)
|
|
:enter (behavior ((arg0 symbol))
|
|
(set-time! (-> self state-time))
|
|
)
|
|
:exit (behavior ()
|
|
(ja-abort-spooled-anim (-> self anim) (the-as art-joint-anim #f) -1)
|
|
)
|
|
:trans rider-trans
|
|
:code (behavior ((arg0 symbol))
|
|
(process-entity-status! self (entity-perm-status subtask-complete) #t)
|
|
(let ((v1-1 (-> self root root-prim)))
|
|
(set! (-> v1-1 prim-core collide-as) (collide-spec))
|
|
(set! (-> v1-1 prim-core collide-with) (collide-spec))
|
|
)
|
|
0
|
|
(if (not arg0)
|
|
(ja-play-spooled-anim
|
|
(-> self anim)
|
|
(ja-group)
|
|
(the-as art-joint-anim #f)
|
|
(the-as (function process-drawable symbol) false-func)
|
|
(spooler-flags)
|
|
)
|
|
)
|
|
(ja-channel-set! 0)
|
|
(suspend)
|
|
(logior! (-> self mask) (process-mask sleep))
|
|
(suspend)
|
|
0
|
|
)
|
|
:post rider-post
|
|
)
|