diff options
| author | Eblo <7004497+Eblo@users.noreply.github.com> | 2025-11-20 13:24:47 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-20 13:24:47 -0500 |
| commit | c74531cd2d5be71cce63d63708c1d7932c4aca9e (patch) | |
| tree | eb363102bc0cb4432cef3f686ecce3c6fe3b30bb | |
| parent | e2f7c9414332fe67f7d7216705463f6d4546a984 (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
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/EnemyDrops.cpp | 2 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Logic.h | 10 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/Central.cpp | 10 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp | 16 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/Miscellaneous.cpp | 171 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/South.cpp | 23 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp | 2 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp | 2 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/West.cpp | 10 | ||||
| -rw-r--r-- | mm/2s2h/Rando/StaticData/Checks.cpp | 6 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Types.h | 5 |
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, |
