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:
Matt Dallmeyer
2022-08-20 07:16:16 -07:00
committed by GitHub
parent e71adf6e3d
commit 04d6b13ced
4 changed files with 269 additions and 88 deletions
+37
View File
@@ -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)
)
+204 -67
View File
@@ -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)
)
)
)
)
)
+9
View File
@@ -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
+19 -21
View File
@@ -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)
)