mirror of
https://github.com/open-goal/jak-project
synced 2026-06-25 02:02:08 -04:00
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
This commit is contained in:
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user