diff options
| author | Garrett Cox <garrettjcox@gmail.com> | 2026-01-27 19:32:39 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-27 19:32:39 -0600 |
| commit | 9b699dee135f35ea660618765b2b38e7b6891d18 (patch) | |
| tree | 0d3d57b04e6f1f63c9fe5a62a2a84e08053ec7c1 | |
| parent | bcc562a3e4d711dc55154df63ce939398f461d87 (diff) | |
Some time logic fixes (#1506)
| -rw-r--r-- | mm/2s2h/Rando/Logic/GlitchlessLogic.cpp | 18 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp | 28 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/TimeLogic.cpp | 6 |
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 |
