From 04d6b13ced775715b520819ea79d5cf9ef35f72f Mon Sep 17 00:00:00 2001 From: Matt Dallmeyer <2515356+dallmeyer@users.noreply.github.com> Date: Sat, 20 Aug 2022 07:16:16 -0700 Subject: [PATCH] HUD - show total/level counts on dpad up/down (#1756) * hud - show total counters on dpad up, level counters on dpad down * make views toggle-able, extend hud timeout on toggle, decompilation cleanup * review feedback round 1 * refactor draw-hud methods * scaled version of draw-string-xy working, need to adjust hud labels still * adjust scale/position of hud counters * remove unnecessary adjustments * update comments --- goal_src/jak1/engine/gfx/font.gc | 37 ++++ goal_src/jak1/engine/ui/hud-classes.gc | 271 +++++++++++++++++++------ goal_src/jak1/engine/ui/hud-h.gc | 9 + goal_src/jak1/engine/ui/text.gc | 40 ++-- 4 files changed, 269 insertions(+), 88 deletions(-) diff --git a/goal_src/jak1/engine/gfx/font.gc b/goal_src/jak1/engine/gfx/font.gc index 15018341f1..41227aa637 100644 --- a/goal_src/jak1/engine/gfx/font.gc +++ b/goal_src/jak1/engine/gfx/font.gc @@ -1830,3 +1830,40 @@ (draw-string str buf context) ) ) + +;; Added for PC port +(defun draw-string-xy-scaled ((str string) (buf dma-buffer) (x int) (y int) (color font-color) (flags font-flags) (scale float)) + "Draw a string at the given xy location, with the given scale." + (let ((font-ctxt (new 'stack 'font-context *font-default-matrix* x y 0.0 color flags))) + (let ((scaled-width (* (-> font-ctxt width) scale)) + (scaled-height (* (-> font-ctxt height) scale)) + (orig-mat-x-scale (-> font-ctxt mat vector 0 x)) + (orig-mat-y-scale (-> font-ctxt mat vector 1 y)) + (orig-vid-parms-x-scale (-> *video-parms* relative-x-scale)) + (orig-vid-parms-y-scale (-> *video-parms* relative-y-scale)) + ) + (*! (-> font-ctxt scale) scale) + (set! (-> font-ctxt width) scaled-width) + (set! (-> font-ctxt height) scaled-height) + + ;; scaling globals *font-default-matrix*, *video-parms* (based on print-game-text scaling) + (*! (-> *font-default-matrix* vector 0 x) scale) + (*! (-> *font-default-matrix* vector 1 y) scale) + (*! (-> *video-parms* relative-x-scale) scale) + (*! (-> *video-parms* relative-y-scale) scale) + (set! (-> *video-parms* relative-x-scale-reciprical) (/ 1.0 (-> *video-parms* relative-x-scale))) + (set! (-> *video-parms* relative-y-scale-reciprical) (/ 1.0 scale)) + + (draw-string str buf font-ctxt) + + ;; un-scaling globals *font-default-matrix*, *video-params* + (set! (-> *font-default-matrix* vector 0 x) orig-mat-x-scale) + (set! (-> *font-default-matrix* vector 1 y) orig-mat-y-scale) + (set! (-> *video-parms* relative-x-scale) orig-vid-parms-x-scale) + (set! (-> *video-parms* relative-y-scale) orig-vid-parms-y-scale) + (set! (-> *video-parms* relative-x-scale-reciprical) (/ 1.0 (-> *video-parms* relative-x-scale))) + (set! (-> *video-parms* relative-y-scale-reciprical) (/ 1.0 (-> *video-parms* relative-y-scale))) + ) + ) + (none) + ) diff --git a/goal_src/jak1/engine/ui/hud-classes.gc b/goal_src/jak1/engine/ui/hud-classes.gc index 3aa4a02483..73c71ecfc5 100644 --- a/goal_src/jak1/engine/ui/hud-classes.gc +++ b/goal_src/jak1/engine/ui/hud-classes.gc @@ -737,22 +737,79 @@ :flag-assert #x1b00c00124 ) - +(define-extern *game-counts* game-count-info) (defmethod draw-hud hud-money ((obj hud-money)) (let ((t9-0 (method-of-type hud draw-hud))) (t9-0 obj) ) + ;; modified for pc port + (cond + ((cpad-hold? 0 up) + (set! *hud-collectable-view* (hud-collectable-view game-totals)) + (set! (-> obj trigger-time) (-> *display* base-frame-counter)) + ) + ((cpad-hold? 0 down) + (set! *hud-collectable-view* (hud-collectable-view level-totals)) + (set! (-> obj trigger-time) (-> *display* base-frame-counter)) + ) + ((or (cpad-hold? 0 left) (cpad-hold? 0 right)) + (set! *hud-collectable-view* (hud-collectable-view original)) + (set! (-> obj trigger-time) (-> *display* base-frame-counter)) + ) + ) (with-dma-buffer-add-bucket ((buf (-> (current-frame) global-buf)) (bucket-id debug)) - (draw-string-xy (string-format "~D" (-> obj value)) buf - (+ (-> obj text-x) (* (-> obj x-sgn) (-> obj offset))) - (/ (* (+ (-> obj text-y) (* (-> obj y-sgn) (-> obj offset)) (-> obj y-offset)) - (the int (-> *video-parms* relative-y-scale)) - ) - 2 + (let* ((string-x (+ (-> obj text-x) (* (-> obj x-sgn) (-> obj offset)))) + (string-y (/ (* (+ (-> obj text-y) (* (-> obj y-sgn) (-> obj offset)) (-> obj y-offset)) (the int (-> *video-parms* relative-y-scale))) 2)) + ) + (case *hud-collectable-view* + (((hud-collectable-view game-totals)) + ;; show orbs collected/total across entire game + (draw-string-xy-scaled + (string-format + "~D~%/~D" + (the int (-> *game-info* money-total)) + 2000 ;;(-> (the progress (-> *progress-process* 0)) total-nb-of-orbs) ) + buf + string-x + (- string-y 5) (font-color dark-yellow) - (font-flags shadow kerning large)) + (font-flags shadow kerning large) + 0.8 + ) + ) + (((hud-collectable-view level-totals)) + (let ((lvl-idx (-> *level-task-data-remap* (+ (-> *target* current-level info index) -1)))) + ;; show orbs collected/total this level + (draw-string-xy-scaled + (string-format + "~D~%/~D" + (-> *game-info* money-per-level lvl-idx) + (-> *game-counts* data lvl-idx money-count) + ) + buf + string-x + (- string-y 5) + (font-color dark-yellow) + (font-flags shadow kerning large) + 0.8 + ) + ) + ) + (((hud-collectable-view original)) + ;; show original (total collected, unspent orbs) + (draw-string-xy + (string-format "~D" (-> obj value)) + buf + string-x + string-y + (font-color dark-yellow) + (font-flags shadow kerning large) + ) + ) + ) + ) ) 0 (none) @@ -1099,37 +1156,81 @@ (defmethod draw-hud hud-fuel-cell ((obj hud-fuel-cell)) (let ((t9-0 (method-of-type hud draw-hud))) (t9-0 obj) - ) - (let* ((s5-0 (-> *display* frames (-> *display* on-screen) frame global-buf)) - (gp-0 (-> s5-0 base)) - ) - (let ((s4-0 draw-string-xy)) - (format (clear *temp-string*) "~D" (-> obj value)) - (s4-0 - *temp-string* - s5-0 - (+ (-> obj text-x) (* (-> obj x-sgn) (-> obj offset))) - (/ (* (+ (-> obj text-y) (* (-> obj y-sgn) (-> obj offset)) (-> obj y-offset)) - (the int (-> *video-parms* relative-y-scale)) - ) - 2 - ) - (font-color dark-yellow) - (font-flags shadow kerning large) - ) + ) + ;; modified for pc port + (cond + ((cpad-hold? 0 up) + (set! *hud-collectable-view* (hud-collectable-view game-totals)) + (set! (-> obj trigger-time) (-> *display* base-frame-counter)) ) - (let ((a3-7 (-> s5-0 base))) - (let ((v1-8 (the-as object (-> s5-0 base)))) - (set! (-> (the-as (pointer int64) v1-8)) #x20000000) - (set! (-> (the-as dma-packet v1-8) vif0) (new 'static 'vif-tag)) - (set! (-> (the-as dma-packet v1-8) vif1) (new 'static 'vif-tag)) - (set! (-> s5-0 base) (&+ (the-as pointer v1-8) 16)) - ) - (dma-bucket-insert-tag - (-> *display* frames (-> *display* on-screen) frame bucket-group) - (bucket-id debug) - gp-0 - (the-as (pointer dma-tag) a3-7) + ((cpad-hold? 0 down) + (set! *hud-collectable-view* (hud-collectable-view level-totals)) + (set! (-> obj trigger-time) (-> *display* base-frame-counter)) + ) + ((or (cpad-hold? 0 left) (cpad-hold? 0 right)) + (set! *hud-collectable-view* (hud-collectable-view original)) + (set! (-> obj trigger-time) (-> *display* base-frame-counter)) + ) + ) + (with-dma-buffer-add-bucket ((buf (-> (current-frame) global-buf)) + (bucket-id debug)) + (let* ((string-x (+ (-> obj text-x) (* (-> obj x-sgn) (-> obj offset)))) + (string-y (/ (* (+ (-> obj text-y) (* (-> obj y-sgn) (-> obj offset)) (-> obj y-offset)) (the int (-> *video-parms* relative-y-scale))) 2)) + ) + (case *hud-collectable-view* + (((hud-collectable-view game-totals)) + ;; show cells collected/total across entire game + (draw-string-xy-scaled + (string-format + "~D~%/~D" + (the int (-> *game-info* fuel)) + 101 ;;(-> (the progress (-> *progress-process* 0)) total-nb-of-power-cells) + ) + buf + string-x + (- string-y 5) + (font-color dark-yellow) + (font-flags shadow kerning large) + 0.8 + ) + ) + (((hud-collectable-view level-totals)) + (let ((lvl-idx (-> *level-task-data-remap* (+ (-> *target* current-level info index) -1))) + (completed-task-count 0)) + ;; determine number of cells collected in this level + (dotimes (task-idx (-> *level-task-data* lvl-idx nb-of-tasks)) + (if (= (get-task-status (-> *level-task-data* lvl-idx task-info task-idx task-id)) (task-status invalid)) + (+! completed-task-count 1) + ) + ) + + ;; show cells/total collected this level + (draw-string-xy-scaled + (string-format + "~D~%/~D" + completed-task-count + (-> *level-task-data* lvl-idx nb-of-tasks) + ) + buf + string-x + (- string-y 5) + (font-color dark-yellow) + (font-flags shadow kerning large) + 0.8 + ) + ) + ) + (((hud-collectable-view original)) + ;; show original (cells collected across entire game) + (draw-string-xy + (string-format "~D" (-> obj value)) + buf + string-x + string-y + (font-color dark-yellow) + (font-flags shadow kerning large) + ) + ) ) ) ) @@ -1362,6 +1463,21 @@ (let ((t9-0 (method-of-type hud draw-hud))) (t9-0 obj) ) + ;; modified for pc port + (cond + ((cpad-hold? 0 up) + (set! *hud-collectable-view* (hud-collectable-view game-totals)) + (set! (-> obj trigger-time) (-> *display* base-frame-counter)) + ) + ((cpad-hold? 0 down) + (set! *hud-collectable-view* (hud-collectable-view level-totals)) + (set! (-> obj trigger-time) (-> *display* base-frame-counter)) + ) + ((or (cpad-hold? 0 left) (cpad-hold? 0 right)) + (set! *hud-collectable-view* (hud-collectable-view original)) + (set! (-> obj trigger-time) (-> *display* base-frame-counter)) + ) + ) (set! (-> obj text-y) (+ (if (nonzero? (-> obj next-y-offset)) (-> obj text-y-offset) 0 @@ -1369,36 +1485,57 @@ 362 ) ) - (let* ((s5-0 (-> *display* frames (-> *display* on-screen) frame global-buf)) - (gp-0 (-> s5-0 base)) - ) - (let ((s3-0 draw-string-xy)) - (format (clear *temp-string*) "~2,' D" (-> obj value)) - (s3-0 - *temp-string* - s5-0 - (+ (-> obj text-x) (* (-> obj x-sgn) (-> obj offset))) - (/ (* (+ (-> obj text-y) (* (-> obj y-sgn) (-> obj offset)) (-> obj y-offset)) - (the int (-> *video-parms* relative-y-scale)) + (with-dma-buffer-add-bucket ((buf (-> (current-frame) global-buf)) + (bucket-id debug)) + (let* ((string-x (+ (-> obj text-x) (* (-> obj x-sgn) (-> obj offset)))) + (string-y (/ (* (+ (-> obj text-y) (* (-> obj y-sgn) (-> obj offset)) (-> obj y-offset)) (the int (-> *video-parms* relative-y-scale))) 2)) + ) + (case *hud-collectable-view* + (((hud-collectable-view game-totals)) + ;; show flies collected/total across entire game + (draw-string-xy-scaled + (string-format + " ~D~% /~D" + (the int (-> *game-info* buzzer-total)) + 112 ;; (-> (the progress (-> *progress-process* 0)) total-nb-of-buzzers) ) - 2 - ) - (font-color dark-yellow) - (font-flags shadow kerning large) - ) - ) - (let ((a3-7 (-> s5-0 base))) - (let ((v1-11 (the-as object (-> s5-0 base)))) - (set! (-> (the-as (pointer int64) v1-11)) #x20000000) - (set! (-> (the-as dma-packet v1-11) vif0) (new 'static 'vif-tag)) - (set! (-> (the-as dma-packet v1-11) vif1) (new 'static 'vif-tag)) - (set! (-> s5-0 base) (&+ (the-as pointer v1-11) 16)) - ) - (dma-bucket-insert-tag - (-> *display* frames (-> *display* on-screen) frame bucket-group) - (bucket-id debug) - gp-0 - (the-as (pointer dma-tag) a3-7) + buf + string-x + (- string-y 5) + (font-color dark-yellow) + (font-flags shadow kerning large) + 0.8 + ) + ) + (((hud-collectable-view level-totals)) + (let ((lvl-idx (-> *level-task-data-remap* (+ (-> *target* current-level info index) -1)))) + ;; show flies collected/total this level + (draw-string-xy-scaled + (string-format + " ~D~% /~D" + (buzzer-count *game-info* (-> *level-task-data* lvl-idx task-info (-> *level-task-data* lvl-idx buzzer-task-index) task-id)) + (-> *game-counts* data lvl-idx buzzer-count) + ) + buf + string-x + (- string-y 5) + (font-color dark-yellow) + (font-flags shadow kerning large) + 0.8 + ) + ) + ) + (((hud-collectable-view original)) + ;; show original (flies collected this level) + (draw-string-xy + (string-format " ~D" (-> obj value)) + buf + string-x + string-y + (font-color dark-yellow) + (font-flags shadow kerning large) + ) + ) ) ) ) diff --git a/goal_src/jak1/engine/ui/hud-h.gc b/goal_src/jak1/engine/ui/hud-h.gc index 49a777bdd4..1a4bd9cc42 100644 --- a/goal_src/jak1/engine/ui/hud-h.gc +++ b/goal_src/jak1/engine/ui/hud-h.gc @@ -141,6 +141,15 @@ ) ) +;; added for pc port +(defenum hud-collectable-view + (original) + (game-totals) + (level-totals) + ) + +(define *hud-collectable-view* (hud-collectable-view original)) + 0 diff --git a/goal_src/jak1/engine/ui/text.gc b/goal_src/jak1/engine/ui/text.gc index 7b6ee437c3..b28e0668fa 100644 --- a/goal_src/jak1/engine/ui/text.gc +++ b/goal_src/jak1/engine/ui/text.gc @@ -327,35 +327,33 @@ (defun print-game-text-scaled ((str string) (scale float) (font-ctxt font-context) (alpha int)) "Print text, with a given scaling" - (let ((f26-0 (-> font-ctxt width)) - (f30-0 (-> font-ctxt height)) - (f24-0 (-> font-ctxt origin x)) - (f22-0 (-> font-ctxt origin y)) - (f28-0 (-> font-ctxt scale)) + (let ((orig-width (-> font-ctxt width)) + (orig-height (-> font-ctxt height)) + (orig-x (-> font-ctxt origin x)) + (orig-y (-> font-ctxt origin y)) + (orig-scale (-> font-ctxt scale)) ) - (let ((f0-1 (* (-> font-ctxt width) scale)) - (f1-2 (* (-> font-ctxt height) scale)) + (let ((scaled-width (* (-> font-ctxt width) scale)) + (scaled-height (* (-> font-ctxt height) scale)) ) - (if (logtest? (-> font-ctxt flags) 4) - (+! (-> font-ctxt origin x) (* 0.5 (- f26-0 f0-1))) + (if (logtest? (-> font-ctxt flags) (font-flags middle)) + (+! (-> font-ctxt origin x) (* 0.5 (- orig-width scaled-width))) ) - (if (logtest? (-> font-ctxt flags) 8) + (if (logtest? (-> font-ctxt flags) (font-flags left)) ;; this code is really weird. it does the divide with an int, but fails ;; to convert it back to a float before adding?? - (+! (-> font-ctxt origin y) (the-as float (/ (the int (- f30-0 f1-2)) 2))) + (+! (-> font-ctxt origin y) (the-as float (/ (the int (- orig-height scaled-height)) 2))) ) - (let ((v1-10 font-ctxt)) - (set! (-> v1-10 scale) (* f28-0 scale)) - ) - (set! (-> font-ctxt width) f0-1) - (set! (-> font-ctxt height) f1-2) + (set! (-> font-ctxt scale) (* orig-scale scale)) + (set! (-> font-ctxt width) scaled-width) + (set! (-> font-ctxt height) scaled-height) ) (print-game-text str font-ctxt #f alpha 22) - (set! (-> font-ctxt origin x) f24-0) - (set! (-> font-ctxt origin y) f22-0) - (set! (-> font-ctxt width) f26-0) - (set! (-> font-ctxt height) f30-0) - (set! (-> font-ctxt scale) f28-0) + (set! (-> font-ctxt origin x) orig-x) + (set! (-> font-ctxt origin y) orig-y) + (set! (-> font-ctxt width) orig-width) + (set! (-> font-ctxt height) orig-height) + (set! (-> font-ctxt scale) orig-scale) ) (none) )