diff options
| author | Eblo <7004497+Eblo@users.noreply.github.com> | 2025-11-17 12:48:44 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-17 12:48:44 -0500 |
| commit | e2f7c9414332fe67f7d7216705463f6d4546a984 (patch) | |
| tree | c87648b153ff40c6ab3ec355b22b9cc4c72a469e | |
| parent | 724616a208126b08721767ceb32e6214671e2b59 (diff) | |
Revise Octo and region logic in Southern Swamp (#1340)
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/South.cpp | 57 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Types.h | 1 |
2 files changed, 39 insertions, 19 deletions
diff --git a/mm/2s2h/Rando/Logic/Regions/South.cpp b/mm/2s2h/Rando/Logic/Regions/South.cpp index c72cff0dc..4800a4498 100644 --- a/mm/2s2h/Rando/Logic/Regions/South.cpp +++ b/mm/2s2h/Rando/Logic/Regions/South.cpp @@ -5,11 +5,9 @@ using namespace Rando::Logic; -inline bool CanGetPastBigOcto() { - // Boat ride. This takes Link to a landing in the next region and thus has no additional requirements. - if (RANDO_EVENTS[RE_SOUTHERN_SWAMP_RIDE_BOAT]) { - return true; - } +#define CAN_TRAVERSE_WAIST_DEEP_WATER (CAN_USE_ABILITY(SWIM) || CAN_BE_DEKU || CAN_BE_ZORA || CAN_BE_GORON) + +inline bool CanGetPastBigOctoWithoutBoat() { /* * Kill the Big Octo. This means the water is still in a poison state, so swimming is not logically considered due * to the damage boost method not being logically considered. This piece may need expanded as tricks and glitches @@ -23,13 +21,21 @@ inline bool CanGetPastBigOcto() { * over the water as Deku, or he uses one of the forms tall enough to walk through the water. This may also be * expanded if FD is ever logically considered. */ - if (RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE] && - (CAN_USE_ABILITY(SWIM) || CAN_BE_DEKU || CAN_BE_ZORA || CAN_BE_GORON)) { + if (RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE] && CAN_TRAVERSE_WAIST_DEEP_WATER) { return true; } return false; } +inline bool CanGetPastBigOcto() { + // Boat ride. This takes Link to a landing in the next region and thus has no additional requirements. + if (RANDO_EVENTS[RE_SOUTHERN_SWAMP_RIDE_BOAT]) { + return true; + } + + return CanGetPastBigOctoWithoutBoat(); +} + // clang-format off static RegisterShipInitFunc initFunc([]() { Regions[RR_DEKU_KINGS_CHAMBER_HOLDING_CELL] = RandoRegion{ .name = "Holding Cell", .sceneId = SCENE_DEKU_KING, @@ -272,8 +278,6 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_SOUTHERN_SWAMP_SCRUB_DEED, Flags_GetRandoInf(RANDO_INF_OBTAINED_DEED_LAND)), CHECK(RC_SOUTHERN_SWAMP_SCRUB_BEANS, CAN_BE_DEKU), CHECK(RC_SOUTHERN_SWAMP_OWL_STATUE, CAN_USE_SWORD), - CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_01, CAN_BE_DEKU || CAN_BE_ZORA), - CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_02, CAN_BE_DEKU || CAN_BE_ZORA), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_02, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_03, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), @@ -304,8 +308,9 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(TOURIST_INFORMATION, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 1), true), }, .connections = { - CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, CanGetPastBigOcto()), - CONNECTION(RR_SOUTHERN_SWAMP_NEAR_WOODS, (CAN_BE_HUMAN && CAN_USE_ABILITY(SWIM)) || (CAN_BE_DEKU || CAN_BE_ZORA || CAN_BE_GORON)), + CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, CanGetPastBigOcto()), // Via Octo near Tourist Center + CONNECTION(RR_SOUTHERN_SWAMP_NEAR_FLOWERS, CAN_TRAVERSE_WAIST_DEEP_WATER), + CONNECTION(RR_SOUTHERN_SWAMP_NEAR_WOODS, CAN_TRAVERSE_WAIST_DEEP_WATER), }, .events = { EVENT(RE_ACCESS_SPRING_WATER, true), @@ -317,17 +322,33 @@ static RegisterShipInitFunc initFunc([]() { ENTRANCE(SOUTHERN_SWAMP_POISONED, 10), // From Song of Soaring } }; - Regions[RR_SOUTHERN_SWAMP_NEAR_WOODS] = RandoRegion{ .name = "North Woods Section", .sceneId = SCENE_20SICHITAI, + Regions[RR_SOUTHERN_SWAMP_NEAR_FLOWERS] = RandoRegion{ .name = "Flowers Section", .sceneId = SCENE_20SICHITAI, .checks = { CHECK(RC_SOUTHERN_SWAMP_FROG, HAS_ITEM(ITEM_MASK_DON_GERO)), + CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_01, CAN_BE_DEKU || CAN_BE_ZORA), + CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_02, CAN_BE_DEKU || CAN_BE_ZORA), + }, + .connections = { + CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, CanGetPastBigOctoWithoutBoat()), + CONNECTION(RR_SOUTHERN_SWAMP_NORTH, CAN_TRAVERSE_WAIST_DEEP_WATER), + CONNECTION(RR_SOUTHERN_SWAMP_NEAR_WOODS, CAN_TRAVERSE_WAIST_DEEP_WATER), + }, + .events = { + // Any form but Deku can bottle water here. Human can do it from a lilypad before it sinks. + // If human is ever shuffled, revisit this. + EVENT(RE_ACCESS_SPRING_WATER, true), + EVENT(RE_SOUTHERN_SWAMP_KILL_OCTOROK, (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA)), + EVENT(RE_ACCESS_PICTOGRAPH_SWAMP_GENERIC, HAS_ITEM(ITEM_PICTOGRAPH_BOX)), + }, + }; + Regions[RR_SOUTHERN_SWAMP_NEAR_WOODS] = RandoRegion{ .name = "North Woods Section", .sceneId = SCENE_20SICHITAI, + .checks = { CHECK(RC_SOUTHERN_SWAMP_POISON_POT_01, true), CHECK(RC_SOUTHERN_SWAMP_POISON_POT_02, true), CHECK(RC_SOUTHERN_SWAMP_POISON_POT_03, true), CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_02, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_03, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), - CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_01, CAN_BE_DEKU || CAN_BE_ZORA), - CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_02, CAN_BE_DEKU || CAN_BE_ZORA), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_13, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_14, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_15, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), @@ -370,13 +391,11 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(WOODS_OF_MYSTERY, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 7), true), }, .connections = { - CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, CanGetPastBigOcto()), - CONNECTION(RR_SOUTHERN_SWAMP_NORTH, (CAN_BE_HUMAN && CAN_USE_ABILITY(SWIM)) || (CAN_BE_DEKU || CAN_BE_ZORA || CAN_BE_GORON)), + CONNECTION(RR_SOUTHERN_SWAMP_NEAR_FLOWERS, CAN_TRAVERSE_WAIST_DEEP_WATER), + CONNECTION(RR_SOUTHERN_SWAMP_NORTH, CAN_TRAVERSE_WAIST_DEEP_WATER), }, .events = { EVENT(RE_ACCESS_SPRING_WATER, true), - EVENT(RE_ACCESS_BEANS_REFILL, CAN_BE_DEKU && HAS_ITEM(ITEM_MAGIC_BEANS)), - EVENT(RE_SOUTHERN_SWAMP_KILL_OCTOROK, (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA)), EVENT(RE_ACCESS_PICTOGRAPH_SWAMP_GENERIC, HAS_ITEM(ITEM_PICTOGRAPH_BOX)), }, .oneWayEntrances = { @@ -395,7 +414,7 @@ static RegisterShipInitFunc initFunc([]() { }, .connections = { CONNECTION(RR_SOUTHERN_SWAMP_NORTH, CanGetPastBigOcto()), - CONNECTION(RR_SOUTHERN_SWAMP_NEAR_WOODS, CanGetPastBigOcto()), + CONNECTION(RR_SOUTHERN_SWAMP_NEAR_FLOWERS, CanGetPastBigOctoWithoutBoat()), CONNECTION(RR_SOUTHERN_SWAMP_GROTTO, CAN_BE_DEKU || (RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE] && (CAN_USE_ABILITY(SWIM) || CAN_BE_ZORA || CAN_BE_GORON))), // TODO: Grotto mapping }, .events = { diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 297749727..a81297095 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2675,6 +2675,7 @@ typedef enum { RR_SNOWHEAD_TEMPLE_SNOW_ROOM, RR_SNOWHEAD_TEMPLE_UPPER_WIZZROBE_ROOM, RR_SOUTHERN_SWAMP_GROTTO, + RR_SOUTHERN_SWAMP_NEAR_FLOWERS, RR_SOUTHERN_SWAMP_NEAR_WOODS, RR_SOUTHERN_SWAMP_NORTH, RR_SOUTHERN_SWAMP_SOUTH, |
