mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
1e11a588f5
* [decomp] `loader` prelim work + some cleanup * more things * more * even more * yet even more * minor fixes * decompiler fix + use behaviors for two funcs * last functions * Create loader_REF.gc * more work * change vag tool config format + unrelated farmer and yakow stuff * update some things * fix some decomp * cleanup things i came across + make dgo compileable * fix consistency test * update refs * offline test: skip buggy `external-art-buffer` method * fix test
151 lines
4.8 KiB
Common Lisp
151 lines
4.8 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: process-drawable-h.gc
|
|
;; name in dgo: process-drawable-h
|
|
;; dgos: GAME, ENGINE
|
|
|
|
(define-extern cspace-index-by-name (function process-drawable string int))
|
|
(define-extern cspace-by-name (function process-drawable string cspace))
|
|
(define-extern joint-control-reset! (function joint-control joint-control-channel none))
|
|
|
|
(defun cspace-by-name-no-fail ((arg0 process-drawable) (arg1 string))
|
|
"Get a cspace by name from the given process-drawable. If it fails, print an error and return the first one"
|
|
(let ((result (cspace-by-name arg0 arg1)))
|
|
(cond
|
|
(result
|
|
result
|
|
)
|
|
(else
|
|
(format 0 "no cspace (~A)~%" arg1)
|
|
(-> arg0 node-list data 0)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defun cspace-index-by-name-no-fail ((arg0 process-drawable) (arg1 string))
|
|
"Get the index of a cspace by name from the given process drawable. If it fails, print an error and return 0."
|
|
(let ((v0-0 (cspace-index-by-name arg0 arg1)))
|
|
(cond
|
|
((< v0-0 0)
|
|
(format 0 "no cspace[ndx] (~A)~%" arg1)
|
|
0
|
|
)
|
|
(else
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
;; The following functions can be applied to a joint-control-channel to change the frame number.
|
|
;; They return the resulting frame number as well.
|
|
|
|
(defun num-func-none ((arg0 joint-control-channel) (arg2 float) (arg2 float))
|
|
"Don't change anything."
|
|
(-> arg0 frame-num)
|
|
)
|
|
|
|
(defun num-func-+! ((arg0 joint-control-channel) (arg1 float) (arg2 float))
|
|
"Increment the frame number, taking into account the animation speed and current game rate."
|
|
(let ((f0-1
|
|
(+ (-> arg0 frame-num)
|
|
(* arg1 (* (-> arg0 frame-group speed) (-> *display* time-adjust-ratio)))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> arg0 frame-num) f0-1)
|
|
f0-1
|
|
)
|
|
)
|
|
|
|
(defun num-func--! ((arg0 joint-control-channel) (arg1 float) (arg2 float))
|
|
"Decrement the frame number, taking into account the animation speed and current game rate."
|
|
(let ((f0-1
|
|
(- (-> arg0 frame-num)
|
|
(* arg1 (* (-> arg0 frame-group speed) (-> *display* time-adjust-ratio)))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> arg0 frame-num) f0-1)
|
|
f0-1
|
|
)
|
|
)
|
|
|
|
(defun num-func-loop! ((chan joint-control-channel) (inc float) (arg2 float))
|
|
"Like num-func-+!, but will wrap to 0 after going past the end."
|
|
|
|
;; get the duration from the joint-animation-compressed.
|
|
(let* ((duration (the float (+ (-> chan frame-group data 0 length) -1)))
|
|
;; increment (also add a full duration to it, I guess to avoid issues if inc is negative and we're near the start.)
|
|
(after-inc (+ (+ (-> chan frame-num) duration)
|
|
(* inc (* (-> chan frame-group speed) (-> *display* time-adjust-ratio)))
|
|
)
|
|
)
|
|
;; wrap.
|
|
(wrapped (- after-inc (* (the float (the int (/ after-inc duration))) duration)))
|
|
)
|
|
(set! (-> chan frame-num) wrapped)
|
|
wrapped
|
|
)
|
|
)
|
|
|
|
(defun num-func-seek! ((arg0 joint-control-channel) (arg1 float) (arg2 float))
|
|
"Seek toward arg1 by at most arg2 (taking into account speed etc)"
|
|
(let ((f0-3 (seek
|
|
(-> arg0 frame-num)
|
|
arg1
|
|
(* arg2 (* (-> arg0 frame-group speed) (-> *display* time-adjust-ratio)))
|
|
)
|
|
)
|
|
)
|
|
;; set it twice, just to make sure.
|
|
(set! (-> arg0 frame-num) f0-3)
|
|
(set! (-> arg0 frame-num) f0-3)
|
|
f0-3
|
|
)
|
|
)
|
|
|
|
(defun num-func-blend-in! ((arg0 joint-control-channel) (arg1 float) (arg2 float))
|
|
"Seek frame-interp toward 1. Once its there, do a joint-control-reset."
|
|
(let* ((v0-0 (seek (-> arg0 frame-interp) 1.0 (* arg1 (-> *display* time-adjust-ratio))))
|
|
(f30-0 (the-as float v0-0))
|
|
)
|
|
(set! (-> arg0 frame-interp) f30-0)
|
|
(set! (-> arg0 frame-interp) f30-0)
|
|
(if (= f30-0 1.0)
|
|
(joint-control-reset! (-> arg0 parent) arg0)
|
|
)
|
|
f30-0
|
|
)
|
|
)
|
|
|
|
(defun num-func-chan ((arg0 joint-control-channel) (arg1 float) (arg2 float))
|
|
"Copies the frame number from the channel arg1."
|
|
;; this is a super hack.
|
|
;; we know that we're in an inline-array of joint-control-channels
|
|
;; and the group-sub-index is our index in our array
|
|
;; so we can compute the offset of the arg1-th index from this.
|
|
(let ((f0-2 (-> (the-as joint-control-channel
|
|
(+ (the-as uint arg0)
|
|
(the-as uint
|
|
;; 48 * (difference in indices)
|
|
(* 48 (- (the int arg1) (-> arg0 group-sub-index))))
|
|
)
|
|
)
|
|
frame-num
|
|
)
|
|
)
|
|
)
|
|
(set! (-> arg0 frame-num) f0-2)
|
|
f0-2
|
|
)
|
|
)
|
|
|
|
(defun num-func-identity ((arg0 joint-control-channel) (arg1 float) (arg2 float))
|
|
"seems to be the same thing as none."
|
|
(-> arg0 frame-num)
|
|
)
|
|
|