mirror of
https://github.com/open-goal/jak-project
synced 2026-09-13 05:05:48 -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>
258 lines
8.6 KiB
Common Lisp
Vendored
Generated
258 lines
8.6 KiB
Common Lisp
Vendored
Generated
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; definition of type ladder
|
|
(deftype ladder (process-drawable)
|
|
((root collide-shape :override)
|
|
(rider-unit float)
|
|
(rider-time time-frame)
|
|
(art-height meters)
|
|
(set-height meters)
|
|
(meters-per-unit meters)
|
|
(meters-per-rung meters)
|
|
(options ladder-options)
|
|
)
|
|
(:state-methods
|
|
idle
|
|
(active handle)
|
|
)
|
|
(:methods
|
|
(init-collision! (_type_) none)
|
|
(init-skel! (_type_) none)
|
|
(init-params! (_type_) none)
|
|
(ladder-method-25 (_type_ matrix float) matrix)
|
|
(nop (_type_) none)
|
|
)
|
|
)
|
|
|
|
;; definition for method 3 of type ladder
|
|
(defmethod inspect ((this ladder))
|
|
(when (not this)
|
|
(set! this this)
|
|
(goto cfg-4)
|
|
)
|
|
(let ((t9-0 (method-of-type process-drawable inspect)))
|
|
(t9-0 this)
|
|
)
|
|
(format #t "~2Trider-unit: ~f~%" (-> this rider-unit))
|
|
(format #t "~2Trider-time: ~D~%" (-> this rider-time))
|
|
(format #t "~2Tart-height: (meters ~m)~%" (-> this art-height))
|
|
(format #t "~2Tset-height: (meters ~m)~%" (-> this set-height))
|
|
(format #t "~2Tmeters-per-unit: (meters ~m)~%" (-> this meters-per-unit))
|
|
(format #t "~2Tmeters-per-rung: (meters ~m)~%" (-> this meters-per-rung))
|
|
(format #t "~2Toptions: ~D~%" (-> this options))
|
|
(label cfg-4)
|
|
this
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defskelgroup skel-ladder ladder ladder-lod0-jg ladder-idle-ja
|
|
((ladder-lod0-mg (meters 999999)))
|
|
:bounds (static-spherem 0 8 0 16)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate idle (ladder)
|
|
:virtual #t
|
|
:event (behavior ((proc process) (argc int) (message symbol) (block event-message-block))
|
|
(case message
|
|
(('touch 'attack)
|
|
(let* ((s4-0 proc)
|
|
(s2-0 (if (type? s4-0 process-focusable)
|
|
s4-0
|
|
)
|
|
)
|
|
)
|
|
(when s2-0
|
|
(let ((s4-1 (ladder-method-25 self (new 'stack-no-clear 'matrix) 0.0))
|
|
(s3-0 (ladder-method-25 self (new 'stack-no-clear 'matrix) 1.0))
|
|
(s1-0 (get-trans (the-as process-focusable s2-0) 0))
|
|
(s2-1 (new 'stack-no-clear 'vector))
|
|
)
|
|
(vector-segment-distance-point! s1-0 (-> s4-1 trans) (-> s3-0 trans) s2-1)
|
|
(when (and (time-elapsed? (-> self rider-time) (seconds 0.2))
|
|
(if (< 0.0 (vector-dot (vector-! (new 'stack-no-clear 'vector) s1-0 s2-1) (-> s4-1 fvec)))
|
|
(not (logtest? (-> self options) (ladder-options lo0)))
|
|
(not (logtest? (-> self options) (ladder-options lo1)))
|
|
)
|
|
(send-event proc 'ladder (-> block param 0))
|
|
)
|
|
(set! (-> self meters-per-unit) (vector-vector-distance (-> s4-1 trans) (-> s3-0 trans)))
|
|
(set! (-> self rider-unit) (/ (vector-vector-distance (-> s4-1 trans) s2-1) (-> self meters-per-unit)))
|
|
(set-time! (-> self rider-time))
|
|
(go-virtual active (process->handle proc))
|
|
)
|
|
)
|
|
(the-as ladder-options #f)
|
|
)
|
|
)
|
|
)
|
|
(('options)
|
|
(-> self options)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(until #f
|
|
(nop self)
|
|
(suspend)
|
|
)
|
|
#f
|
|
)
|
|
:post ja-post
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(defstate active (ladder)
|
|
:virtual #t
|
|
:event (behavior ((proc process) (argc int) (message symbol) (block event-message-block))
|
|
(case message
|
|
(('matrix)
|
|
(let ((v0-0 (the-as object (ladder-method-25 self (the-as matrix (-> block param 0)) (-> self rider-unit)))))
|
|
(set-time! (-> self rider-time))
|
|
v0-0
|
|
)
|
|
)
|
|
(('move)
|
|
(set! (-> self rider-unit)
|
|
(fmax 0.0 (fmin 1.0 (+ (-> self rider-unit) (/ (the-as float (-> block param 0)) (-> self meters-per-unit)))))
|
|
)
|
|
(* (-> self rider-unit) (/ (-> self meters-per-unit) (-> self meters-per-rung)))
|
|
)
|
|
(('pos)
|
|
(if (> argc 0)
|
|
(set! (-> (the-as vector (-> block param 0)) quad) (-> self node-list data 5 bone transform uvec quad))
|
|
)
|
|
(-> self rider-unit)
|
|
)
|
|
(('stance)
|
|
(let* ((f0-8 (/ (* 0.5 (-> self meters-per-rung)) (-> self meters-per-unit)))
|
|
(f1-12 (* (the float (the int (/ (+ (-> self rider-unit) (* 0.5 f0-8)) f0-8))) f0-8))
|
|
)
|
|
(+! (-> self rider-unit) (* 0.1 (- f1-12 (-> self rider-unit))))
|
|
(set! (-> self rider-unit) (seek (-> self rider-unit) f1-12 (* 2.0 (seconds-per-frame) f0-8)))
|
|
)
|
|
)
|
|
(('options)
|
|
(-> self options)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ((arg0 handle))
|
|
(set-time! (-> self rider-time))
|
|
(while (let ((s5-0 (handle->process arg0)))
|
|
(and (if (type? s5-0 process-focusable)
|
|
s5-0
|
|
)
|
|
(not (time-elapsed? (-> self rider-time) (seconds 0.1)))
|
|
)
|
|
)
|
|
(nop self)
|
|
(suspend)
|
|
)
|
|
(go-virtual idle)
|
|
)
|
|
)
|
|
|
|
;; definition for method 22 of type ladder
|
|
;; WARN: Return type mismatch int vs none.
|
|
(defmethod init-collision! ((this ladder))
|
|
(let ((s5-0 (new 'process 'collide-shape this (collide-list-enum hit-by-player))))
|
|
(set! (-> s5-0 penetrated-by) (penetrate))
|
|
(let ((v1-2 (new 'process 'collide-shape-prim-mesh s5-0 (the-as uint 0) (the-as uint 0))))
|
|
(set! (-> v1-2 prim-core collide-as) (collide-spec obstacle))
|
|
(set! (-> v1-2 prim-core collide-with) (collide-spec jak bot player-list))
|
|
(set! (-> v1-2 prim-core action) (collide-action solid))
|
|
(set! (-> v1-2 transform-index) 0)
|
|
(set-vector! (-> v1-2 local-sphere) 0.0 10240.0 0.0 12288.0)
|
|
(set! (-> s5-0 total-prims) (the-as uint 1))
|
|
(set! (-> s5-0 root-prim) v1-2)
|
|
)
|
|
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
|
|
(let ((v1-5 (-> s5-0 root-prim)))
|
|
(set! (-> s5-0 backup-collide-as) (-> v1-5 prim-core collide-as))
|
|
(set! (-> s5-0 backup-collide-with) (-> v1-5 prim-core collide-with))
|
|
)
|
|
(set! (-> this root) s5-0)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 23 of type ladder
|
|
;; WARN: Return type mismatch int vs none.
|
|
(defmethod init-skel! ((this ladder))
|
|
(initialize-skeleton
|
|
this
|
|
(the-as skeleton-group (art-group-get-by-name *level* "skel-ladder" (the-as (pointer level) #f)))
|
|
(the-as pair 0)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 24 of type ladder
|
|
;; WARN: Return type mismatch int vs none.
|
|
(defmethod init-params! ((this ladder))
|
|
(set! (-> this meters-per-rung) 6144.0)
|
|
(set! (-> this art-height) 94208.0)
|
|
(set! (-> this set-height) (res-lump-float (-> this entity) 'height :default 94208.0))
|
|
(set! (-> this options) (res-lump-value (-> this entity) 'options ladder-options :time -1000000000.0))
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 25 of type ladder
|
|
;; INFO: Used lq/sq
|
|
(defmethod ladder-method-25 ((this ladder) (arg0 matrix) (arg1 float))
|
|
(let ((s4-0 (-> this node-list data 4 bone transform))
|
|
(s3-0 (new 'stack-no-clear 'matrix))
|
|
)
|
|
(let* ((a2-1 (-> this node-list data 5 bone transform))
|
|
(v1-4 (-> a2-1 rvec quad))
|
|
(a0-1 (-> a2-1 uvec quad))
|
|
(a1-1 (-> a2-1 fvec quad))
|
|
(a2-2 (-> a2-1 trans quad))
|
|
)
|
|
(set! (-> s3-0 rvec quad) v1-4)
|
|
(set! (-> s3-0 uvec quad) a0-1)
|
|
(set! (-> s3-0 fvec quad) a1-1)
|
|
(set! (-> s3-0 trans quad) a2-2)
|
|
)
|
|
(vector+!
|
|
(-> s3-0 trans)
|
|
(-> s3-0 trans)
|
|
(vector-normalize! (vector-! (new 'stack-no-clear 'vector) (-> s4-0 trans) (-> s3-0 trans)) 9830.4)
|
|
)
|
|
(matrix-lerp! arg0 s4-0 s3-0 arg1)
|
|
)
|
|
)
|
|
|
|
;; definition for method 26 of type ladder
|
|
;; WARN: Return type mismatch int vs none.
|
|
(defmethod nop ((this ladder))
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 11 of type ladder
|
|
(defmethod init-from-entity! ((this ladder) (arg0 entity-actor))
|
|
(init-collision! this)
|
|
(process-drawable-from-entity! this arg0)
|
|
(init-skel! this)
|
|
(init-params! this)
|
|
(if (logtest? (-> this options) (ladder-options nodraw))
|
|
(logior! (-> this draw status) (draw-control-status no-draw-bounds))
|
|
)
|
|
(set! (-> this root scale y) (/ (-> this set-height) (-> this art-height)))
|
|
(set! (-> this draw bounds y) (/ (* 0.5 (-> this set-height)) (-> this root scale y)))
|
|
(set! (-> this draw bounds w) (+ 2048.0 (* 0.5 (-> this set-height))))
|
|
(set! (-> this root root-prim local-sphere y) (/ (* 0.5 (-> this set-height)) (-> this root scale y)))
|
|
(set! (-> this root root-prim local-sphere w) (+ 2048.0 (* 0.5 (-> this set-height))))
|
|
(go (method-of-object this idle))
|
|
)
|
|
|
|
|
|
|
|
|