From fc5c75534d829a0bcdc3f0762ecd2fb40333a864 Mon Sep 17 00:00:00 2001 From: Matt Dallmeyer <2515356+dallmeyer@users.noreply.github.com> Date: Tue, 7 Feb 2023 16:41:48 -0800 Subject: [PATCH] Autosplitter - add per-level fly & orb counts (#2192) Adds fields to the autosplit struct for the number of orbs and scout flies collected in each level. This can be used for autosplitting on orb/fly counts Tested together with https://github.com/open-goal/speedrunning/pull/8 [autosplit_orbs.mp4](https://user-images.githubusercontent.com/2515356/216900730-92b7b947-cc4a-4629-b7f2-1dc10248c9e9.mp4) [autosplit_fly.mp4](https://user-images.githubusercontent.com/2515356/216900759-e3042426-7cb0-4cb9-ae05-9c44827df6a0.mp4) ![image](https://user-images.githubusercontent.com/2515356/216901323-ffae97c8-3557-45f8-91db-cd86d76dd498.png) ![image](https://user-images.githubusercontent.com/2515356/216901026-59eb3fb6-281d-489d-a50c-010760246072.png) --- .../engine/ui/progress/progress-static.gc | 69 ++++++++++++------- goal_src/jak1/game.gp | 2 +- goal_src/jak1/pc/features/autosplit-h.gc | 36 +++++++++- goal_src/jak1/pc/features/autosplit.gc | 35 ++++++++++ 4 files changed, 116 insertions(+), 26 deletions(-) diff --git a/goal_src/jak1/engine/ui/progress/progress-static.gc b/goal_src/jak1/engine/ui/progress/progress-static.gc index a7be91aa82..eabf2d6b44 100644 --- a/goal_src/jak1/engine/ui/progress/progress-static.gc +++ b/goal_src/jak1/engine/ui/progress/progress-static.gc @@ -153,33 +153,54 @@ ;; maps options to a progress screen (define *options-remap* (new 'static 'boxed-array :type (array game-option) :length 0 :allocated-length (#if (not PC_PORT) 35 60))) -;; TODO probably an enum. +;; added in PC port +(defenum level-task-data-index + :type int32 + (training 0) + (village1 1) + (beach 2) + (jungle 3) + (misty 4) + (firecanyon 5) + (village2 6) + (sunken 7) + (swamp 8) + (rolling 9) + (ogre 10) + (village3 11) + (snow 12) + (cave 13) + (lavatube 14) + (citadel 15) + (max 16) + ) + ;; maps level-info indices to the appropriate offset in *level-task-data* (define *level-task-data-remap* (new 'static 'boxed-array :type int32 - 0 - 1 - 2 - 3 ;; jungle? - 3 ;; jungleb? - 4 - 5 - 6 - 7 ;; sunken? - 7 ;; sunkenb? - 8 - 9 - 10 - 11 - 12 - 13 ;; maincave? - 13 ;; robocave? - 13 ;; darkcave? - 14 - 15 ;; citadel? - 15 ;; finalboss? - 4 ;; demo? - 4 ;; intro? + (level-task-data-index training) + (level-task-data-index village1) + (level-task-data-index beach) + (level-task-data-index jungle) ;; jungle? + (level-task-data-index jungle) ;; jungleb? + (level-task-data-index misty) + (level-task-data-index firecanyon) + (level-task-data-index village2) + (level-task-data-index sunken) ;; sunken? + (level-task-data-index sunken) ;; sunkenb? + (level-task-data-index swamp) + (level-task-data-index rolling) + (level-task-data-index ogre) + (level-task-data-index village3) + (level-task-data-index snow) + (level-task-data-index cave) ;; maincave? + (level-task-data-index cave) ;; robocave? + (level-task-data-index cave) ;; darkcave? + (level-task-data-index lavatube) + (level-task-data-index citadel) ;; citadel? + (level-task-data-index citadel) ;; finalboss? + (level-task-data-index misty) ;; demo? + (level-task-data-index misty) ;; intro? ) ) diff --git a/goal_src/jak1/game.gp b/goal_src/jak1/game.gp index 004914c029..50172961e4 100644 --- a/goal_src/jak1/game.gp +++ b/goal_src/jak1/game.gp @@ -2041,7 +2041,7 @@ ;; Custom or Modified Code (goal-src "pc/features/autosplit-h.gc") -(goal-src "pc/features/autosplit.gc" "autosplit-h" "task-control-h") +(goal-src "pc/features/autosplit.gc" "autosplit-h" "task-control-h" "progress-static") (goal-src "pc/features/speedruns.gc" "speedruns-h" "autosplit-h") (goal-src "pc/pckernel-h.gc" "dma-buffer") (goal-src "pc/util/pc-anim-util.gc" "target-h") diff --git a/goal_src/jak1/pc/features/autosplit-h.gc b/goal_src/jak1/pc/features/autosplit-h.gc index c51e29ceb8..8c044f40b6 100644 --- a/goal_src/jak1/pc/features/autosplit-h.gc +++ b/goal_src/jak1/pc/features/autosplit-h.gc @@ -11,7 +11,41 @@ (num-power-cells uint32) (num-orbs uint32) (num-scout-flies uint32) - (padding-stats uint8 200) ;; padding for future growth + ;; orbs per-level + (training-num-orbs uint8) + (village1-num-orbs uint8) + (beach-num-orbs uint8) + (jungle-num-orbs uint8) + (misty-num-orbs uint8) + (firecanyon-num-orbs uint8) + (village2-num-orbs uint8) + (sunken-num-orbs uint8) + (swamp-num-orbs uint8) + (rolling-num-orbs uint8) + (ogre-num-orbs uint8) + (village3-num-orbs uint8) + (snow-num-orbs uint8) + (cave-num-orbs uint8) + (lavatube-num-orbs uint8) + (citadel-num-orbs uint8) + ;; scout flies per-level + (training-num-scout-flies uint8) + (village1-num-scout-flies uint8) + (beach-num-scout-flies uint8) + (jungle-num-scout-flies uint8) + (misty-num-scout-flies uint8) + (firecanyon-num-scout-flies uint8) + (village2-num-scout-flies uint8) + (sunken-num-scout-flies uint8) + (swamp-num-scout-flies uint8) + (rolling-num-scout-flies uint8) + (ogre-num-scout-flies uint8) + (village3-num-scout-flies uint8) + (snow-num-scout-flies uint8) + (cave-num-scout-flies uint8) + (lavatube-num-scout-flies uint8) + (citadel-num-scout-flies uint8) + (padding-stats uint8 168) ;; padding for future growth ;; loading/cutscene/control related info (game-hash uint32) (in-cutscene? symbol) diff --git a/goal_src/jak1/pc/features/autosplit.gc b/goal_src/jak1/pc/features/autosplit.gc index 0bbfb77250..46aa5129c5 100644 --- a/goal_src/jak1/pc/features/autosplit.gc +++ b/goal_src/jak1/pc/features/autosplit.gc @@ -15,6 +15,41 @@ (set! (-> *autosplit-info-jak1* num-orbs) (the int (-> *game-info* money-total))) (set! (-> *autosplit-info-jak1* num-scout-flies) (the int (-> *game-info* buzzer-total))) + ;; per-level orb/fly counts + (set! (-> *autosplit-info-jak1* training-num-orbs) (-> *game-info* money-per-level (level-task-data-index training))) + (set! (-> *autosplit-info-jak1* village1-num-orbs) (-> *game-info* money-per-level (level-task-data-index village1))) + (set! (-> *autosplit-info-jak1* beach-num-orbs) (-> *game-info* money-per-level (level-task-data-index beach))) + (set! (-> *autosplit-info-jak1* jungle-num-orbs) (-> *game-info* money-per-level (level-task-data-index jungle))) + (set! (-> *autosplit-info-jak1* misty-num-orbs) (-> *game-info* money-per-level (level-task-data-index misty))) + (set! (-> *autosplit-info-jak1* firecanyon-num-orbs) (-> *game-info* money-per-level (level-task-data-index firecanyon))) + (set! (-> *autosplit-info-jak1* village2-num-orbs) (-> *game-info* money-per-level (level-task-data-index village2))) + (set! (-> *autosplit-info-jak1* sunken-num-orbs) (-> *game-info* money-per-level (level-task-data-index sunken))) + (set! (-> *autosplit-info-jak1* swamp-num-orbs) (-> *game-info* money-per-level (level-task-data-index swamp))) + (set! (-> *autosplit-info-jak1* rolling-num-orbs) (-> *game-info* money-per-level (level-task-data-index rolling))) + (set! (-> *autosplit-info-jak1* ogre-num-orbs) (-> *game-info* money-per-level (level-task-data-index ogre))) + (set! (-> *autosplit-info-jak1* village3-num-orbs) (-> *game-info* money-per-level (level-task-data-index village3))) + (set! (-> *autosplit-info-jak1* snow-num-orbs) (-> *game-info* money-per-level (level-task-data-index snow))) + (set! (-> *autosplit-info-jak1* cave-num-orbs) (-> *game-info* money-per-level (level-task-data-index cave))) + (set! (-> *autosplit-info-jak1* lavatube-num-orbs) (-> *game-info* money-per-level (level-task-data-index lavatube))) + (set! (-> *autosplit-info-jak1* citadel-num-orbs) (-> *game-info* money-per-level (level-task-data-index citadel))) + + (set! (-> *autosplit-info-jak1* training-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index training) task-info (-> *level-task-data* (level-task-data-index training) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* village1-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index village1) task-info (-> *level-task-data* (level-task-data-index village1) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* beach-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index beach) task-info (-> *level-task-data* (level-task-data-index beach) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* jungle-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index jungle) task-info (-> *level-task-data* (level-task-data-index jungle) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* misty-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index misty) task-info (-> *level-task-data* (level-task-data-index misty) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* firecanyon-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index firecanyon) task-info (-> *level-task-data* (level-task-data-index firecanyon) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* village2-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index village2) task-info (-> *level-task-data* (level-task-data-index village2) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* sunken-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index sunken) task-info (-> *level-task-data* (level-task-data-index sunken) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* swamp-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index swamp) task-info (-> *level-task-data* (level-task-data-index swamp) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* rolling-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index rolling) task-info (-> *level-task-data* (level-task-data-index rolling) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* ogre-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index ogre) task-info (-> *level-task-data* (level-task-data-index ogre) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* village3-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index village3) task-info (-> *level-task-data* (level-task-data-index village3) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* snow-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index snow) task-info (-> *level-task-data* (level-task-data-index snow) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* cave-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index cave) task-info (-> *level-task-data* (level-task-data-index cave) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* lavatube-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index lavatube) task-info (-> *level-task-data* (level-task-data-index lavatube) buzzer-task-index) task-id))) + (set! (-> *autosplit-info-jak1* citadel-num-scout-flies) (buzzer-count *game-info* (-> *level-task-data* (level-task-data-index citadel) task-info (-> *level-task-data* (level-task-data-index citadel) buzzer-task-index) task-id))) + ;; loading/cutscene related flags (set! (-> *autosplit-info-jak1* in-cutscene?) (-> *pc-settings* movie?))