summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorEblo <7004497+Eblo@users.noreply.github.com>2025-11-20 13:24:47 -0500
committerGitHub <noreply@github.com>2025-11-20 13:24:47 -0500
commitc74531cd2d5be71cce63d63708c1d7932c4aca9e (patch)
treeeb363102bc0cb4432cef3f686ecce3c6fe3b30bb /mm
parente2f7c9414332fe67f7d7216705463f6d4546a984 (diff)
[Rando] Revise enemy drop logic (#1347)
* Revise enemy drop logic * Exclude pot and Freezard drop RCs * Use macro for south->upper connection * Address flowers region TODO
Diffstat (limited to 'mm')
-rw-r--r--mm/2s2h/Rando/ActorBehavior/EnemyDrops.cpp2
-rw-r--r--mm/2s2h/Rando/Logic/Logic.h10
-rw-r--r--mm/2s2h/Rando/Logic/Regions/Central.cpp10
-rw-r--r--mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp16
-rw-r--r--mm/2s2h/Rando/Logic/Regions/Miscellaneous.cpp171
-rw-r--r--mm/2s2h/Rando/Logic/Regions/South.cpp23
-rw-r--r--mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp2
-rw-r--r--mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp2
-rw-r--r--mm/2s2h/Rando/Logic/Regions/West.cpp10
-rw-r--r--mm/2s2h/Rando/StaticData/Checks.cpp6
-rw-r--r--mm/2s2h/Rando/Types.h5
11 files changed, 196 insertions, 61 deletions
diff --git a/mm/2s2h/Rando/ActorBehavior/EnemyDrops.cpp b/mm/2s2h/Rando/ActorBehavior/EnemyDrops.cpp
index 98ba30e5d..ff540678b 100644
--- a/mm/2s2h/Rando/ActorBehavior/EnemyDrops.cpp
+++ b/mm/2s2h/Rando/ActorBehavior/EnemyDrops.cpp
@@ -37,7 +37,7 @@ std::unordered_map<int16_t, RandoCheckId> actorIdToRandoCheckIdMap = {
{ ACTOR_EN_OKUTA, RC_ENEMY_DROP_OCTOROK },
{ ACTOR_EN_PEEHAT, RC_ENEMY_DROP_PEAHAT },
{ ACTOR_EN_BBFALL, RC_ENEMY_DROP_RED_BUBBLE },
- { ACTOR_EN_RD, RC_ENEMY_DROP_REDEAD_GIBDO },
+ { ACTOR_EN_RD, RC_ENEMY_DROP_REDEAD },
{ ACTOR_EN_SB, RC_ENEMY_DROP_SHELLBLADE },
{ ACTOR_EN_PR2, RC_ENEMY_DROP_SKULLFISH },
{ ACTOR_EN_ST, RC_ENEMY_DROP_SKULLTULA },
diff --git a/mm/2s2h/Rando/Logic/Logic.h b/mm/2s2h/Rando/Logic/Logic.h
index 31912efb2..04d94ad64 100644
--- a/mm/2s2h/Rando/Logic/Logic.h
+++ b/mm/2s2h/Rando/Logic/Logic.h
@@ -217,7 +217,7 @@ inline bool CanKillEnemy(ActorId EnemyId) {
case ACTOR_EN_KNIGHT: // Igos du Ikana/IdI Lackey
return (CAN_USE_MAGIC_ARROW(FIRE) &&
(GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) >= EQUIP_VALUE_SHIELD_MIRROR) &&
- (CAN_USE_HUMAN_SWORD || CAN_BE_DEKU || CAN_BE_GORON || CAN_BE_ZORA));
+ (CAN_USE_SWORD || CAN_BE_DEKU || CAN_BE_GORON || CAN_BE_ZORA));
case ACTOR_EN_KAIZOKU: // Fighter Pirate
return (CAN_USE_SWORD || CAN_BE_ZORA);
case ACTOR_EN_PAMETFROG: // Swamp Gekko
@@ -225,17 +225,17 @@ inline bool CanKillEnemy(ActorId EnemyId) {
case ACTOR_EN_BIGSLIME: // Great Bay Gekko
return (CAN_USE_MAGIC_ARROW(ICE));
case ACTOR_EN_SW: // Gold Skulltula & Skullwalltula
- return (CAN_USE_PROJECTILE || CAN_BE_DEKU || CAN_BE_GORON || CAN_USE_HUMAN_SWORD || CAN_USE_EXPLOSIVE);
+ return (CAN_USE_PROJECTILE || CAN_BE_DEKU || CAN_BE_GORON || CAN_USE_SWORD || CAN_USE_EXPLOSIVE);
case ACTOR_EN_DINOFOS: // Dinofos
return (CAN_USE_SWORD || CAN_BE_GORON || HAS_ITEM(ITEM_BOW) || (CAN_BE_DEKU && HAS_MAGIC));
case ACTOR_EN_WIZ: // Wizrobe
return (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_USE_SWORD || CAN_BE_GORON);
case ACTOR_EN_WF: // Wolfos
- return (CAN_USE_HUMAN_SWORD || (CAN_BE_DEKU && HAS_MAGIC) || CAN_BE_GORON || CAN_BE_ZORA);
+ return (CAN_USE_SWORD || (CAN_BE_DEKU && HAS_MAGIC) || CAN_BE_GORON || CAN_BE_ZORA);
case ACTOR_EN_JSO2: // Garo Master
return (HAS_ITEM(ITEM_BOW) || CAN_BE_GORON || CAN_USE_SWORD);
case ACTOR_EN_IK: // Iron Knuckle
- return (CAN_USE_HUMAN_SWORD || CAN_BE_GORON);
+ return (CAN_USE_SWORD || CAN_BE_GORON);
case ACTOR_EN_GRASSHOPPER: // Dragonfly
return ((CAN_BE_DEKU && HAS_MAGIC) || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_NUT) || CAN_USE_SWORD ||
CAN_BE_ZORA);
@@ -250,7 +250,7 @@ inline bool CanKillEnemy(ActorId EnemyId) {
return (CAN_USE_SWORD || HAS_ITEM(ITEM_HOOKSHOT) || HAS_ITEM(ITEM_BOW) || CAN_USE_EXPLOSIVE ||
CAN_BE_GORON || CAN_BE_ZORA);
case ACTOR_EN_DEKUBABA: // Neck bending Deku Baba
- return (CAN_USE_HUMAN_SWORD || CAN_BE_DEKU || CAN_BE_GORON || CAN_BE_ZORA || HAS_ITEM(ITEM_BOW) ||
+ return (CAN_USE_SWORD || CAN_BE_DEKU || CAN_BE_GORON || CAN_BE_ZORA || HAS_ITEM(ITEM_BOW) ||
CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK));
case ACTOR_OBJ_SNOWBALL: // Large Snowball
return (CAN_USE_EXPLOSIVE || CAN_BE_GORON || CAN_USE_MAGIC_ARROW(FIRE));
diff --git a/mm/2s2h/Rando/Logic/Regions/Central.cpp b/mm/2s2h/Rando/Logic/Regions/Central.cpp
index 84d309f9c..d0a84d565 100644
--- a/mm/2s2h/Rando/Logic/Regions/Central.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/Central.cpp
@@ -299,11 +299,11 @@ static RegisterShipInitFunc initFunc([]() {
Regions[RR_SWORDSMAN_SCHOOL] = RandoRegion{ .sceneId = SCENE_DOUJOU,
.checks = {
CHECK(RC_SWORDSMAN_SCHOOL_PIECE_OF_HEART, CAN_USE_HUMAN_SWORD),
- CHECK(RC_SWORDSMAN_SCHOOL_POT_01, CAN_USE_HUMAN_SWORD),
- CHECK(RC_SWORDSMAN_SCHOOL_POT_02, CAN_USE_HUMAN_SWORD),
- CHECK(RC_SWORDSMAN_SCHOOL_POT_03, CAN_USE_HUMAN_SWORD),
- CHECK(RC_SWORDSMAN_SCHOOL_POT_04, CAN_USE_HUMAN_SWORD),
- CHECK(RC_SWORDSMAN_SCHOOL_POT_05, CAN_USE_HUMAN_SWORD),
+ CHECK(RC_SWORDSMAN_SCHOOL_POT_01, CAN_USE_SWORD),
+ CHECK(RC_SWORDSMAN_SCHOOL_POT_02, CAN_USE_SWORD),
+ CHECK(RC_SWORDSMAN_SCHOOL_POT_03, CAN_USE_SWORD),
+ CHECK(RC_SWORDSMAN_SCHOOL_POT_04, CAN_USE_SWORD),
+ CHECK(RC_SWORDSMAN_SCHOOL_POT_05, CAN_USE_SWORD),
},
.exits = { // TO FROM
EXIT(ENTRANCE(WEST_CLOCK_TOWN, 3), ENTRANCE(SWORDMANS_SCHOOL, 0), true),
diff --git a/mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp b/mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp
index 63e3853f3..5ed3c114e 100644
--- a/mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp
@@ -21,7 +21,7 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_ANCIENT_CASTLE_OF_IKANA_LEFT_THIRD_ROOM_POT_02, true),
},
.connections = {
- CONNECTION(RR_IKANA_CASTLE_SKULLTULA_ROOM, CAN_USE_HUMAN_SWORD),
+ CONNECTION(RR_IKANA_CASTLE_SKULLTULA_ROOM, CAN_USE_SWORD),
CONNECTION(RR_IKANA_CASTLE_OUTER_ROOF, true)
},
};
@@ -50,18 +50,24 @@ static RegisterShipInitFunc initFunc([]() {
Regions[RR_IKANA_CASTLE_FLOORMASTER_ROOM] = RandoRegion{ .name = "Floormaster Room", .sceneId = SCENE_CASTLE,
.connections = {
CONNECTION(RR_IKANA_CASTLE_MAIN_ROOM, true),
- CONNECTION(RR_IKANA_CASTLE_WIZZROBE_ROOM, CAN_USE_MAGIC_ARROW(LIGHT) || (RANDO_EVENTS[RE_IKANA_CASTLE_RIGHT_SUNLIGHT] && (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) >= EQUIP_VALUE_SHIELD_MIRROR))),
+ CONNECTION(RR_IKANA_CASTLE_FLOORMASTER_ROOM_REDEAD_AREA, CAN_USE_MAGIC_ARROW(LIGHT) || (RANDO_EVENTS[RE_IKANA_CASTLE_RIGHT_SUNLIGHT] && (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) >= EQUIP_VALUE_SHIELD_MIRROR))),
},
.oneWayEntrances = {
ENTRANCE(IKANA_CASTLE, 5), // From Inner Roof
}
};
+ Regions[RR_IKANA_CASTLE_FLOORMASTER_ROOM_REDEAD_AREA] = RandoRegion{ .name = "Floormaster Room, Redead Area", .sceneId = SCENE_CASTLE,
+ .connections = {
+ CONNECTION(RR_IKANA_CASTLE_FLOORMASTER_ROOM, CAN_USE_MAGIC_ARROW(LIGHT)),
+ CONNECTION(RR_IKANA_CASTLE_WIZZROBE_ROOM, true),
+ },
+ };
Regions[RR_IKANA_CASTLE_FRONT_ENTRANCE] = RandoRegion{ .name = "Front Entrance", .sceneId = SCENE_CASTLE,
.exits = { // TO FROM
EXIT(ENTRANCE(IKANA_CANYON, 8), ENTRANCE(IKANA_CASTLE, 1), true),
},
.connections = {
- CONNECTION(RR_IKANA_CASTLE_COURTYARD, CAN_USE_MAGIC_ARROW(LIGHT) || ((GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) >= EQUIP_VALUE_SHIELD_MIRROR) && (CAN_USE_HUMAN_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE))),
+ CONNECTION(RR_IKANA_CASTLE_COURTYARD, CAN_USE_MAGIC_ARROW(LIGHT) || ((GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) >= EQUIP_VALUE_SHIELD_MIRROR) && (CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE))),
},
};
Regions[RR_IKANA_CASTLE_INNER_ROOF] = RandoRegion{ .name = "Inner Roof", .sceneId = SCENE_CASTLE,
@@ -123,7 +129,7 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_ANCIENT_CASTLE_OF_IKANA_LEFT_SECOND_ROOM_POT_04, CAN_BE_DEKU || HAS_ITEM(ITEM_BOW))
},
.connections = {
- CONNECTION(RR_IKANA_CASTLE_CEILING_ROOM, CAN_USE_HUMAN_SWORD || CAN_USE_PROJECTILE),
+ CONNECTION(RR_IKANA_CASTLE_CEILING_ROOM, CAN_USE_SWORD || CAN_USE_PROJECTILE),
CONNECTION(RR_IKANA_CASTLE_BUBBLE_ROOM, HAS_ITEM(ITEM_LENS_OF_TRUTH) && HAS_MAGIC && CAN_BE_DEKU && (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_BOMB)))
},
};
@@ -145,7 +151,7 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_IKANA_CASTLE_WIZZROBE_ROOM] = RandoRegion{ .name = "Wizzrobe Room", .sceneId = SCENE_CASTLE,
.connections = {
- CONNECTION(RR_IKANA_CASTLE_FLOORMASTER_ROOM, CanKillEnemy(ACTOR_EN_WIZ)),
+ CONNECTION(RR_IKANA_CASTLE_FLOORMASTER_ROOM_REDEAD_AREA, CanKillEnemy(ACTOR_EN_WIZ)),
CONNECTION(RR_IKANA_CASTLE_REDEAD_WALKWAY, CanKillEnemy(ACTOR_EN_WIZ))
},
};
diff --git a/mm/2s2h/Rando/Logic/Regions/Miscellaneous.cpp b/mm/2s2h/Rando/Logic/Regions/Miscellaneous.cpp
index 80b187a72..d33b34b45 100644
--- a/mm/2s2h/Rando/Logic/Regions/Miscellaneous.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/Miscellaneous.cpp
@@ -10,41 +10,148 @@ static RegisterShipInitFunc initFunc([]() {
Regions[RR_MISCELLANEOUS] = RandoRegion{ .name = "Various Regions", .sceneId = SCENE_SPOT00,
.checks = {
CHECK(RC_ENEMY_DROP_ARMOS, CanKillEnemy(ACTOR_EN_AM) && CanReachRegions({ RR_STONE_TOWER_TEMPLE_ARMOS_ROOM })),
- CHECK(RC_ENEMY_DROP_BEAMOS, CanKillEnemy(ACTOR_EN_VM) && CanReachRegions({ RR_STONE_TOWER_BOTTOM, RR_STONE_TOWER_MIDDLE, RR_STONE_TOWER_TEMPLE_SHALLOW_POOL_ROOM })),
- CHECK(RC_ENEMY_DROP_BLUE_BUBBLE, CanKillEnemy(ACTOR_EN_BB) && CanReachRegions({ RR_TERMINA_FIELD, RR_ROAD_TO_IKANA_FIELD_SIDE, RR_ROAD_TO_IKANA_BELOW_LEDGE, RR_IKANA_CASTLE_BUBBLE_ROOM, RR_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS })),
- CHECK(RC_ENEMY_DROP_BIO_DEKU_BABA, CanKillEnemy(ACTOR_BOSS_05) && CanReachRegions({ RR_TERMINA_FIELD_BIO_BABA_GROTTO, RR_STONE_TOWER_TEMPLE_DEEP_POOL_ROOM, RR_GREAT_BAY_TEMPLE_COMPASS_ROOM, RR_GREAT_BAY_TEMPLE_BABA_CHEST_ROOM })),
- CHECK(RC_ENEMY_DROP_BOMBCHU, CanKillEnemy(ACTOR_EN_RAT) && CanReachRegions({ RR_TERMINA_FIELD, RR_ROAD_TO_IKANA_FIELD_SIDE, RR_ROAD_TO_IKANA_BELOW_LEDGE, RR_SNOWHEAD_TEMPLE_MAP_ROOM_LOWER, RR_STONE_TOWER_TEMPLE_LAVA_WIND_ROOM, RR_GREAT_BAY_TEMPLE_COMPASS_ROOM, RR_GREAT_BAY_TEMPLE_GREEN_PIPE_3 })),
- CHECK(RC_ENEMY_DROP_CHU, CanKillEnemy(ACTOR_EN_SLIME) && CanReachRegions({ RR_TERMINA_FIELD, RR_ROAD_TO_SOUTHERN_SWAMP, RR_GREAT_BAY_TEMPLE_BEFORE_WART, RR_GREAT_BAY_TEMPLE_GREEN_PIPE_3, RR_STONE_TOWER_TEMPLE_INVERTED_BLOCK_FLIP_ROOM })),
- CHECK(RC_ENEMY_DROP_DEATH_ARMOS, CanKillEnemy(ACTOR_EN_FAMOS) && CanReachRegions({ RR_STONE_TOWER_TEMPLE_INVERTED_SIDE_OF_ENTRANCE, RR_STONE_TOWER_TEMPLE_INVERTED_POE_ROOM })),
- CHECK(RC_ENEMY_DROP_DEKU_BABA, CanKillEnemy(ACTOR_EN_DEKUBABA) && CanReachRegions({ RR_TERMINA_FIELD, RR_ROAD_TO_SOUTHERN_SWAMP, RR_SOUTHERN_SWAMP_SOUTH, RR_WOODFALL, RR_WOODFALL_TEMPLE_MAIN_ROOM, RR_WOODFALL_TEMPLE_MAZE_ROOM, RR_BENEATH_THE_WELL_BABA_AND_POTS_ROOM, RR_SAKON_HIDEOUT })),
- CHECK(RC_ENEMY_DROP_DODONGO, CanKillEnemy(ACTOR_EN_DODONGO) && CanReachRegions({ RR_TERMINA_FIELD, RR_TERMINA_FIELD_DODONGO_GROTTO })),
- CHECK(RC_ENEMY_DROP_DRAGONFLY, CanKillEnemy(ACTOR_EN_GRASSHOPPER) && CanReachRegions({ RR_SOUTHERN_SWAMP_SOUTH, RR_WOODFALL, RR_STONE_TOWER_TEMPLE_ENTRANCE, RR_STONE_TOWER_TEMPLE_OUTSIDE_SWITCH_ROOM, RR_WOODFALL_TEMPLE_PRE_BOSS_ROOM, RR_WOODFALL_TEMPLE_MAIN_ROOM_UPPER })),
- CHECK(RC_ENEMY_DROP_EENO, CanKillEnemy(ACTOR_EN_SNOWMAN) && CanReachRegions({ RR_TERMINA_FIELD, RR_SNOWHEAD_TEMPLE_SNOW_ROOM })),
- CHECK(RC_ENEMY_DROP_FLYING_POT, CanKillEnemy(ACTOR_EN_TUBO_TRAP) && CanReachRegions({ RR_STONE_TOWER_TEMPLE_INVERTED_UNDER_BRIDGE, RR_SNOWHEAD_TEMPLE_BLOCK_ROOM })),
+ CHECK(RC_ENEMY_DROP_BEAMOS, CanKillEnemy(ACTOR_EN_VM) && CanReachRegions({ RR_STONE_TOWER_BOTTOM,
+ RR_STONE_TOWER_MIDDLE,
+ RR_STONE_TOWER_TEMPLE_SHALLOW_POOL_ROOM })),
+ CHECK(RC_ENEMY_DROP_BLUE_BUBBLE, CanKillEnemy(ACTOR_EN_BB) && CanReachRegions({ RR_TERMINA_FIELD,
+ RR_ROAD_TO_IKANA_FIELD_SIDE,
+ RR_ROAD_TO_IKANA_BELOW_LEDGE,
+ RR_IKANA_CASTLE_BUBBLE_ROOM,
+ RR_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS })),
+ CHECK(RC_ENEMY_DROP_BIO_DEKU_BABA, CanKillEnemy(ACTOR_BOSS_05) && CanReachRegions({ RR_TERMINA_FIELD_BIO_BABA_GROTTO,
+ RR_STONE_TOWER_TEMPLE_DEEP_POOL_ROOM,
+ RR_GREAT_BAY_TEMPLE_COMPASS_ROOM,
+ RR_GREAT_BAY_TEMPLE_BABA_CHEST_ROOM })),
+ CHECK(RC_ENEMY_DROP_BOMBCHU, CanKillEnemy(ACTOR_EN_RAT) && CanReachRegions({ RR_TERMINA_FIELD,
+ RR_ROAD_TO_IKANA_FIELD_SIDE,
+ RR_ROAD_TO_IKANA_BELOW_LEDGE })),
+ CHECK(RC_ENEMY_DROP_CHU, CanKillEnemy(ACTOR_EN_SLIME) && CanReachRegions({ RR_TERMINA_FIELD,
+ RR_ROAD_TO_SOUTHERN_SWAMP,
+ RR_GREAT_BAY_TEMPLE_BEFORE_WART,
+ RR_GREAT_BAY_TEMPLE_GREEN_PIPE_3,
+ RR_STONE_TOWER_TEMPLE_INVERTED_BLOCK_FLIP_ROOM })),
+ CHECK(RC_ENEMY_DROP_DEATH_ARMOS, CanKillEnemy(ACTOR_EN_FAMOS) && CanReachRegions({ RR_STONE_TOWER_TEMPLE_INVERTED_SIDE_OF_ENTRANCE,
+ RR_STONE_TOWER_TEMPLE_INVERTED_POE_ROOM })),
+ CHECK(RC_ENEMY_DROP_DEKU_BABA, CanKillEnemy(ACTOR_EN_DEKUBABA) && CanReachRegions({ RR_TERMINA_FIELD,
+ RR_ROAD_TO_SOUTHERN_SWAMP,
+ RR_SOUTHERN_SWAMP_NEAR_WOODS,
+ RR_WOODFALL_TEMPLE_MAIN_ROOM,
+ RR_WOODFALL_TEMPLE_MAZE_ROOM,
+ RR_BENEATH_THE_WELL_BABA_AND_POTS_ROOM,
+ RR_SAKON_HIDEOUT })),
+ CHECK(RC_ENEMY_DROP_DODONGO, CanKillEnemy(ACTOR_EN_DODONGO) && CanReachRegions({ RR_TERMINA_FIELD,
+ RR_TERMINA_FIELD_DODONGO_GROTTO })),
+ CHECK(RC_ENEMY_DROP_DRAGONFLY, CanKillEnemy(ACTOR_EN_GRASSHOPPER) && CanReachRegions({ RR_SOUTHERN_SWAMP_SOUTH_UPPER,
+ RR_WOODFALL,
+ RR_STONE_TOWER_TEMPLE_ENTRANCE,
+ RR_STONE_TOWER_TEMPLE_OUTSIDE_SWITCH_ROOM,
+ RR_WOODFALL_TEMPLE_PRE_BOSS_ROOM,
+ RR_WOODFALL_TEMPLE_COMPASS_ROOM,
+ RR_WOODFALL_TEMPLE_MAIN_ROOM_UPPER })),
+ CHECK(RC_ENEMY_DROP_EENO, CanKillEnemy(ACTOR_EN_SNOWMAN) && CanReachRegions({ RR_TERMINA_FIELD,
+ RR_SNOWHEAD_TEMPLE_SNOW_ROOM })),
+ // Flying pots have unreachable drop logic. Excluding for now, pending rework to expand enemy drops
+ // CHECK(RC_ENEMY_DROP_FLYING_POT, CanKillEnemy(ACTOR_EN_TUBO_TRAP) && CanReachRegions({ RR_STONE_TOWER_TEMPLE_INVERTED_UNDER_BRIDGE, RR_SNOWHEAD_TEMPLE_BLOCK_ROOM })),
CHECK(RC_ENEMY_DROP_FLOORMASTER, CanKillEnemy(ACTOR_EN_FLOORMAS) && CanReachRegions({ RR_IKANA_CASTLE_FLOORMASTER_ROOM })),
- CHECK(RC_ENEMY_DROP_FREEZARD, CanKillEnemy(ACTOR_EN_FZ) && CanReachRegions({ RR_SNOWHEAD_TEMPLE_BRIDGE_ROOM_AFTER, RR_SNOWHEAD_TEMPLE_MAP_ROOM_UPPER, RR_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER, RR_BENEATH_THE_WELL_FREEZARD_ROOM })),
- CHECK(RC_ENEMY_DROP_GUAY, CanKillEnemy(ACTOR_EN_CROW) && CanReachRegions({ RR_IKANA_CANYON_UPPER, RR_IKANA_CASTLE_COURTYARD, RR_PATH_TO_GORON_VILLAGE, RR_IKANA_CASTLE_COURTYARD, RR_ZORA_CAPE }) || (CanReachRegions({ RR_MOUNTAIN_VILLAGE, RR_PATH_TO_GORON_VILLAGE }) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE])),
- CHECK(RC_ENEMY_DROP_HIPLOOP, CanKillEnemy(ACTOR_EN_PP) && CanReachRegions({ RR_WOODFALL, RR_STONE_TOWER_TEMPLE_INVERTED_WIND_ROOM, RR_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_UPPER })),
- CHECK(RC_ENEMY_DROP_IRON_KNUCKLE, CanKillEnemy(ACTOR_EN_IK) && CanReachRegions({ RR_BENEATH_THE_GRAVEYARD_NIGHT_1_BOSS, RR_BENEATH_THE_GRAVEYARD_NIGHT_2_BOSS, RR_MOON_LINK_TRIAL })),
- CHECK(RC_ENEMY_DROP_KEESE, CanKillEnemy(ACTOR_EN_FIREFLY) && CanReachRegions({ RR_TERMINA_FIELD, RR_STONE_TOWER_TOP, RR_STONE_TOWER_UPPER, RR_STONE_TOWER_MIDDLE, RR_BENEATH_THE_WELL_LEFT_FIRE_KEESE, RR_BENEATH_THE_WELL_RIGHT_FIRE_KEESE, RR_BENEATH_THE_WELL_FREEZARD_ROOM, RR_BENEATH_THE_GRAVEYARD_NIGHT_2_GRAVE_BEFORE_PIT, RR_SNOWHEAD_NEAR_TEMPLE, RR_PATH_TO_SNOWHEAD_LOWER, RR_PATH_TO_SNOWHEAD_MIDDLE })),
- CHECK(RC_ENEMY_DROP_LEEVER, CanKillEnemy(ACTOR_EN_NEO_REEBA) && CanReachRegions({ RR_TERMINA_FIELD, RR_GREAT_BAY_COAST, RR_ZORA_CAPE })),
- CHECK(RC_ENEMY_DROP_LIKE_LIKE, CanKillEnemy(ACTOR_EN_RR) && CanReachRegions({ RR_ZORA_CAPE, RR_GREAT_BAY_COAST })),
- CHECK(RC_ENEMY_DROP_MAD_SCRUB, CanKillEnemy(ACTOR_EN_DEKUNUTS) && CanReachRegions({ RR_WOODFALL, RR_DEKU_PALACE_INSIDE })),
- CHECK(RC_ENEMY_DROP_MINI_BABA, CanKillEnemy(ACTOR_EN_KAREBABA) && CanReachRegions({ RR_SOUTHERN_SWAMP_NORTH, RR_SOUTHERN_SWAMP_NEAR_WOODS, RR_BENEATH_THE_WELL_BABA_AND_POTS_ROOM })),
- CHECK(RC_ENEMY_DROP_NEJIRON, CanKillEnemy(ACTOR_EN_BAGUO) && CanReachRegions({ RR_ROAD_TO_IKANA_ABOVE_LEDGE, RR_STONE_TOWER_TEMPLE_MIRROR_PILLAR_ROOM })),
- CHECK(RC_ENEMY_DROP_OCTOROK, CanKillEnemy(ACTOR_EN_OKUTA) && CanReachRegions({ RR_SOUTHERN_SWAMP_NORTH, RR_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART, RR_IKANA_CANYON_LOWER })),
+ // Freezards change their category before dying. Excluding for now, pending rework to expand enemy drops
+ // CHECK(RC_ENEMY_DROP_FREEZARD, CanKillEnemy(ACTOR_EN_FZ) && CanReachRegions({ RR_SNOWHEAD_TEMPLE_BRIDGE_ROOM_AFTER, RR_SNOWHEAD_TEMPLE_MAP_ROOM_UPPER, RR_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER, RR_BENEATH_THE_WELL_FREEZARD_ROOM })),
+ CHECK(RC_ENEMY_DROP_GUAY, CanKillEnemy(ACTOR_EN_CROW) && CanReachRegions({ RR_IKANA_CANYON_UPPER,
+ RR_IKANA_CASTLE_COURTYARD,
+ RR_STONE_TOWER_TEMPLE_OUTSIDE_SWITCH_ROOM }) ||
+ (CanReachRegions({ RR_MOUNTAIN_VILLAGE,
+ RR_PATH_TO_GORON_VILLAGE }) &&
+ RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]) ||
+ (CanReachRegions({ RR_ZORA_CAPE_OUTSIDE_FAIRY_FOUNTAIN }))),
+ CHECK(RC_ENEMY_DROP_HIPLOOP, CanKillEnemy(ACTOR_EN_PP) && CanReachRegions({ RR_WOODFALL,
+ RR_STONE_TOWER_TEMPLE_INVERTED_WIND_ROOM,
+ RR_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_UPPER })),
+ CHECK(RC_ENEMY_DROP_IRON_KNUCKLE, CanKillEnemy(ACTOR_EN_IK) && CanReachRegions({ RR_BENEATH_THE_GRAVEYARD_NIGHT_1_BOSS,
+ RR_BENEATH_THE_GRAVEYARD_NIGHT_2_BOSS,
+ RR_MOON_LINK_TRIAL })),
+ CHECK(RC_ENEMY_DROP_KEESE, CanKillEnemy(ACTOR_EN_FIREFLY) && CanReachRegions({ RR_STONE_TOWER_TOP,
+ RR_STONE_TOWER_UPPER,
+ RR_STONE_TOWER_MIDDLE,
+ RR_BENEATH_THE_WELL_LEFT_FIRE_KEESE,
+ RR_BENEATH_THE_WELL_RIGHT_FIRE_KEESE,
+ RR_BENEATH_THE_WELL_FREEZARD_ROOM,
+ RR_BENEATH_THE_GRAVEYARD_NIGHT_2_GRAVE_BEFORE_PIT,
+ RR_SNOWHEAD_NEAR_TEMPLE,
+ RR_PATH_TO_SNOWHEAD_LOWER,
+ RR_PATH_TO_SNOWHEAD_MIDDLE })),
+ CHECK(RC_ENEMY_DROP_LEEVER, CanKillEnemy(ACTOR_EN_NEO_REEBA) && CanReachRegions({ RR_TERMINA_FIELD,
+ RR_GREAT_BAY_COAST,
+ RR_ZORA_CAPE })),
+ CHECK(RC_ENEMY_DROP_LIKE_LIKE, CanKillEnemy(ACTOR_EN_RR) && CanReachRegions({ RR_ZORA_CAPE,
+ RR_GREAT_BAY_COAST })),
+ CHECK(RC_ENEMY_DROP_MAD_SCRUB, CanKillEnemy(ACTOR_EN_DEKUNUTS) && CanReachRegions({ RR_WOODFALL,
+ RR_DEKU_PALACE_INSIDE })),
+ CHECK(RC_ENEMY_DROP_MINI_BABA, CanKillEnemy(ACTOR_EN_KAREBABA) && CanReachRegions({ RR_SOUTHERN_SWAMP_NORTH,
+ RR_SOUTHERN_SWAMP_NEAR_WOODS,
+ RR_DEKU_PALACE_OUTSIDE,
+ RR_BENEATH_THE_WELL_BABA_AND_POTS_ROOM,
+ RR_GREAT_BAY_COAST_FISHERMAN_GROTTO,
+ RR_IKANA_CANYON_GROTTO,
+ RR_IKANA_GRAVEYARD_GROTTO,
+ RR_MOUNTAIN_VILLAGE_TUNNEL_GROTTO,
+ RR_PATH_TO_GORON_VILLAGE_RAMP_GROTTO,
+ RR_PATH_TO_SNOWHEAD_GROTTO,
+ RR_ROAD_TO_IKANA_GROTTO,
+ RR_ROAD_TO_SOUTHERN_SWAMP_GROTTO,
+ RR_SOUTHERN_SWAMP_GROTTO,
+ RR_TERMINA_FIELD_PILLAR_GROTTO,
+ RR_TERMINA_FIELD_TALL_GRASS_GROTTO,
+ RR_WOODS_OF_MYSTERY_GROTTO,
+ RR_ZORA_CAPE_GROTTO })),
+ CHECK(RC_ENEMY_DROP_NEJIRON, CanKillEnemy(ACTOR_EN_BAGUO) && CanReachRegions({ RR_ROAD_TO_IKANA_ABOVE_LEDGE,
+ RR_STONE_TOWER_TEMPLE_MIRROR_PILLAR_ROOM })),
+ CHECK(RC_ENEMY_DROP_OCTOROK, CanKillEnemy(ACTOR_EN_OKUTA) && CanReachRegions({ RR_SOUTHERN_SWAMP_NEAR_FLOWERS,
+ RR_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART,
+ RR_IKANA_CANYON_LOWER })),
CHECK(RC_ENEMY_DROP_PEAHAT, CanKillEnemy(ACTOR_EN_PEEHAT) && CanReachRegions({ RR_TERMINA_FIELD_PEAHAT_GROTTO })),
CHECK(RC_ENEMY_DROP_RED_BUBBLE, CanKillEnemy(ACTOR_EN_BBFALL) && CanReachRegions({ RR_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM })),
- CHECK(RC_ENEMY_DROP_REDEAD_GIBDO, CanKillEnemy(ACTOR_EN_RD) && CanReachRegions({ RR_IKANA_CANYON_UPPER, RR_IKANA_CASTLE_FRONT_ENTRANCE, RR_STONE_TOWER_UPPER, RR_BENEATH_THE_WELL_ENTRANCE, RR_BENEATH_THE_WELL_THREE_SPIKED_BARS, RR_BENEATH_THE_WELL_TWO_SPIKED_BARS, RR_BENEATH_THE_WELL_FREEZARD_ROOM, RR_BENEATH_THE_WELL_RIGHT_FIRE_KEESE, RR_BENEATH_THE_WELL_BABA_AND_POTS_ROOM, RR_BENEATH_THE_WELL_FOUR_SPIKED_BARS })),
- CHECK(RC_ENEMY_DROP_SHELLBLADE, CanKillEnemy(ACTOR_EN_SB) && CanReachRegions({ RR_PIRATES_FORTRESS_LEFT_CLAM_EGG_ROOM, RR_PIRATES_FORTRESS_RIGHT_CLAM_EGG_ROOM, RR_PIRATES_FORTRESS_CAPTAIN_ROOM, RR_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART })),
- CHECK(RC_ENEMY_DROP_SKULLFISH, CanKillEnemy(ACTOR_EN_PR2) && CanReachRegions({ RR_GREAT_BAY_TEMPLE_MAP_ROOM, RR_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART, })),
- CHECK(RC_ENEMY_DROP_SKULLTULA, CanKillEnemy(ACTOR_EN_ST) && CanReachRegions({ RR_ASTRAL_OBSERVATORY_PASSAGE, RR_WOODFALL_TEMPLE_MAZE_ROOM, RR_OCEAN_SPIDER_HOUSE_MEETING_ROOM, RR_BENEATH_THE_WELL_SKULLTULA_ROOM, RR_BENEATH_THE_WELL_FOUR_SPIKED_BARS, RR_BENEATH_THE_GRAVEYARD_NIGHT_1_GRAVE, RR_GREAT_BAY_TEMPLE_WATER_WHEEL_ROOM, RR_IKANA_CASTLE_SKULLTULA_ROOM })),
- CHECK(RC_ENEMY_DROP_SKULLWALLTULA, CanKillEnemy(ACTOR_EN_SW) && CanReachRegions({ RR_TERMINA_FIELD_GOSSIP_STONE_GROTTO_1, RR_LONE_PEAK_SHRINE })),
- CHECK(RC_ENEMY_DROP_SNAPPER, CanKillEnemy(ACTOR_EN_KAME) && CanReachRegions({ RR_WOODS_OF_MYSTERY, RR_WOODFALL_TEMPLE_MAP_ROOM })),
- CHECK(RC_ENEMY_DROP_STALCHILD, CanKillEnemy(ACTOR_EN_SKB) && CanReachRegions({ RR_IKANA_GRAVEYARD_LOWER, RR_OCEAN_SPIDER_HOUSE_LIBRARY_ROOM, RR_OCEAN_SPIDER_HOUSE_MEETING_ROOM })),
- CHECK(RC_ENEMY_DROP_TEKTITE, CanKillEnemy(ACTOR_EN_TITE) && CanReachRegions({ RR_GORON_VILLAGE, RR_PATH_TO_MOUNTAIN_VILLAGE_LOWER, RR_PATH_TO_GORON_VILLAGE, RR_GREAT_BAY_TEMPLE_GREEN_PIPE_1 })),
- CHECK(RC_ENEMY_DROP_WOLFOS, CanKillEnemy(ACTOR_EN_WF) && CanReachRegions({ RR_ROAD_TO_SOUTHERN_SWAMP, RR_PATH_TO_GORON_VILLAGE, RR_SNOWHEAD_TEMPLE_ENTRANCE_AFTER_BLOCK, RR_SNOWHEAD_NEAR_TEMPLE, RR_SNOWHEAD_TEMPLE_COMPASS_ROOM, RR_SAKON_HIDEOUT })),
- CHECK(RC_ENEMY_DROP_WALLMASTER, CanKillEnemy(ACTOR_EN_WALLMAS) && CanReachRegions({ RR_BENEATH_THE_GRAVEYARD_DAMPE, RR_BENEATH_THE_WELL_FREEZARD_ROOM, RR_BENEATH_THE_WELL_LEFT_FIRE_KEESE, RR_BENEATH_THE_WELL_FOUR_SPIKED_BARS, RR_BENEATH_THE_WELL_TWO_SPIKED_BARS })),
+ CHECK(RC_ENEMY_DROP_REDEAD, CanKillEnemy(ACTOR_EN_RD) && CanReachRegions({ RR_IKANA_CASTLE_FRONT_ENTRANCE,
+ RR_IKANA_CASTLE_REDEAD_WALKWAY,
+ RR_IKANA_CASTLE_FLOORMASTER_ROOM_REDEAD_AREA,
+ RR_STONE_TOWER_UPPER, })),
+ CHECK(RC_ENEMY_DROP_SHELLBLADE, CanKillEnemy(ACTOR_EN_SB) && CanReachRegions({ RR_PIRATES_FORTRESS_LEFT_CLAM_EGG_ROOM,
+ RR_PIRATES_FORTRESS_RIGHT_CLAM_EGG_ROOM,
+ RR_PIRATES_FORTRESS_CAPTAIN_ROOM,
+ RR_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART })),
+ CHECK(RC_ENEMY_DROP_SKULLFISH, CanKillEnemy(ACTOR_EN_PR2) && CanReachRegions({ RR_GREAT_BAY_TEMPLE_MAP_ROOM,
+ RR_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART })),
+ CHECK(RC_ENEMY_DROP_SKULLTULA, CanKillEnemy(ACTOR_EN_ST) && (CanReachRegions({ RR_ASTRAL_OBSERVATORY_PASSAGE,
+ RR_TERMINA_FIELD_GOSSIP_STONE_GROTTO_1,
+ RR_WOODFALL_TEMPLE_ENTRANCE,
+ RR_WOODFALL_TEMPLE_MAZE_ROOM,
+ RR_LONE_PEAK_SHRINE,
+ RR_OCEAN_SPIDER_HOUSE_STORAGE_ROOM,
+ RR_OCEAN_SPIDER_HOUSE_MEETING_ROOM,
+ RR_GREAT_BAY_TEMPLE_WATER_WHEEL_ROOM,
+ RR_BENEATH_THE_WELL_SKULLTULA_ROOM,
+ RR_BENEATH_THE_WELL_FOUR_SPIKED_BARS,
+ RR_BENEATH_THE_GRAVEYARD_NIGHT_1_GRAVE,
+ RR_IKANA_CASTLE_SKULLTULA_ROOM }) ||
+ CanReachRegions({ RR_WOODFALL_TEMPLE_PRE_BOSS_ROOM }) && CAN_BE_DEKU)),
+ CHECK(RC_ENEMY_DROP_SKULLWALLTULA, CanKillEnemy(ACTOR_EN_SW) && CanReachRegions({ RR_TERMINA_FIELD_GOSSIP_STONE_GROTTO_1 })),
+ CHECK(RC_ENEMY_DROP_SNAPPER, CanKillEnemy(ACTOR_EN_KAME) && CanReachRegions({ RR_WOODS_OF_MYSTERY,
+ RR_WOODFALL_TEMPLE_MAP_ROOM })),
+ CHECK(RC_ENEMY_DROP_STALCHILD, CanKillEnemy(ACTOR_EN_SKB) && CanReachRegions({ RR_IKANA_GRAVEYARD_LOWER,
+ RR_IKANA_GRAVEYARD_UPPER })),
+ CHECK(RC_ENEMY_DROP_TEKTITE, CanKillEnemy(ACTOR_EN_TITE) && CanReachRegions({ RR_GORON_VILLAGE,
+ RR_PATH_TO_MOUNTAIN_VILLAGE_LOWER,
+ RR_PATH_TO_GORON_VILLAGE,
+ RR_GREAT_BAY_TEMPLE_GREEN_PIPE_1 })),
+ CHECK(RC_ENEMY_DROP_WOLFOS, CanKillEnemy(ACTOR_EN_WF) && CanReachRegions({ RR_ROAD_TO_SOUTHERN_SWAMP,
+ RR_PATH_TO_GORON_VILLAGE,
+ RR_SNOWHEAD_NEAR_TEMPLE,
+ RR_SNOWHEAD_TEMPLE_ENTRANCE_AFTER_BLOCK,
+ RR_SNOWHEAD_TEMPLE_COMPASS_ROOM,
+ RR_SAKON_HIDEOUT })),
+ CHECK(RC_ENEMY_DROP_WALLMASTER, CanKillEnemy(ACTOR_EN_WALLMAS) && CanReachRegions({ RR_BENEATH_THE_GRAVEYARD_DAMPE,
+ RR_BENEATH_THE_WELL_FREEZARD_ROOM,
+ RR_BENEATH_THE_WELL_LEFT_FIRE_KEESE,
+ RR_BENEATH_THE_WELL_FOUR_SPIKED_BARS,
+ RR_BENEATH_THE_WELL_TWO_SPIKED_BARS })),
},
};
}, {});
diff --git a/mm/2s2h/Rando/Logic/Regions/South.cpp b/mm/2s2h/Rando/Logic/Regions/South.cpp
index 4800a4498..57d996c01 100644
--- a/mm/2s2h/Rando/Logic/Regions/South.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/South.cpp
@@ -403,19 +403,30 @@ static RegisterShipInitFunc initFunc([]() {
}
};
Regions[RR_SOUTHERN_SWAMP_SOUTH] = RandoRegion{ .name = "South Section", .sceneId = SCENE_20SICHITAI,
- .checks = {
- CHECK(RC_SOUTHERN_SWAMP_SONG_OF_SOARING, CAN_BE_DEKU),
- },
.exits = { // TO FROM
- EXIT(ENTRANCE(WOODFALL, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 2), CAN_BE_DEKU || (RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE] && (CAN_USE_ABILITY(SWIM) || CAN_BE_ZORA))),
EXIT(ENTRANCE(DEKU_PALACE, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 3), true),
- EXIT(ENTRANCE(DEKU_PALACE, 5), ENTRANCE(SOUTHERN_SWAMP_POISONED, 4), CAN_BE_DEKU), // Treetop
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] && (CAN_USE_ABILITY(SWIM) || CAN_BE_ZORA)))),
},
.connections = {
CONNECTION(RR_SOUTHERN_SWAMP_NORTH, 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
+ CONNECTION(RR_SOUTHERN_SWAMP_GROTTO, CAN_BE_DEKU || (RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE] && CAN_TRAVERSE_WAIST_DEEP_WATER)), // TODO: Grotto mapping
+ CONNECTION(RR_SOUTHERN_SWAMP_SOUTH_UPPER, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE] && CAN_TRAVERSE_WAIST_DEEP_WATER), // Climbable vines, only in cleared swamp
+ },
+ .events = {
+ EVENT(RE_ACCESS_PICTOGRAPH_SWAMP_GENERIC, HAS_ITEM(ITEM_PICTOGRAPH_BOX))
+ }
+ };
+ Regions[RR_SOUTHERN_SWAMP_SOUTH_UPPER] = RandoRegion{ .name = "Upper South Section", .sceneId = SCENE_20SICHITAI,
+ .checks = {
+ CHECK(RC_SOUTHERN_SWAMP_SONG_OF_SOARING, CAN_BE_DEKU),
+ },
+ .exits = { // TO FROM
+ EXIT(ENTRANCE(WOODFALL, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 2), CAN_BE_DEKU),
+ EXIT(ENTRANCE(DEKU_PALACE, 5), ENTRANCE(SOUTHERN_SWAMP_POISONED, 4), CAN_BE_DEKU), // Treetop
+ },
+ .connections = {
+ CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, true),
},
.events = {
EVENT(RE_ACCESS_PICTOGRAPH_SWAMP_GENERIC, HAS_ITEM(ITEM_PICTOGRAPH_BOX)) //Adding here to future proof for later when map shuffle is in.
diff --git a/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp b/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp
index 758a48149..304bd89db 100644
--- a/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp
@@ -115,7 +115,7 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_JAR, CanKillEnemy(ACTOR_EN_SW)),
CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_POT_01, CanKillEnemy(ACTOR_EN_SW)),
CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_POT_02, CanKillEnemy(ACTOR_EN_SW)),
- CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_BEHIND_VINES, CAN_USE_HUMAN_SWORD), // Double check this later.
+ CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_BEHIND_VINES, CAN_USE_SWORD),
CHECK(RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_01, true),
CHECK(RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_02, true),
CHECK(RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_03, true),
diff --git a/mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp b/mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp
index 6bebe4ebf..758a0b1fa 100644
--- a/mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp
@@ -294,7 +294,7 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_STONE_TOWER_TEMPLE_INVERTED_GOMESS_ROOM] = RandoRegion{ .name = "Gomess Room", .sceneId = SCENE_INISIE_R,
.checks = {
- CHECK(RC_STONE_TOWER_TEMPLE_INVERTED_BOSS_KEY, CAN_USE_HUMAN_SWORD || HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA || CAN_BE_GORON || (CAN_BE_DEKU && HAS_MAGIC)),
+ CHECK(RC_STONE_TOWER_TEMPLE_INVERTED_BOSS_KEY, CAN_USE_SWORD || HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA || CAN_BE_GORON || (CAN_BE_DEKU && HAS_MAGIC)),
CHECK(RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_01, true),
CHECK(RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_02, true),
CHECK(RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_03, true),
diff --git a/mm/2s2h/Rando/Logic/Regions/West.cpp b/mm/2s2h/Rando/Logic/Regions/West.cpp
index c91a17915..355ff7e70 100644
--- a/mm/2s2h/Rando/Logic/Regions/West.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/West.cpp
@@ -300,6 +300,14 @@ static RegisterShipInitFunc initFunc([]() {
CONNECTION(RR_ZORA_CAPE, true), // TODO: Grotto mapping
},
};
+ Regions[RR_ZORA_CAPE_OUTSIDE_FAIRY_FOUNTAIN] = RandoRegion{ .sceneId = SCENE_31MISAKI,
+ .exits = { // TO FROM
+ EXIT(ENTRANCE(FAIRY_FOUNTAIN, 3), ENTRANCE(ZORA_CAPE, 5), CAN_USE_EXPLOSIVE),
+ },
+ .connections = {
+ CONNECTION(RR_ZORA_CAPE, CAN_USE_ABILITY(SWIM)),
+ }
+ };
Regions[RR_ZORA_CAPE] = RandoRegion{ .sceneId = SCENE_31MISAKI,
.checks = {
CHECK(RC_ZORA_CAPE_LEDGE_CHEST_01, HAS_ITEM(ITEM_HOOKSHOT)),
@@ -313,11 +321,11 @@ static RegisterShipInitFunc initFunc([]() {
EXIT(ENTRANCE(GREAT_BAY_COAST, 1), ENTRANCE(ZORA_CAPE, 0), true),
EXIT(ENTRANCE(ZORA_HALL, 0), ENTRANCE(ZORA_CAPE, 1), CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)),
EXIT(ENTRANCE(WATERFALL_RAPIDS, 0), ENTRANCE(ZORA_CAPE, 4), HAS_ITEM(ITEM_HOOKSHOT)),
- EXIT(ENTRANCE(FAIRY_FOUNTAIN, 3), ENTRANCE(ZORA_CAPE, 5), HAS_ITEM(ITEM_HOOKSHOT) && CAN_USE_EXPLOSIVE),
},
.connections = {
CONNECTION(RR_ZORA_CAPE_BEFORE_GREAT_BAY_TEMPLE, CAN_BE_ZORA),
CONNECTION(RR_ZORA_CAPE_GROTTO, CAN_USE_EXPLOSIVE || CAN_BE_GORON), // TODO: Grotto mapping
+ CONNECTION(RR_ZORA_CAPE_OUTSIDE_FAIRY_FOUNTAIN, HAS_ITEM(ITEM_HOOKSHOT)),
}
};
Regions[RR_ZORA_HALL_EVANS_ROOM] = RandoRegion{ .name = "Evan's Room", .sceneId = SCENE_BANDROOM,
diff --git a/mm/2s2h/Rando/StaticData/Checks.cpp b/mm/2s2h/Rando/StaticData/Checks.cpp
index 4c2e84b80..1d91a3a16 100644
--- a/mm/2s2h/Rando/StaticData/Checks.cpp
+++ b/mm/2s2h/Rando/StaticData/Checks.cpp
@@ -2242,9 +2242,9 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_ENEMY_DROP_DODONGO, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_DRAGONFLY, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_EENO, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
- RC(RC_ENEMY_DROP_FLYING_POT, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
+ // RC(RC_ENEMY_DROP_FLYING_POT, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_FLOORMASTER, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
- RC(RC_ENEMY_DROP_FREEZARD, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
+ // RC(RC_ENEMY_DROP_FREEZARD, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_GUAY, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_HIPLOOP, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_IRON_KNUCKLE, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
@@ -2257,7 +2257,7 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_ENEMY_DROP_OCTOROK, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_PEAHAT, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_RED_BUBBLE, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
- RC(RC_ENEMY_DROP_REDEAD_GIBDO, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ENEMY_DROP_REDEAD, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_SHELLBLADE, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_SKULLFISH, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ENEMY_DROP_SKULLTULA, RCTYPE_ENEMY_DROP, SCENE_SPOT00, FLAG_NONE, 0x0, RI_JUNK),
diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h
index a81297095..f1643fb2f 100644
--- a/mm/2s2h/Rando/Types.h
+++ b/mm/2s2h/Rando/Types.h
@@ -2261,7 +2261,7 @@ typedef enum {
RC_ENEMY_DROP_OCTOROK,
RC_ENEMY_DROP_PEAHAT,
RC_ENEMY_DROP_RED_BUBBLE,
- RC_ENEMY_DROP_REDEAD_GIBDO,
+ RC_ENEMY_DROP_REDEAD,
RC_ENEMY_DROP_SHELLBLADE,
RC_ENEMY_DROP_SKULLFISH,
RC_ENEMY_DROP_SKULLTULA,
@@ -2557,6 +2557,7 @@ typedef enum {
RR_IKANA_CASTLE_BUBBLE_ROOM,
RR_IKANA_CASTLE_CEILING_ROOM,
RR_IKANA_CASTLE_COURTYARD,
+ RR_IKANA_CASTLE_FLOORMASTER_ROOM_REDEAD_AREA,
RR_IKANA_CASTLE_FLOORMASTER_ROOM,
RR_IKANA_CASTLE_FRONT_ENTRANCE,
RR_IKANA_CASTLE_INNER_ROOF,
@@ -2679,6 +2680,7 @@ typedef enum {
RR_SOUTHERN_SWAMP_NEAR_WOODS,
RR_SOUTHERN_SWAMP_NORTH,
RR_SOUTHERN_SWAMP_SOUTH,
+ RR_SOUTHERN_SWAMP_SOUTH_UPPER,
RR_STONE_TOWER_BOTTOM,
RR_STONE_TOWER_INVERTED_LOWER,
RR_STONE_TOWER_INVERTED_NEAR_TEMPLE,
@@ -2767,6 +2769,7 @@ typedef enum {
RR_WOODS_OF_MYSTERY,
RR_ZORA_CAPE_BEFORE_GREAT_BAY_TEMPLE,
RR_ZORA_CAPE_GROTTO,
+ RR_ZORA_CAPE_OUTSIDE_FAIRY_FOUNTAIN,
RR_ZORA_CAPE,
RR_ZORA_HALL_EVANS_ROOM,
RR_ZORA_HALL_JAPAS_ROOM,