Files
jak-project/test/decompiler/reference/jak3/engine/ambient/ambient_REF.gc
T
water111 2a4d3d7a4a [decompiler] More inline vector functions (#3861)
This adds more recognition for inlined vector functions to the
decompiler, which can clean up a bunch of ugly looking code/`rlet`s.


![image](https://github.com/user-attachments/assets/1f7b4627-81bd-481b-b828-76b9f7ba13b3)

Unfortunately, this changes the numbering of ops in the decomp, since
all the vector instructions get combined in a single "operation" by the
decompiler. I really tried to avoid having this ever happen in the
decompiler and this is one of the few cases where it has. So I had to
update a bunch of type casts.

For that reason I haven't turned this on in Jak 2 yet, although I am
planning to do that at some point. (probably at the same time as porting
back a bunch of jak 3 improvements to jak 2)

---------

Co-authored-by: water111 <awaterford1111445@gmail.com>
2025-02-16 15:59:17 -05:00

569 lines
19 KiB
Common Lisp
Vendored
Generated

;;-*-Lisp-*-
(in-package goal)
;; definition for function can-display-query?
(defun can-display-query? ((arg0 process) (arg1 string) (arg2 float))
(let ((a1-2 (gui-control-method-12
*gui-control*
arg0
(gui-channel query)
(gui-action play)
(if arg1
arg1
(symbol->string (-> arg0 type symbol))
)
0
arg2
(new 'static 'sound-id)
)
)
)
(= (get-status *gui-control* a1-2) (gui-status active))
)
)
;; definition for function talker-surpress!
(defun talker-surpress! ()
(set! (-> *game-info* hint-play-time) (-> *display* base-clock frame-counter))
0
)
;; definition for function talker-displayed?
(defun talker-displayed? ()
(if (-> *setting-control* user-current hint)
#t
#f
)
)
;; definition for function kill-current-talker
;; WARN: Return type mismatch int vs none.
(defun kill-current-talker ((arg0 pair) (arg1 pair) (arg2 symbol))
(if (not (member 'daxter arg1))
(set-action!
*gui-control*
(gui-action stop)
(the-as sound-id 1)
(gui-channel daxter)
(gui-action none)
(the-as string #f)
(the-as (function gui-connection symbol) #f)
(the-as process #f)
)
)
(if (not (member 'pecker arg1))
(set-action!
*gui-control*
(gui-action stop)
(the-as sound-id 1)
(gui-channel pecker)
(gui-action none)
(the-as string #f)
(the-as (function gui-connection symbol) #f)
(the-as process #f)
)
)
(if (not (member 'voicebox arg1))
(set-action!
*gui-control*
(gui-action stop)
(the-as sound-id 1)
(gui-channel voicebox)
(gui-action none)
(the-as string #f)
(the-as (function gui-connection symbol) #f)
(the-as process #f)
)
)
(if (not (member 'message arg1))
(set-action!
*gui-control*
(gui-action stop)
(the-as sound-id 1)
(gui-channel message)
(gui-action none)
(the-as string #f)
(the-as (function gui-connection symbol) #f)
(the-as process #f)
)
)
(when (not (member 'notice arg1))
(set-action!
*gui-control*
(gui-action stop)
(the-as sound-id 1)
(gui-channel notice)
(gui-action none)
(the-as string #f)
(the-as (function gui-connection symbol) #f)
(the-as process #f)
)
(set-action!
*gui-control*
(gui-action stop)
(the-as sound-id 1)
(gui-channel notice-low)
(gui-action none)
(the-as string #f)
(the-as (function gui-connection symbol) #f)
(the-as process #f)
)
)
0
(none)
)
;; definition for function string->talker-speech
(defun string->talker-speech ((arg0 string))
(dotimes (s5-0 365)
(let ((s4-0 (-> *talker-speech* s5-0)))
(if (string= arg0 (-> s4-0 name))
(return s4-0)
)
)
)
(-> *talker-speech* 0)
)
;; definition for method 9 of type talker-speech-class
(defmethod should-play? ((this talker-speech-class))
"Return if the talker is in a state where it should play."
(and (>= (-> *game-info* talker-state (* (-> this speech) 2)) (-> this pos))
(>= (-> this neg) (-> *game-info* talker-state (+ (* (-> this speech) 2) 1)))
)
)
;; definition for method 10 of type talker-speech-class
;; WARN: Return type mismatch int vs none.
(defmethod mark-played! ((this talker-speech-class))
"Mark something as played by making its state UINT16_MAX"
(set! (-> *game-info* talker-state (+ (* (-> this speech) 2) 1)) (the-as uint #xffff))
0
(none)
)
;; definition for method 11 of type talker-speech-class
;; WARN: Return type mismatch int vs none.
(defmethod reset-state! ((this talker-speech-class))
"Reset the state of this talker to 0 (the initial value)"
(set! (-> *game-info* talker-state (+ (* (-> this speech) 2) 1)) (the-as uint 0))
0
(none)
)
;; definition for method 12 of type talker-speech-class
;; WARN: Return type mismatch int vs none.
(defmethod yes-play! ((this talker-speech-class) (arg0 int))
(if (>= arg0 0)
(set! (-> *game-info* talker-state (* (-> this speech) 2))
(the-as uint (seekl (the-as int (-> *game-info* talker-state (* (-> this speech) 2))) #xfff0 arg0))
)
(set! (-> *game-info* talker-state (* (-> this speech) 2))
(the-as uint (seekl (the-as int (-> *game-info* talker-state (* (-> this speech) 2))) 0 (- arg0)))
)
)
(if (should-play? this)
(talker-spawn-func this *entity-pool* (target-pos 0) (the-as region #f))
)
0
(none)
)
;; definition for method 13 of type talker-speech-class
;; WARN: Return type mismatch int vs none.
(defmethod no-play! ((this talker-speech-class) (arg0 int))
(if (>= arg0 0)
(set! (-> *game-info* talker-state (+ (* (-> this speech) 2) 1))
(the-as uint (seekl (the-as int (-> *game-info* talker-state (+ (* (-> this speech) 2) 1))) #xfff0 arg0))
)
(set! (-> *game-info* talker-state (+ (* (-> this speech) 2) 1))
(the-as uint (seekl (the-as int (-> *game-info* talker-state (+ (* (-> this speech) 2) 1))) 0 (- arg0)))
)
)
0
(none)
)
;; definition for function talker-spawn-func
;; WARN: Return type mismatch int vs sound-id.
(defun talker-spawn-func ((arg0 talker-speech-class) (arg1 process-tree) (arg2 vector) (arg3 region))
(local-vars (s2-0 int))
(when (or (not arg0) (zero? (-> arg0 speech)) (not (should-play? arg0)))
(set! s2-0 0)
(goto cfg-27)
)
(if (and (or (not (-> *setting-control* user-current play-hints))
(= (-> *setting-control* user-current dialog-volume) 0.0)
)
(logtest? (-> arg0 flags) (talker-flags play-only-once))
)
(mark-played! arg0)
)
(set! s2-0
(the-as int (lookup-gui-connection-id *gui-control* (-> arg0 name) (-> arg0 channel) (gui-action none)))
)
(set! s2-0 (cond
((zero? (the-as sound-id s2-0))
(let ((v1-17 (process-spawn talker :init talker-init arg0 arg2 arg3 :name "talker" :to arg1)))
(cond
(v1-17
(if (nonzero? (-> (the-as talker (-> v1-17 0)) voice-id))
(the-as int (-> (the-as talker (-> v1-17 0)) voice-id))
(the-as int (-> (the-as talker (-> v1-17 0)) message-id))
)
)
(else
(empty)
s2-0
)
)
)
)
(else
(empty)
s2-0
)
)
)
(label cfg-27)
(the-as sound-id s2-0)
)
;; definition for function talker-init
;; INFO: Used lq/sq
;; WARN: Return type mismatch int vs none.
(defbehavior talker-init talker ((arg0 talker-speech-class) (arg1 vector) (arg2 region))
(vector-copy! (-> self trans) arg1)
(let ((v1-2 (shr (the-as int (-> arg0 channel)) 4)))
(when (not (or (or (= v1-2 4) (= v1-2 5))
(or (not (-> *setting-control* user-current play-hints))
(= (-> *setting-control* user-current dialog-volume) 0.0)
)
)
)
(set! (-> self voice-id)
(add-process *gui-control* self (-> arg0 channel) (gui-action queue) (-> arg0 name) 81920.0 0)
)
(sound-params-set!
*gui-control*
(-> self voice-id)
#f
-1
-1
-1
(-> *setting-control* user-current talker-volume)
)
)
)
(when (nonzero? (-> arg0 text-message))
(let* ((a0-7 *gui-control*)
(t9-2 (method-of-object a0-7 add-process))
(a1-4 self)
(v1-18 (shr (the-as int (-> arg0 channel)) 4))
)
(set! (-> self message-id) (t9-2
a0-7
a1-4
(if (or (= v1-18 4) (= v1-18 5))
(the-as gui-channel (the-as int (-> arg0 channel)))
(gui-channel message)
)
(gui-action play)
(-> arg0 name)
81920.0
0
)
)
)
)
(set! (-> self message) arg0)
(set! (-> self region) arg2)
(set! (-> self total-time) 0)
(set! (-> self total-off-time) 0)
(set-time! (-> self start-time))
(set! (-> self voicebox) (the-as handle #f))
(set! (-> self save?) #f)
(set! (-> self grab?) #f)
(if (logtest? (-> self message flags) (talker-flags fade-in slide-in))
(set! (-> self interp) 0.0)
(set! (-> self interp) 1.0)
)
(go-virtual idle)
0
(none)
)
;; definition for method 10 of type talker
(defmethod deactivate ((this talker))
"Make a process dead, clean it up, remove it from the active pool, and return to dead pool."
(send-event (handle->process (-> this voicebox)) 'die)
(call-parent-method this)
(none)
)
;; definition for method 17 of type talker
;; WARN: Return type mismatch int vs none.
(defmethod draw-text ((this talker))
(let ((gp-0
(new 'stack 'font-context *font-default-matrix* 36 310 0.0 (font-color default) (font-flags shadow kerning))
)
)
(let ((f0-0 320.0))
(set-scale! gp-0 0.75)
(case (-> this message channel)
(((gui-channel notice))
(cond
((logtest? (-> this message flags) (talker-flags bigger-font))
(set-origin! gp-0 36 140)
)
(else
(set-scale! gp-0 0.6)
(set-origin! gp-0 36 160)
)
)
(set! f0-0 160.0)
)
)
(set-width! gp-0 440)
(set-height! gp-0 140)
(set! (-> gp-0 flags) (font-flags shadow kerning middle large))
(if (logtest? (-> this message flags) (talker-flags fade-in))
(set! (-> gp-0 alpha) (-> this interp))
(set! (-> gp-0 alpha) 1.0)
)
(if (logtest? (-> this message flags) (talker-flags slide-in))
(set-origin! gp-0 36 (the int (lerp-scale 400.0 f0-0 (-> this interp) 0.0 1.0)))
)
)
(let ((f0-17 (print-game-text
(lookup-text! *common-text* (-> this message text-message) #f)
gp-0
#t
44
(bucket-id hud-draw-hud-alpha)
)
)
)
(if (< 98.0 f0-17)
(set-scale! gp-0 0.6)
)
)
(let ((s4-2 print-game-text)
(a0-14 (lookup-text! *common-text* (-> this message text-message) #f))
(a2-5 #f)
(a3-3 44)
(v1-36 (-> this message channel))
)
(s4-2
a0-14
gp-0
a2-5
a3-3
(if (or (= v1-36 (gui-channel notice)) (= v1-36 (gui-channel notice-low)) (= v1-36 (gui-channel subtitle)))
(bucket-id hud-draw-pris2)
(bucket-id hud-draw-hud-alpha)
)
)
)
)
0
(none)
)
;; failed to figure out what this is:
(defstate idle (talker)
:virtual #t
:code (behavior ()
(suspend-for (the-as time-frame (-> self message delay))
)
(while (or (not (time-elapsed? (-> self start-time) (the-as time-frame (+ (-> self message delay) 300))))
(and (logtest? (-> self message flags) (talker-flags long-timeout))
(not (time-elapsed? (-> self start-time) (seconds 180)))
)
)
(when (and (or (zero? (-> self voice-id)) (= (get-status *gui-control* (-> self voice-id)) (gui-status ready)))
(or (zero? (-> self message-id)) (= (get-status *gui-control* (-> self message-id)) (gui-status active)))
)
(case (-> self message channel)
(((gui-channel voicebox))
(if (and (not (handle->process (-> self voicebox))) *target*)
(set! (-> self voicebox) (ppointer->handle (voicebox-spawn *target* (target-pos 0))))
)
)
)
(go-virtual active)
)
(suspend)
)
(go-virtual exit)
)
)
;; failed to figure out what this is:
(defstate active (talker)
:virtual #t
:enter (behavior ()
(set-time! (-> self state-time))
(if (logtest? (-> self message flags) (talker-flags play-only-once))
(mark-played! (-> self message))
)
(set-setting! 'hint (process->ppointer self) 0.0 0)
(set-setting! 'speech-control #f 0.0 0)
(if (nonzero? (-> self voice-id))
(set-action!
*gui-control*
(gui-action play)
(-> self voice-id)
(gui-channel none)
(gui-action none)
(the-as string #f)
(the-as (function gui-connection symbol) #f)
(the-as process #f)
)
)
(when (and (nonzero? (-> self voice-id)) (logtest? (-> self message flags) (talker-flags reduce-volume)))
(add-setting! 'music-volume 'rel 0.25 0)
(add-setting! 'sfx-volume 'rel 0.75 0)
(add-setting! 'dialog-volume 'rel (-> *setting-control* user-current dialog-volume-talker) 0)
)
(if (logtest? (-> self message flags) (talker-flags auto-save-on-each-start))
(auto-save-user)
)
(apply-settings *setting-control*)
)
:exit (behavior ()
(if (and (-> self grab?) *target*)
(process-release? *target*)
)
(let ((gp-0 (-> self message on-close)))
(when gp-0
(let ((v1-9 (as-type (handle->process (-> self voicebox)) process-drawable)))
(script-eval gp-0 :vector (if v1-9
(-> (the-as process-drawable v1-9) root trans)
)
)
)
)
)
(when (and (logtest? (-> self message flags) (talker-flags auto-save-once-on-exit)) (not (-> self save?)))
(set! (-> self save?) #t)
(auto-save-user)
)
(if (nonzero? (-> self voice-id))
(set-action!
*gui-control*
(gui-action stop)
(-> self voice-id)
(gui-channel none)
(gui-action none)
(the-as string #f)
(the-as (function gui-connection symbol) #f)
(the-as process #f)
)
)
(if (nonzero? (-> self message-id))
(set-action!
*gui-control*
(gui-action stop)
(-> self message-id)
(gui-channel none)
(gui-action none)
(the-as string #f)
(the-as (function gui-connection symbol) #f)
(the-as process #f)
)
)
(remove-setting! 'music-volume)
(remove-setting! 'sfx-volume)
(remove-setting! 'dialog-volume)
(remove-setting! 'hint)
(remove-setting! 'speech-control)
(remove-setting! 'camera-name)
(apply-settings *setting-control*)
)
:code (behavior ()
(local-vars (v1-50 symbol))
(let ((gp-0 #t))
(while (or (and (nonzero? (-> self voice-id))
(let ((v1-41 (get-status *gui-control* (-> self voice-id))))
(or (= v1-41 (gui-status ready)) (= v1-41 (gui-status active)))
)
(begin
(dotimes (s5-2 4)
(when (and (string-charp= (-> self message name) (-> *sound-iop-info* stream-name s5-2 name))
(= (-> self voice-id) (-> *sound-iop-info* stream-id s5-2))
(logtest? (-> *sound-iop-info* stream-status s5-2) (stream-status ss6))
)
(set! v1-50 #f)
(goto cfg-47)
)
)
(set! v1-50 #t)
(label cfg-47)
(and v1-50 (not (time-elapsed? (-> self state-time) (seconds 120))))
)
)
(and (nonzero? (-> self message-id))
(= (get-status *gui-control* (-> self message-id)) (gui-status active))
(or (not (time-elapsed? (-> self state-time) (the-as time-frame (-> self message text-duration))))
(and (logtest? (-> self message flags) (talker-flags only-play-in-region))
(-> self region)
(point-in-region-debug! (-> self region) (target-pos 0))
)
)
)
(not (time-elapsed? (-> self state-time) (seconds 0.05)))
)
(when (and (nonzero? (-> self voice-id)) (not gp-0) (zero? (get-status *gui-control* (-> self voice-id))))
(remove-setting! 'music-volume)
(remove-setting! 'sfx-volume)
(remove-setting! 'dialog-volume)
(set! gp-0 #t)
)
(when (and (-> self message camera) (not (-> self grab?)) *target*)
(when (process-grab? *target* #f)
(set! (-> self grab?) #t)
(set-setting! 'entity-name (-> self message camera) 0.0 0)
)
)
(when (and (nonzero? (-> self message-id))
(= (get-status *gui-control* (-> self message-id)) (gui-status active))
(not (paused?))
)
(if (logtest? (-> self message flags) (talker-flags fade-in))
(seek! (-> self interp) 1.0 (* 0.5 (seconds-per-frame)))
(seek! (-> self interp) 1.0 (* 4.0 (seconds-per-frame)))
)
(draw-text self)
)
(suspend)
)
)
(when (and (nonzero? (-> self message-id)) (logtest? (-> self message flags) (talker-flags fade-in slide-in)))
(while (!= (-> self interp) 0.0)
(if (logtest? (-> self message flags) (talker-flags fade-in))
(seek! (-> self interp) 0.0 (* 0.5 (seconds-per-frame)))
(seek! (-> self interp) 0.0 (* 4.0 (seconds-per-frame)))
)
(if (and (= (get-status *gui-control* (-> self message-id)) (gui-status active)) (not (paused?)))
(draw-text self)
)
(suspend)
)
)
(when (and (logtest? (-> self message flags) (talker-flags auto-save-once-on-exit)) (not (-> self save?)))
(suspend-for (seconds 1)
)
(set! (-> self save?) #t)
(auto-save-user)
)
(go-virtual exit)
)
)
;; failed to figure out what this is:
(defstate exit (talker)
:virtual #t
:code nothing
)