summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett Cox <garrettjcox@gmail.com>2026-01-22 09:41:56 -0600
committerGitHub <noreply@github.com>2026-01-22 09:41:56 -0600
commit99204fb69c923cba79299675c2ce21bb4f8ee587 (patch)
treea3509ae6348307e7bf571feb3c3047e5cf67c317
parent58eef5d931e437ca828bdf2387616b1d7bd63c06 (diff)
Fixes for suns song usage in time shuffle (#1488)
-rw-r--r--mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp9
-rw-r--r--mm/2s2h/Rando/Menu.cpp10
-rw-r--r--mm/2s2h/Rando/MiscBehavior/ClockShuffle.cpp30
-rw-r--r--mm/2s2h/Rando/StartingItems.cpp3
-rw-r--r--mm/2s2h/Rando/StaticData/Items.cpp2
5 files changed, 30 insertions, 24 deletions
diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp
index 285c935b4..b1c91d3c5 100644
--- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp
+++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp
@@ -401,7 +401,14 @@ void LoadAvailableWindows() {
.name = "Time",
.columns = 6,
.scale = 1.0f,
- .items = GetItemsFromRange(TRACKER_ITEM_RANDO, RI_TIME_DAY_1, RI_TIME_NIGHT_3),
+ .items = {
+ { TRACKER_ITEM_RANDO, RI_TIME_DAY_1 },
+ { TRACKER_ITEM_RANDO, RI_TIME_NIGHT_1 },
+ { TRACKER_ITEM_RANDO, RI_TIME_DAY_2 },
+ { TRACKER_ITEM_RANDO, RI_TIME_NIGHT_2 },
+ { TRACKER_ITEM_RANDO, RI_TIME_DAY_3 },
+ { TRACKER_ITEM_RANDO, RI_TIME_NIGHT_3 },
+ },
});
itemTrackerGroupsAvailable.push_back(TrackerGroup{
diff --git a/mm/2s2h/Rando/Menu.cpp b/mm/2s2h/Rando/Menu.cpp
index e25d052ad..b0b63dc35 100644
--- a/mm/2s2h/Rando/Menu.cpp
+++ b/mm/2s2h/Rando/Menu.cpp
@@ -196,6 +196,16 @@ void RefreshMetrics() {
for (auto& item : startingItems) {
setOfItemsInPool.insert(item);
}
+ // Handle weird edge case with Random shuffle time option missing one time because it's computed given
+ if (randoSaveInfo.randoSaveOptions[RO_CLOCK_SHUFFLE] &&
+ randoSaveInfo.randoSaveOptions[RO_CLOCK_SHUFFLE_PROGRESSIVE] == RO_CLOCK_SHUFFLE_RANDOM) {
+ setOfItemsInPool.insert(RI_TIME_DAY_1);
+ setOfItemsInPool.insert(RI_TIME_NIGHT_1);
+ setOfItemsInPool.insert(RI_TIME_DAY_2);
+ setOfItemsInPool.insert(RI_TIME_NIGHT_2);
+ setOfItemsInPool.insert(RI_TIME_DAY_3);
+ setOfItemsInPool.insert(RI_TIME_NIGHT_3);
+ }
ableToBalance = checksInPool >= (itemsInPool - junkInPool);
}
diff --git a/mm/2s2h/Rando/MiscBehavior/ClockShuffle.cpp b/mm/2s2h/Rando/MiscBehavior/ClockShuffle.cpp
index 692ad329e..ae5a8a853 100644
--- a/mm/2s2h/Rando/MiscBehavior/ClockShuffle.cpp
+++ b/mm/2s2h/Rando/MiscBehavior/ClockShuffle.cpp
@@ -288,7 +288,7 @@ bool SceneNeedsReloadForTimeSkip(s16 sceneId) {
case SCENE_BOWLING: // Honey & Darling - minigame mode changes based on day/time
return true;
case SCENE_CLOCKTOWER: // South Clock Town - Clock Tower platform appears at midnight Night 3
- return true;
+ return CURRENT_DAY == 3;
default:
return false; // Most scenes handle time changes without reload
}
@@ -375,34 +375,22 @@ void ApplyTimeSkip(int nextHalfDay, EnTest4* enTest4) {
}
// Apply time change
- gSaveContext.save.day = day;
+ gSaveContext.save.day = time == GAME_TIME_DAY_START ? day - 1 : day;
gSaveContext.save.time = time;
+ // Unset Sun's Song state
+ if (gSaveContext.sunsSongState != SUNSSONG_INACTIVE) {
+ gSaveContext.sunsSongState = SUNSSONG_INACTIVE;
+ R_TIME_SPEED = gPlayState->envCtx.sceneTimeSpeed;
+ }
+
// Update actor state
enTest4->daytimeIndex = IsCurrentlyNightTime(time) ? 1 : 0;
+ enTest4->prevBellTime = CURRENT_TIME;
- // Handle scene reload for time-sensitive scenes
if (SceneNeedsReloadForTimeSkip(gPlayState->sceneId)) {
ForceSceneReload();
- enTest4->prevTime = time - CLOCK_TIME(0, 1);
- return;
}
-
- // Terminal state handling
- if (nextHalfDay == ClockItems::TERMINAL_STATE) {
- enTest4->prevTime = time - CLOCK_TIME(0, 1);
- return;
- }
-
- // Day transition handling
- if (time == GAME_TIME_DAY_START) {
- gSaveContext.save.day--;
- } else {
- Interface_NewDay(gPlayState, gSaveContext.save.day);
- Environment_NewDay(&gPlayState->envCtx);
- }
-
- enTest4->prevTime = time - CLOCK_TIME(0, 1);
}
// Application function: Applies the time skip
diff --git a/mm/2s2h/Rando/StartingItems.cpp b/mm/2s2h/Rando/StartingItems.cpp
index 3430284b2..61f6530c8 100644
--- a/mm/2s2h/Rando/StartingItems.cpp
+++ b/mm/2s2h/Rando/StartingItems.cpp
@@ -54,8 +54,9 @@ std::vector<RandoItemId> GetComputedStartingItems(RandoSaveInfo& randoSaveInfo)
// When shuffling time, if the player did not choose any starting time items, we need to give them at least one.
if (randoSaveInfo.randoSaveOptions[RO_CLOCK_SHUFFLE] == RO_GENERIC_YES) {
+ auto configuredStartedItems = Rando::GetStartingItemsFromSave(randoSaveInfo);
bool hasTimeItem = false;
- for (RandoItemId randoItemId : startingItems) {
+ for (RandoItemId randoItemId : configuredStartedItems) {
if (randoItemId >= RI_TIME_DAY_1 && randoItemId <= RI_TIME_PROGRESSIVE) {
hasTimeItem = true;
break;
diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp
index 204e88a8c..f64a5fc41 100644
--- a/mm/2s2h/Rando/StaticData/Items.cpp
+++ b/mm/2s2h/Rando/StaticData/Items.cpp
@@ -292,7 +292,7 @@ std::map<StartingItemCategory, std::vector<RandoItemId>> StartingItemsMap = {
{ STARTING_ITEMS_MISC,
{ RI_SOUL_BOSS_GOHT, RI_SOUL_BOSS_GYORG, RI_SOUL_BOSS_MAJORA, RI_SOUL_BOSS_ODOLWA, RI_SOUL_BOSS_TWINMOLD,
RI_FROG_BLUE, RI_FROG_CYAN, RI_FROG_PINK, RI_FROG_WHITE,
- RI_TIME_DAY_1, RI_TIME_DAY_2, RI_TIME_DAY_3, RI_TIME_NIGHT_1, RI_TIME_NIGHT_2, RI_TIME_NIGHT_3, RI_TIME_PROGRESSIVE,
+ RI_TIME_DAY_1, RI_TIME_NIGHT_1, RI_TIME_DAY_2, RI_TIME_NIGHT_2, RI_TIME_DAY_3, RI_TIME_NIGHT_3, RI_TIME_PROGRESSIVE,
RI_OCARINA_BUTTON_A, RI_OCARINA_BUTTON_C_DOWN, RI_OCARINA_BUTTON_C_RIGHT, RI_OCARINA_BUTTON_C_LEFT, RI_OCARINA_BUTTON_C_UP,
} },
};