summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett Cox <garrettjcox@gmail.com>2026-01-27 19:32:39 -0600
committerGitHub <noreply@github.com>2026-01-27 19:32:39 -0600
commit9b699dee135f35ea660618765b2b38e7b6891d18 (patch)
tree0d3d57b04e6f1f63c9fe5a62a2a84e08053ec7c1
parentbcc562a3e4d711dc55154df63ce939398f461d87 (diff)
Some time logic fixes (#1506)
-rw-r--r--mm/2s2h/Rando/Logic/GlitchlessLogic.cpp18
-rw-r--r--mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp28
-rw-r--r--mm/2s2h/Rando/Logic/TimeLogic.cpp6
3 files changed, 25 insertions, 27 deletions
diff --git a/mm/2s2h/Rando/Logic/GlitchlessLogic.cpp b/mm/2s2h/Rando/Logic/GlitchlessLogic.cpp
index a9fadb032..3de4d0f8f 100644
--- a/mm/2s2h/Rando/Logic/GlitchlessLogic.cpp
+++ b/mm/2s2h/Rando/Logic/GlitchlessLogic.cpp
@@ -85,16 +85,10 @@ void ApplyGlitchlessLogicToSaveContext(std::vector<RandoCheckId>& checkPool, std
// Apply any new events
for (auto& randoEvent : randoRegion.events) {
- // When Clock Shuffle is active, always check events (don't skip based on eventsInLogic)
- bool skipEventCheck = !SettingClocks() && eventsInLogic.contains(&randoEvent);
-
- if (!skipEventCheck && randoEvent.second()) {
- // Only increment if not already triggered
- if (!eventsInLogic.contains(&randoEvent)) {
- RANDO_EVENTS[randoEvent.first]++;
- eventsInLogic.insert(&randoEvent);
- eventsInLogicChanged = true;
- }
+ if (!eventsInLogic.contains(&randoEvent) && randoEvent.second()) {
+ RANDO_EVENTS[randoEvent.first]++;
+ eventsInLogic.insert(&randoEvent);
+ eventsInLogicChanged = true;
}
}
@@ -147,10 +141,6 @@ void ApplyGlitchlessLogicToSaveContext(std::vector<RandoCheckId>& checkPool, std
timeState.timeSlices = TimeLogic::ExpandTimeForward(newTimeSlices, Regions[regionId]);
}
}
- // Trigger region re-exploration to discover new regions accessible with expanded time
- // Also trigger event re-evaluation since time-gated events may now be accessible
- regionsInLogicChanged = true;
- eventsInLogicChanged = true;
}
checksInLogicChanged = true;
diff --git a/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp b/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp
index 9187e4928..a01a65e0d 100644
--- a/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp
@@ -5,6 +5,15 @@
using namespace Rando::Logic;
+// TODO: This is a temporary fix to ensure cows can only be accessed if they can reach the ranch
+// on day 1 or beat the aliens. This will not work for entrance rando when that comes.
+#define BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_DAY \
+ ((BETWEEN(TIME_DAY1_AM_06_00, TIME_NIGHT1_PM_06_00) && CAN_BE_GORON && HAS_ITEM(ITEM_POWDER_KEG)) || \
+ RANDO_EVENTS[RE_COWS_FROM_ALIENS])
+#define BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_NIGHT \
+ ((BETWEEN(TIME_NIGHT1_PM_06_00, TIME_NIGHT1_AM_02_30) && CAN_BE_GORON && HAS_ITEM(ITEM_POWDER_KEG)) || \
+ RANDO_EVENTS[RE_COWS_FROM_ALIENS])
+
// clang-format off
static RegisterShipInitFunc initFunc([]() {
Regions[RR_CUCCO_SHACK] = RandoRegion{ .sceneId = SCENE_F01C,
@@ -161,9 +170,9 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_RANCH_BARN] = RandoRegion{ .sceneId = SCENE_OMOYA,
.checks = {
- CHECK(RC_ROMANI_RANCH_BARN_COW_LEFT, CAN_PLAY_SONG(EPONA) && (BETWEEN(TIME_NIGHT1_PM_06_00, TIME_NIGHT1_AM_02_30) || RANDO_EVENTS[RE_COWS_FROM_ALIENS])),
- CHECK(RC_ROMANI_RANCH_BARN_COW_MIDDLE, CAN_PLAY_SONG(EPONA) && (BETWEEN(TIME_NIGHT1_PM_06_00, TIME_NIGHT1_AM_02_30) || RANDO_EVENTS[RE_COWS_FROM_ALIENS])),
- CHECK(RC_ROMANI_RANCH_BARN_COW_RIGHT, CAN_PLAY_SONG(EPONA) && (BETWEEN(TIME_NIGHT1_PM_06_00, TIME_NIGHT1_AM_02_30) || RANDO_EVENTS[RE_COWS_FROM_ALIENS]))
+ CHECK(RC_ROMANI_RANCH_BARN_COW_LEFT, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_NIGHT),
+ CHECK(RC_ROMANI_RANCH_BARN_COW_MIDDLE, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_NIGHT),
+ CHECK(RC_ROMANI_RANCH_BARN_COW_RIGHT, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_NIGHT)
},
.exits = { // TO FROM
EXIT(ENTRANCE(ROMANI_RANCH, 2), ENTRANCE(RANCH_HOUSE, 0), true),
@@ -185,11 +194,13 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_ROMANI_RANCH] = RandoRegion{ .sceneId = SCENE_F01,
.checks = {
+ // TODO: Time logic is wrong for entrance rando
CHECK(RC_ROMANI_RANCH_ALIENS, CanKillEnemy(ACTOR_EN_INVADEPOH) && CAN_BE_GORON && HAS_ITEM(ITEM_POWDER_KEG)),
- CHECK(RC_ROMANI_RANCH_EPONAS_SONG, BEFORE(TIME_NIGHT1_PM_06_00)),
- CHECK(RC_ROMANI_RANCH_FIELD_COW_ENTRANCE, CAN_PLAY_SONG(EPONA) && (BETWEEN(TIME_NIGHT1_PM_06_00, TIME_NIGHT1_AM_02_30) || RANDO_EVENTS[RE_COWS_FROM_ALIENS])),
- CHECK(RC_ROMANI_RANCH_FIELD_COW_NEAR_HOUSE_BACK, CAN_PLAY_SONG(EPONA) && (BETWEEN(TIME_NIGHT1_PM_06_00, TIME_NIGHT1_AM_02_30) || RANDO_EVENTS[RE_COWS_FROM_ALIENS])),
- CHECK(RC_ROMANI_RANCH_FIELD_COW_NEAR_HOUSE_FRONT, CAN_PLAY_SONG(EPONA) && (BETWEEN(TIME_NIGHT1_PM_06_00, TIME_NIGHT1_AM_02_30) || RANDO_EVENTS[RE_COWS_FROM_ALIENS])),
+ // TODO: Time logic is wrong for entrance rando
+ CHECK(RC_ROMANI_RANCH_EPONAS_SONG, BEFORE(TIME_NIGHT1_PM_06_00) && CAN_BE_GORON && HAS_ITEM(ITEM_POWDER_KEG)),
+ CHECK(RC_ROMANI_RANCH_FIELD_COW_ENTRANCE, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_DAY),
+ CHECK(RC_ROMANI_RANCH_FIELD_COW_NEAR_HOUSE_BACK, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_DAY),
+ CHECK(RC_ROMANI_RANCH_FIELD_COW_NEAR_HOUSE_FRONT, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_DAY),
CHECK(RC_ROMANI_RANCH_FIELD_LARGE_CRATE, true),
CHECK(RC_CREMIA_ESCORT, HAS_ITEM(ITEM_BOW) && RANDO_EVENTS[RE_COWS_FROM_ALIENS] && AT(TIME_NIGHT2_PM_06_00)),
CHECK(RC_ROMANI_RANCH_GRASS_01, true),
@@ -256,7 +267,8 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_ROMANI_RANCH_TREE_05, true),
CHECK(RC_ROMANI_RANCH_TREE_06, true),
CHECK(RC_ROMANI_RANCH_TREE_07, true),
- CHECK(RC_ENEMY_DROP_ALIEN, CanKillEnemy(ACTOR_EN_INVADEPOH) && IS_NIGHT1()), // Night 1 only
+ // TODO: Time logic is wrong for entrance rando
+ CHECK(RC_ENEMY_DROP_ALIEN, CanKillEnemy(ACTOR_EN_INVADEPOH) && IS_NIGHT1() && CAN_BE_GORON && HAS_ITEM(ITEM_POWDER_KEG)), // Night 1 only
},
.exits = { // TO FROM
EXIT(ENTRANCE(MILK_ROAD, 1), ENTRANCE(ROMANI_RANCH, 0), true),
diff --git a/mm/2s2h/Rando/Logic/TimeLogic.cpp b/mm/2s2h/Rando/Logic/TimeLogic.cpp
index 5514f5895..bcaceee94 100644
--- a/mm/2s2h/Rando/Logic/TimeLogic.cpp
+++ b/mm/2s2h/Rando/Logic/TimeLogic.cpp
@@ -57,11 +57,7 @@ uint64_t ExpandTimeForward(uint64_t timeSlices, const RandoRegion& region) {
// Check if we can wait to this time
auto it = region.timeStayRestrictions.find(static_cast<TimeSlice>(i));
if (it != region.timeStayRestrictions.end()) {
- // CLOCK SHUFFLE: Ignore item-gated restrictions during logic generation
- // Player will obtain items eventually, so treat as permissive
- if (SettingClocks()) {
- expanded |= mask; // Allow expansion - player will get items eventually
- } else if (it->second()) {
+ if (it->second()) {
expanded |= mask; // Condition passed, add time
} else {
canWait = false; // Kicked out, STOP expansion