summaryrefslogtreecommitdiff
path: root/mm/2s2h/Rando/Logic/Regions/South.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mm/2s2h/Rando/Logic/Regions/South.cpp')
-rw-r--r--mm/2s2h/Rando/Logic/Regions/South.cpp125
1 files changed, 92 insertions, 33 deletions
diff --git a/mm/2s2h/Rando/Logic/Regions/South.cpp b/mm/2s2h/Rando/Logic/Regions/South.cpp
index 3f35c4473..9a21cda50 100644
--- a/mm/2s2h/Rando/Logic/Regions/South.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/South.cpp
@@ -5,6 +5,31 @@
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;
+ }
+ /*
+ * 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
+ * are logically introduced.
+ */
+ if (RANDO_EVENTS[RE_SOUTHERN_SWAMP_KILL_OCTOROK] && CAN_BE_DEKU) {
+ return true;
+ }
+ /*
+ * The water is clear in this state, so swimming comes into question. Either Link uses the swim ability, he hops
+ * 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)) {
+ return true;
+ }
+ return false;
+}
+
// clang-format off
static RegisterShipInitFunc initFunc([]() {
Regions[RR_DEKU_KINGS_CHAMBER_HOLDING_CELL] = RandoRegion{ .name = "Holding Cell", .sceneId = SCENE_DEKU_KING,
@@ -241,19 +266,12 @@ static RegisterShipInitFunc initFunc([]() {
CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, true), // TODO: Grotto mapping
},
};
- Regions[RR_SOUTHERN_SWAMP_NORTH] = RandoRegion{ .name = "North Section", .sceneId = SCENE_20SICHITAI,
+ Regions[RR_SOUTHERN_SWAMP_NORTH] = RandoRegion{ .name = "North Tourist Section", .sceneId = SCENE_20SICHITAI,
.checks = {
- CHECK(RC_SOUTHERN_SWAMP_FROG, HAS_ITEM(ITEM_MASK_DON_GERO)),
CHECK(RC_SOUTHERN_SWAMP_PIECE_OF_HEART, CAN_BE_DEKU && Flags_GetRandoInf(RANDO_INF_OBTAINED_DEED_LAND)),
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_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_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
@@ -268,6 +286,48 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_10, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_11, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_12, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_01, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_02, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_03, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_04, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_05, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_06, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_07, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_08, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_09, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_10, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_11, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_12, true),
+ },
+ .exits = { // TO FROM
+ EXIT(ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 1), ENTRANCE(SOUTHERN_SWAMP_POISONED, 0), true),
+ 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)),
+ },
+ .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 = {
+ ENTRANCE(SOUTHERN_SWAMP_POISONED, 10), // From Song of Soaring
+ }
+ };
+ Regions[RR_SOUTHERN_SWAMP_NEAR_WOODS] = RandoRegion{ .name = "North Woods Section", .sceneId = SCENE_20SICHITAI,
+ .checks = {
+ CHECK(RC_SOUTHERN_SWAMP_FROG, HAS_ITEM(ITEM_MASK_DON_GERO)),
+ 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]),
@@ -286,18 +346,6 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_28, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_29, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_30, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_01, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_02, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_03, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_04, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_05, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_06, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_07, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_08, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_09, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_10, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_11, true),
- CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_12, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_13, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_14, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_15, true),
@@ -318,13 +366,12 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_30, true),
},
.exits = { // TO FROM
- EXIT(ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 1), ENTRANCE(SOUTHERN_SWAMP_POISONED, 0), true),
- EXIT(ENTRANCE(TOURIST_INFORMATION, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 1), true),
EXIT(ENTRANCE(MAGIC_HAGS_POTION_SHOP, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 5), true),
EXIT(ENTRANCE(WOODS_OF_MYSTERY, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 7), true),
},
.connections = {
- CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, (RANDO_EVENTS[RE_SOUTHERN_SWAMP_KILL_OCTOROK] || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE])),
+ 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)),
},
.events = {
EVENT(RE_ACCESS_SPRING_WATER, true),
@@ -334,7 +381,6 @@ static RegisterShipInitFunc initFunc([]() {
},
.oneWayEntrances = {
ENTRANCE(SOUTHERN_SWAMP_POISONED, 9), // From river in Ikana
- ENTRANCE(SOUTHERN_SWAMP_POISONED, 10), // From Song of Soaring
}
};
Regions[RR_SOUTHERN_SWAMP_SOUTH] = RandoRegion{ .name = "South Section", .sceneId = SCENE_20SICHITAI,
@@ -348,7 +394,8 @@ static RegisterShipInitFunc initFunc([]() {
EXIT(ENTRANCE(SWAMP_SPIDER_HOUSE, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 8), CAN_LIGHT_TORCH_NEAR_ANOTHER && (CAN_BE_DEKU || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE])),
},
.connections = {
- CONNECTION(RR_SOUTHERN_SWAMP_NORTH, (RANDO_EVENTS[RE_SOUTHERN_SWAMP_KILL_OCTOROK] || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE])),
+ CONNECTION(RR_SOUTHERN_SWAMP_NORTH, CanGetPastBigOcto()),
+ CONNECTION(RR_SOUTHERN_SWAMP_NEAR_WOODS, CanGetPastBigOcto()),
CONNECTION(RR_SOUTHERN_SWAMP_GROTTO, CAN_BE_DEKU), // TODO: Grotto mapping
},
.events = {
@@ -375,7 +422,7 @@ static RegisterShipInitFunc initFunc([]() {
EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 1), ENTRANCE(TOURIST_INFORMATION, 0), true),
},
.events = {
- EVENT(RE_SOUTHERN_SWAMP_KILL_OCTOROK, RANDO_EVENTS[RE_SAVED_KOUME] || CAN_ACCESS(PICTOGRAPH_SWAMP_GENERIC)),
+ EVENT(RE_SOUTHERN_SWAMP_RIDE_BOAT, RANDO_EVENTS[RE_SAVED_KOUME] || CAN_ACCESS(PICTOGRAPH_SWAMP_GENERIC)),
},
};
Regions[RR_WOODFALL_GREAT_FAIRY_FOUNTAIN] = RandoRegion{ .name = "Woodfall", .sceneId = SCENE_YOUSEI_IZUMI,
@@ -388,13 +435,8 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_WOODFALL] = RandoRegion{ .sceneId = SCENE_21MITURINMAE,
.checks = {
- CHECK(RC_WOODFALL_ENTRANCE_CHEST, CAN_BE_DEKU || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
+ CHECK(RC_WOODFALL_ENTRANCE_CHEST, CAN_BE_DEKU || (RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE] && (CAN_BE_ZORA || CAN_BE_GORON || CAN_USE_ABILITY(SWIM)))),
CHECK(RC_WOODFALL_PIECE_OF_HEART_CHEST, CAN_BE_DEKU),
- CHECK(RC_WOODFALL_OWL_STATUE, CAN_USE_SWORD),
- CHECK(RC_WOODFALL_NEAR_OWL_CHEST, CAN_BE_DEKU),
- CHECK(RC_WOODFALL_POT_01, CAN_BE_DEKU || CAN_OWL_WARP(OWL_WARP_WOODFALL)),
- CHECK(RC_WOODFALL_POT_02, CAN_BE_DEKU || CAN_OWL_WARP(OWL_WARP_WOODFALL)),
- CHECK(RC_WOODFALL_POT_03, CAN_BE_DEKU || CAN_OWL_WARP(OWL_WARP_WOODFALL)),
CHECK(RC_WOODFALL_FREESTANDING_RUPEE, CAN_BE_DEKU),
CHECK(RC_WOODFALL_GRASS_01, true),
CHECK(RC_WOODFALL_GRASS_02, true),
@@ -405,10 +447,27 @@ static RegisterShipInitFunc initFunc([]() {
},
.exits = { // TO FROM
EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 2), ENTRANCE(WOODFALL, 0), true),
- EXIT(ENTRANCE(WOODFALL_TEMPLE, 0), ENTRANCE(WOODFALL, 1), CanAccessDungeon(DUNGEON_SCENE_INDEX_WOODFALL_TEMPLE)),
EXIT(ENTRANCE(FAIRY_FOUNTAIN, 1), ENTRANCE(WOODFALL, 2), CAN_BE_DEKU),
EXIT(ENTRANCE(WOODFALL_TEMPLE, 2), ENTRANCE(WOODFALL, 3), RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
},
+ .connections = {
+ CONNECTION(RR_WOODFALL_OWL_STATUE_PLATFORM, CAN_BE_DEKU),
+ },
+ };
+ Regions[RR_WOODFALL_OWL_STATUE_PLATFORM] = RandoRegion{ .name = "Owl Statue Platform", .sceneId = SCENE_21MITURINMAE,
+ .checks = {
+ CHECK(RC_WOODFALL_OWL_STATUE, CAN_USE_SWORD),
+ CHECK(RC_WOODFALL_NEAR_OWL_CHEST, CAN_BE_DEKU),
+ CHECK(RC_WOODFALL_POT_01, true),
+ CHECK(RC_WOODFALL_POT_02, true),
+ CHECK(RC_WOODFALL_POT_03, true),
+ },
+ .exits = { // TO FROM
+ EXIT(ENTRANCE(WOODFALL_TEMPLE, 0), ENTRANCE(WOODFALL, 1), CAN_BE_DEKU && CanAccessDungeon(DUNGEON_SCENE_INDEX_WOODFALL_TEMPLE)),
+ },
+ .connections = {
+ CONNECTION(RR_WOODFALL, CAN_BE_DEKU),
+ },
};
Regions[RR_WOODS_OF_MYSTERY_GROTTO] = RandoRegion{ .name = "Woods of Mystery Grotto", .sceneId = SCENE_KAKUSIANA,
.checks = {