From 4876b6af21d169ef697239a38bed0cc34d5d979d Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Sat, 28 Jan 2023 18:44:29 -0500 Subject: [PATCH] g/jak2: cleanup `target-board` a bit, add a new feature (#2154) --- goal_src/jak2/engine/common_objs/voicebox.gc | 6 + goal_src/jak2/engine/debug/default-menu.gc | 1 + goal_src/jak2/engine/target/board/board-h.gc | 17 ++ .../jak2/engine/target/board/target-board.gc | 225 ++++++++++++------ .../levels/stadium/jetboard/skatea-obs.gc | 1 + goal_src/jak2/pc/pckernel-h.gc | 2 + goal_src/jak2/pc/pckernel.gc | 2 + 7 files changed, 179 insertions(+), 75 deletions(-) diff --git a/goal_src/jak2/engine/common_objs/voicebox.gc b/goal_src/jak2/engine/common_objs/voicebox.gc index 95da3bf2b4..8528c43f83 100644 --- a/goal_src/jak2/engine/common_objs/voicebox.gc +++ b/goal_src/jak2/engine/common_objs/voicebox.gc @@ -450,6 +450,9 @@ (set! (-> *game-info* timer) (the-as time-frame v1-15)) ) ) + ;; Print trick text to screen if available + (#when PC_PORT + (render-combo *board-trick-tracker*)) 0 (none) ) @@ -474,6 +477,9 @@ ) (change-parent self (ppointer->process s4-0)) (try-update-focus (-> self focus) s5-2) + (#when PC_PORT + (end-combo! *board-trick-tracker*) + (reset-combo! *board-trick-tracker*)) (go-virtual enter) ) ) diff --git a/goal_src/jak2/engine/debug/default-menu.gc b/goal_src/jak2/engine/debug/default-menu.gc index 7acac10518..7d8720ddcd 100644 --- a/goal_src/jak2/engine/debug/default-menu.gc +++ b/goal_src/jak2/engine/debug/default-menu.gc @@ -5908,6 +5908,7 @@ '(menu "PC Settings" (flag "Discord RPC" #t ,(dm-lambda-boolean-flag (-> *pc-settings* discord-rpc?))) + (flag "Jetboard Trick String" #t ,(dm-lambda-boolean-flag (-> *pc-settings* jetboard-trick-text?))) (function "Save" #f ,(lambda () (commit-to-file *pc-settings*))) ) ) diff --git a/goal_src/jak2/engine/target/board/board-h.gc b/goal_src/jak2/engine/target/board/board-h.gc index 8ab404d4b0..b591f7baf0 100644 --- a/goal_src/jak2/engine/target/board/board-h.gc +++ b/goal_src/jak2/engine/target/board/board-h.gc @@ -29,6 +29,23 @@ (darkjak-giant 18) ) +(#when PC_PORT + +(deftype board-trick-tracker (structure) + ((tricks-in-combo board-tricks 16) + (num-tricks-in-combo uint32) + (points-in-combo float) + (combo-in-progress? symbol)) + (:methods + (reset-combo! (_type_) none 9) + (add-trick-to-combo! (_type_ board-tricks float) none 10) + (render-combo (_type_) none 11) + (end-combo! (_type_) none 12))) + +(define-extern *board-trick-tracker* board-trick-tracker) + +) + ;; DECOMP BEGINS (deftype board (process-drawable) diff --git a/goal_src/jak2/engine/target/board/target-board.gc b/goal_src/jak2/engine/target/board/target-board.gc index 3b0c776bae..68be920af8 100644 --- a/goal_src/jak2/engine/target/board/target-board.gc +++ b/goal_src/jak2/engine/target/board/target-board.gc @@ -52,7 +52,139 @@ (define-extern target-board-clone-anim (state handle target)) (define-extern target-board-hit (state vector attack-info target)) -;; decomp begins +(#when PC_PORT + +(define *board-trick-tracker* (new 'static 'board-trick-tracker)) + +(defmethod reset-combo! board-trick-tracker ((obj board-trick-tracker)) + (set! (-> obj num-tricks-in-combo) 0) + (set! (-> obj points-in-combo) 0.0) + (countdown (idx 16) + (set! (-> obj tricks-in-combo idx) (board-tricks none))) + (none)) + +(defmethod add-trick-to-combo! board-trick-tracker ((obj board-trick-tracker) (trick board-tricks) (points float)) + (when (not (-> obj combo-in-progress?)) + (set! (-> obj combo-in-progress?) #t) + (reset-combo! obj)) + (when (< (-> obj num-tricks-in-combo) 15) + (set! (-> obj tricks-in-combo (-> obj num-tricks-in-combo)) trick) + (set! (-> obj num-tricks-in-combo) (inc (-> obj num-tricks-in-combo))) + (set! (-> obj points-in-combo) (+ (-> obj points-in-combo) points))) + (none)) + + +(defun board-trick->string ((trick board-tricks)) + "TODO - make a prefix removal function instead" + (cond + ((= trick (board-tricks board-rail-jump)) + "rail-jump" + ) + ((= trick (board-tricks board-nosegrab)) + "nosegrab" + ) + ((= trick (board-tricks board-board-spin)) + "board-spin" + ) + ((= trick (board-tricks board-kickflip)) + "kickflip" + ) + ((= trick (board-tricks board-method)) + "method" + ) + ((= trick (board-tricks board-spin)) + "spin" + ) + ((= trick (board-tricks board-boost)) + "boost" + ) + ((= trick (board-tricks board-duck-jump)) + "duck-jump" + ) + ((= trick (board-tricks board-board-flip)) + "board-flip" + ) + ((= trick (board-tricks board-rail)) + "rail" + ) + ((= trick (board-tricks none)) + "none" + ) + ((= trick (board-tricks board-quick-jump)) + "quick-jump" + ) + ((= trick (board-tricks board-noseflip)) + "noseflip" + ) + ((= trick (board-tricks board-jump)) + "jump" + ) + ((= trick (board-tricks board-flip)) + "flip" + ) + (else + "*unknown*" + ))) + +(defmethod render-combo board-trick-tracker ((obj board-trick-tracker)) + (when (not (-> *pc-settings* jetboard-trick-text?)) + (return 0)) + (clear *temp-string*) + ;; Also only print each trick type once + (let ((freq (new 'stack-no-clear 'array 'uint32 19)) + (printed (new 'stack-no-clear 'array 'symbol 19)) + (idx 0) + (text-entries 0)) + ;; Initialize the arrays + (countdown (i 19) + (set! (-> freq i) 0) + (set! (-> printed i) #f)) + ;; Build up a frequency list, god i wish i had a map + (while (< idx (-> obj num-tricks-in-combo)) + (let ((trick (-> obj tricks-in-combo idx))) + (set! (-> freq trick) (inc (-> freq trick))) + (set! idx (inc idx)))) + ;; Now we can construct the string + (set! idx 0) + (while (< idx (-> obj num-tricks-in-combo)) + (let* ((trick (-> obj tricks-in-combo idx)) + (times (-> freq trick)) + (skip? (-> printed trick)) + (color (case trick + (((board-tricks board-boost) (board-tricks board-jump) (board-tricks board-duck-jump) (board-tricks board-quick-jump)) + "~[~9L") + (((board-tricks board-rail) (board-tricks board-rail-jump)) + "~[~3L") + (((board-tricks board-spin) (board-tricks board-flip) (board-tricks board-board-flip) (board-tricks board-nosegrab)) + "~[~26L") + (((board-tricks board-board-spin) (board-tricks board-method) (board-tricks board-noseflip) (board-tricks board-kickflip)) + "~[~15L"))) + (padding (if (= idx 0) "" " "))) + (when (not skip?) + (if (> times 0) + (format *temp-string* "~S~S~S~S x ~D" padding color (board-trick->string trick) "~[~0L" times) + (format *temp-string* "~S~S~S~S" padding color (board-trick->string trick) "~[~0L")) + (set! (-> printed trick) #t) + (set! text-entries (inc text-entries)) + (when (= (mod text-entries 4) 0) + (format *temp-string* "~%")) + )) + (set! idx (inc idx)))) + ;; Add points + (when (> (-> obj points-in-combo) 0.0) + (format *temp-string* "~%~S~D" "~[~38L" (the int (-> obj points-in-combo)))) + ;; Print it finally + (let ((font-ctx (new 'stack 'font-context *font-default-matrix* 0 325 0.0 (font-color default-#cddbcd) (font-flags shadow kerning middle)))) + (print-game-text-scaled *temp-string* 1.0 font-ctx 320)) + (none)) + +(defmethod end-combo! board-trick-tracker ((obj board-trick-tracker)) + (set! (-> obj combo-in-progress?) #f) + (none)) + +) + +;; DECOMP BEGINS (define *board-walk-mods* (new 'static 'surface @@ -2881,86 +3013,28 @@ (let ((t9-4 format) (a0-29 #t) (a1-8 "trick: ~S (~D) ~,,0f") - (v1-30 arg0) - ) + (trick-name (enum->string board-tricks arg0))) (t9-4 a0-29 a1-8 - (cond - ((= v1-30 (board-tricks board-rail-jump)) - "board-rail-jump" - ) - ((= v1-30 (board-tricks board-nosegrab)) - "board-nosegrab" - ) - ((= v1-30 (board-tricks board-board-spin)) - "board-board-spin" - ) - ((= v1-30 (board-tricks board-kickflip)) - "board-kickflip" - ) - ((= v1-30 (board-tricks board-method)) - "board-method" - ) - ((= v1-30 (board-tricks board-spin)) - "board-spin" - ) - ((= v1-30 (board-tricks board-boost)) - "board-boost" - ) - ((= v1-30 (board-tricks darkjak)) - "darkjak" - ) - ((= v1-30 (board-tricks darkjak-giant)) - "darkjak-giant" - ) - ((= v1-30 (board-tricks board-duck-jump)) - "board-duck-jump" - ) - ((= v1-30 (board-tricks board-board-flip)) - "board-board-flip" - ) - ((= v1-30 (board-tricks board-rail)) - "board-rail" - ) - ((= v1-30 (board-tricks none)) - "none" - ) - ((= v1-30 (board-tricks darkjak-bomb0)) - "darkjak-bomb0" - ) - ((= v1-30 (board-tricks board-quick-jump)) - "board-quick-jump" - ) - ((= v1-30 (board-tricks board-noseflip)) - "board-noseflip" - ) - ((= v1-30 (board-tricks darkjak-bomb1)) - "darkjak-bomb1" - ) - ((= v1-30 (board-tricks board-jump)) - "board-jump" - ) - ((= v1-30 (board-tricks board-flip)) - "board-flip" - ) - (else - "*unknown*" - ) - ) + trick-name s4-0 s3-1 ) ) - (when (nonzero? (-> obj trick-count)) - (format #t " + combo ~,,0f" (-> obj trick-points-array (+ (-> obj trick-count) -1))) - (+! (-> obj trick-points-array (+ (-> obj trick-count) -1)) - (-> obj trick-points-array (+ (-> obj trick-count) -1)) - ) - ) - (format #t "~%") - (set! (-> obj trick-array (-> obj trick-count)) arg0) - (set! (-> obj trick-points-array (-> obj trick-count)) s3-1) + (let ((total-points s3-1)) + (when (nonzero? (-> obj trick-count)) + (format #t " + combo ~,,0f" (-> obj trick-points-array (+ (-> obj trick-count) -1))) + (+! total-points (-> obj trick-points-array (+ (-> obj trick-count) -1))) + (+! (-> obj trick-points-array (+ (-> obj trick-count) -1)) + (-> obj trick-points-array (+ (-> obj trick-count) -1)) + ) + ) + (format #t "~%") + (set! (-> obj trick-array (-> obj trick-count)) arg0) + (set! (-> obj trick-points-array (-> obj trick-count)) s3-1) + (#when PC_PORT + (add-trick-to-combo! *board-trick-tracker* arg0 total-points))) ) ) (+! (-> obj trick-count) 1) @@ -3003,7 +3077,8 @@ ) ) (sound-play "trick-score") - ) + (#when PC_PORT + (end-combo! *board-trick-tracker*))) ) (set! (-> obj trick-count) 0) 0 diff --git a/goal_src/jak2/levels/stadium/jetboard/skatea-obs.gc b/goal_src/jak2/levels/stadium/jetboard/skatea-obs.gc index 06bc578ec2..229a6b0d85 100644 --- a/goal_src/jak2/levels/stadium/jetboard/skatea-obs.gc +++ b/goal_src/jak2/levels/stadium/jetboard/skatea-obs.gc @@ -1359,6 +1359,7 @@ This commonly includes things such as: - collision information - loading the skeleton group / bones - sounds" + (stack-size-set! (-> obj main-thread) 1024) (local-vars (sv-16 res-tag)) (set! sv-16 (new 'static 'res-tag)) (let ((v1-1 (res-lump-data (-> obj entity) 'actor-groups pointer :tag-ptr (& sv-16)))) diff --git a/goal_src/jak2/pc/pckernel-h.gc b/goal_src/jak2/pc/pckernel-h.gc index 97e528a701..e8ece3d30c 100644 --- a/goal_src/jak2/pc/pckernel-h.gc +++ b/goal_src/jak2/pc/pckernel-h.gc @@ -50,6 +50,7 @@ ((version pckernel-version) ;; version of this settings (discord-rpc? symbol) ;; enable discord rich presence integration + (jetboard-trick-text? symbol) ;; enable rendering jetboard trick combo during minigame ) (:methods @@ -90,6 +91,7 @@ "Set the default settings" (set! (-> obj version) PC_KERNEL_VERSION) (set! (-> obj discord-rpc?) #t) + (set! (-> obj jetboard-trick-text?) #t) (none)) (defmacro with-pc (&rest body) diff --git a/goal_src/jak2/pc/pckernel.gc b/goal_src/jak2/pc/pckernel.gc index 20bb633af5..919e17617c 100644 --- a/goal_src/jak2/pc/pckernel.gc +++ b/goal_src/jak2/pc/pckernel.gc @@ -238,6 +238,7 @@ (dosettings (file) (case-str *pc-temp-string* (("discord-rpc?") (set! (-> obj discord-rpc?) (file-stream-read-symbol file))) + (("jetboard-trick-text?") (set! (-> obj jetboard-trick-text?) (file-stream-read-symbol file))) ) ) ) @@ -266,6 +267,7 @@ (format file "(settings #x~X~%" (-> obj version)) (format file " (discord-rpc? ~A)~%" (-> obj discord-rpc?)) + (format file " (jetboard-trick-text? ~A)~%" (-> obj jetboard-trick-text?)) (format file " )~%") (file-stream-close file) )