From dd21b5c9426b3e8eaf3df156cece953c750fc1ed Mon Sep 17 00:00:00 2001 From: Matt Dallmeyer Date: Sat, 27 Dec 2025 19:55:01 -0800 Subject: [PATCH] Speedrun fixes (jak 1 buzzer counts, jak 2 race intro autosplit) (#4103) fixes https://github.com/open-goal/jak-project/issues/4021 for jak1 also fixes a small bug for jak2 where the speedrun menu wasn't properly closed on resetting run, which would break the debug menu until you toggled the speedrun menu again. Looks like Hatkid already caught and fixed this in jak3 goes along with https://github.com/open-goal/speedrunning/pull/29 --- goal_src/jak1/pc/features/speedruns.gc | 40 ++++++++++++++++++++++++ goal_src/jak2/pc/features/autosplit-h.gc | 5 ++- goal_src/jak2/pc/features/autosplit.gc | 5 ++- goal_src/jak2/pc/features/speedruns.gc | 5 ++- 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/goal_src/jak1/pc/features/speedruns.gc b/goal_src/jak1/pc/features/speedruns.gc index c958eb51bb..26d5fe33ff 100644 --- a/goal_src/jak1/pc/features/speedruns.gc +++ b/goal_src/jak1/pc/features/speedruns.gc @@ -49,6 +49,16 @@ (game-task firecanyon-end) (game-task firecanyon-buzzer))) +(define *hub1-buzzer-task-list* + (new 'static 'boxed-array :type game-task + (game-task training-buzzer) + (game-task village1-buzzer) + (game-task beach-buzzer) + (game-task jungle-buzzer) + (game-task misty-buzzer) + (game-task firecanyon-buzzer) + )) + (define *hub2-cell-list* (new 'static 'boxed-array @@ -89,6 +99,15 @@ (game-task ogre-secret) (game-task ogre-buzzer))) +(define *hub2-buzzer-task-list* + (new 'static 'boxed-array :type game-task + (game-task village2-buzzer) + (game-task sunken-buzzer) + (game-task swamp-buzzer) + (game-task rolling-buzzer) + (game-task ogre-buzzer) + )) + (define *hub3-cell-list* (new 'static 'boxed-array @@ -232,6 +251,18 @@ (set! (-> *setting-control* default auto-save) #t) (none)) +(defun buzzer-task-collect-all ((buzz-task game-task)) + (let* ((ctrl (get-task-control buzz-task)) + (buzz-bits (get-reminder ctrl 0))) + (dotimes (buzz-index (the int (-> *FACT-bank* buzzer-max-default))) + ;; increment total if we haven't collected it before + (if (not (logtest? buzz-bits (ash 1 buzz-index))) (+! (-> *game-info* buzzer-total) 1.0)) + ;; set the updated bits + (set! buzz-bits (logior buzz-bits (ash 1 buzz-index))) + (save-reminder ctrl buzz-bits 0))) + (none) + ) + (defun setup-speedrun-post-blackout () (when (and (-> *speedrun-info* needs-post-blackout-setup?) (>= (-> *display* base-frame-counter) (-> *game-info* blackout-time))) @@ -350,6 +381,9 @@ ;; give all orbs from hub1 (set! (-> *game-info* money-total) 600.0) ;; 50+50+150+150+150+50 (set! (-> *game-info* money) 180.0) ;; 50+50+150+150+150+50 - (90+90+120+120) + ;; give all flies from hub1 (updates both buzzer-total and task reminder bitmasks) + (dotimes (idx (length *hub1-buzzer-task-list*)) + (buzzer-task-collect-all (-> *hub1-buzzer-task-list* idx))) ) (((speedrun-category hub3-100)) ;; skip intro cutscene @@ -365,6 +399,12 @@ ;; give all orbs from hub1+2 (set! (-> *game-info* money-total) 1300.0) ;; 50+50+150+150+150+50 + 50+200+200+200+50 (set! (-> *game-info* money) 370.0) ;; 50+50+150+150+150+50 - (90+90+120+120) + 50+200+200+200+50 - (90+90+90+120+120) + ;; give all flies from hub1 (updates both buzzer-total and task reminder bitmasks) + (dotimes (idx (length *hub1-buzzer-task-list*)) + (buzzer-task-collect-all (-> *hub1-buzzer-task-list* idx))) + ;; give all flies from hub2 (updates both buzzer-total and task reminder bitmasks) + (dotimes (idx (length *hub2-buzzer-task-list*)) + (buzzer-task-collect-all (-> *hub2-buzzer-task-list* idx))) ) (((speedrun-category all-cutscenes)) ;; no post-blackout actions needed diff --git a/goal_src/jak2/pc/features/autosplit-h.gc b/goal_src/jak2/pc/features/autosplit-h.gc index 2e5bdefe75..9de82b6739 100644 --- a/goal_src/jak2/pc/features/autosplit-h.gc +++ b/goal_src/jak2/pc/features/autosplit-h.gc @@ -80,7 +80,7 @@ (res-forest-protect uint8) (res-drill-mech uint8) (res-city-save-lurkers uint8) - (res-stadium-race-class uint8) + (res-stadium-race-class1 uint8) (res-palace-sneak-in uint8) (res-castle-break-in uint8) (res-castle-boss uint8) @@ -133,6 +133,9 @@ (sewer-escort-get-gun uint8) ;; get peacemaker (forest-protect-introduction uint8) ;; talk to onin (protect samos) (forest-protect-meeting uint8) ;; talk to samos (protect samos) + (int-stadium-race-class3 uint8) ;; talk to keira (class 3) + (int-stadium-race-class2 uint8) ;; talk to keira (class 2) + (int-stadium-race-class1 uint8) ;; talk to keira (class 1) ;; TODO - orbs in level X ;; end marker just to make things look nice in a memory view diff --git a/goal_src/jak2/pc/features/autosplit.gc b/goal_src/jak2/pc/features/autosplit.gc index 355c56cc3d..86d252f5c1 100644 --- a/goal_src/jak2/pc/features/autosplit.gc +++ b/goal_src/jak2/pc/features/autosplit.gc @@ -102,7 +102,7 @@ (autosplit-flag-task-complete! res-forest-protect forest-protect) (autosplit-flag-task-complete! res-drill-mech drill-mech) (autosplit-flag-task-complete! res-city-save-lurkers city-save-lurkers) - (autosplit-flag-task-complete! res-stadium-race-class stadium-race-class) + (autosplit-flag-task-complete! res-stadium-race-class1 stadium-race-class) (autosplit-flag-task-complete! res-palace-sneak-in palace-sneak-in) (autosplit-flag-task-complete! res-castle-break-in castle-break-in) (autosplit-flag-task-complete! res-castle-boss castle-boss) @@ -155,6 +155,9 @@ (autosplit-flag-task-node-closed! sewer-escort-get-gun sewer-escort-get-gun) ;; get peacemaker (autosplit-flag-task-node-closed! forest-protect-introduction forest-protect-introduction) ;; talk to onin (protect samos) (autosplit-flag-task-node-closed! forest-protect-meeting forest-protect-meeting) ;; talk to samos (protect samos) + (autosplit-flag-task-node-closed! int-stadium-race-class3 stadium-race-class3-introduction) ;; talk to keira (class 3) + (autosplit-flag-task-node-closed! int-stadium-race-class2 stadium-race-class2-introduction) ;; talk to keira (class 2) + (autosplit-flag-task-node-closed! int-stadium-race-class1 stadium-race-class1-introduction) ;; talk to keira (class 1) ;; debug only, draw stuff to the screen so i don't have to stare at a memory editor ;; (debug-draw this) diff --git a/goal_src/jak2/pc/features/speedruns.gc b/goal_src/jak2/pc/features/speedruns.gc index ebefbf7ade..02f71a2e7d 100644 --- a/goal_src/jak2/pc/features/speedruns.gc +++ b/goal_src/jak2/pc/features/speedruns.gc @@ -253,7 +253,10 @@ (define *speedrun-popup-menu-entries* (new 'static 'boxed-array :type popup-menu-entry (new 'static 'popup-menu-button :label "Reset" - :on-confirm (lambda () (send-event (ppointer->process *speedrun-manager*) 'invoke (speedrun-menu-command reset)))) + :on-confirm + (lambda () + (send-event (ppointer->process *speedrun-manager*) 'invoke (speedrun-menu-command reset)) + (send-event (ppointer->process (-> *speedrun-manager* 0 popup-menu)) 'close-menu))) (new 'static 'popup-menu-submenu :label "Built-in category select" :entries (new 'static 'boxed-array :type popup-menu-entry (new 'static 'popup-menu-flag :label "Normal"