From 8154c4659d49382fc4b78cb8c4a9fd6f1276c96d Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Sat, 9 Sep 2023 13:58:57 -0600 Subject: [PATCH] g/j2: Start adding game options to jak 2's menu (#2968) --- decompiler/config/jak2/all-types.gc | 24 +- .../config/jak2/ntsc_v1/var_names.jsonc | 108 ++++ .../jak2/text/game_custom_text_en-US.json | 4 +- goal_src/goal-lib.gc | 8 + goal_src/jak2/dgos/game.gd | 3 + .../jak2/engine/ui/progress/progress-draw.gc | 281 +++++----- .../engine/ui/progress/progress-static.gc | 16 +- goal_src/jak2/engine/ui/progress/progress.gc | 17 +- goal_src/jak2/engine/ui/text-id-h.gc | 18 +- goal_src/jak2/pc/progress/progress-draw-pc.gc | 254 ++++----- .../pc/progress/progress-generic-draw-pc.gc | 312 +++++++++++ .../jak2/pc/progress/progress-generic-h-pc.gc | 94 ++++ .../jak2/pc/progress/progress-generic-pc.gc | 268 +++++++++ goal_src/jak2/pc/progress/progress-h-pc.gc | 6 +- goal_src/jak2/pc/progress/progress-pc.gc | 45 +- .../jak2/pc/progress/progress-static-pc.gc | 55 ++ .../engine/ui/progress/progress-draw_REF.gc | 518 +++++++++--------- .../engine/ui/progress/progress-static_REF.gc | 16 +- .../jak2/engine/ui/progress/progress_REF.gc | 14 +- 19 files changed, 1474 insertions(+), 587 deletions(-) create mode 100644 goal_src/jak2/pc/progress/progress-generic-draw-pc.gc create mode 100644 goal_src/jak2/pc/progress/progress-generic-h-pc.gc create mode 100644 goal_src/jak2/pc/progress/progress-generic-pc.gc diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index 267fbd3c34..e8f03dbf61 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -6755,13 +6755,13 @@ (progress-on #x10e) (progress-off #x10f) (progress-move-dpad #x110) - (text-x111 #x111) - (text-x112 #x112) - (text-x113 #x113) - (text-x114 #x114) - (text-x115 #x115) - (text-x116 #x116) - (text-x117 #x117) + (language-name-english #x111) + (language-name-french #x112) + (language-name-german #x113) + (language-name-spanish #x114) + (language-name-italian #x115) + (language-name-korean #x116) + (language-name-japanese #x117) (progress-aspect-ratio #x118) (progress-progressive-scan #x119) (progress-video-mode #x11a) @@ -7234,7 +7234,7 @@ (scene-nest-boss-intro #x306) (scene-intro #x307) (scene-outro #x308) - (text-x30b #x30b) + (language-name-english-uk #x30b) (scene-subtitles-hint #x30c) (scene-subtitles-enabled #x30d) (scene-subtitles-disabled #x30e) @@ -7363,6 +7363,8 @@ (progress-lod-high #x128c) (progress-credits #x128d) (progress-frame-rate #x128e) + (progress-misc-game-options #x128f) + (progress-speedrunner-mode #x1290) ) ;; ---text-id-h:text-id @@ -31174,7 +31176,7 @@ (stereo-mode-backup int32 :offset-assert 216) (secrets-unlocked symbol :offset-assert 220) (missions-total-spacing float :offset-assert 224) - (clear-screen basic :offset-assert 228) + (clear-screen symbol :offset-assert 228) ) :method-count-assert 9 :size-assert #xe8 @@ -31273,7 +31275,9 @@ (define-extern draw-sound-options-decoration (function menu-slider-option font-context float text-id symbol pointer)) (define-extern draw-decoration-secrets (function menu-option font-context float text-id pointer)) (define-extern draw-decoration-load-save (function menu-option font-context float text-id pointer)) -(define-extern sort-task-node-result (function int none)) +(define-extern sort-task-node-result + "Sorts the [[*game-info*]]'s `mission-list` by if they are closed and their `closed-time`. Just bubble-sort and therefore O(n^2)" + (function int none)) (define-extern find-mission-text-at-index (function int game-task-node-info)) (define-extern draw-secret-list (function secret-item-option progress font-context int symbol float none)) (define-extern draw-highscore-icon (function menu-highscores-option uint int int float pointer)) diff --git a/decompiler/config/jak2/ntsc_v1/var_names.jsonc b/decompiler/config/jak2/ntsc_v1/var_names.jsonc index 1bc6a5ad2b..4d92727210 100644 --- a/decompiler/config/jak2/ntsc_v1/var_names.jsonc +++ b/decompiler/config/jak2/ntsc_v1/var_names.jsonc @@ -4390,5 +4390,113 @@ "vars": { "s3-1": ["points", "(inline-array vector)"] } + }, + "(method 10 menu-missions-option)": { + "args": ["obj", "progress", "font-ctx", "arg3", "arg4"], + "vars": { + "sv-16": "font-alpha", + "v1-26": "task-info", + "a0-15": "game-task-info-array", + "sv-284": "font-scale", + "sv-280": "font-y-pos", + "sv-24": "game-task-idx", + "sv-272": "found-closed-task?", + "sv-268": "completed-task-info", + "sv-264": "inprogress-task-info", + "sv-20": "task-info-idx", + "sv-48": "num-task-info", + "v1-36": "font-ctx-1", + "a0-21": "font-ctx-2", + "v1-40": "page-idx", + "sv-276": "hud-bounds", + "a0-27": "font-ctx-3", + "v1-52": "font-ctx-4", + "sv-56": "default-y-origin-4x3", + "v1-57": "y-offset", + "sv-260": "line-height", + "s4-1": "game-task-idx-2", + "s3-1": "game-task-info-2", + "a1-19": "task-text-id", + "f30-0": "line-padding", + "s3-2": "line-text", + "s2-0": "print-game-text-fn", + "s4-2": "game-task-info-3", + "a1-23": "task-text-id-2", + "s4-3": "line-text-2", + "f30-1": "line-padding-2", + "s3-3": "print-game-text-fn-2" + } + }, + "sort-task-node-result": { + "vars": { + "v1-1": "game-task-info-array", + "a1-1": "i", + "a0-3": "j", + "a2-19": "task-info" + } + }, + "draw-missions-up-down": { + "args": ["font-ctx"], + "vars": { + "f30-0": "old-x-pos", + "f28-0": "old-y-pos", + "s3-0": "new-x-pos", + "s5-0": "new-y-pos-up", + "s4-0": "new-y-pos-down", + "s2-0": "print-text-fn", + "s5-1": "print-text-fn-1" + } + }, + "begin-scissor-missions": { + "args": ["hud-bounds"], + "vars": { + "s4-0": "buffer" + } + }, + "end-scissor-missions": { + "args": ["hud-bounds", "arg1"], + "vars": { + "s5-0": "buffer" + } + }, + "(method 25 progress)": { + "vars": { + "s5-0": "option-array" + } + }, + "(method 10 menu-language-game-option)": { + "args": ["obj", "progress", "font-ctx", "option-index", "selected"], + "vars": { + "f30-0": "alpha", + "v1-2": "font-ctx-1", + "a0-5": "font-ctx-2", + "s4-0": "curr-language-ptr", + "a0-7": "font-ctx-3", + "s3-0": "print-game-text-fn-1", + "s4-1": "curr-language", + "a0-14": "font-ctx-4", + "v1-33": "font-ctx-5", + "a0-16": "font-ctx-6", + "s5-1": "print-game-text-fn-2", + "s5-2": "print-game-text-fn-3", + "s5-3": "font-ctx-7", + "v1-43": "language-name-idx", + "s3-1": "font-ctx-8", + "a0-33": "font-ctx-9", + "v1-52": "font-ctx-10", + "s3-2": "print-game-text-fn-4", + "v1-54": "font-ctx-11", + "a0-40": "font-ctx-12", + "a0-44": "font-ctx-13", + "v1-66": "language-name-idx-2" + } + }, + "draw-highlight": { + "vars": { + "s2-0": "buffer", + "a3-0": "width", + "s3-0": "x-pos" + }, + "args": ["y-pos", "height", "alpha"] } } diff --git a/game/assets/jak2/text/game_custom_text_en-US.json b/game/assets/jak2/text/game_custom_text_en-US.json index 872b6e4b3b..bca2b79383 100644 --- a/game/assets/jak2/text/game_custom_text_en-US.json +++ b/game/assets/jak2/text/game_custom_text_en-US.json @@ -121,5 +121,7 @@ "128b": "Low", "128c": "High", "128d": "Credits", - "128e": "Frame Rate (Experimental)" + "128e": "Frame Rate (Experimental)", + "128f": "Misc. Options", + "1290": "Speedrunner Mode" } diff --git a/goal_src/goal-lib.gc b/goal_src/goal-lib.gc index a717eaf3d4..a99b688dc4 100644 --- a/goal_src/goal-lib.gc +++ b/goal_src/goal-lib.gc @@ -540,6 +540,10 @@ `(+! ,place 1) ) +(defmacro inc! (place) + `(+! ,place 1) + ) + (defmacro 1- (var) `(+ ,var -1) ) @@ -556,6 +560,10 @@ `(-! ,place 1) ) +(defmacro dec! (place) + `(-! ,place 1) + ) + (defmacro *! (place amount) `(set! ,place (* ,place ,amount)) ) diff --git a/goal_src/jak2/dgos/game.gd b/goal_src/jak2/dgos/game.gd index cb7c8858ce..2014869786 100644 --- a/goal_src/jak2/dgos/game.gd +++ b/goal_src/jak2/dgos/game.gd @@ -162,6 +162,7 @@ "hud-h.o" "progress-h.o" "progress-h-pc.o" ;; added + "progress-generic-h-pc.o" ;; added "rpc-h.o" "path-h.o" "nav-mesh-h.o" @@ -361,8 +362,10 @@ "progress-static-pc.o" ;; added "progress.o" "progress-pc.o" ;; added + "progress-generic-pc.o" ;; added "progress-draw.o" "progress-draw-pc.o" ;; added + "progress-generic-draw-pc.o" ;; added "ocean.o" "ocean-vu0.o" "ocean-texture.o" diff --git a/goal_src/jak2/engine/ui/progress/progress-draw.gc b/goal_src/jak2/engine/ui/progress/progress-draw.gc index c4a2d44fa7..670b3edb4d 100644 --- a/goal_src/jak2/engine/ui/progress/progress-draw.gc +++ b/goal_src/jak2/engine/ui/progress/progress-draw.gc @@ -68,35 +68,36 @@ (none) ) -(defun draw-highlight ((arg0 int) (arg1 int) (arg2 float)) - (let ((s3-0 (if (= (get-aspect-ratio) 'aspect4x3) - 70 - 79 - ) - ) - (a3-0 (if (= (get-aspect-ratio) 'aspect4x3) - 374 - 355 - ) - ) +(defun draw-highlight ((y-pos int) (height int) (alpha float)) + (let ((x-pos (if (= (get-aspect-ratio) 'aspect4x3) + 70 + 79 + ) + ) + (width (if (= (get-aspect-ratio) 'aspect4x3) + 374 + 355 + ) + ) ) + ;; og:preserve-this (#when PC_PORT ;; added for better widescreen handling (when (not (-> *pc-settings* use-vis?)) - (set! s3-0 (the int (adjust-game-x (the float s3-0)))) - (set! a3-0 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) a3-0))) + (set! x-pos (the int (adjust-game-x (the float x-pos)))) + (set! width (the int (* (-> *pc-settings* aspect-ratio-reciprocal) width))) ) ) - (with-dma-buffer-add-bucket ((s2-0 (-> *display* frames (-> *display* on-screen) global-buf)) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw-sprite2d-xy - s2-0 - s3-0 - arg0 - a3-0 - arg1 - (new 'static 'rgba :r #x40 :g #x80 :b #x80 :a (the int (* 64.0 arg2))) + buffer + x-pos + y-pos + width + height + (new 'static 'rgba :r #x40 :g #x80 :b #x80 :a (the int (* 64.0 alpha))) ) ) ) @@ -227,31 +228,27 @@ ) ;; WARN: Return type mismatch float vs none. -(defun draw-missions-up-down ((arg0 font-context)) - (let ((s3-0 250) - (s5-0 116) - (s4-0 191) - (f30-0 (-> arg0 origin x)) - (f28-0 (-> arg0 origin y)) +(defun draw-missions-up-down ((font-ctx font-context)) + (let ((new-x-pos 250) + (new-y-pos-up 116) + (new-y-pos-down 191) + (old-x-pos (-> font-ctx origin x)) + (old-y-pos (-> font-ctx origin y)) ) - (#when PC_PORT - (when (not (-> *pc-settings* use-vis?)) - (set! s3-0 (adjust-game-x (the float s3-0))) - )) - (set! (-> arg0 origin x) (the float s3-0)) - (set! (-> arg0 origin y) (the float s5-0)) - (let ((s2-0 print-game-text)) + (set! (-> font-ctx origin x) (the float new-x-pos)) + (set! (-> font-ctx origin y) (the float new-y-pos-up)) + (let ((print-text-fn print-game-text)) (format (clear *temp-string*) "~33L~C" 160) - (s2-0 *temp-string* arg0 #f 44 (bucket-id progress)) + (print-text-fn *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (set! (-> arg0 origin x) (the float s3-0)) - (set! (-> arg0 origin y) (the float (+ s5-0 s4-0))) - (let ((s5-1 print-game-text)) + (set! (-> font-ctx origin x) (the float new-x-pos)) + (set! (-> font-ctx origin y) (the float (+ new-y-pos-up new-y-pos-down))) + (let ((print-text-fn-1 print-game-text)) (format (clear *temp-string*) "~33L~C" 162) - (s5-1 *temp-string* arg0 #f 44 (bucket-id progress)) + (print-text-fn-1 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (set! (-> arg0 origin x) f30-0) - (set! (-> arg0 origin y) f28-0) + (set! (-> font-ctx origin x) old-x-pos) + (set! (-> font-ctx origin y) old-y-pos) ) (none) ) @@ -366,34 +363,34 @@ 0 ) -(defun begin-scissor-missions ((arg0 hud-box)) +(defun begin-scissor-missions ((hud-bounds hud-box)) (cond ((= (get-aspect-ratio) 'aspect16x9) - (set! (-> arg0 min x) 79.0) - (set! (-> arg0 min y) 130.0) - (set! (-> arg0 max x) 434.0) - (set! (-> arg0 max y) 305.0) + (set! (-> hud-bounds min x) 79.0) + (set! (-> hud-bounds min y) 130.0) + (set! (-> hud-bounds max x) 434.0) + (set! (-> hud-bounds max y) 305.0) ) (else - (set! (-> arg0 min x) 70.0) - (set! (-> arg0 min y) 130.0) - (set! (-> arg0 max x) 444.0) - (set! (-> arg0 max y) 305.0) + (set! (-> hud-bounds min x) 70.0) + (set! (-> hud-bounds min y) 130.0) + (set! (-> hud-bounds max x) 444.0) + (set! (-> hud-bounds max y) 305.0) ) ) - (with-dma-buffer-add-bucket ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf)) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) - (setup-scissor arg0 s4-0) + (setup-scissor hud-bounds buffer) ) 0 ) -(defun end-scissor-missions ((arg0 hud-box) (arg1 float)) - (with-dma-buffer-add-bucket ((s5-0 (-> *display* frames (-> *display* on-screen) global-buf)) +(defun end-scissor-missions ((hud-bounds hud-box) (arg1 float)) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) - (restore-scissor arg0 s5-0) + (restore-scissor hud-bounds buffer) ) 0 ) @@ -3590,25 +3587,26 @@ ;; WARN: Return type mismatch symbol vs none. (defun sort-task-node-result ((arg0 int)) - (let ((v1-1 (-> *game-info* mission-list)) - (a1-1 (max 0 (+ arg0 -1))) + "Sorts the [[*game-info*]]'s `mission-list` by if they are closed and their `closed-time`. Just bubble-sort and therefore O(n^2)" + (let ((game-task-info-array (-> *game-info* mission-list)) + (i (max 0 (+ arg0 -1))) ) - (let ((a0-3 0)) - (while (> a1-1 0) - (while (< a0-3 a1-1) - (when (and (logtest? (-> v1-1 a0-3 flags) (game-task-node-flag closed)) - (logtest? (-> v1-1 (+ a0-3 1) flags) (game-task-node-flag closed)) - (< (-> v1-1 a0-3 close-time) (-> v1-1 (+ a0-3 1) close-time)) + (let ((j 0)) + (while (> i 0) + (while (< j i) + (when (and (logtest? (-> game-task-info-array j flags) (game-task-node-flag closed)) + (logtest? (-> game-task-info-array (+ j 1) flags) (game-task-node-flag closed)) + (< (-> game-task-info-array j close-time) (-> game-task-info-array (+ j 1) close-time)) ) - (let ((a2-19 (-> v1-1 a0-3))) - (set! (-> v1-1 a0-3) (-> v1-1 (+ a0-3 1))) - (set! (-> v1-1 (+ a0-3 1)) a2-19) + (let ((task-info (-> game-task-info-array j))) + (set! (-> game-task-info-array j) (-> game-task-info-array (+ j 1))) + (set! (-> game-task-info-array (+ j 1)) task-info) ) ) - (+! a0-3 1) + (+! j 1) ) - (+! a1-1 -1) - (set! a0-3 0) + (+! i -1) + (set! j 0) ) ) ) @@ -5766,85 +5764,91 @@ ) ) -(defmethod draw-option menu-language-game-option ((obj menu-language-game-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) +(defmethod draw-option menu-language-game-option ((obj menu-language-game-option) + (progress progress) + (font-ctx font-context) + (option-index int) + (selected symbol) + ) (with-pp - (let ((f30-0 (* 2.0 (- 0.5 (-> arg0 menu-transition))))) - (let ((v1-2 arg1)) - (set! (-> v1-2 scale) 0.65) + (let ((alpha (* 2.0 (- 0.5 (-> progress menu-transition))))) + (let ((font-ctx-1 font-ctx)) + (set! (-> font-ctx-1 scale) 0.65) ) - (case arg2 + (case option-index ((2) - (+! (-> arg1 origin y) 20.0) + (+! (-> font-ctx origin y) 20.0) ) ((3) - (+! (-> arg1 origin y) 32.0) + (+! (-> font-ctx origin y) 32.0) ) ) - (if (< f30-0 0.0) - (set! f30-0 0.0) + (if (< alpha 0.0) + (set! alpha 0.0) ) - (set! (-> arg1 alpha) f30-0) - (let ((a0-5 arg1)) - (set! (-> a0-5 flags) (font-flags kerning middle large)) + (set! (-> font-ctx alpha) alpha) + (let ((font-ctx-2 font-ctx)) + (set! (-> font-ctx-2 flags) (font-flags kerning middle large)) ) - (let ((s4-0 (&-> *setting-control* user-default language))) + (let ((curr-language-ptr (&-> *setting-control* user-default language))) (cond ((and (= (-> *progress-state* game-options-item-selected) 3) (-> *progress-state* game-options-item-picked)) - (let ((a0-7 arg1)) - (set! (-> a0-7 color) (font-color progress-force-selected)) + (let ((font-ctx-3 font-ctx)) + (set! (-> font-ctx-3 color) (font-color progress-force-selected)) ) - (draw-highlight (the int (-> arg1 origin y)) 44 f30-0) - (let ((s3-0 print-game-text)) + (draw-highlight (the int (-> font-ctx origin y)) 44 alpha) + (let ((print-game-text-fn-1 print-game-text)) (format (clear *temp-string*) "~S" (lookup-text! *common-text* (-> obj name) #f)) - (s3-0 *temp-string* arg1 #f 44 (bucket-id progress)) + (print-game-text-fn-1 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (+! (-> arg1 origin y) 24.0) + (+! (-> font-ctx origin y) 24.0) (-> obj language-selection) - (let ((s4-1 (-> s4-0 0))) + (let ((curr-language (-> curr-language-ptr 0))) 7 (if (-> obj language-transition) (seekl! (-> obj language-x-offset) 150 (the int (* 10.0 (-> pp clock time-adjust-ratio)))) ) (when (>= (-> obj language-x-offset) 75) - (set! (-> obj language-selection) (the-as uint s4-1)) + (set! (-> obj language-selection) (the-as uint curr-language)) (set! (-> obj language-transition) #f) (set! (-> obj language-x-offset) 0) 0 ) ) - (let ((a0-14 arg1)) - (set! (-> a0-14 color) (font-color progress)) + (let ((font-ctx-4 font-ctx)) + (set! (-> font-ctx-4 color) (font-color progress)) ) - (let ((v1-33 arg1)) - (set! (-> v1-33 scale) 0.5) + (let ((font-ctx-5 font-ctx)) + (set! (-> font-ctx-5 scale) 0.5) ) - (let ((a0-16 arg1)) - (set! (-> a0-16 color) (font-color progress)) + (let ((font-ctx-6 font-ctx)) + (set! (-> font-ctx-6 color) (font-color progress)) ) - (+! (-> arg1 origin x) -70.0) - (let ((s5-1 print-game-text)) + (+! (-> font-ctx origin x) -70.0) + (let ((print-game-text-fn-2 print-game-text)) (format (clear *temp-string*) "~33L~C" 163) - (s5-1 *temp-string* arg1 #f 44 (bucket-id progress)) + (print-game-text-fn-2 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (+! (-> arg1 origin x) 70.0) - (+! (-> arg1 origin x) 70.0) - (let ((s5-2 print-game-text)) + (+! (-> font-ctx origin x) 70.0) + (+! (-> font-ctx origin x) 70.0) + (let ((print-game-text-fn-3 print-game-text)) (format (clear *temp-string*) "~33L~C" 161) - (s5-2 *temp-string* arg1 #f 44 (bucket-id progress)) + (print-game-text-fn-3 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (+! (-> arg1 origin x) -70.0) - (let ((s5-3 arg1)) - (set! (-> s5-3 color) (progress-selected 0)) + (+! (-> font-ctx origin x) -70.0) + (let ((font-ctx-7 font-ctx)) + (set! (-> font-ctx-7 color) (progress-selected 0)) ) - (let ((v1-43 (if (and (= (scf-get-territory) GAME_TERRITORY_SCEE) (zero? (-> *progress-state* game-options-language-index))) - 7 - (-> *progress-state* game-options-language-index) - ) - ) + (let ((language-name-idx + (if (and (= (scf-get-territory) 1) (zero? (-> *progress-state* game-options-language-index))) + 7 + (-> *progress-state* game-options-language-index) + ) + ) ) (print-game-text - (lookup-text! *common-text* (-> *language-name-remap* v1-43) #f) - arg1 + (lookup-text! *common-text* (-> *language-name-remap* language-name-idx) #f) + font-ctx #f 44 (bucket-id progress) @@ -5854,45 +5858,50 @@ (else (cond ((= (-> *progress-state* game-options-item-selected) 3) - (let ((s3-1 arg1)) - (set! (-> s3-1 color) (progress-selected 0)) + (let ((font-ctx-8 font-ctx)) + (set! (-> font-ctx-8 color) (progress-selected 0)) ) - (draw-highlight (the int (-> arg1 origin y)) 24 f30-0) + (draw-highlight (the int (-> font-ctx origin y)) 24 alpha) ) (else - (let ((a0-33 arg1)) - (set! (-> a0-33 color) (font-color progress)) + (let ((font-ctx-9 font-ctx)) + (set! (-> font-ctx-9 color) (font-color progress)) ) ) ) - (let ((v1-52 arg1)) - (set! (-> v1-52 scale) 0.65) + (let ((font-ctx-10 font-ctx)) + (set! (-> font-ctx-10 scale) 0.65) ) - (let ((s3-2 print-game-text)) + (let ((print-game-text-fn-4 print-game-text)) (format (clear *temp-string*) "~S" (lookup-text! *common-text* (-> obj name) #f)) - (s3-2 *temp-string* arg1 #f 44 (bucket-id progress)) + (print-game-text-fn-4 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (let ((v1-54 arg1)) - (set! (-> v1-54 scale) 0.5) + (let ((font-ctx-11 font-ctx)) + (set! (-> font-ctx-11 scale) 0.5) ) - (let ((a0-40 arg1)) - (set! (-> a0-40 color) (font-color progress)) + (let ((font-ctx-12 font-ctx)) + (set! (-> font-ctx-12 color) (font-color progress)) + ) + (format + (clear *temp-string*) + "~S" + (lookup-text! *common-text* (-> *language-name-remap* (-> curr-language-ptr 0)) #f) ) - (format (clear *temp-string*) "~S" (lookup-text! *common-text* (-> *language-name-remap* (-> s4-0 0)) #f)) *temp-string* - (+! (-> arg1 origin y) 24.0) - (let ((a0-44 arg1)) - (set! (-> a0-44 flags) (font-flags kerning middle large)) + (+! (-> font-ctx origin y) 24.0) + (let ((font-ctx-13 font-ctx)) + (set! (-> font-ctx-13 flags) (font-flags kerning middle large)) ) - (let ((v1-66 (if (and (= (scf-get-territory) GAME_TERRITORY_SCEE) (zero? (-> *progress-state* game-options-language-index))) - 7 - (-> *progress-state* game-options-language-index) - ) - ) + (let ((language-name-idx-2 + (if (and (= (scf-get-territory) 1) (zero? (-> *progress-state* game-options-language-index))) + 7 + (-> *progress-state* game-options-language-index) + ) + ) ) (print-game-text - (lookup-text! *common-text* (-> *language-name-remap* v1-66) #f) - arg1 + (lookup-text! *common-text* (-> *language-name-remap* language-name-idx-2) #f) + font-ctx #f 44 (bucket-id progress) diff --git a/goal_src/jak2/engine/ui/progress/progress-static.gc b/goal_src/jak2/engine/ui/progress/progress-static.gc index 48b3304a12..2cf8812857 100644 --- a/goal_src/jak2/engine/ui/progress/progress-static.gc +++ b/goal_src/jak2/engine/ui/progress/progress-static.gc @@ -807,14 +807,14 @@ ) (define *language-name-remap* (new 'static 'boxed-array :type text-id - (text-id text-x111) - (text-id text-x112) - (text-id text-x113) - (text-id text-x114) - (text-id text-x115) - (text-id text-x117) - (text-id text-x116) - (text-id text-x30b) + (text-id language-name-english) + (text-id language-name-french) + (text-id language-name-german) + (text-id language-name-spanish) + (text-id language-name-italian) + (text-id language-name-japanese) + (text-id language-name-korean) + (text-id language-name-english-uk) ) ) diff --git a/goal_src/jak2/engine/ui/progress/progress.gc b/goal_src/jak2/engine/ui/progress/progress.gc index a673111aae..fe22c1d7c9 100644 --- a/goal_src/jak2/engine/ui/progress/progress.gc +++ b/goal_src/jak2/engine/ui/progress/progress.gc @@ -54,7 +54,7 @@ (stereo-mode-backup int32 :offset-assert 216) (secrets-unlocked symbol :offset-assert 220) (missions-total-spacing float :offset-assert 224) - (clear-screen basic :offset-assert 228) + (clear-screen symbol :offset-assert 228) ) :method-count-assert 9 :size-assert #xe8 @@ -967,10 +967,10 @@ (defmethod respond-to-cpad progress ((obj progress)) (mc-get-slot-info 0 *progress-save-info*) (when (-> obj current-options) - (let ((s5-0 (-> obj current-options options))) - (when (and s5-0 (= (-> obj menu-transition) 0.0)) + (let ((option-array (-> obj current-options options))) + (when (and option-array (= (-> obj menu-transition) 0.0)) (respond-progress - (the-as menu-option (-> s5-0 (-> obj option-index))) + (the-as menu-option (-> option-array (-> obj option-index))) obj (and (= (-> obj menu-transition) 0.0) (-> obj selected-option)) ) @@ -996,7 +996,7 @@ ((= (-> obj current-options) *main-options*) (sound-play "ring-select") ) - ((!= (length s5-0) 1) + ((!= (length option-array) 1) (sound-play "roll-over") ) ) @@ -1017,7 +1017,7 @@ ((= (-> obj current-options) *main-options*) (sound-play "ring-select") ) - ((!= (length s5-0) 1) + ((!= (length option-array) 1) (sound-play "roll-over") ) ) @@ -1060,8 +1060,7 @@ ) (defbehavior progress-trans progress () - - ;; pc port note : added variable + ;; og:preserve-this pc port note : added variable (let ((speed-mod (if (-> *pc-settings* fast-progress?) (-> *pc-cheat-state* progress-speed) 1.0))) (cond ((and (= (-> self next) 'none) @@ -2385,7 +2384,7 @@ ((and (cpad-pressed? 0 confirm) (!= (-> arg0 current) 'none)) (logclear! (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons confirm)) (logclear! (-> *cpad-list* cpads 0 button0-rel 0) (pad-buttons confirm)) - (set! (-> *progress-state* clear-screen) (the-as basic #t)) + (set! (-> *progress-state* clear-screen) #t) (cond ((-> s5-0 0) (sound-play "generic-beep") diff --git a/goal_src/jak2/engine/ui/text-id-h.gc b/goal_src/jak2/engine/ui/text-id-h.gc index 532da27af1..78b524556a 100644 --- a/goal_src/jak2/engine/ui/text-id-h.gc +++ b/goal_src/jak2/engine/ui/text-id-h.gc @@ -83,13 +83,13 @@ (progress-on #x10e) (progress-off #x10f) (progress-move-dpad #x110) - (text-x111 #x111) - (text-x112 #x112) - (text-x113 #x113) - (text-x114 #x114) - (text-x115 #x115) - (text-x116 #x116) - (text-x117 #x117) + (language-name-english #x111) + (language-name-french #x112) + (language-name-german #x113) + (language-name-spanish #x114) + (language-name-italian #x115) + (language-name-korean #x116) + (language-name-japanese #x117) (progress-aspect-ratio #x118) (progress-progressive-scan #x119) (progress-video-mode #x11a) @@ -562,7 +562,7 @@ (scene-nest-boss-intro #x306) (scene-intro #x307) (scene-outro #x308) - (text-x30b #x30b) + (language-name-english-uk #x30b) (scene-subtitles-hint #x30c) (scene-subtitles-enabled #x30d) (scene-subtitles-disabled #x30e) @@ -691,6 +691,8 @@ (progress-lod-high #x128c) (progress-credits #x128d) (progress-frame-rate #x128e) + (progress-misc-game-options #x128f) + (progress-speedrunner-mode #x1290) ) ;; ---text-id diff --git a/goal_src/jak2/pc/progress/progress-draw-pc.gc b/goal_src/jak2/pc/progress/progress-draw-pc.gc index 4bc2b87c90..3bd57a0144 100644 --- a/goal_src/jak2/pc/progress/progress-draw-pc.gc +++ b/goal_src/jak2/pc/progress/progress-draw-pc.gc @@ -655,42 +655,41 @@ (none) ) - - -(defmethod draw-option menu-missions-option ((obj menu-missions-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) +;; TODO - some naming is bad here in a few spots, cleanup once i understand it more +(defmethod draw-option menu-missions-option ((obj menu-missions-option) (progress progress) (font-ctx font-context) (arg3 int) (arg4 symbol)) (local-vars (f0-50 float) - (sv-16 float) - (sv-20 int) - (sv-24 int) + (font-alpha float) + (task-info-idx int) + (game-task-idx int) (sv-32 int) (sv-40 int) - (sv-48 int) - (sv-56 int) + (num-task-info int) + (default-y-origin-4x3 int) (sv-256 float) - (sv-260 float) - (sv-264 game-task-node-info) - (sv-268 game-task-node-info) - (sv-272 symbol) - (sv-276 hud-box) - (sv-280 float) - (sv-284 float) + (line-height float) + (inprogress-task-info game-task-node-info) + (completed-task-info game-task-node-info) + (found-closed-task? symbol) + (hud-bounds hud-box) + (font-y-pos float) + (font-scale float) ) - (set! sv-16 (* 2.0 (- 0.5 (-> arg0 menu-transition)))) - (set! sv-20 1) - (set! sv-24 0) + (set! font-alpha (* 2.0 (- 0.5 (-> progress menu-transition)))) + (set! task-info-idx 1) + (set! game-task-idx 0) (set! sv-32 0) (set! sv-40 0) - (set! sv-48 0) - (set! sv-56 95) - (set! sv-256 (* 395.0 (-> arg0 sliding))) - (set! sv-260 (* 44.0 (-> arg0 sliding-height))) - (set! sv-264 (new 'stack 'game-task-node-info)) - (set! sv-268 (new 'stack 'game-task-node-info)) - (set! sv-272 #t) - (set! sv-276 (new 'stack-no-clear 'hud-box)) - (set! sv-280 (-> arg1 origin y)) - (set! sv-284 (-> arg1 scale)) + (set! num-task-info 0) + (set! default-y-origin-4x3 95) + (set! sv-256 (* 395.0 (-> progress sliding))) + (set! line-height (* 44.0 (-> progress sliding-height))) + (set! inprogress-task-info (new 'stack 'game-task-node-info)) + (set! completed-task-info (new 'stack 'game-task-node-info)) + (set! found-closed-task? #t) + (set! hud-bounds (new 'stack-no-clear 'hud-box)) + (set! font-y-pos (-> font-ctx origin y)) + (set! font-scale (-> font-ctx scale)) (set! (-> *progress-state* current-task-index) (length (-> *game-info* sub-task-list))) (set! (-> *progress-state* current-line-index) -1) (set! (-> *progress-state* current-task) (the-as uint -1)) @@ -698,120 +697,131 @@ (set! (-> *progress-state* extra-text-state) -1) (set! (-> *progress-state* num-open-tasks-found) 0) (set! (-> *progress-state* num-closed-tasks-found) 0) - (if (< sv-16 0.0) - (set! sv-16 (the-as float 0.0)) + (if (< font-alpha 0.0) + (set! font-alpha (the-as float 0.0)) ) - (set! (-> arg1 alpha) sv-16) - (set! (-> *game-info* mission-list 0) sv-264) - (set! (-> sv-264 description) (text-id progress-missions-in-progress)) - (set! (-> sv-268 description) (text-id progress-missions-completed)) - (while (< sv-24 (length (-> *game-info* sub-task-list))) - (let ((v1-26 (find-mission-text-at-index sv-24)) - (a0-15 (-> *game-info* mission-list)) + (set! (-> font-ctx alpha) font-alpha) + (set! (-> *game-info* mission-list 0) inprogress-task-info) + (set! (-> inprogress-task-info description) (text-id progress-missions-in-progress)) + (set! (-> completed-task-info description) (text-id progress-missions-completed)) + (while (< game-task-idx (length (-> *game-info* sub-task-list))) + (let ((task-info (find-mission-text-at-index game-task-idx)) + (game-task-info-array (-> *game-info* mission-list)) ) - (when (!= v1-26 #f) - (when (and (logtest? (-> v1-26 flags) (game-task-node-flag closed)) sv-272) - (set! sv-272 (the-as symbol #f)) - (set! (-> a0-15 sv-20) sv-268) - (set! sv-20 (+ sv-20 1)) + (when (!= task-info #f) + (when (and (logtest? (-> task-info flags) (game-task-node-flag closed)) found-closed-task?) + (set! found-closed-task? (the-as symbol #f)) + (set! (-> game-task-info-array task-info-idx) completed-task-info) + (set! task-info-idx (+ task-info-idx 1)) ) - (set! (-> a0-15 sv-20) v1-26) - (set! sv-20 (+ sv-20 1)) + (set! (-> game-task-info-array task-info-idx) task-info) + (set! task-info-idx (+ task-info-idx 1)) ) ) - (set! sv-24 (+ sv-24 1)) + (set! game-task-idx (+ game-task-idx 1)) ) - (set! sv-48 sv-20) - (set! (-> *progress-state* total-num-tasks) sv-20) - (sort-task-node-result sv-48) - (set! (-> arg1 width) 395.0) - (set! (-> arg1 origin x) 60.0) - (set! (-> arg1 origin y) 80.0) - (set-color! arg1 (font-color progress)) + (set! num-task-info task-info-idx) + (set! (-> *progress-state* total-num-tasks) task-info-idx) + (sort-task-node-result num-task-info) + (let ((font-ctx-1 font-ctx)) + (set! (-> font-ctx-1 width) 395.0) + ) + (set! (-> font-ctx origin x) 60.0) + (set! (-> font-ctx origin y) 80.0) + (set-color! font-ctx (font-color progress)) (when (not (-> *pc-settings* use-vis?)) ;; added to fix widescreen - (*! (-> arg1 width) (-> *pc-settings* aspect-ratio-reciprocal)) - (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x)))) + (*! (-> font-ctx width) (-> *pc-settings* aspect-ratio-reciprocal)) + (set! (-> font-ctx origin x) (the float (adjust-game-x (-> font-ctx origin x)))) ) - (let ((v1-40 (-> obj page-index))) + (let ((page-idx (-> obj page-index))) (cond - ((zero? v1-40) - (draw-missions-decoration obj arg1 sv-16 (text-id progress-root-missions)) + ((zero? page-idx) + (draw-missions-decoration obj font-ctx font-alpha (text-id progress-root-missions)) ) - ((= v1-40 1) - (draw-missions-decoration obj arg1 sv-16 (text-id progress-root-missions)) + ((= page-idx 1) + (draw-missions-decoration obj font-ctx font-alpha (text-id progress-root-missions)) ) ) ) - (begin-scissor-missions sv-276) - (set-flags! arg1 (font-flags kerning large)) + (begin-scissor-missions hud-bounds) + (set-flags! font-ctx (font-flags kerning large)) (if (-> *pc-settings* use-vis?) - (+! (-> arg1 origin x) 20.0) - (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 20.0))) + (+! (-> font-ctx origin x) 20.0) + (+! (-> font-ctx origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 20.0))) + (+! (-> font-ctx origin x) 20.0) (case (get-aspect-ratio) (('aspect16x9) - (set! (-> arg1 origin y) 80.0) + (set! (-> font-ctx origin y) 80.0) ) (('aspect4x3) - (set! (-> arg1 origin y) (the float sv-56)) + (set! (-> font-ctx origin y) (the float default-y-origin-4x3)) ) ) - (set-scale! arg1 sv-284) + (let ((font-ctx-4 font-ctx)) + (set! (-> font-ctx-4 scale) font-scale) + ) (when (zero? (-> obj page-index)) - (set! sv-24 (-> obj task-line-index)) - (set! sv-20 0) - (let ((v1-57 (+ sv-56 44))) - (set! sv-56 v1-57) - (set! (-> arg1 origin y) (the float (+ v1-57 (the int sv-260)))) + (set! game-task-idx (-> obj task-line-index)) + (set! task-info-idx 0) + (let ((y-offset (+ default-y-origin-4x3 44))) + (set! default-y-origin-4x3 y-offset) + (set! (-> font-ctx origin y) (the float (+ y-offset (the int line-height)))) ) - (set! (-> arg1 width) 340.0) - (set! (-> arg1 height) 44.0) - (when (!= sv-260 0.0) + (set! (-> font-ctx width) 340.0) + (set! (-> font-ctx height) 44.0) + (when (!= line-height 0.0) (set! (-> *progress-state* missions-total-spacing) 0.0) - (dotimes (s4-1 sv-24) - (let* ((s3-1 (-> *game-info* mission-list s4-1)) - (a1-19 - (if (and (logtest? (-> s3-1 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s3-1 task))) - (-> *game-info* play-list (-> s3-1 task) text-name) - (-> s3-1 description) + (dotimes (game-task-idx-2 game-task-idx) + (let* ((game-task-info-2 (-> *game-info* mission-list game-task-idx-2)) + (task-text-id + (if (and (logtest? (-> game-task-info-2 flags) (game-task-node-flag closed)) + (task-complete? *game-info* (-> game-task-info-2 task)) + ) + (-> *game-info* play-list (-> game-task-info-2 task) text-name) + (-> game-task-info-2 description) ) ) - (s3-2 (lookup-text! *common-text* a1-19 #f)) - (f30-0 3.0) - (s2-0 print-game-text) + (line-text (lookup-text! *common-text* task-text-id #f)) + (line-padding 3.0) + (print-game-text-fn print-game-text) ) - (format (clear *temp-string*) "~S" s3-2) + (format (clear *temp-string*) "~S" line-text) (set! (-> *progress-state* missions-total-spacing) - (+ f30-0 (s2-0 *temp-string* arg1 #t 44 (bucket-id progress)) (-> *progress-state* missions-total-spacing)) + (+ line-padding + (print-game-text-fn *temp-string* font-ctx #t 44 (bucket-id progress)) + (-> *progress-state* missions-total-spacing) + ) ) ) ) ) - (set! sv-56 (- sv-56 (the int (-> *progress-state* missions-total-spacing)))) + (set! default-y-origin-4x3 (- default-y-origin-4x3 (the int (-> *progress-state* missions-total-spacing)))) (cond - ((< (-> arg0 sliding-height) 0.0) - (let* ((s4-2 (-> *game-info* mission-list sv-24)) - (a1-23 - (if (and (logtest? (-> s4-2 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s4-2 task))) - (-> *game-info* play-list (-> s4-2 task) text-name) - (-> s4-2 description) - ) - ) - (s4-3 (lookup-text! *common-text* a1-23 #f)) + ((< (-> progress sliding-height) 0.0) + (let* ((game-task-info-3 (-> *game-info* mission-list game-task-idx)) + (task-text-id-2 (if (and (logtest? (-> game-task-info-3 flags) (game-task-node-flag closed)) + (task-complete? *game-info* (-> game-task-info-3 task)) + ) + (-> *game-info* play-list (-> game-task-info-3 task) text-name) + (-> game-task-info-3 description) + ) + ) + (line-text-2 (lookup-text! *common-text* task-text-id-2 #f)) ) 0.0 - (let ((f30-1 3.0) - (s3-3 print-game-text) + (let ((line-padding-2 3.0) + (print-game-text-fn-2 print-game-text) ) - (format (clear *temp-string*) "~S" s4-3) - (let ((f0-36 (+ f30-1 (s3-3 *temp-string* arg1 #t 44 (bucket-id progress))))) - (set! sv-260 (* (-> arg0 sliding-height) f0-36)) + (format (clear *temp-string*) "~S" line-text-2) + (let ((f0-36 (+ line-padding-2 (print-game-text-fn-2 *temp-string* font-ctx #t 44 (bucket-id progress))))) + (set! line-height (* (-> progress sliding-height) f0-36)) ) ) ) ) (else - (let* ((s4-4 (-> *game-info* mission-list (+ sv-24 -1))) + (let* ((s4-4 (-> *game-info* mission-list (+ game-task-idx -1))) (a1-27 (if (and (logtest? (-> s4-4 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s4-4 task))) (-> *game-info* play-list (-> s4-4 task) text-name) @@ -825,16 +835,16 @@ (s3-4 print-game-text) ) (format (clear *temp-string*) "~S" s4-5) - (let ((f0-40 (+ f30-2 (s3-4 *temp-string* arg1 #t 44 (bucket-id progress))))) - (set! sv-260 (* (-> arg0 sliding-height) f0-40)) + (let ((f0-40 (+ f30-2 (s3-4 *temp-string* font-ctx #t 44 (bucket-id progress))))) + (set! line-height (* (-> progress sliding-height) f0-40)) ) ) ) ) ) - (set! (-> arg1 origin y) (the float (+ sv-56 (the int sv-260)))) - (while (and (< sv-20 sv-48) (< sv-20 (+ sv-24 10))) - (let* ((s4-6 (-> *game-info* mission-list sv-20)) + (set! (-> font-ctx origin y) (the float (+ default-y-origin-4x3 (the int line-height)))) + (while (and (< task-info-idx num-task-info) (< task-info-idx (+ game-task-idx 10))) + (let* ((s4-6 (-> *game-info* mission-list task-info-idx)) (s3-5 (if (and (logtest? (-> s4-6 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s4-6 task))) (-> *game-info* play-list (-> s4-6 task) text-name) @@ -846,7 +856,7 @@ 0.0 (set! f0-50 (cond - ((>= sv-20 (+ sv-24 -1)) + ((>= task-info-idx (+ game-task-idx -1)) (when (and (!= s3-5 381) (!= s3-5 380)) (let ((s3-6 print-game-text)) (format (clear *temp-string*) "~S" (lookup-text! @@ -858,21 +868,21 @@ #f ) ) - (s3-6 *temp-string* arg1 #f 44 (bucket-id progress)) + (s3-6 *temp-string* font-ctx #f 44 (bucket-id progress)) ) ) (if (-> *pc-settings* use-vis?) - (+! (-> arg1 origin x) 20.0) - (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 20.0))) + (+! (-> font-ctx origin x) 20.0) + (+! (-> font-ctx origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 20.0))) (let ((f30-3 3.0) (s4-7 print-game-text) ) (format (clear *temp-string*) "~S" s5-1) - (set! f0-50 (+ f30-3 (s4-7 *temp-string* arg1 #f 44 (bucket-id progress)))) + (set! f0-50 (+ f30-3 (s4-7 *temp-string* font-ctx #f 44 (bucket-id progress)))) ) (if (-> *pc-settings* use-vis?) - (+! (-> arg1 origin x) -20.0) - (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -20.0))) + (+! (-> font-ctx origin x) -20.0) + (+! (-> font-ctx origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -20.0))) f0-50 ) (else @@ -880,30 +890,30 @@ (s4-8 print-game-text) ) (format (clear *temp-string*) "~S" s5-1) - (+ f30-4 (s4-8 *temp-string* arg1 #t 44 (bucket-id progress))) + (+ f30-4 (s4-8 *temp-string* font-ctx #t 44 (bucket-id progress))) ) ) ) ) ) - (let ((v1-142 (+ sv-56 (the int f0-50)))) - (set! sv-56 v1-142) - (set! (-> arg1 origin y) (the float (+ v1-142 (the int sv-260)))) + (let ((v1-142 (+ default-y-origin-4x3 (the int f0-50)))) + (set! default-y-origin-4x3 v1-142) + (set! (-> font-ctx origin y) (the float (+ v1-142 (the int line-height)))) ) - (set! sv-20 (+ sv-20 1)) + (set! task-info-idx (+ task-info-idx 1)) ) (if (zero? (-> *progress-state* total-num-tasks)) (print-game-text (lookup-text! *common-text* (text-id progress-missions-none) #f) - arg1 + font-ctx #f 44 (bucket-id progress) ) ) ) - (end-scissor-missions sv-276 1.0) - (draw-missions-up-down arg1) + (end-scissor-missions hud-bounds 1.0) + (draw-missions-up-down font-ctx) 0 (none) ) @@ -2521,5 +2531,3 @@ (draw-mouse)) ))) ) - - diff --git a/goal_src/jak2/pc/progress/progress-generic-draw-pc.gc b/goal_src/jak2/pc/progress/progress-generic-draw-pc.gc new file mode 100644 index 0000000000..d0ee463345 --- /dev/null +++ b/goal_src/jak2/pc/progress/progress-generic-draw-pc.gc @@ -0,0 +1,312 @@ +;;-*-Lisp-*- +(in-package goal) + +(defun draw-page-border ((hud-bounds hud-box) (alpha float)) + (let ((x-pos 70) + (y-pos 112) + (width 375) + (background-height 200)) + (when (= (get-aspect-ratio) 'aspect16x9) + (set! x-pos 79) + (set! y-pos 86) + (set! width 356) + (set! background-height 255)) + (#when PC_PORT + ;; added for better widescreen handling + (when (not (-> *pc-settings* use-vis?)) + (set! x-pos (the int (adjust-game-x (the float x-pos)))) + (set! width (the int (* (-> *pc-settings* aspect-ratio-reciprocal) width))))) + (set-vector! (-> hud-bounds color) 64 128 128 (the int (* 128.0 alpha))) + ;; Top Line + (set! (-> hud-bounds min x) (the float x-pos)) + (set! (-> hud-bounds max x) (the float (+ x-pos width))) + (set! (-> hud-bounds min y) (the float y-pos)) + (set! (-> hud-bounds max y) (the float y-pos)) + (with-dma-buffer-add-bucket ((buffer-1 (-> *display* frames (-> *display* on-screen) global-buf)) + (bucket-id progress)) + ((method-of-type hud-box draw-box-prim-only) hud-bounds buffer-1)) + ;; Bottom Line + (set! (-> hud-bounds min x) (the float x-pos)) + (set! (-> hud-bounds max x) (the float (+ x-pos width))) + (set! (-> hud-bounds min y) (the float (+ y-pos background-height))) + (set! (-> hud-bounds max y) (the float (+ y-pos background-height))) + (with-dma-buffer-add-bucket ((buffer-2 (-> *display* frames (-> *display* on-screen) global-buf)) + (bucket-id progress)) + ((method-of-type hud-box draw-box-prim-only) hud-bounds buffer-2))) + (none)) + +(defun draw-page-background ((alpha float)) + (let ((x-pos 70) + (y-pos 112) + (width 375) + (background-height 200)) + (when (= (get-aspect-ratio) 'aspect16x9) + (set! x-pos 79) + (set! y-pos 86) + (set! width 356) + (set! background-height 256)) + (#when PC_PORT + ;; added for better widescreen handling + (when (not (-> *pc-settings* use-vis?)) + (set! x-pos (the int (adjust-game-x (the float x-pos)))) + (set! width (the int (* (-> *pc-settings* aspect-ratio-reciprocal) width))))) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) + (bucket-id particles)) + (draw-sprite2d-xy buffer x-pos y-pos width background-height + (new 'static 'rgba :r #x40 :g #x40 :b #x40 :a (the int (* 64.0 alpha)))))) + (none)) + +(defun draw-page-header ((font-ctx font-context) (text text-id)) + (let ((x-pos 70) + (y-pos 85) + (width 375)) + (when (= (get-aspect-ratio) 'aspect16x9) + (set! x-pos 79) + (set! y-pos 55) + (set! width 356)) + (set-scale! font-ctx 0.75) + (set! (-> font-ctx height) 20.0) + (set! (-> font-ctx origin y) (the float y-pos)) + (set-color! font-ctx (font-color progress)) + (print-game-text (lookup-text! *common-text* text #f) font-ctx #f 44 (bucket-id progress))) + (none)) + +(defun draw-scrolling-page-up-down-arrows ((font-ctx font-context) (draw-up? symbol) (draw-down? symbol)) + (let ((new-x-pos 250.0) + (new-y-pos-up 100) + (new-y-pos-down 211) + (new-scale 0.5) + (old-scale (-> font-ctx scale)) + (old-x-pos (-> font-ctx origin x)) + (old-y-pos (-> font-ctx origin y))) + (when (= (get-aspect-ratio) 'aspect16x9) + (set! new-x-pos 251.5) + (set! new-y-pos-up 75) + (set! new-y-pos-down 265)) + (set! (-> font-ctx scale) new-scale) + (when draw-up? + (set! (-> font-ctx origin x) (the float new-x-pos)) + (set! (-> font-ctx origin y) (the float new-y-pos-up)) + (let ((print-text-fn print-game-text)) + (format (clear *temp-string*) "~33L~C" 160) + (print-text-fn *temp-string* font-ctx #f 44 (bucket-id progress)))) + (when draw-down? + (set! (-> font-ctx origin x) (the float new-x-pos)) + (set! (-> font-ctx origin y) (the float (+ new-y-pos-up new-y-pos-down))) + (let ((print-text-fn-1 print-game-text)) + (format (clear *temp-string*) "~33L~C" 162) + (print-text-fn-1 *temp-string* font-ctx #f 44 (bucket-id progress)))) + (set! (-> font-ctx origin x) old-x-pos) + (set! (-> font-ctx origin y) old-y-pos) + (set! (-> font-ctx scale) old-scale)) + (none)) + +;; The boundary info could be moved to the menu-option, every one of these is duplicate code +(defun begin-scissor-scrolling-page ((hud-bounds hud-box)) + (cond + ((= (get-aspect-ratio) 'aspect16x9) + (set! (-> hud-bounds min x) 19.0) + (set! (-> hud-bounds min y) 86.0) + (set! (-> hud-bounds max x) 494.0) + (set! (-> hud-bounds max y) 340.0)) + (else + (set! (-> hud-bounds min x) 70.0) + (set! (-> hud-bounds min y) 112.0) + (set! (-> hud-bounds max x) 444.0) + (set! (-> hud-bounds max y) 312.0))) + (#when PC_PORT + (set! (-> hud-bounds min x) (the float (the int (adjust-game-x (-> hud-bounds min x))))) + (set! (-> hud-bounds max x) (the float (the int (adjust-game-x (-> hud-bounds max x)))))) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) + (bucket-id progress)) + (setup-scissor hud-bounds buffer)) + (none)) + +(defun end-scissor-scrolling-page ((hud-bounds hud-box) (arg1 float)) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) + (bucket-id progress) + ) + (restore-scissor hud-bounds buffer)) + (none)) + +(defmethod draw-option menu-generic-scrolling-page ((obj menu-generic-scrolling-page) (progress progress) (font-ctx font-context) (arg3 int) (arg4 symbol)) + ;; (inspect obj) + (when (or (zero? (-> obj mounted?)) (not (-> obj mounted?))) + (on-mount! obj)) + ;; the list has a total of 200px of y-height + ;; with 10px of margin at the top and bottom, that leaves 180 / 4 = 45px per item + ;; it's the responsibility of each generic component to center itself within these 45px lines + (when (not (-> *progress-pc-generic-store* clear-screen?)) + (let ((font-alpha (fmax 0.0 (* 2.0 (- 0.5 (-> progress menu-transition))))) + (hud-bounds (new 'stack-no-clear 'hud-box)) + (max-page-size (if (= (get-aspect-ratio) 'aspect16x9) 5 4)) + (margin-top-bottom 10.0) + (line-height 45.0)) + (set! (-> font-ctx alpha) font-alpha) + (set-color! font-ctx (font-color progress)) + ;; header + (draw-page-header font-ctx (-> obj name)) + ;; background borders + (draw-page-border (-> obj box 0) font-alpha) + ;; background + (draw-page-background font-alpha) + (begin-scissor-scrolling-page hud-bounds) + (if (= (get-aspect-ratio) 'aspect16x9) + (set! (-> font-ctx origin y) (+ 86.0 margin-top-bottom)) + (set! (-> font-ctx origin y) (+ 112.0 margin-top-bottom))) + ;; render items + (let* ((menu-option-index (if (< (-> *progress-pc-generic-store* current-menu-hover-index) max-page-size) + 0 + (-> *progress-pc-generic-store* current-menu-hover-index))) + (end-index (min (-> obj menu-options length) (+ menu-option-index max-page-size)))) + (while (< menu-option-index end-index) + (let ((menu-option (-> obj menu-options menu-option-index))) + (when (nonzero? menu-option) + ;; save the y position as who knows where it will end up after the component finishes rendering + (let ((old-y-pos (-> font-ctx origin y))) + (draw-option menu-option progress font-ctx menu-option-index + (= (-> obj selected-option-index) menu-option-index)) + ;; move to the next line + (set! (-> font-ctx origin y) (+ old-y-pos line-height)) + ;; reset the font color + (set-color! font-ctx (font-color progress))))) + (+! menu-option-index 1))) + ;; end + (end-scissor-scrolling-page hud-bounds 1.0) + (set-flags! font-ctx (font-flags kerning large)) + (let* ((draw-up-arrow? (and (not (zero? (-> *progress-pc-generic-store* current-menu-hover-index))) + (>= (-> *progress-pc-generic-store* current-menu-hover-index) max-page-size))) + (last-page-remainder (mod (-> obj menu-options length) max-page-size)) + (last-page-starting-index (if (zero? last-page-remainder) + (- (-> obj menu-options length) max-page-size) + (- (-> obj menu-options length) last-page-remainder))) + (draw-down-arrow? (and (> (-> obj menu-options length) max-page-size) + (< (-> *progress-pc-generic-store* current-menu-hover-index) last-page-starting-index)))) + (draw-scrolling-page-up-down-arrows font-ctx draw-up-arrow? draw-down-arrow?)))) + (none)) + +(defun draw-generic-highlight ((y-pos int) (height int) (alpha float)) + (let ((x-pos (if (= (get-aspect-ratio) 'aspect4x3) + 70 + 50)) + (width (if (= (get-aspect-ratio) 'aspect4x3) + 374 + 500))) + ;; og:preserve-this + (#when PC_PORT + ;; added for better widescreen handling + (when (not (-> *pc-settings* use-vis?)) + (set! x-pos (the int (adjust-game-x (the float x-pos)))) + (set! width (the int (* (-> *pc-settings* aspect-ratio-reciprocal) width))))) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) + (bucket-id progress) + ) + (draw-sprite2d-xy buffer x-pos y-pos width height + (new 'static 'rgba :r #x40 :g #x80 :b #x80 :a (the int (* 64.0 alpha))))))) + +(defmethod draw-option menu-generic-boolean-option ((obj menu-generic-boolean-option) (arg0 progress) (arg1 font-context) (option-index int) (selected? symbol)) + (when (not (-> obj mounted?)) + (on-mount! obj)) + (let ((alpha (* 2.0 (- 0.5 (-> arg0 menu-transition)))) + (line-height 23.0)) + (max! alpha 0.0) + (set! (-> arg1 alpha) alpha) + (set-flags! arg1 (font-flags kerning middle large)) + (set-scale! arg1 0.65) + (+! (-> arg1 origin y) 5.0) + (cond + (selected? + (set-color! arg1 (font-color progress-force-selected)) + (draw-generic-highlight (the int (+ -1.0 (-> arg1 origin y))) 41 alpha) + (print-game-text (lookup-text! *common-text* (-> obj name) #f) arg1 #f 44 (bucket-id progress)) + (+! (-> arg1 origin y) line-height) + (set! *temp-string* (clear *temp-string*)) + (if (-> obj value) + (format *temp-string* "~33L~S~35L ~S" (lookup-text! *common-text* (-> obj truthy-text) #f) (lookup-text! *common-text* (-> obj falsey-text) #f)) + (format *temp-string* "~35L~S ~33L~S~1L" (lookup-text! *common-text* (-> obj truthy-text) #f) (lookup-text! *common-text* (-> obj falsey-text) #f)))) + ;; hover case + (else + (cond + ((= option-index (-> *progress-pc-generic-store* current-menu-hover-index)) + (set-color! arg1 (progress-selected 0)) + (draw-generic-highlight (the int (+ -1.0 (-> arg1 origin y))) 22 alpha)) + (else + (set-color! arg1 (font-color progress)))) + (print-game-text (lookup-text! *common-text* (-> obj name) #f) arg1 #f 44 (bucket-id progress)) + (+! (-> arg1 origin y) line-height) + (set! *temp-string* (clear *temp-string*)) + (let ((actual-value (if (and (nonzero? (-> obj get-value-fn)) (!= (-> obj get-value-fn) #f)) + ((-> obj get-value-fn)) + #f))) + (if actual-value + (format *temp-string* "~1L~S~35L ~S" (lookup-text! *common-text* (-> obj truthy-text) #f) (lookup-text! *common-text* (-> obj falsey-text) #f)) + (format *temp-string* "~35L~S ~1L~S~1L" (lookup-text! *common-text* (-> obj truthy-text) #f) (lookup-text! *common-text* (-> obj falsey-text) #f)))))) + (set-scale! arg1 0.5) + (print-game-text *temp-string* arg1 #f 44 (bucket-id progress))) + (none)) + +(defmethod draw-option menu-generic-carousel-option ((obj menu-generic-carousel-option) + (progress progress) + (font-ctx font-context) + (option-index int) + (selected? symbol)) + (when (not (-> obj mounted?)) + (on-mount! obj)) + (let ((alpha (fmax (* 2.0 (- 0.5 (-> progress menu-transition))) 0.0))) + (set! (-> font-ctx scale) 0.65) + (set! (-> font-ctx alpha) alpha) + (+! (-> font-ctx origin y) 2.5) + (set-flags! font-ctx (font-flags kerning middle large)) + ;; the item label + (cond + (selected? + (set! (-> font-ctx color) (font-color progress-force-selected)) + (draw-generic-highlight (the int (-> font-ctx origin y)) 44 alpha)) + ((= option-index (-> *progress-pc-generic-store* current-menu-hover-index)) + (set! (-> font-ctx color) (progress-selected 0)) + (draw-generic-highlight (the int (-> font-ctx origin y)) 24 alpha))) + (format (clear *temp-string*) "~S" (lookup-text! *common-text* (-> obj name) #f)) + (print-game-text *temp-string* font-ctx #f 44 (bucket-id progress)) + (+! (-> font-ctx origin y) 24.0) + (set! (-> font-ctx scale) 0.5) + (set! (-> font-ctx color) (font-color progress)) + (when selected? + ;; left arrow + (+! (-> font-ctx origin x) -70.0) + (format (clear *temp-string*) "~33L~C" 163) + (print-game-text *temp-string* font-ctx #f 44 (bucket-id progress)) + (+! (-> font-ctx origin x) 70.0) + (+! (-> font-ctx origin x) 70.0) + ;; right arrow + (format (clear *temp-string*) "~33L~C" 161) + (print-game-text *temp-string* font-ctx #f 44 (bucket-id progress)) + (+! (-> font-ctx origin x) -70.0) + (set! (-> font-ctx color) (progress-selected 0))) + ;; the value + ;; TODO - bounds checking would be smart + (if selected? + (print-game-text (lookup-text! *common-text* (-> obj items (-> obj item-index)) #f) font-ctx #f 44 (bucket-id progress)) + (let ((actual-index (if (and (nonzero? (-> obj get-item-index-fn)) (!= (-> obj get-item-index-fn) #f)) + ((-> obj get-item-index-fn)) + 0))) + (print-game-text (lookup-text! *common-text* (-> obj items actual-index) #f) font-ctx #f 44 (bucket-id progress))))) + (none)) + +(defmethod draw-option menu-generic-link-option ((obj menu-generic-link-option) (arg0 progress) (arg1 font-context) (option-index int) (selected? symbol)) + (when (not (-> obj mounted?)) + (on-mount! obj)) + (let ((alpha (* 2.0 (- 0.5 (-> arg0 menu-transition)))) + (line-height 23.0)) + (max! alpha 0.0) + (set! (-> arg1 alpha) alpha) + (set-flags! arg1 (font-flags kerning middle large)) + (set-scale! arg1 0.65) + (+! (-> arg1 origin y) 12.5) + (cond + ((= option-index (-> *progress-pc-generic-store* current-menu-hover-index)) + (set-color! arg1 (progress-selected 0)) + (draw-generic-highlight (the int (+ -1.0 (-> arg1 origin y))) 22 alpha)) + (else + (set-color! arg1 (font-color progress)))) + (print-game-text (lookup-text! *common-text* (-> obj name) #f) arg1 #f 44 (bucket-id progress))) + (none)) diff --git a/goal_src/jak2/pc/progress/progress-generic-h-pc.gc b/goal_src/jak2/pc/progress/progress-generic-h-pc.gc new file mode 100644 index 0000000000..8d9c259e77 --- /dev/null +++ b/goal_src/jak2/pc/progress/progress-generic-h-pc.gc @@ -0,0 +1,94 @@ +;;-*-Lisp-*- +(in-package goal) + +;; TODO: +;; - slider +;; - disabled options +;; - detail list + +(deftype generic-progress-state-entry (structure) + "All info that is pushed onto a 'stack' when navigating to a sub-menu with + the new generic menu options" + (;; what needs to be drawn now, the normal progress code figures this out with a hard-coded switch statement, this avoids that + (ref menu-option-list) + ;; generic function to potentially run some setup code when the entry is loaded + (on-load (function none)) + ;; so we can restore back to the same menu position + (hover-index int32) + ;; symbol used normally for progress stuff + (progress-id symbol))) + +(deftype progress-pc-generic-store (structure) + "Isolated type for keeping track of some global state, as re-using the normal [[*progress*]] object + can lead to unexpected behaviour -- they change some values all over the place" + ((current-menu-hover-index int32) + (clear-screen? symbol) + (history-stack generic-progress-state-entry 10 :inline) + (history-stack-index int32)) + (:methods + (init! (_type_) none) + (navigate! (_type_ progress menu-option-list (function none)) none) + (back! (_type_ progress) none) + (has-history? (_type_) symbol) + (clear-history-if-empty! (_type_) none))) + +(define *progress-pc-generic-store* (new 'static 'progress-pc-generic-store)) + +(deftype menu-generic-option (menu-option) + ((mounted? symbol)) + (:methods + (on-mount! "Called when the menu item is first drawn as a means to initialize defaults, etc" (_type_) none))) + +;; TODO - make methods for calling the lambdas just to reduce duplication (checking if the value is set, etc) +(deftype menu-generic-boolean-option (menu-generic-option) + "Generic two option menu entry (ie. yes/no)" + (;; props + (truthy-text text-id) + (falsey-text text-id) + ;; state + (value symbol) + ;; lambdas + (get-value-fn (function symbol)) + (on-confirm (function symbol none)))) + +;; TODO - make methods for calling the lambdas just to reduce duplication (checking if the value is set, etc) +(deftype menu-generic-carousel-option (menu-generic-option) + "Generic left-right menu entry (ie. language selection)" + (;; props + (items (array text-id)) + ;; state + (item-index int32) + ;; lambdas + (get-item-index-fn (function int)) + (on-confirm (function int none)))) + +(deftype menu-generic-scrolling-page (menu-generic-option) + "A menu option that holds menu options" + (;; props + (menu-options (array menu-option)) + (header text-id) + ;; state + (selected-option-item menu-option) + (selected-option-index int32) + (last-move time-frame))) + +;; TODO - make methods for calling the lambdas just to reduce duplication (checking if the value is set, etc) +(deftype menu-generic-link-option (menu-generic-option) + "A very simple link option that allows you to link to any other menu-option" + (;; props + (target menu-option-list) + ;; generic function to potentially run some setup code when the entry is loaded + (on-load (function none)))) + +(defmacro progress-new-generic-scrolling-page (title &rest options) + `(new 'static 'menu-option-list + :options (new 'static 'boxed-array :type menu-option + (new 'static 'menu-generic-scrolling-page + :name ,title ; (text-id progress-misc-game-options) + :menu-options (new 'static 'boxed-array :type menu-option + ,@options))))) + +(defmacro progress-new-generic-link (text target) + `(new 'static 'menu-generic-link-option + :name ,text + :target ,target)) diff --git a/goal_src/jak2/pc/progress/progress-generic-pc.gc b/goal_src/jak2/pc/progress/progress-generic-pc.gc new file mode 100644 index 0000000000..96441cabea --- /dev/null +++ b/goal_src/jak2/pc/progress/progress-generic-pc.gc @@ -0,0 +1,268 @@ +;;-*-Lisp-*- +(in-package goal) + +(defmethod init! progress-pc-generic-store ((this progress-pc-generic-store)) + (set! (-> this clear-screen?) #f) + (none)) + +(defmethod navigate! progress-pc-generic-store ((this progress-pc-generic-store) (progress progress) (target menu-option-list) (on-load (function none))) + (when (< (-> this history-stack-index) 9) ;; hard-coded length + ;; if this is the first history entry, we push the current page as well + ;; if it's not, then we update the current entry before proceeding to the next page + (if (has-history? this) + (let ((stack-entry (-> this history-stack (-> this history-stack-index)))) + (set! (-> stack-entry hover-index) (-> this current-menu-hover-index)) + (set! (-> stack-entry progress-id) (-> progress current))) + (let ((stack-entry (-> this history-stack (-> this history-stack-index)))) + (set! (-> stack-entry ref) (-> progress current-options)) + (set! (-> stack-entry on-load) on-load) + (set! (-> stack-entry hover-index) (-> this current-menu-hover-index)) + (set! (-> stack-entry progress-id) (-> progress current)))) + ;; push the target history entry now + (inc! (-> this history-stack-index)) + ;; Create a new stack entry + (let ((stack-entry (-> this history-stack (-> this history-stack-index)))) + (set! (-> stack-entry ref) target) + (set! (-> stack-entry on-load) on-load) + (set! (-> stack-entry hover-index) 0) + (set! (-> stack-entry progress-id) 'generic-menu)) + ;; Update global state + (set! (-> this clear-screen?) #t) + (set! (-> progress next) 'generic-menu) + (set! (-> progress selected-option) #f)) + (none)) + +(defmethod back! progress-pc-generic-store ((this progress-pc-generic-store) (progress progress)) + (set! (-> this history-stack-index) (max 0 (dec (-> this history-stack-index)))) + (set! (-> this clear-screen?) #t) + (set! (-> progress next) 'generic-menu) + (set! (-> progress selected-option) #f) + (none)) + +(defmethod has-history? progress-pc-generic-store ((this progress-pc-generic-store)) + (> (-> this history-stack-index) 0)) + +(defmethod clear-history-if-empty! progress-pc-generic-store ((this progress-pc-generic-store)) + ;; if we are have no history, just reset the entry. This is so we don't preserve state + ;; after completely exiting the menu + (when (not (has-history? this)) + (set! (-> this history-stack-index) 0) + (set! (-> this clear-screen?) #f) + (set! (-> this current-menu-hover-index) 0) + (let ((stack-entry (-> this history-stack (-> this history-stack-index)))) + (set! (-> stack-entry hover-index) 0) + (set! (-> stack-entry ref) #f) + (set! (-> stack-entry on-load) #f) + (set! (-> stack-entry progress-id) #f))) + (none)) + +(defmethod on-mount! menu-generic-option ((this menu-generic-option)) + (set! (-> this mounted?) #t) + (none)) + +(defmethod on-mount! menu-generic-carousel-option ((this menu-generic-carousel-option)) + (set! (-> this mounted?) #t) + (set! (-> this item-index) 0) + (none)) + +(defmethod on-mount! menu-generic-scrolling-page ((this menu-generic-scrolling-page)) + (set! (-> this mounted?) #t) + (set! (-> this selected-option-item) #f) + (set! (-> this selected-option-index) -1) + (none)) + +;; Progress Code Overrides + +(defmethod respond-to-cpad progress ((obj progress)) + (mc-get-slot-info 0 *progress-save-info*) + ;; ND originally did this...called this every frame in the game options, looked like a hack + ;; there's probably a way to consistently do it synchronously + (load-level-text-files (the-as int (-> *setting-control* user-current language))) + (when (-> obj current-options) + (let ((option-array (-> obj current-options options)) + (has-generic-history? (has-history? *progress-pc-generic-store*))) + (when (and option-array (= (-> obj menu-transition) 0.0)) + (let ((in-generic-page? (and (= (-> option-array length) 1) + (type? (-> option-array 0) menu-generic-scrolling-page)))) + (cond + ;; If it's a scrolling menu, we have to pull from it's list of items + (in-generic-page? + ;; update the scrolling list + (respond-progress + (the-as menu-option (-> option-array 0)) + obj + (and (= (-> obj menu-transition) 0.0) (-> obj selected-option)))) + ;; Do a bounds check to avoid crashing + ((>= (-> obj option-index) (-> option-array length)) + (format 0 "respond-to-cpad:progress: Option index ~D out of bounds~%" (-> obj option-index))) + (else + (respond-progress + (the-as menu-option (-> option-array (-> obj option-index))) + obj + (and (= (-> obj menu-transition) 0.0) (-> obj selected-option))))) + (cond + ((-> obj selected-option) + (cond + ((cpad-pressed? 0 confirm) + (set! (-> obj selected-option) #f) + ) + ((cpad-pressed? 0 triangle) + (when (not in-generic-page?) + (if (= (-> obj current-options) *main-options*) + (sound-play "window-contract") + (sound-play "generic-beep"))) + (set! (-> obj selected-option) #f)))) + (else + (cond + ((cpad-pressed? 0 up l-analog-up) + (cond + ((= (-> obj current-options) *main-options*) + (sound-play "ring-select")) + ((!= (length option-array) 1) + (sound-play "roll-over"))) + (if (and (= *title* (-> obj current-options)) (not (memcard-unlocked-secrets? #f)) (zero? (-> obj option-index))) + (set! (-> obj option-index) 3)) + (cond + ((> (-> obj want-option-index) 0) + (set! (-> obj want-option-index) -1)) + ((< -2 (-> obj want-option-index)) + (+! (-> obj want-option-index) -1)))) + ((cpad-pressed? 0 down l-analog-down) + (cond + ((= (-> obj current-options) *main-options*) + (sound-play "ring-select")) + ((!= (length option-array) 1) + (sound-play "roll-over"))) + (cond + ((< (-> obj want-option-index) 0) + (set! (-> obj want-option-index) 1)) + ((< (-> obj want-option-index) 2) + (+! (-> obj want-option-index) 1)))) + ((cpad-pressed? 0 confirm) + (logclear! (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons confirm)) + (logclear! (-> *cpad-list* cpads 0 button0-rel 0) (pad-buttons confirm)) + (when (and (not in-generic-page?) + (not (-> *progress-state* clear-screen))) + (sound-play "generic-beep")) + ;; don't "select" the page link + (when (!= (-> obj next) 'generic-menu) + (set! (-> obj selected-option) #t))) + ((cpad-pressed? 0 triangle) + ;; if we are within a generic managed menu option, handle the stack elsewhere + ;; TODO - this likely has issues if we have a nested-non-generic menu, but deal with that use-case if it's ever + ;; actually employed + (when (and (not has-generic-history?) (can-go-back? obj)) + (logclear! (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons triangle)) + (logclear! (-> *cpad-list* cpads 0 button0-rel 0) (pad-buttons triangle)) + (if (and (= (-> *progress-state* starting-state) 'main) (!= (-> obj current-options) *main-options*)) + (sound-play "window-contract") + (sound-play "generic-beep")) + (clear-history-if-empty! *progress-pc-generic-store*) + (pop-state obj)))))))))) + (none)) + +;; Component implementation + +(defmethod respond-progress menu-generic-scrolling-page ((obj menu-generic-scrolling-page) (progress progress) (selected? symbol)) + "Handle progress menu navigation logic." + (if (or (= (-> obj selected-option-item) #f) + (zero? (-> obj selected-option-item))) + (cond + ((or (cpad-pressed? 0 down l-analog-down) + (and (cpad-hold? 0 down l-analog-down) + (>= (- (current-time) (the-as int (-> obj last-move))) (seconds 0.5)))) + (set! (-> obj last-move) (current-time)) + (cond + ((< (-> *progress-pc-generic-store* current-menu-hover-index) (dec (-> obj menu-options length))) + (+! (-> *progress-pc-generic-store* current-menu-hover-index) 1) + (sound-play "roll-over")) + (else + (set! (-> *progress-pc-generic-store* current-menu-hover-index) 0) + (sound-play "roll-over")))) + ((or (cpad-pressed? 0 up l-analog-up) + (and (cpad-hold? 0 up l-analog-up) + (>= (- (current-time) (the-as int (-> obj last-move))) (seconds 0.5)))) + (set! (-> obj last-move) (current-time)) + (+! (-> *progress-pc-generic-store* current-menu-hover-index) -1) + (sound-play "roll-over") + (when (< (-> *progress-pc-generic-store* current-menu-hover-index) 0) + (set! (-> *progress-pc-generic-store* current-menu-hover-index) (dec (-> obj menu-options length))))) + ((cpad-pressed? 0 confirm) + ;; ignore confirm if it's a link + (when (and (< (-> *progress-pc-generic-store* current-menu-hover-index) (-> obj menu-options length)) + (not (type? (-> obj menu-options (-> *progress-pc-generic-store* current-menu-hover-index)) menu-generic-link-option))) + (set! (-> obj selected-option-index) (-> *progress-pc-generic-store* current-menu-hover-index)) + (set! (-> obj selected-option-item) (-> obj menu-options (-> *progress-pc-generic-store* current-menu-hover-index)))) + (sound-play "generic-beep")) + ((cpad-pressed? 0 triangle) + ;; we are in a sub-page, time to go back + (when (has-history? *progress-pc-generic-store*) + (back! *progress-pc-generic-store* progress) + (sound-play "score-slide"))) + ) + (cond + ((cpad-pressed? 0 confirm) + (set! (-> obj selected-option-index) -1) + (set! (-> obj selected-option-item) #f)) + ((cpad-pressed? 0 triangle) + (set! (-> obj selected-option-index) -1) + (set! (-> obj selected-option-item) #f)))) + ;; propagate event to menu-option + (when (< (-> *progress-pc-generic-store* current-menu-hover-index) (-> obj menu-options length)) + (respond-progress (-> obj menu-options (-> *progress-pc-generic-store* current-menu-hover-index)) progress selected?)) + 0) + +(defmethod respond-progress menu-generic-boolean-option ((obj menu-generic-boolean-option) (progress progress) (selected? symbol)) + (if selected? + (cond + ((cpad-pressed? 0 left l-analog-left right l-analog-right) + (if (-> obj value) + (set! (-> obj value) #f) + (set! (-> obj value) #t)) + (sound-play "generic-beep")) + ((cpad-pressed? 0 confirm) + (when (and (nonzero? (-> obj on-confirm)) (!= (-> obj on-confirm) #f)) + ((-> obj on-confirm) (-> obj value))) + (sound-play "generic-beep"))) + (cond + ((cpad-pressed? 0 confirm) + ;; set the value, this is so we edit the component's state and not the actual underlying value + ;; in other words, don't change the setting until the user has actually confirmed the change! + (when (and (nonzero? (-> obj get-value-fn)) + (!= (-> obj get-value-fn) #f)) + (set! (-> obj value) ((-> obj get-value-fn))))))) + 0) + +(defmethod respond-progress menu-generic-carousel-option ((obj menu-generic-carousel-option) (progress progress) (selected? symbol)) + (if selected? + (cond + ((cpad-pressed? 0 left l-analog-left) + (dec! (-> obj item-index)) + (when (< (-> obj item-index) 0) + (set! (-> obj item-index) (dec (-> obj items length)))) + (sound-play "generic-beep")) + ((cpad-pressed? 0 right l-analog-right) + (inc! (-> obj item-index)) + (when (>= (-> obj item-index) (-> obj items length)) + (set! (-> obj item-index) 0)) + (sound-play "generic-beep")) + ((cpad-pressed? 0 confirm) + (when (and (nonzero? (-> obj on-confirm)) (!= (-> obj on-confirm) #f)) + ((-> obj on-confirm) (-> obj item-index))) + (sound-play "generic-beep"))) + (cond + ((cpad-pressed? 0 confirm) + ;; set the value, this is so we edit the component's state and not the actual underlying value + ;; in other words, don't change the setting until the user has actually confirmed the change! + (when (and (nonzero? (-> obj get-item-index-fn)) (!= (-> obj get-item-index-fn) #f)) + (set! (-> obj item-index) ((-> obj get-item-index-fn))))))) + 0) + +(defmethod respond-progress menu-generic-link-option ((obj menu-generic-link-option) (progress progress) (selected? symbol)) + (when (>= (-> *progress-pc-generic-store* current-menu-hover-index) 0) + (cond + ((cpad-pressed? 0 confirm) + (navigate! *progress-pc-generic-store* progress (-> obj target) (-> obj on-load)) + (set! (-> progress selected-option) #f) + (sound-play "score-slide")))) + 0) diff --git a/goal_src/jak2/pc/progress/progress-h-pc.gc b/goal_src/jak2/pc/progress/progress-h-pc.gc index 7c4024a134..13a9769139 100644 --- a/goal_src/jak2/pc/progress/progress-h-pc.gc +++ b/goal_src/jak2/pc/progress/progress-h-pc.gc @@ -41,7 +41,7 @@ (deftype menu-music-player-option (menu-option) ((last-move time-frame) - + ;; player params (music-index int16) (flava-index int8) @@ -50,7 +50,7 @@ ;; scroll (current-scroll float) (max-scroll float) - + ;; sprites 0-3 used to show level icon (sprites hud-sprite 4 :inline) ) @@ -61,7 +61,7 @@ ((name text-id) (unlock text-id) (flag pc-cheats) - + (avail-after game-task-node) (avail-after-hero game-task-node) ) diff --git a/goal_src/jak2/pc/progress/progress-pc.gc b/goal_src/jak2/pc/progress/progress-pc.gc index fdf6198fd5..99698e9062 100644 --- a/goal_src/jak2/pc/progress/progress-pc.gc +++ b/goal_src/jak2/pc/progress/progress-pc.gc @@ -12,9 +12,9 @@ (deftype progress-global-state-pc (basic) ((decoration-draw-time uint64) - + (display-mode-choice-index int8) - + (aspect-ratio-choice-index int8) (aspect-ratio-ratio-index int8) @@ -149,6 +149,7 @@ ;; PC STATE BEGIN ;; -------------- + (init! *progress-pc-generic-store*) ;; set aspect ratio options (set-progress-aspect-ratio-pc-index) @@ -185,21 +186,7 @@ ) (('game-options) (set! (-> obj current-options) - (cond - ((demo?) - (if (= (scf-get-territory) GAME_TERRITORY_SCEE) - *game-options* - *game-options-demo* - ) - ) - ((and (= (scf-get-territory) GAME_TERRITORY_SCEI) (not (and (= *progress-cheat* 'language) (cpad-hold? 0 l2) (cpad-hold? 0 r2)))) - *game-options* - ) - (else - *game-options* - ) - ) - ) + (if (demo?) *game-options-demo* *game-options-pc*)) ) (('graphic-options) (set! (-> obj current-options) *graphic-options-pc*) @@ -362,6 +349,22 @@ (set! (-> (the-as menu-music-player-option (-> *music-player-options* options 0)) excitement) 0) (set! (-> obj current-options) *music-player-options*) ) + (('generic-menu) + ;; a single condition to handle all generic menu links + (let ((curr-history-entry (-> *progress-pc-generic-store* history-stack + (-> *progress-pc-generic-store* history-stack-index)))) + ;; call the on-load function is appropriate, this can be used to perform some kind of generic setup + ;; for the particular route + (when (and (nonzero? (-> curr-history-entry on-load)) (!= (-> curr-history-entry on-load) #f)) + ((-> curr-history-entry on-load))) + ;; restore state from the history entry + (set! (-> *progress-pc-generic-store* clear-screen?) #f) + (set! (-> *progress-pc-generic-store* current-menu-hover-index) (-> curr-history-entry hover-index)) + (if (!= (-> curr-history-entry progress-id) 'generic-menu) + ;; do a recursive call to hit the relevant case in this switch + (set-menu-options obj (-> curr-history-entry progress-id)) + ;; otherwise, set the options + (set! (-> obj current-options) (-> curr-history-entry ref))))) ) (when (= (-> obj current-options) #f) (format #t "Didn't find new menu settings!!~%") @@ -372,7 +375,6 @@ - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; CUSTOM MENU OPTIONS @@ -426,7 +428,7 @@ (when (cpad-pressed? 0 right l-analog-right) (true! sound-beep?) (min-max-wrap-around+! (-> *progress-state-pc* aspect-ratio-choice-index) 1 0 3)) - + (if sound-beep? (sound-play "generic-beep"))) ) @@ -459,7 +461,7 @@ (when (cpad-pressed? 0 right l-analog-right) (true! sound-beep?) (min-max-wrap-around+! (-> *progress-state-pc* display-mode-choice-index) 1 0 2)) - + (if sound-beep? (sound-play "generic-beep"))) ) @@ -587,7 +589,7 @@ (defun count-bits ((val int)) "return the number of bits set to 1." - + (let ((bits 0)) (dotimes (i 64) (if (logtest? val (ash 1 i)) @@ -753,4 +755,3 @@ 0 (none) ) - diff --git a/goal_src/jak2/pc/progress/progress-static-pc.gc b/goal_src/jak2/pc/progress/progress-static-pc.gc index fff52baa04..824704b981 100644 --- a/goal_src/jak2/pc/progress/progress-static-pc.gc +++ b/goal_src/jak2/pc/progress/progress-static-pc.gc @@ -11,6 +11,61 @@ (set! (-> *main-options-debug* options 9) (new 'static 'menu-main-menu-option :name (text-id progress-music-player) :scale #t :next-state 'music-player)) +(define *game-options-pc* + (progress-new-generic-scrolling-page (text-id progress-root-game-options) + (new 'static 'menu-generic-boolean-option + :name (text-id progress-vibration) + :truthy-text (text-id progress-on) + :falsey-text (text-id progress-off) + :get-value-fn (lambda () (-> *setting-control* user-default vibration)) + :on-confirm (lambda ((val symbol)) (set! (-> *setting-control* user-default vibration) val))) + (new 'static 'menu-generic-boolean-option + :name (text-id progress-subtitles) + :truthy-text (text-id progress-on) + :falsey-text (text-id progress-off) + :get-value-fn (lambda () (-> *setting-control* user-default subtitle)) + :on-confirm (lambda ((val symbol)) (set! (-> *setting-control* user-default subtitle) val))) + (new 'static 'menu-generic-carousel-option + :name (text-id progress-sound-subtitle-language) + :items (new 'static 'boxed-array :type text-id + (text-id language-name-english) + (text-id language-name-french) + (text-id language-name-german) + (text-id language-name-spanish) + (text-id language-name-italian) + (text-id language-name-japanese) + (text-id language-name-korean) + (text-id language-name-english-uk)) + :get-item-index-fn (lambda () (-> *setting-control* user-default subtitle-language)) + :on-confirm (lambda ((index int)) (set! (-> *setting-control* user-default subtitle-language) + (the-as language-enum index)))) + (new 'static 'menu-generic-carousel-option + :name (text-id progress-sound-language) + :items (new 'static 'boxed-array :type text-id + (text-id language-name-english) + (text-id language-name-french) + (text-id language-name-german) + (text-id language-name-spanish) + (text-id language-name-italian) + (text-id language-name-japanese) + (text-id language-name-korean) + (text-id language-name-english-uk)) + :get-item-index-fn (lambda () (-> *setting-control* user-default language)) + :on-confirm (lambda ((index int)) (set! (-> *setting-control* user-default language) (the-as language-enum index)) + ;; NOTE - this doesn't actually work (naughty dog tried it too in their progress code) + ;; fix it eventually + (load-level-text-files (the-as int (-> *setting-control* user-default language))))) + (progress-new-generic-link (text-id progress-misc-game-options) + (progress-new-generic-scrolling-page (text-id progress-misc-game-options) + (new 'static 'menu-generic-boolean-option + :name (text-id progress-speedrunner-mode) + :truthy-text (text-id progress-on) + :falsey-text (text-id progress-off) + :get-value-fn (lambda () (-> *pc-settings* speedrunner-mode?)) + :on-confirm (lambda ((val symbol)) + (set! (-> *pc-settings* speedrunner-mode?) val) + (commit-to-file *pc-settings*))))))) + (define *graphic-options-pc* (new 'static 'menu-option-list diff --git a/test/decompiler/reference/jak2/engine/ui/progress/progress-draw_REF.gc b/test/decompiler/reference/jak2/engine/ui/progress/progress-draw_REF.gc index 433ca27f54..8482015048 100644 --- a/test/decompiler/reference/jak2/engine/ui/progress/progress-draw_REF.gc +++ b/test/decompiler/reference/jak2/engine/ui/progress/progress-draw_REF.gc @@ -66,28 +66,28 @@ ) ;; definition for function draw-highlight -(defun draw-highlight ((arg0 int) (arg1 int) (arg2 float)) - (let ((s3-0 (if (= (get-aspect-ratio) 'aspect4x3) - 70 - 79 - ) - ) - (a3-0 (if (= (get-aspect-ratio) 'aspect4x3) - 374 - 355 - ) - ) +(defun draw-highlight ((y-pos int) (height int) (alpha float)) + (let ((x-pos (if (= (get-aspect-ratio) 'aspect4x3) + 70 + 79 + ) + ) + (width (if (= (get-aspect-ratio) 'aspect4x3) + 374 + 355 + ) + ) ) - (with-dma-buffer-add-bucket ((s2-0 (-> *display* frames (-> *display* on-screen) global-buf)) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw-sprite2d-xy - s2-0 - s3-0 - arg0 - a3-0 - arg1 - (new 'static 'rgba :r #x40 :g #x80 :b #x80 :a (the int (* 64.0 arg2))) + buffer + x-pos + y-pos + width + height + (new 'static 'rgba :r #x40 :g #x80 :b #x80 :a (the int (* 64.0 alpha))) ) ) ) @@ -220,27 +220,27 @@ ;; definition for function draw-missions-up-down ;; WARN: Return type mismatch float vs none. -(defun draw-missions-up-down ((arg0 font-context)) - (let ((s3-0 250) - (s5-0 116) - (s4-0 191) - (f30-0 (-> arg0 origin x)) - (f28-0 (-> arg0 origin y)) +(defun draw-missions-up-down ((font-ctx font-context)) + (let ((new-x-pos 250) + (new-y-pos-up 116) + (new-y-pos-down 191) + (old-x-pos (-> font-ctx origin x)) + (old-y-pos (-> font-ctx origin y)) ) - (set! (-> arg0 origin x) (the float s3-0)) - (set! (-> arg0 origin y) (the float s5-0)) - (let ((s2-0 print-game-text)) + (set! (-> font-ctx origin x) (the float new-x-pos)) + (set! (-> font-ctx origin y) (the float new-y-pos-up)) + (let ((print-text-fn print-game-text)) (format (clear *temp-string*) "~33L~C" 160) - (s2-0 *temp-string* arg0 #f 44 (bucket-id progress)) + (print-text-fn *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (set! (-> arg0 origin x) (the float s3-0)) - (set! (-> arg0 origin y) (the float (+ s5-0 s4-0))) - (let ((s5-1 print-game-text)) + (set! (-> font-ctx origin x) (the float new-x-pos)) + (set! (-> font-ctx origin y) (the float (+ new-y-pos-up new-y-pos-down))) + (let ((print-text-fn-1 print-game-text)) (format (clear *temp-string*) "~33L~C" 162) - (s5-1 *temp-string* arg0 #f 44 (bucket-id progress)) + (print-text-fn-1 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (set! (-> arg0 origin x) f30-0) - (set! (-> arg0 origin y) f28-0) + (set! (-> font-ctx origin x) old-x-pos) + (set! (-> font-ctx origin y) old-y-pos) ) (none) ) @@ -353,35 +353,35 @@ ) ;; definition for function begin-scissor-missions -(defun begin-scissor-missions ((arg0 hud-box)) +(defun begin-scissor-missions ((hud-bounds hud-box)) (cond ((= (get-aspect-ratio) 'aspect16x9) - (set! (-> arg0 min x) 79.0) - (set! (-> arg0 min y) 130.0) - (set! (-> arg0 max x) 434.0) - (set! (-> arg0 max y) 305.0) + (set! (-> hud-bounds min x) 79.0) + (set! (-> hud-bounds min y) 130.0) + (set! (-> hud-bounds max x) 434.0) + (set! (-> hud-bounds max y) 305.0) ) (else - (set! (-> arg0 min x) 70.0) - (set! (-> arg0 min y) 130.0) - (set! (-> arg0 max x) 444.0) - (set! (-> arg0 max y) 305.0) + (set! (-> hud-bounds min x) 70.0) + (set! (-> hud-bounds min y) 130.0) + (set! (-> hud-bounds max x) 444.0) + (set! (-> hud-bounds max y) 305.0) ) ) - (with-dma-buffer-add-bucket ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf)) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) - (setup-scissor arg0 s4-0) + (setup-scissor hud-bounds buffer) ) 0 ) ;; definition for function end-scissor-missions -(defun end-scissor-missions ((arg0 hud-box) (arg1 float)) - (with-dma-buffer-add-bucket ((s5-0 (-> *display* frames (-> *display* on-screen) global-buf)) +(defun end-scissor-missions ((hud-bounds hud-box) (arg1 float)) + (with-dma-buffer-add-bucket ((buffer (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) - (restore-scissor arg0 s5-0) + (restore-scissor hud-bounds buffer) ) 0 ) @@ -3972,25 +3972,26 @@ ;; definition for function sort-task-node-result ;; WARN: Return type mismatch symbol vs none. (defun sort-task-node-result ((arg0 int)) - (let ((v1-1 (-> *game-info* mission-list)) - (a1-1 (max 0 (+ arg0 -1))) + "Sorts the [[*game-info*]]'s `mission-list` by if they are closed and their `closed-time`. Just bubble-sort and therefore O(n^2)" + (let ((game-task-info-array (-> *game-info* mission-list)) + (i (max 0 (+ arg0 -1))) ) - (let ((a0-3 0)) - (while (> a1-1 0) - (while (< a0-3 a1-1) - (when (and (logtest? (-> v1-1 a0-3 flags) (game-task-node-flag closed)) - (logtest? (-> v1-1 (+ a0-3 1) flags) (game-task-node-flag closed)) - (< (-> v1-1 a0-3 close-time) (-> v1-1 (+ a0-3 1) close-time)) + (let ((j 0)) + (while (> i 0) + (while (< j i) + (when (and (logtest? (-> game-task-info-array j flags) (game-task-node-flag closed)) + (logtest? (-> game-task-info-array (+ j 1) flags) (game-task-node-flag closed)) + (< (-> game-task-info-array j close-time) (-> game-task-info-array (+ j 1) close-time)) ) - (let ((a2-19 (-> v1-1 a0-3))) - (set! (-> v1-1 a0-3) (-> v1-1 (+ a0-3 1))) - (set! (-> v1-1 (+ a0-3 1)) a2-19) + (let ((task-info (-> game-task-info-array j))) + (set! (-> game-task-info-array j) (-> game-task-info-array (+ j 1))) + (set! (-> game-task-info-array (+ j 1)) task-info) ) ) - (+! a0-3 1) + (+! j 1) ) - (+! a1-1 -1) - (set! a0-3 0) + (+! i -1) + (set! j 0) ) ) ) @@ -4183,40 +4184,40 @@ ;; WARN: Stack slot offset 20 signed mismatch ;; WARN: Stack slot offset 20 signed mismatch ;; WARN: Return type mismatch int vs none. -(defmethod draw-option menu-missions-option ((obj menu-missions-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) +(defmethod draw-option menu-missions-option ((obj menu-missions-option) (progress progress) (font-ctx font-context) (arg3 int) (arg4 symbol)) (local-vars (f0-50 float) - (sv-16 float) - (sv-20 int) - (sv-24 int) + (font-alpha float) + (task-info-idx int) + (game-task-idx int) (sv-32 int) (sv-40 int) - (sv-48 int) - (sv-56 int) + (num-task-info int) + (default-y-origin-4x3 int) (sv-256 float) - (sv-260 float) - (sv-264 game-task-node-info) - (sv-268 game-task-node-info) - (sv-272 symbol) - (sv-276 hud-box) - (sv-280 float) - (sv-284 float) + (line-height float) + (inprogress-task-info game-task-node-info) + (completed-task-info game-task-node-info) + (found-closed-task? symbol) + (hud-bounds hud-box) + (font-y-pos float) + (font-scale float) ) - (set! sv-16 (* 2.0 (- 0.5 (-> arg0 menu-transition)))) - (set! sv-20 1) - (set! sv-24 0) + (set! font-alpha (* 2.0 (- 0.5 (-> progress menu-transition)))) + (set! task-info-idx 1) + (set! game-task-idx 0) (set! sv-32 0) (set! sv-40 0) - (set! sv-48 0) - (set! sv-56 95) - (set! sv-256 (* 395.0 (-> arg0 sliding))) - (set! sv-260 (* 44.0 (-> arg0 sliding-height))) - (set! sv-264 (new 'stack 'game-task-node-info)) - (set! sv-268 (new 'stack 'game-task-node-info)) - (set! sv-272 #t) - (set! sv-276 (new 'stack-no-clear 'hud-box)) - (set! sv-280 (-> arg1 origin y)) - (set! sv-284 (-> arg1 scale)) + (set! num-task-info 0) + (set! default-y-origin-4x3 95) + (set! sv-256 (* 395.0 (-> progress sliding))) + (set! line-height (* 44.0 (-> progress sliding-height))) + (set! inprogress-task-info (new 'stack 'game-task-node-info)) + (set! completed-task-info (new 'stack 'game-task-node-info)) + (set! found-closed-task? #t) + (set! hud-bounds (new 'stack-no-clear 'hud-box)) + (set! font-y-pos (-> font-ctx origin y)) + (set! font-scale (-> font-ctx scale)) (set! (-> *progress-state* current-task-index) (length (-> *game-info* sub-task-list))) (set! (-> *progress-state* current-line-index) -1) (set! (-> *progress-state* current-task) (the-as uint -1)) @@ -4224,121 +4225,127 @@ (set! (-> *progress-state* extra-text-state) -1) (set! (-> *progress-state* num-open-tasks-found) 0) (set! (-> *progress-state* num-closed-tasks-found) 0) - (if (< sv-16 0.0) - (set! sv-16 (the-as float 0.0)) + (if (< font-alpha 0.0) + (set! font-alpha (the-as float 0.0)) ) - (set! (-> arg1 alpha) sv-16) - (set! (-> *game-info* mission-list 0) sv-264) - (set! (-> sv-264 description) (text-id progress-missions-in-progress)) - (set! (-> sv-268 description) (text-id progress-missions-completed)) - (while (< sv-24 (length (-> *game-info* sub-task-list))) - (let ((v1-26 (find-mission-text-at-index sv-24)) - (a0-15 (-> *game-info* mission-list)) + (set! (-> font-ctx alpha) font-alpha) + (set! (-> *game-info* mission-list 0) inprogress-task-info) + (set! (-> inprogress-task-info description) (text-id progress-missions-in-progress)) + (set! (-> completed-task-info description) (text-id progress-missions-completed)) + (while (< game-task-idx (length (-> *game-info* sub-task-list))) + (let ((task-info (find-mission-text-at-index game-task-idx)) + (game-task-info-array (-> *game-info* mission-list)) ) - (when (!= v1-26 #f) - (when (and (logtest? (-> v1-26 flags) (game-task-node-flag closed)) sv-272) - (set! sv-272 (the-as symbol #f)) - (set! (-> a0-15 sv-20) sv-268) - (set! sv-20 (+ sv-20 1)) + (when (!= task-info #f) + (when (and (logtest? (-> task-info flags) (game-task-node-flag closed)) found-closed-task?) + (set! found-closed-task? (the-as symbol #f)) + (set! (-> game-task-info-array task-info-idx) completed-task-info) + (set! task-info-idx (+ task-info-idx 1)) ) - (set! (-> a0-15 sv-20) v1-26) - (set! sv-20 (+ sv-20 1)) + (set! (-> game-task-info-array task-info-idx) task-info) + (set! task-info-idx (+ task-info-idx 1)) ) ) - (set! sv-24 (+ sv-24 1)) + (set! game-task-idx (+ game-task-idx 1)) ) - (set! sv-48 sv-20) - (set! (-> *progress-state* total-num-tasks) sv-20) - (sort-task-node-result sv-48) - (let ((v1-36 arg1)) - (set! (-> v1-36 width) 395.0) + (set! num-task-info task-info-idx) + (set! (-> *progress-state* total-num-tasks) task-info-idx) + (sort-task-node-result num-task-info) + (let ((font-ctx-1 font-ctx)) + (set! (-> font-ctx-1 width) 395.0) ) - (set! (-> arg1 origin x) 60.0) - (set! (-> arg1 origin y) 80.0) - (let ((a0-21 arg1)) - (set! (-> a0-21 color) (font-color progress)) + (set! (-> font-ctx origin x) 60.0) + (set! (-> font-ctx origin y) 80.0) + (let ((font-ctx-2 font-ctx)) + (set! (-> font-ctx-2 color) (font-color progress)) ) - (let ((v1-40 (-> obj page-index))) + (let ((page-idx (-> obj page-index))) (cond - ((zero? v1-40) - (draw-missions-decoration obj arg1 sv-16 (text-id progress-root-missions)) + ((zero? page-idx) + (draw-missions-decoration obj font-ctx font-alpha (text-id progress-root-missions)) ) - ((= v1-40 1) - (draw-missions-decoration obj arg1 sv-16 (text-id progress-root-missions)) + ((= page-idx 1) + (draw-missions-decoration obj font-ctx font-alpha (text-id progress-root-missions)) ) ) ) - (begin-scissor-missions sv-276) - (let ((a0-27 arg1)) - (set! (-> a0-27 flags) (font-flags kerning large)) + (begin-scissor-missions hud-bounds) + (let ((font-ctx-3 font-ctx)) + (set! (-> font-ctx-3 flags) (font-flags kerning large)) ) - (+! (-> arg1 origin x) 20.0) + (+! (-> font-ctx origin x) 20.0) (case (get-aspect-ratio) (('aspect16x9) - (set! (-> arg1 origin y) 80.0) + (set! (-> font-ctx origin y) 80.0) ) (('aspect4x3) - (set! (-> arg1 origin y) (the float sv-56)) + (set! (-> font-ctx origin y) (the float default-y-origin-4x3)) ) ) - (let ((v1-52 arg1)) - (set! (-> v1-52 scale) sv-284) + (let ((font-ctx-4 font-ctx)) + (set! (-> font-ctx-4 scale) font-scale) ) (when (zero? (-> obj page-index)) - (set! sv-24 (-> obj task-line-index)) - (set! sv-20 0) - (let ((v1-57 (+ sv-56 44))) - (set! sv-56 v1-57) - (set! (-> arg1 origin y) (the float (+ v1-57 (the int sv-260)))) + (set! game-task-idx (-> obj task-line-index)) + (set! task-info-idx 0) + (let ((y-offset (+ default-y-origin-4x3 44))) + (set! default-y-origin-4x3 y-offset) + (set! (-> font-ctx origin y) (the float (+ y-offset (the int line-height)))) ) - (set! (-> arg1 width) 340.0) - (set! (-> arg1 height) 44.0) - (when (!= sv-260 0.0) + (set! (-> font-ctx width) 340.0) + (set! (-> font-ctx height) 44.0) + (when (!= line-height 0.0) (set! (-> *progress-state* missions-total-spacing) 0.0) - (dotimes (s4-1 sv-24) - (let* ((s3-1 (-> *game-info* mission-list s4-1)) - (a1-19 - (if (and (logtest? (-> s3-1 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s3-1 task))) - (-> *game-info* play-list (-> s3-1 task) text-name) - (-> s3-1 description) + (dotimes (game-task-idx-2 game-task-idx) + (let* ((game-task-info-2 (-> *game-info* mission-list game-task-idx-2)) + (task-text-id + (if (and (logtest? (-> game-task-info-2 flags) (game-task-node-flag closed)) + (task-complete? *game-info* (-> game-task-info-2 task)) + ) + (-> *game-info* play-list (-> game-task-info-2 task) text-name) + (-> game-task-info-2 description) ) ) - (s3-2 (lookup-text! *common-text* a1-19 #f)) - (f30-0 3.0) - (s2-0 print-game-text) + (line-text (lookup-text! *common-text* task-text-id #f)) + (line-padding 3.0) + (print-game-text-fn print-game-text) ) - (format (clear *temp-string*) "~S" s3-2) + (format (clear *temp-string*) "~S" line-text) (set! (-> *progress-state* missions-total-spacing) - (+ f30-0 (s2-0 *temp-string* arg1 #t 44 (bucket-id progress)) (-> *progress-state* missions-total-spacing)) + (+ line-padding + (print-game-text-fn *temp-string* font-ctx #t 44 (bucket-id progress)) + (-> *progress-state* missions-total-spacing) + ) ) ) ) ) - (set! sv-56 (- sv-56 (the int (-> *progress-state* missions-total-spacing)))) + (set! default-y-origin-4x3 (- default-y-origin-4x3 (the int (-> *progress-state* missions-total-spacing)))) (cond - ((< (-> arg0 sliding-height) 0.0) - (let* ((s4-2 (-> *game-info* mission-list sv-24)) - (a1-23 - (if (and (logtest? (-> s4-2 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s4-2 task))) - (-> *game-info* play-list (-> s4-2 task) text-name) - (-> s4-2 description) - ) - ) - (s4-3 (lookup-text! *common-text* a1-23 #f)) + ((< (-> progress sliding-height) 0.0) + (let* ((game-task-info-3 (-> *game-info* mission-list game-task-idx)) + (task-text-id-2 (if (and (logtest? (-> game-task-info-3 flags) (game-task-node-flag closed)) + (task-complete? *game-info* (-> game-task-info-3 task)) + ) + (-> *game-info* play-list (-> game-task-info-3 task) text-name) + (-> game-task-info-3 description) + ) + ) + (line-text-2 (lookup-text! *common-text* task-text-id-2 #f)) ) 0.0 - (let ((f30-1 3.0) - (s3-3 print-game-text) + (let ((line-padding-2 3.0) + (print-game-text-fn-2 print-game-text) ) - (format (clear *temp-string*) "~S" s4-3) - (let ((f0-36 (+ f30-1 (s3-3 *temp-string* arg1 #t 44 (bucket-id progress))))) - (set! sv-260 (* (-> arg0 sliding-height) f0-36)) + (format (clear *temp-string*) "~S" line-text-2) + (let ((f0-36 (+ line-padding-2 (print-game-text-fn-2 *temp-string* font-ctx #t 44 (bucket-id progress))))) + (set! line-height (* (-> progress sliding-height) f0-36)) ) ) ) ) (else - (let* ((s4-4 (-> *game-info* mission-list (+ sv-24 -1))) + (let* ((s4-4 (-> *game-info* mission-list (+ game-task-idx -1))) (a1-27 (if (and (logtest? (-> s4-4 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s4-4 task))) (-> *game-info* play-list (-> s4-4 task) text-name) @@ -4352,16 +4359,16 @@ (s3-4 print-game-text) ) (format (clear *temp-string*) "~S" s4-5) - (let ((f0-40 (+ f30-2 (s3-4 *temp-string* arg1 #t 44 (bucket-id progress))))) - (set! sv-260 (* (-> arg0 sliding-height) f0-40)) + (let ((f0-40 (+ f30-2 (s3-4 *temp-string* font-ctx #t 44 (bucket-id progress))))) + (set! line-height (* (-> progress sliding-height) f0-40)) ) ) ) ) ) - (set! (-> arg1 origin y) (the float (+ sv-56 (the int sv-260)))) - (while (and (< sv-20 sv-48) (< sv-20 (+ sv-24 10))) - (let* ((s4-6 (-> *game-info* mission-list sv-20)) + (set! (-> font-ctx origin y) (the float (+ default-y-origin-4x3 (the int line-height)))) + (while (and (< task-info-idx num-task-info) (< task-info-idx (+ game-task-idx 10))) + (let* ((s4-6 (-> *game-info* mission-list task-info-idx)) (s3-5 (if (and (logtest? (-> s4-6 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s4-6 task))) (-> *game-info* play-list (-> s4-6 task) text-name) @@ -4373,7 +4380,7 @@ 0.0 (set! f0-50 (cond - ((>= sv-20 (+ sv-24 -1)) + ((>= task-info-idx (+ game-task-idx -1)) (when (and (!= s3-5 381) (!= s3-5 380)) (let ((s3-6 print-game-text)) (format (clear *temp-string*) "~S" (lookup-text! @@ -4385,17 +4392,17 @@ #f ) ) - (s3-6 *temp-string* arg1 #f 44 (bucket-id progress)) + (s3-6 *temp-string* font-ctx #f 44 (bucket-id progress)) ) ) - (+! (-> arg1 origin x) 20.0) + (+! (-> font-ctx origin x) 20.0) (let ((f30-3 3.0) (s4-7 print-game-text) ) (format (clear *temp-string*) "~S" s5-1) - (set! f0-50 (+ f30-3 (s4-7 *temp-string* arg1 #f 44 (bucket-id progress)))) + (set! f0-50 (+ f30-3 (s4-7 *temp-string* font-ctx #f 44 (bucket-id progress)))) ) - (+! (-> arg1 origin x) -20.0) + (+! (-> font-ctx origin x) -20.0) f0-50 ) (else @@ -4403,30 +4410,30 @@ (s4-8 print-game-text) ) (format (clear *temp-string*) "~S" s5-1) - (+ f30-4 (s4-8 *temp-string* arg1 #t 44 (bucket-id progress))) + (+ f30-4 (s4-8 *temp-string* font-ctx #t 44 (bucket-id progress))) ) ) ) ) ) - (let ((v1-142 (+ sv-56 (the int f0-50)))) - (set! sv-56 v1-142) - (set! (-> arg1 origin y) (the float (+ v1-142 (the int sv-260)))) + (let ((v1-142 (+ default-y-origin-4x3 (the int f0-50)))) + (set! default-y-origin-4x3 v1-142) + (set! (-> font-ctx origin y) (the float (+ v1-142 (the int line-height)))) ) - (set! sv-20 (+ sv-20 1)) + (set! task-info-idx (+ task-info-idx 1)) ) (if (zero? (-> *progress-state* total-num-tasks)) (print-game-text (lookup-text! *common-text* (text-id progress-missions-none) #f) - arg1 + font-ctx #f 44 (bucket-id progress) ) ) ) - (end-scissor-missions sv-276 1.0) - (draw-missions-up-down arg1) + (end-scissor-missions hud-bounds 1.0) + (draw-missions-up-down font-ctx) 0 (none) ) @@ -6677,85 +6684,91 @@ ;; definition for method 10 of type menu-language-game-option ;; WARN: Return type mismatch int vs none. -(defmethod draw-option menu-language-game-option ((obj menu-language-game-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) +(defmethod draw-option menu-language-game-option ((obj menu-language-game-option) + (progress progress) + (font-ctx font-context) + (option-index int) + (selected symbol) + ) (with-pp - (let ((f30-0 (* 2.0 (- 0.5 (-> arg0 menu-transition))))) - (let ((v1-2 arg1)) - (set! (-> v1-2 scale) 0.65) + (let ((alpha (* 2.0 (- 0.5 (-> progress menu-transition))))) + (let ((font-ctx-1 font-ctx)) + (set! (-> font-ctx-1 scale) 0.65) ) - (case arg2 + (case option-index ((2) - (+! (-> arg1 origin y) 20.0) + (+! (-> font-ctx origin y) 20.0) ) ((3) - (+! (-> arg1 origin y) 32.0) + (+! (-> font-ctx origin y) 32.0) ) ) - (if (< f30-0 0.0) - (set! f30-0 0.0) + (if (< alpha 0.0) + (set! alpha 0.0) ) - (set! (-> arg1 alpha) f30-0) - (let ((a0-5 arg1)) - (set! (-> a0-5 flags) (font-flags kerning middle large)) + (set! (-> font-ctx alpha) alpha) + (let ((font-ctx-2 font-ctx)) + (set! (-> font-ctx-2 flags) (font-flags kerning middle large)) ) - (let ((s4-0 (&-> *setting-control* user-default language))) + (let ((curr-language-ptr (&-> *setting-control* user-default language))) (cond ((and (= (-> *progress-state* game-options-item-selected) 3) (-> *progress-state* game-options-item-picked)) - (let ((a0-7 arg1)) - (set! (-> a0-7 color) (font-color progress-force-selected)) + (let ((font-ctx-3 font-ctx)) + (set! (-> font-ctx-3 color) (font-color progress-force-selected)) ) - (draw-highlight (the int (-> arg1 origin y)) 44 f30-0) - (let ((s3-0 print-game-text)) + (draw-highlight (the int (-> font-ctx origin y)) 44 alpha) + (let ((print-game-text-fn-1 print-game-text)) (format (clear *temp-string*) "~S" (lookup-text! *common-text* (-> obj name) #f)) - (s3-0 *temp-string* arg1 #f 44 (bucket-id progress)) + (print-game-text-fn-1 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (+! (-> arg1 origin y) 24.0) + (+! (-> font-ctx origin y) 24.0) (-> obj language-selection) - (let ((s4-1 (-> s4-0 0))) + (let ((curr-language (-> curr-language-ptr 0))) 7 (if (-> obj language-transition) (seekl! (-> obj language-x-offset) 150 (the int (* 10.0 (-> pp clock time-adjust-ratio)))) ) (when (>= (-> obj language-x-offset) 75) - (set! (-> obj language-selection) (the-as uint s4-1)) + (set! (-> obj language-selection) (the-as uint curr-language)) (set! (-> obj language-transition) #f) (set! (-> obj language-x-offset) 0) 0 ) ) - (let ((a0-14 arg1)) - (set! (-> a0-14 color) (font-color progress)) + (let ((font-ctx-4 font-ctx)) + (set! (-> font-ctx-4 color) (font-color progress)) ) - (let ((v1-33 arg1)) - (set! (-> v1-33 scale) 0.5) + (let ((font-ctx-5 font-ctx)) + (set! (-> font-ctx-5 scale) 0.5) ) - (let ((a0-16 arg1)) - (set! (-> a0-16 color) (font-color progress)) + (let ((font-ctx-6 font-ctx)) + (set! (-> font-ctx-6 color) (font-color progress)) ) - (+! (-> arg1 origin x) -70.0) - (let ((s5-1 print-game-text)) + (+! (-> font-ctx origin x) -70.0) + (let ((print-game-text-fn-2 print-game-text)) (format (clear *temp-string*) "~33L~C" 163) - (s5-1 *temp-string* arg1 #f 44 (bucket-id progress)) + (print-game-text-fn-2 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (+! (-> arg1 origin x) 70.0) - (+! (-> arg1 origin x) 70.0) - (let ((s5-2 print-game-text)) + (+! (-> font-ctx origin x) 70.0) + (+! (-> font-ctx origin x) 70.0) + (let ((print-game-text-fn-3 print-game-text)) (format (clear *temp-string*) "~33L~C" 161) - (s5-2 *temp-string* arg1 #f 44 (bucket-id progress)) + (print-game-text-fn-3 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (+! (-> arg1 origin x) -70.0) - (let ((s5-3 arg1)) - (set! (-> s5-3 color) (progress-selected 0)) + (+! (-> font-ctx origin x) -70.0) + (let ((font-ctx-7 font-ctx)) + (set! (-> font-ctx-7 color) (progress-selected 0)) ) - (let ((v1-43 (if (and (= (scf-get-territory) 1) (zero? (-> *progress-state* game-options-language-index))) - 7 - (-> *progress-state* game-options-language-index) - ) - ) + (let ((language-name-idx + (if (and (= (scf-get-territory) 1) (zero? (-> *progress-state* game-options-language-index))) + 7 + (-> *progress-state* game-options-language-index) + ) + ) ) (print-game-text - (lookup-text! *common-text* (-> *language-name-remap* v1-43) #f) - arg1 + (lookup-text! *common-text* (-> *language-name-remap* language-name-idx) #f) + font-ctx #f 44 (bucket-id progress) @@ -6765,45 +6778,50 @@ (else (cond ((= (-> *progress-state* game-options-item-selected) 3) - (let ((s3-1 arg1)) - (set! (-> s3-1 color) (progress-selected 0)) + (let ((font-ctx-8 font-ctx)) + (set! (-> font-ctx-8 color) (progress-selected 0)) ) - (draw-highlight (the int (-> arg1 origin y)) 24 f30-0) + (draw-highlight (the int (-> font-ctx origin y)) 24 alpha) ) (else - (let ((a0-33 arg1)) - (set! (-> a0-33 color) (font-color progress)) + (let ((font-ctx-9 font-ctx)) + (set! (-> font-ctx-9 color) (font-color progress)) ) ) ) - (let ((v1-52 arg1)) - (set! (-> v1-52 scale) 0.65) + (let ((font-ctx-10 font-ctx)) + (set! (-> font-ctx-10 scale) 0.65) ) - (let ((s3-2 print-game-text)) + (let ((print-game-text-fn-4 print-game-text)) (format (clear *temp-string*) "~S" (lookup-text! *common-text* (-> obj name) #f)) - (s3-2 *temp-string* arg1 #f 44 (bucket-id progress)) + (print-game-text-fn-4 *temp-string* font-ctx #f 44 (bucket-id progress)) ) - (let ((v1-54 arg1)) - (set! (-> v1-54 scale) 0.5) + (let ((font-ctx-11 font-ctx)) + (set! (-> font-ctx-11 scale) 0.5) ) - (let ((a0-40 arg1)) - (set! (-> a0-40 color) (font-color progress)) + (let ((font-ctx-12 font-ctx)) + (set! (-> font-ctx-12 color) (font-color progress)) + ) + (format + (clear *temp-string*) + "~S" + (lookup-text! *common-text* (-> *language-name-remap* (-> curr-language-ptr 0)) #f) ) - (format (clear *temp-string*) "~S" (lookup-text! *common-text* (-> *language-name-remap* (-> s4-0 0)) #f)) *temp-string* - (+! (-> arg1 origin y) 24.0) - (let ((a0-44 arg1)) - (set! (-> a0-44 flags) (font-flags kerning middle large)) + (+! (-> font-ctx origin y) 24.0) + (let ((font-ctx-13 font-ctx)) + (set! (-> font-ctx-13 flags) (font-flags kerning middle large)) ) - (let ((v1-66 (if (and (= (scf-get-territory) 1) (zero? (-> *progress-state* game-options-language-index))) - 7 - (-> *progress-state* game-options-language-index) - ) - ) + (let ((language-name-idx-2 + (if (and (= (scf-get-territory) 1) (zero? (-> *progress-state* game-options-language-index))) + 7 + (-> *progress-state* game-options-language-index) + ) + ) ) (print-game-text - (lookup-text! *common-text* (-> *language-name-remap* v1-66) #f) - arg1 + (lookup-text! *common-text* (-> *language-name-remap* language-name-idx-2) #f) + font-ctx #f 44 (bucket-id progress) @@ -7986,7 +8004,3 @@ 0 (none) ) - - - - diff --git a/test/decompiler/reference/jak2/engine/ui/progress/progress-static_REF.gc b/test/decompiler/reference/jak2/engine/ui/progress/progress-static_REF.gc index d2950e27b2..2d5c060e5e 100644 --- a/test/decompiler/reference/jak2/engine/ui/progress/progress-static_REF.gc +++ b/test/decompiler/reference/jak2/engine/ui/progress/progress-static_REF.gc @@ -844,14 +844,14 @@ ;; definition for symbol *language-name-remap*, type (array text-id) (define *language-name-remap* (new 'static 'boxed-array :type text-id - (text-id text-x111) - (text-id text-x112) - (text-id text-x113) - (text-id text-x114) - (text-id text-x115) - (text-id text-x117) - (text-id text-x116) - (text-id text-x30b) + (text-id language-name-english) + (text-id language-name-french) + (text-id language-name-german) + (text-id language-name-spanish) + (text-id language-name-italian) + (text-id language-name-japanese) + (text-id language-name-korean) + (text-id language-name-english-uk) ) ) diff --git a/test/decompiler/reference/jak2/engine/ui/progress/progress_REF.gc b/test/decompiler/reference/jak2/engine/ui/progress/progress_REF.gc index b37a11dc9b..137f624a49 100644 --- a/test/decompiler/reference/jak2/engine/ui/progress/progress_REF.gc +++ b/test/decompiler/reference/jak2/engine/ui/progress/progress_REF.gc @@ -49,7 +49,7 @@ (stereo-mode-backup int32 :offset-assert 216) (secrets-unlocked symbol :offset-assert 220) (missions-total-spacing float :offset-assert 224) - (clear-screen basic :offset-assert 228) + (clear-screen symbol :offset-assert 228) ) :method-count-assert 9 :size-assert #xe8 @@ -1069,10 +1069,10 @@ (defmethod respond-to-cpad progress ((obj progress)) (mc-get-slot-info 0 *progress-save-info*) (when (-> obj current-options) - (let ((s5-0 (-> obj current-options options))) - (when (and s5-0 (= (-> obj menu-transition) 0.0)) + (let ((option-array (-> obj current-options options))) + (when (and option-array (= (-> obj menu-transition) 0.0)) (respond-progress - (the-as menu-option (-> s5-0 (-> obj option-index))) + (the-as menu-option (-> option-array (-> obj option-index))) obj (and (= (-> obj menu-transition) 0.0) (-> obj selected-option)) ) @@ -1098,7 +1098,7 @@ ((= (-> obj current-options) *main-options*) (sound-play "ring-select") ) - ((!= (length s5-0) 1) + ((!= (length option-array) 1) (sound-play "roll-over") ) ) @@ -1119,7 +1119,7 @@ ((= (-> obj current-options) *main-options*) (sound-play "ring-select") ) - ((!= (length s5-0) 1) + ((!= (length option-array) 1) (sound-play "roll-over") ) ) @@ -2510,7 +2510,7 @@ ((and (cpad-pressed? 0 confirm) (!= (-> arg0 current) 'none)) (logclear! (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons confirm)) (logclear! (-> *cpad-list* cpads 0 button0-rel 0) (pad-buttons confirm)) - (set! (-> *progress-state* clear-screen) (the-as basic #t)) + (set! (-> *progress-state* clear-screen) #t) (cond ((-> s5-0 0) (sound-play "generic-beep")