diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 6b2800068..4ad0cf482 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -4,32 +4,40 @@ using namespace Rando; +// Poe sisters: Joelle is red, Beth is blue, Amy is green, Meg is purple + void RegionTable_Init_ForestTemple() { // clang-format off // Vanilla/MQ Decider areaTable[RR_FOREST_TEMPLE_ENTRYWAY] = Region("Forest Temple Entryway", SCENE_FOREST_TEMPLE, {}, {}, { //Exits - Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla();}), - Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsMQ();}), + Entrance(RR_FOREST_TEMPLE_TREES, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla();}), + Entrance(RR_FOREST_TEMPLE_MQ_TREES, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsMQ();}), Entrance(RR_SACRED_FOREST_MEADOW, []{return true;}), }); #pragma region Vanilla - areaTable[RR_FOREST_TEMPLE_FIRST_ROOM] = Region("Forest Temple First Room", SCENE_FOREST_TEMPLE, {}, { + areaTable[RR_FOREST_TEMPLE_TREES] = Region("Forest Temple Trees", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, true), LOCATION(RC_FOREST_TEMPLE_GS_FIRST_ROOM, (logic->IsAdult && logic->CanUse(RG_BOMB_BAG)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOMBCHU_5) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_FOREST_FIRST_GS) && (logic->CanJumpslashExceptHammer() || (logic->IsChild && logic->CanUse(RG_BOMB_BAG))))), }, { //Exits - Entrance(RR_FOREST_TEMPLE_ENTRYWAY, []{return true;}), - Entrance(RR_FOREST_TEMPLE_SOUTH_CORRIDOR, []{return true;}), + Entrance(RR_FOREST_TEMPLE_ENTRYWAY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_OVERGROWN_HALLWAY_LOWER, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_SOUTH_CORRIDOR] = Region("Forest Temple South Corridor", SCENE_FOREST_TEMPLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_OVERGROWN_HALLWAY_LOWER] = Region("Forest Temple Overgrown Hallway Lower", SCENE_FOREST_TEMPLE, {}, {}, { //Exits - Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, []{return true;}), - Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), + Entrance(RR_FOREST_TEMPLE_TREES, []{return true;}), + Entrance(RR_FOREST_TEMPLE_OVERGROWN_HALLWAY_UPPER, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), + }); + + areaTable[RR_FOREST_TEMPLE_OVERGROWN_HALLWAY_UPPER] = Region("Forest Temple Overgrown Hallway Upper", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_OVERGROWN_HALLWAY_LOWER, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), + Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), }); areaTable[RR_FOREST_TEMPLE_LOBBY] = Region("Forest Temple Lobby", SCENE_FOREST_TEMPLE, { @@ -46,17 +54,17 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_LOBBY_POT_6, logic->CanBreakPots()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_SOUTH_CORRIDOR, []{return true;}), - Entrance(RR_FOREST_TEMPLE_NORTH_CORRIDOR, []{return true;}), - Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, []{return logic->CanUse(RG_SONG_OF_TIME) || logic->IsChild;}), - Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT);}), - Entrance(RR_FOREST_TEMPLE_WEST_CORRIDOR, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 1);}), - Entrance(RR_FOREST_TEMPLE_EAST_CORRIDOR, []{return false;}), - Entrance(RR_FOREST_TEMPLE_BOSS_REGION, []{return logic->Get(LOGIC_FOREST_MEG);}), - Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), + Entrance(RR_FOREST_TEMPLE_OVERGROWN_HALLWAY_UPPER, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NORTH_HALLWAY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_LOWER, []{return logic->CanUse(RG_SONG_OF_TIME) || logic->IsChild;}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_LOWER, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT);}), + Entrance(RR_FOREST_TEMPLE_RED_DOORMAT_HALLWAY, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 1);}), + Entrance(RR_FOREST_TEMPLE_BLUE_DOORMAT_HALLWAY, []{return false;}), + Entrance(RR_FOREST_TEMPLE_BASEMENT, []{return logic->Get(LOGIC_FOREST_MEG);}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_FOREST_TEMPLE_NORTH_CORRIDOR] = Region("Forest Temple North Corridor", SCENE_FOREST_TEMPLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NORTH_HALLWAY] = Region("Forest Temple North Hallway", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), Entrance(RR_FOREST_TEMPLE_LOWER_STALFOS, []{return true;}), @@ -64,36 +72,37 @@ void RegionTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_LOWER_STALFOS] = Region("Forest Temple Lower Stalfos", SCENE_FOREST_TEMPLE, { //Events - EventAccess(LOGIC_FAIRY_ACCESS, []{return logic->CanBreakPots();}), + EventAccess(LOGIC_FAIRY_ACCESS, []{return logic->CanBreakPots();}), + EventAccess(LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2);}), }, { //Locations - LOCATION(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2)), + LOCATION(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, logic->Get(LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH)), LOCATION(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, logic->CanBreakPots()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NORTH_CORRIDOR, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NORTH_HALLWAY, []{return logic->Get(LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH);}), }); - areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER] = Region("Forest Temple NW Outdoors Lower", SCENE_FOREST_TEMPLE, { + areaTable[RR_FOREST_TEMPLE_NW_COURTYARD_LOWER] = Region("Forest Temple NW Courtyard Lower", SCENE_FOREST_TEMPLE, { //Events EventAccess(LOGIC_STICK_ACCESS, []{return logic->CanGetDekuBabaSticks();}), EventAccess(LOGIC_NUT_ACCESS, []{return logic->CanGetDekuBabaNuts();}), }, { //Locations LOCATION(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, logic->CanUse(RG_LONGSHOT)), - LOCATION(RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG)), - LOCATION(RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG)), + LOCATION(RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_COURTYARD_HEARTS_BOOMERANG)), + LOCATION(RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_COURTYARD_HEARTS_BOOMERANG)), }, { //Exits - Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanUse(RG_SONG_OF_TIME);}), - Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return logic->CanUse(RG_HOVER_BOOTS) && ((ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives()) || (ctx->GetTrickOption(RT_GROUND_JUMP_HARD) && logic->CanGroundJump()));}), - Entrance(RR_FOREST_TEMPLE_MAP_ROOM, []{return true;}), - Entrance(RR_FOREST_TEMPLE_SEWER, []{return logic->HasItem(RG_GOLDEN_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), - Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), + Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_UPPER, []{return logic->CanUse(RG_HOVER_BOOTS) && ((ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives()) || (ctx->GetTrickOption(RT_GROUND_JUMP_HARD) && logic->IsAdult && logic->CanGroundJump()));}), + Entrance(RR_FOREST_TEMPLE_MAP_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_SEWER, []{return logic->HasItem(RG_GOLDEN_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER] = Region("Forest Temple NW Outdoors Upper", SCENE_FOREST_TEMPLE, { + areaTable[RR_FOREST_TEMPLE_NW_COURTYARD_UPPER] = Region("Forest Temple NW Courtyard Upper", SCENE_FOREST_TEMPLE, { //Events EventAccess(LOGIC_STICK_ACCESS, []{return logic->CanGetDekuBabaSticks();}), EventAccess(LOGIC_NUT_ACCESS, []{return logic->CanGetDekuBabaNuts();}), @@ -104,41 +113,58 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, true), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, []{return true;}), - Entrance(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return true;}), - Entrance(RR_FOREST_TEMPLE_FLOORMASTER_ROOM, []{return true;}), - Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_LOWER, []{return true;}), + Entrance(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return true;}), + Entrance(RR_FOREST_TEMPLE_FLOORMASTER_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM_COURTYARD_ALCOVE, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER] = Region("Forest Temple NE Outdoors Lower", SCENE_FOREST_TEMPLE, { + areaTable[RR_FOREST_TEMPLE_NE_COURTYARD_LOWER] = Region("Forest Temple NE Courtyard Lower", SCENE_FOREST_TEMPLE, { //Events EventAccess(LOGIC_STICK_ACCESS, []{return logic->CanGetDekuBabaSticks();}), EventAccess(LOGIC_NUT_ACCESS, []{return logic->CanGetDekuBabaNuts();}), }, { //Locations - LOCATION(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, logic->CanUse(RG_HOOKSHOT)), - LOCATION(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_FOREST_OUTDOORS_EAST_GS) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_FOREST_COURTYARD_EAST_GS) && logic->CanUse(RG_BOOMERANG))), }, { //Exits - Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), - Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER, []{return logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_FOREST_VINES) && logic->CanUse(RG_HOOKSHOT));}), - Entrance(RR_FOREST_TEMPLE_SEWER, []{return logic->HasItem(RG_GOLDEN_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), - Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return false;}), + Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_UPPER, []{return logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_FOREST_VINES) && logic->CanUse(RG_HOOKSHOT));}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_ISLAND, []{return logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_FOREST_TEMPLE_SEWER, []{return (((logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_FOREST_WELL_SWIM) && logic->CanUse(RG_HOOKSHOT))) && logic->HasItem(RG_BRONZE_SCALE)) || logic->HasItem(RG_GOLDEN_SCALE)) && logic->WaterTimer() >= 16;}), }); - areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER] = Region("Forest Temple NE Outdoors Upper", SCENE_FOREST_TEMPLE, { + areaTable[RR_FOREST_TEMPLE_NE_COURTYARD_UPPER] = Region("Forest Temple NE Courtyard Upper", SCENE_FOREST_TEMPLE, { //Events - EventAccess(LOGIC_STICK_ACCESS, []{return logic->CanGetDekuBabaSticks();}), - EventAccess(LOGIC_NUT_ACCESS, []{return logic->CanGetDekuBabaNuts();}), + EventAccess(LOGIC_STICK_ACCESS, []{return logic->CanGetDekuBabaSticks();}), + EventAccess(LOGIC_NUT_ACCESS, []{return logic->CanGetDekuBabaNuts();}), + EventAccess(LOGIC_FOREST_SUMMON_NE_SCARECROW, []{return ctx->GetTrickOption(RT_FOREST_DOORFRAME) && logic->CanJumpslash() && logic->CanUse(RG_HOVER_BOOTS) && logic->ScarecrowsSong();}), + }, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_LOWER, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_ISLAND, []{return logic->IsAdult && ctx->GetTrickOption(RT_FOREST_COURTYARD_LEDGE) && logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_FOREST_TEMPLE_MAP_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_DRAINED_SEWER, []{return true;}), + }); + + areaTable[RR_FOREST_TEMPLE_NE_COURTYARD_ISLAND] = Region("Forest Temple NE Courtyard Island", SCENE_FOREST_TEMPLE, { + EventAccess(LOGIC_FOREST_SUMMON_NE_SCARECROW, []{return logic->ScarecrowsSong();}), }, { //Locations - LOCATION(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, logic->IsAdult && ctx->GetTrickOption(RT_FOREST_OUTDOORS_LEDGE) && logic->CanUse(RG_HOVER_BOOTS)), + LOCATION(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, true), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, []{return true;}), - Entrance(RR_FOREST_TEMPLE_MAP_ROOM, []{return true;}), - Entrance(RR_FOREST_TEMPLE_DRAINED_SEWER, []{return true;}), - Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return ctx->GetTrickOption(RT_FOREST_DOORFRAME) && logic->CanJumpslashExceptHammer() && logic->CanUse(RG_HOVER_BOOTS) && logic->CanUse(RG_SCARECROW);}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_LOWER, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_SCARECROW_LEDGE, []{return logic->Get(LOGIC_FOREST_SUMMON_NE_SCARECROW) && logic->CanUse(RG_HOOKSHOT);}), + }); + + areaTable[RR_FOREST_TEMPLE_NE_COURTYARD_SCARECROW_LEDGE] = Region("Forest Temple NE Courtyard Scarecrow Ledge", SCENE_FOREST_TEMPLE, {}, { + //Locations + LOCATION(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_DINS_FIRE) || logic->HasExplosives()), + }, { + //Exits + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_ISLAND, []{return true;}), + Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return true;}), }); areaTable[RR_FOREST_TEMPLE_MAP_ROOM] = Region("Forest Temple Map Room", SCENE_FOREST_TEMPLE, {}, { @@ -146,8 +172,8 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_MAP_CHEST, logic->CanKillEnemy(RE_BLUE_BUBBLE)), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, []{return Here(RR_FOREST_TEMPLE_MAP_ROOM, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), - Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER, []{return Here(RR_FOREST_TEMPLE_MAP_ROOM, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), + Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_LOWER, []{return Here(RR_FOREST_TEMPLE_MAP_ROOM, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_UPPER, []{return Here(RR_FOREST_TEMPLE_MAP_ROOM, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), }); areaTable[RR_FOREST_TEMPLE_SEWER] = Region("Forest Temple Sewer", SCENE_FOREST_TEMPLE, {}, { @@ -157,8 +183,8 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_WELL_EAST_HEART, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, []{return logic->HasItem(RG_BRONZE_SCALE);}), - Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, []{return logic->HasItem(RG_BRONZE_SCALE);}), + Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_LOWER, []{return logic->HasItem(RG_BRONZE_SCALE);}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_LOWER, []{return logic->HasItem(RG_BRONZE_SCALE);}), }); areaTable[RR_FOREST_TEMPLE_DRAINED_SEWER] = Region("Forest Temple Drained Well", SCENE_FOREST_TEMPLE, {}, { @@ -168,13 +194,13 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_WELL_EAST_HEART, true), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, []{return true;}), - Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_LOWER, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_LOWER, []{return true;}), }); areaTable[RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST] = Region("Forest Temple Below Boss Key Chest", SCENE_FOREST_TEMPLE, {}, {}, { //Exits - Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return Here(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), + Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_UPPER, []{return Here(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), }); areaTable[RR_FOREST_TEMPLE_FLOORMASTER_ROOM] = Region("Forest Temple Floormaster Room", SCENE_FOREST_TEMPLE, {}, { @@ -182,39 +208,64 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, logic->CanDamage()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_UPPER, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_WEST_CORRIDOR] = Region("Forest Temple West Corridor", SCENE_FOREST_TEMPLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_RED_DOORMAT_HALLWAY] = Region("Forest Temple West Hallway", SCENE_FOREST_TEMPLE, {}, {}, { //Exits - Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 1);}), - Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), + Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 1);}), + Entrance(RR_FOREST_TEMPLE_RED_DOORMAT_HALLWAY_DOORMAT, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM] = Region("Forest Temple Block Push Room", SCENE_FOREST_TEMPLE, {}, { + areaTable[RR_FOREST_TEMPLE_RED_DOORMAT_HALLWAY_DOORMAT] = Region("Forest Temple West Hallway Doormat", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_RED_DOORMAT_HALLWAY, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), + Entrance(RR_FOREST_TEMPLE_LOWER_BLOCK_PUSH_ROOM, []{return true;}), + }); + + areaTable[RR_FOREST_TEMPLE_LOWER_BLOCK_PUSH_ROOM] = Region("Forest Temple Lower Block Push Room", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_RED_DOORMAT_HALLWAY_DOORMAT, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MIDDLE_BLOCK_PUSH_ROOM, []{return logic->HasItem(RG_GORONS_BRACELET);}), + Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM_COURTYARD_ALCOVE, []{return logic->CanUse(RG_HOVER_BOOTS);}), + }); + + areaTable[RR_FOREST_TEMPLE_MIDDLE_BLOCK_PUSH_ROOM] = Region("Forest Temple Middle Block Push Room", SCENE_FOREST_TEMPLE, {}, { //Locations - LOCATION(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, logic->HasItem(RG_GORONS_BRACELET) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, logic->CanHitEyeTargets()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_WEST_CORRIDOR, []{return true;}), - Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_FOREST_OUTSIDE_BACKDOOR) && logic->CanJumpslashExceptHammer() && logic->HasItem(RG_GORONS_BRACELET));}), - Entrance(RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED, []{return logic->IsAdult && logic->HasItem(RG_GORONS_BRACELET) && logic->SmallKeys(SCENE_FOREST_TEMPLE, 2);}), - Entrance(RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, []{return logic->IsAdult && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)) && logic->HasItem(RG_GORONS_BRACELET) && logic->SmallKeys(SCENE_FOREST_TEMPLE, 2);}), + Entrance(RR_FOREST_TEMPLE_LOWER_BLOCK_PUSH_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM_COURTYARD_ALCOVE, []{return ctx->GetTrickOption(RT_FOREST_OUTSIDE_BACKDOOR) && logic->CanJumpslashExceptHammer();}), + Entrance(RR_FOREST_TEMPLE_UPPER_BLOCK_PUSH_ROOM, []{return logic->IsAdult && logic->HasItem(RG_GORONS_BRACELET);}), }); - areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED] = Region("Forest Temple NW Corridor Twisted", SCENE_FOREST_TEMPLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_UPPER_BLOCK_PUSH_ROOM] = Region("Forest Temple Upper Block Push Room", SCENE_FOREST_TEMPLE, {}, {}, { //Exits - Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 2);}), - Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 3);}), + Entrance(RR_FOREST_TEMPLE_MIDDLE_BLOCK_PUSH_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NW_HALLWAY_TWISTED, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 2);}), + Entrance(RR_FOREST_TEMPLE_NW_HALLWAY_STRAIGHTENED, []{return logic->CanHitEyeTargets() && logic->SmallKeys(SCENE_FOREST_TEMPLE, 2);}), }); - areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NW Corridor Straightened", SCENE_FOREST_TEMPLE, {}, { + areaTable[RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM_COURTYARD_ALCOVE] = Region("Forest Temple Block Push Room Courtyard Alcove", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_LOWER_BLOCK_PUSH_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_UPPER, []{return true;}), + }); + + areaTable[RR_FOREST_TEMPLE_NW_HALLWAY_TWISTED] = Region("Forest Temple NW Hallway Twisted", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_UPPER_BLOCK_PUSH_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 2);}), + Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 3);}), + }); + + areaTable[RR_FOREST_TEMPLE_NW_HALLWAY_STRAIGHTENED] = Region("Forest Temple NW Hallway Straightened", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, true), }, { //Exits - Entrance(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return true;}), - Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 2);}), + Entrance(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return true;}), + Entrance(RR_FOREST_TEMPLE_UPPER_BLOCK_PUSH_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 2);}), }); areaTable[RR_FOREST_TEMPLE_RED_POE_ROOM] = Region("Forest Temple Red Poe Room", SCENE_FOREST_TEMPLE, { @@ -225,21 +276,25 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_RED_POE_CHEST, logic->Get(LOGIC_FOREST_JOELLE)), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 3);}), + Entrance(RR_FOREST_TEMPLE_NW_HALLWAY_TWISTED, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 3);}), Entrance(RR_FOREST_TEMPLE_UPPER_STALFOS, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_UPPER_STALFOS] = Region("Forest Temple Upper Stalfos", SCENE_FOREST_TEMPLE, {}, { + areaTable[RR_FOREST_TEMPLE_UPPER_STALFOS] = Region("Forest Temple Upper Stalfos", SCENE_FOREST_TEMPLE, { + //Events + //technically happens in RR_FOREST_TEMPLE_LOWER_STALFOS, but the way this room blocks the hole means it cannot be logical to do anything else there. + EventAccess(LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2);}), + }, { //Locations - LOCATION(RC_FOREST_TEMPLE_BOW_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3)), + LOCATION(RC_FOREST_TEMPLE_BOW_CHEST, logic->Get(LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH) && logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3)), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, logic->CanBreakPots()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), - Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), + Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, []{return logic->Get(LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH) && logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), + Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, []{return logic->Get(LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH) && logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), }); areaTable[RR_FOREST_TEMPLE_BLUE_POE_ROOM] = Region("Forest Temple Blue Poe Room", SCENE_FOREST_TEMPLE, { @@ -254,16 +309,16 @@ void RegionTable_Init_ForestTemple() { }, { //Exits Entrance(RR_FOREST_TEMPLE_UPPER_STALFOS, []{return true;}), - Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 4);}), + Entrance(RR_FOREST_TEMPLE_NE_HALLWAY_STRAIGHTENED, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 4);}), }); - areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NE Corridor Straightened", SCENE_FOREST_TEMPLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NE_HALLWAY_STRAIGHTENED] = Region("Forest Temple NE Hallway Straightened", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 4);}), Entrance(RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 5);}), }); - areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED] = Region("Forest Temple NE Corridor Twisted", SCENE_FOREST_TEMPLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NE_HALLWAY_TWISTED] = Region("Forest Temple NE Hallway Twisted", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 5);}), Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return true;}), @@ -275,19 +330,17 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, logic->CanBreakPots()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 5);}), - Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 5) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE));}), + Entrance(RR_FOREST_TEMPLE_NE_HALLWAY_STRAIGHTENED, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 5);}), + Entrance(RR_FOREST_TEMPLE_NE_HALLWAY_TWISTED, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 5) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE));}), }); areaTable[RR_FOREST_TEMPLE_FALLING_ROOM] = Region("Forest Temple Falling Room", SCENE_FOREST_TEMPLE, {}, { //Locations - LOCATION(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_DINS_FIRE) || logic->HasExplosives()), - LOCATION(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, true), - LOCATION(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, true), + LOCATION(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, true), }, { //Exits - Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, []{return true;}), - Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_SCARECROW_LEDGE, []{return true;}), + Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, []{return true;}), }); areaTable[RR_FOREST_TEMPLE_GREEN_POE_ROOM] = Region("Forest Temple Green Poe Room", SCENE_FOREST_TEMPLE, { @@ -299,42 +352,64 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_GREEN_POE_POT_2, logic->CanBreakPots()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return true;}), - Entrance(RR_FOREST_TEMPLE_EAST_CORRIDOR, []{return logic->Get(LOGIC_FOREST_AMY);}), + Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_BLUE_DOORMAT_HALLWAY_DOORMAT, []{return logic->Get(LOGIC_FOREST_AMY);}), }); - areaTable[RR_FOREST_TEMPLE_EAST_CORRIDOR] = Region("Forest Temple East Corridor", SCENE_FOREST_TEMPLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_BLUE_DOORMAT_HALLWAY_DOORMAT] = Region("Forest Temple Blue Doormat Hallway Doormat", SCENE_FOREST_TEMPLE, {}, {}, { //Exits - Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), - Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), + Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_BLUE_DOORMAT_HALLWAY, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_FOREST_TEMPLE_BOSS_REGION] = Region("Forest Temple Boss Region", SCENE_FOREST_TEMPLE, {}, { + areaTable[RR_FOREST_TEMPLE_BLUE_DOORMAT_HALLWAY] = Region("Forest Temple Blue Doormat Hallway", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_BLUE_DOORMAT_HALLWAY_DOORMAT, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), + Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), + }); + + areaTable[RR_FOREST_TEMPLE_BASEMENT] = Region("Forest Temple Boss Region", SCENE_FOREST_TEMPLE, { + //Events + EventAccess(LOGIC_FOREST_OPEN_BOSS_HALLWAY, []{return true;}), + }, { //Locations LOCATION(RC_FOREST_TEMPLE_BASEMENT_CHEST, true), LOCATION(RC_FOREST_TEMPLE_GS_BASEMENT, logic->HookshotOrBoomerang()), }, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), - Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return logic->Get(LOGIC_FOREST_OPEN_BOSS_HALLWAY);}), }); #pragma endregion #pragma region MQ - areaTable[RR_FOREST_TEMPLE_MQ_LOBBY] = Region("Forest Temple MQ Lobby", SCENE_FOREST_TEMPLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_TREES] = Region("Forest Temple MQ Trees", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA, ED_SHORT_JUMPSLASH, false) || logic->CanUse(RG_HOVER_BOOTS)), - //Implies CanPassEnemy(RE_BIG_SKULLTULA) + }, { + //Exits + Entrance(RR_FOREST_TEMPLE_ENTRYWAY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_OVERGROWN_HALLWAY_LOWER, []{return true;}), + }); + + areaTable[RR_FOREST_TEMPLE_MQ_OVERGROWN_HALLWAY_LOWER] = Region("Forest Temple MQ Overgrown Hallway Lower", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_MQ_TREES, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_OVERGROWN_HALLWAY_UPPER, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), + }); + + areaTable[RR_FOREST_TEMPLE_MQ_OVERGROWN_HALLWAY_UPPER] = Region("Forest Temple MQ Overgrown Hallway Upper", SCENE_FOREST_TEMPLE, {}, { + //Locations LOCATION(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, logic->HookshotOrBoomerang()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_ENTRYWAY, []{return true;}), - Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 1) && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), + Entrance(RR_FOREST_TEMPLE_MQ_OVERGROWN_HALLWAY_LOWER, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), + Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 1);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_CENTRAL_AREA] = Region("Forest Temple MQ Central Region", SCENE_FOREST_TEMPLE, { + areaTable[RR_FOREST_TEMPLE_MQ_LOBBY] = Region("Forest Temple MQ Lobby", SCENE_FOREST_TEMPLE, { //Events EventAccess(LOGIC_FOREST_MEG, []{return logic->Get(LOGIC_FOREST_JOELLE) && logic->Get(LOGIC_FOREST_BETH) && logic->Get(LOGIC_FOREST_AMY) && logic->CanKillEnemy(RE_MEG);}), }, { @@ -347,12 +422,20 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, logic->CanBreakPots()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM, []{return logic->IsChild || logic->CanUse(RG_SONG_OF_TIME);}), - Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, []{return logic->CanHitEyeTargets();}), - Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, []{return logic->CanHitEyeTargets();}), - Entrance(RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE, []{return Here(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->CanKillEnemy(RE_STALFOS);});}), + Entrance(RR_FOREST_TEMPLE_MQ_OVERGROWN_HALLWAY_UPPER, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 1);}), + Entrance(RR_FOREST_TEMPLE_MQ_NORTH_HALLWAY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_RED_DOORMAT_HALLWAY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_BLUE_DOORMAT_HALLWAY, []{return false;}), + Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD, []{return logic->CanHitEyeTargets();}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_COURTYARD, []{return logic->CanHitEyeTargets();}), //implies the other 3 poes - Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->Get(LOGIC_FOREST_MEG);}), + Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->Get(LOGIC_FOREST_MEG);}), + }); + + areaTable[RR_FOREST_TEMPLE_MQ_NORTH_HALLWAY] = Region("Forest Temple MQ North Hallway", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM, []{return logic->IsChild || logic->CanUse(RG_SONG_OF_TIME);}), }); areaTable[RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM] = Region("Forest Temple MQ Wolfos Room", SCENE_FOREST_TEMPLE, { @@ -366,7 +449,13 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, logic->CanBreakPots()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->Get(LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH) && (logic->IsChild || logic->CanUse(RG_SONG_OF_TIME));}), + Entrance(RR_FOREST_TEMPLE_MQ_NORTH_HALLWAY, []{return logic->Get(LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH) && (logic->IsChild || logic->CanUse(RG_SONG_OF_TIME));}), + }); + + areaTable[RR_FOREST_TEMPLE_MQ_RED_DOORMAT_HALLWAY] = Region("Forest Temple MQ Red Doormat Hallway", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return Here(RR_FOREST_TEMPLE_MQ_RED_DOORMAT_HALLWAY, []{return logic->CanKillEnemy(RE_STALFOS);});}), + Entrance(RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE, []{return Here(RR_FOREST_TEMPLE_MQ_RED_DOORMAT_HALLWAY, []{return logic->CanKillEnemy(RE_STALFOS);});}), }); areaTable[RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE] = Region("Forest Temple MQ Lower Block Puzzle", SCENE_FOREST_TEMPLE, { @@ -379,11 +468,9 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return Here(RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE, []{return logic->CanKillEnemy(RE_STALFOS);});}), + Entrance(RR_FOREST_TEMPLE_MQ_RED_DOORMAT_HALLWAY, []{return Here(RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE, []{return logic->CanKillEnemy(RE_STALFOS);});}), Entrance(RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE, []{return logic->HasItem(RG_GORONS_BRACELET) || (logic->Get(LOGIC_FOREST_MQ_BLOCK_ROOM_TARGETS) && logic->CanUse(RG_HOOKSHOT));}), - //Assumes RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE access - Entrance(RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE, []{return (logic->IsAdult && logic->HasItem(RG_GORONS_BRACELET)) || (logic->Get(LOGIC_FOREST_MQ_BLOCK_ROOM_TARGETS) && logic->CanUse(RG_HOOKSHOT));}), - Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return logic->Get(LOGIC_FOREST_CAN_TWIST_HALLWAY) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}), + Entrance(RR_FOREST_TEMPLE_MQ_INDOOR_LEDGE, []{return logic->Get(LOGIC_FOREST_CAN_TWIST_HALLWAY) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}), }); areaTable[RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE] = Region("Forest Temple MQ Middle Block Puzzle", SCENE_FOREST_TEMPLE, { @@ -395,21 +482,19 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE, []{return true;}), Entrance(RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE, []{return (logic->IsAdult && logic->HasItem(RG_GORONS_BRACELET)) || (logic->Get(LOGIC_FOREST_MQ_BLOCK_ROOM_TARGETS) && logic->CanUse(RG_HOOKSHOT));}), //Hammer cannot recoil from here, but can make the jump forwards with a hammer jumpslash as adult - Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return logic->Get(LOGIC_FOREST_CAN_TWIST_HALLWAY) && logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_FOREST_OUTSIDE_BACKDOOR) && (logic->CanJumpslashExceptHammer() || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER))));}), + Entrance(RR_FOREST_TEMPLE_MQ_INDOOR_LEDGE, []{return logic->Get(LOGIC_FOREST_CAN_TWIST_HALLWAY) && logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_FOREST_OUTSIDE_BACKDOOR) && (logic->CanJumpslashExceptHammer() || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER))));}), }); - areaTable[RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE] = Region("Forest Temple MQ After Block Puzzle", SCENE_FOREST_TEMPLE, {}, { - //Locations - LOCATION(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, logic->SmallKeys(SCENE_FOREST_TEMPLE, 3)), - }, { + areaTable[RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE] = Region("Forest Temple MQ After Block Puzzle", SCENE_FOREST_TEMPLE, {}, {}, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_STRAIGHT_HALLWAY, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 3);}), - Entrance(RR_FOREST_TEMPLE_MQ_JOELLE_ROOM, []{return logic->Get(LOGIC_FOREST_CAN_TWIST_HALLWAY) && logic->SmallKeys(SCENE_FOREST_TEMPLE, 4);}), + Entrance(RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_STRAIGHT_HALLWAY, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 3);}), + Entrance(RR_FOREST_TEMPLE_MQ_JOELLE_ROOM, []{return logic->Get(LOGIC_FOREST_CAN_TWIST_HALLWAY) && logic->SmallKeys(SCENE_FOREST_TEMPLE, 4);}), //!QUANTUM LOGIC! - //As there is no way in default logic to reach the other possible key use without going through RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, this is logically safe for now - //Breaks if there's any other way to RR_FOREST_TEMPLE_MQ_FALLING_ROOM than going through the eye targets in RR_FOREST_TEMPLE_MQ_CENTRAL_AREA + //As there is no way in default logic to reach the other possible key use without going through RR_FOREST_TEMPLE_MQ_NW_COURTYARD, this is logically safe for now + //Breaks if there's any other way to RR_FOREST_TEMPLE_MQ_FALLING_ROOM than going through the eye targets in RR_FOREST_TEMPLE_MQ_LOBBY //Requires a bow/sling ammo source once ammo logic is done, to avoid edge cases. - Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 2) && Here(RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), + Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 2) && Here(RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), }); areaTable[RR_FOREST_TEMPLE_MQ_STRAIGHT_HALLWAY] = Region("Forest Temple MQ Straight Hallway", SCENE_FOREST_TEMPLE, {}, { @@ -422,48 +507,71 @@ void RegionTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM] = Region("Forest Temple MQ Floormaster Room", SCENE_FOREST_TEMPLE, {}, {}, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return Here(RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), + Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD_LEDGE, []{return Here(RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), }); - areaTable[RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE] = Region("Forest Temple MQ Outdoor Ledge", SCENE_FOREST_TEMPLE, { + areaTable[RR_FOREST_TEMPLE_MQ_INDOOR_LEDGE] = Region("Forest Temple MQ Indoor Ledge", SCENE_FOREST_TEMPLE, { + //Events EventAccess(LOGIC_FOREST_CAN_TWIST_HALLWAY, []{return logic->CanHitSwitch();}), - }, { + }, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE, []{return logic->Get(LOGIC_FOREST_CAN_TWIST_HALLWAY);}), + Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD_LEDGE, []{return true;}), + }); + + areaTable[RR_FOREST_TEMPLE_MQ_NW_COURTYARD_LEDGE] = Region("Forest Temple MQ Outdoor Ledge", SCENE_FOREST_TEMPLE, {}, { //Locations - LOCATION(RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, logic->CanKillEnemy(RE_REDEAD)), LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, true), LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, true), LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, true), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_INDOOR_LEDGE, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_REDEAD_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_NW_OUTDOORS] = Region("Forest Temple MQ NW Outdoors", SCENE_FOREST_TEMPLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_REDEAD_ROOM] = Region("Forest Temple MQ Redead Room", SCENE_FOREST_TEMPLE, {}, { + //Locations + LOCATION(RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, logic->CanKillEnemy(RE_REDEAD)), + }, { + //Exits + Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD_LEDGE, []{return Here(RR_FOREST_TEMPLE_MQ_REDEAD_ROOM, []{return logic->CanKillEnemy(RE_REDEAD);});}), + }); + + areaTable[RR_FOREST_TEMPLE_MQ_NW_COURTYARD] = Region("Forest Temple MQ NW Courtyard", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), //the well checks are considered from both areas instead of being a region because the draining is a temp flag and the skull (as well as the chest with hook glitch) has different breath timers from each side LOCATION(RC_FOREST_TEMPLE_MQ_GS_WELL, (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8 && logic->CanUse(RG_HOOKSHOT))), - LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG)), - LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG)), - LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG)), + LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_COURTYARD_HEARTS_BOOMERANG)), + LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_COURTYARD_HEARTS_BOOMERANG)), + LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_FOREST_COURTYARD_HEARTS_BOOMERANG)), LOCATION(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8), LOCATION(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8), LOCATION(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, []{return (((logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_FOREST_MQ_WELL_SWIM) && logic->CanUse(RG_HOOKSHOT))) && logic->HasItem(RG_BRONZE_SCALE)) || logic->HasItem(RG_GOLDEN_SCALE)) && logic->WaterTimer() >= 16;}), - Entrance(RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, []{return logic->CanUse(RG_FIRE_ARROWS);}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_COURTYARD, []{return (((logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_FOREST_WELL_SWIM) && logic->CanUse(RG_HOOKSHOT))) && logic->HasItem(RG_BRONZE_SCALE)) || logic->HasItem(RG_GOLDEN_SCALE)) && logic->WaterTimer() >= 16;}), + Entrance(RR_FOREST_TEMPLE_MQ_NORTH_PASSAGE, []{return logic->CanUse(RG_FIRE_ARROWS);}), // temp flag, can't be event + Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD_LEDGE, []{return logic->CanUse(RG_HOVER_BOOTS) && ((ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives()) || (ctx->GetTrickOption(RT_GROUND_JUMP_HARD) && logic->IsAdult && logic->CanGroundJump()));}), }); - //The well only coniders the eye target here because the eye target is a temp flag, making it unwieldy to use as an EventAccess to make it it's own room - areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS] = Region("Forest Temple MQ NE Outdoors", SCENE_FOREST_TEMPLE, { + areaTable[RR_FOREST_TEMPLE_MQ_NORTH_PASSAGE] = Region("Forest Temple MQ North Passage", SCENE_FOREST_TEMPLE, {}, {}, { + Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD, []{return logic->HasFireSourceWithTorch();}), + Entrance(RR_FOREST_TEMPLE_MQ_COURTYARD_TOP_LEDGES, []{return true;}), + }); + + //The well only considers the eye target here because the eye target is a temp flag, making it unwieldy to use as an EventAccess to make it it's own room + areaTable[RR_FOREST_TEMPLE_MQ_NE_COURTYARD] = Region("Forest Temple MQ NE Courtyard", SCENE_FOREST_TEMPLE, { //Events EventAccess(LOGIC_STICK_ACCESS, []{return logic->CanGetDekuBabaSticks();}), EventAccess(LOGIC_NUT_ACCESS, []{return logic->CanGetDekuBabaNuts();}), }, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_WELL_CHEST, logic->CanHitEyeTargets() || (logic->CanOpenUnderwaterChest() && logic->WaterTimer() >= 8)), - LOCATION(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), + LOCATION(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), //implies logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA) LOCATION(RC_FOREST_TEMPLE_MQ_GS_WELL, logic->CanHitEyeTargets() || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), LOCATION(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8) || logic->CanHitEyeTargets()), @@ -471,35 +579,41 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8) || logic->CanHitEyeTargets()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, []{return (((logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_LONGSHOT)) && logic->HasItem(RG_BRONZE_SCALE)) || logic->HasItem(RG_GOLDEN_SCALE)) && logic->WaterTimer() >= 16;}), - Entrance(RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, []{return logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOOKSHOT) && ((logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || logic->CanUse(RG_SONG_OF_TIME)));}), - Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, []{return logic->CanUse(RG_LONGSHOT);}), + Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD, []{return (((logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_LONGSHOT)) && logic->HasItem(RG_BRONZE_SCALE)) || logic->HasItem(RG_GOLDEN_SCALE)) && logic->WaterTimer() >= 16;}), + Entrance(RR_FOREST_TEMPLE_MQ_COURTYARD_TOP_LEDGES, []{return logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOOKSHOT) && ((logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || logic->CanUse(RG_SONG_OF_TIME)));}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_COURTYARD_ISLAND, []{return logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES] = Region("Forest Temple MQ Outdoors Top Ledges", SCENE_FOREST_TEMPLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_COURTYARD_TOP_LEDGES] = Region("Forest Temple MQ Courtyard Top Ledges", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, true), //Actually killing the skull from the doorframe with melee is annoying. Hammer swing hits low enough unaided, other swords need to crouch stab but the spot is precise based on range. kokiri sword doesn't reach at all for adult. - LOCATION(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, ((logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME)) || (logic->CanUse(RG_HOVER_BOOTS) && ctx->GetTrickOption(RT_FOREST_DOORFRAME))) && logic->CanJumpslash() && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || logic->CanUse(RG_FAIRY_BOW) || logic->HookshotOrBoomerang() || (logic->CanStandingShield() && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MASTER_SWORD) || (logic->IsChild && logic->CanUse(RG_KOKIRI_SWORD)))))), + LOCATION(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, ((logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME)) || (logic->CanUse(RG_HOVER_BOOTS) && ctx->GetTrickOption(RT_FOREST_DOORFRAME))) && logic->CanJumpslash() && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || logic->CanUse(RG_FAIRY_BOW) || logic->HookshotOrBoomerang() || (logic->CanStandingShield() && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MASTER_SWORD) || (logic->IsChild && logic->CanUse(RG_KOKIRI_SWORD)))))), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, []{return logic->HasFireSourceWithTorch();}), - Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_NORTH_PASSAGE, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_COURTYARD, []{return true;}), //N64 logic doesn't check damage but I always take some so I'm adding it - Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, []{return ctx->GetTrickOption(RT_FOREST_OUTDOORS_LEDGE) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanJumpslash() && logic->TakeDamage();}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_COURTYARD_ISLAND, []{return ctx->GetTrickOption(RT_FOREST_COURTYARD_LEDGE) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanJumpslash() && logic->TakeDamage();}), }); - areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE] = Region("Forest Temple MQ NE Outdoors Ledge", SCENE_FOREST_TEMPLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_NE_COURTYARD_ISLAND] = Region("Forest Temple MQ NE Courtyard Island", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, true), }, { //Exits //Skipping swim here is non-trival, needs a roll-jump. If a swim lock is added it's probably wise to copy deku baba events here - Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, []{return true;}), - Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->CanUse(RG_SONG_OF_TIME);}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_COURTYARD, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_COURTYARD_LEDGE_ABOVE_ISLAND, []{return logic->CanUse(RG_SONG_OF_TIME);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_JOELLE_ROOM] = Region("Forest Temple MQ Joelle room", SCENE_FOREST_TEMPLE, { + areaTable[RR_FOREST_TEMPLE_MQ_NE_COURTYARD_LEDGE_ABOVE_ISLAND] = Region("Forest Temple MQ NE Courtyard Ledge Above Island", SCENE_FOREST_TEMPLE, {}, {}, { + Entrance(RR_FOREST_TEMPLE_MQ_NE_COURTYARD_ISLAND, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return true;}), + }); + + areaTable[RR_FOREST_TEMPLE_MQ_JOELLE_ROOM] = Region("Forest Temple MQ Joelle Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(LOGIC_FOREST_JOELLE, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -547,7 +661,6 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_3_STALFOS_ROOM, []{return true;}), }); - //This room exists to show the actual map layout, and for when the crates get added to logic areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", SCENE_FOREST_TEMPLE, {}, { // Locations LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), @@ -564,8 +677,8 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, true), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, []{return true;}), - Entrance(RR_FOREST_TEMPLE_MQ_AMY_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 6);}), + Entrance(RR_FOREST_TEMPLE_MQ_NE_COURTYARD_LEDGE_ABOVE_ISLAND, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_AMY_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 6);}), }); areaTable[RR_FOREST_TEMPLE_MQ_AMY_ROOM] = Region("Forest Temple MQ Amy Room", SCENE_FOREST_TEMPLE, { @@ -577,22 +690,28 @@ void RegionTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, logic->CanBreakPots()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->Get(LOGIC_FOREST_AMY);}), - Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_BLUE_DOORMAT_HALLWAY, []{return logic->Get(LOGIC_FOREST_AMY);}), + Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->SmallKeys(SCENE_FOREST_TEMPLE, 6);}), + }); + + areaTable[RR_FOREST_TEMPLE_MQ_BLUE_DOORMAT_HALLWAY] = Region("Forest Temple MQ Blue Doormat Hallway", SCENE_FOREST_TEMPLE, {}, {}, { + //Exits + Entrance(RR_FOREST_TEMPLE_MQ_AMY_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return true;}), }); areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT] = Region("Forest Temple MQ Basement", SCENE_FOREST_TEMPLE, { //Events //Implies CanHitSwitch() - EventAccess(LOGIC_FOREST_OPEN_BOSS_CORRIDOR, []{return logic->CanHitEyeTargets();}), + EventAccess(LOGIC_FOREST_OPEN_BOSS_HALLWAY, []{return logic->CanHitEyeTargets();}), }, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, true), }, { //Exits - Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->Get(LOGIC_FOREST_MEG);}), + Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return true;}), Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT_POT_ROOM, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->TakeDamage();}), - Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, []{return logic->Get(LOGIC_FOREST_OPEN_BOSS_CORRIDOR);}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return logic->Get(LOGIC_FOREST_OPEN_BOSS_HALLWAY);}), }); areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT_POT_ROOM] = Region("Forest Temple MQ Basement Pot Room", SCENE_FOREST_TEMPLE, {}, { @@ -606,20 +725,14 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_BOSS_REGION] = Region("Forest Temple MQ Boss Region", SCENE_FOREST_TEMPLE, {}, {}, { - //Exits - Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->Get(LOGIC_FOREST_OPEN_BOSS_CORRIDOR);}), - Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return true;}), - }); - #pragma endregion // Boss Room areaTable[RR_FOREST_TEMPLE_BOSS_ENTRYWAY] = Region("Forest Temple Boss Entryway", SCENE_FOREST_TEMPLE, {}, {}, { // Exits - Entrance(RR_FOREST_TEMPLE_BOSS_REGION, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla() && false;}), - Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsMQ() && false;}), - Entrance(RR_FOREST_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_FOREST_TEMPLE_BOSS_KEY);}), + Entrance(RR_FOREST_TEMPLE_BASEMENT, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla() && logic->Get(LOGIC_FOREST_OPEN_BOSS_HALLWAY);}), + Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsMQ() && logic->Get(LOGIC_FOREST_OPEN_BOSS_HALLWAY);}), + Entrance(RR_FOREST_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_FOREST_TEMPLE_BOSS_KEY);}), }); areaTable[RR_FOREST_TEMPLE_BOSS_ROOM] = Region("Forest Temple Boss Room", SCENE_FOREST_TEMPLE_BOSS, { diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index cea8437d7..ba069d287 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -270,10 +270,11 @@ typedef enum { LOGIC_JABU_LOWERED_PATH, LOGIC_JABU_MQ_HOLES_ROOM_DOOR, LOGIC_JABU_MQ_LIFT_ROOM_COW, + LOGIC_FOREST_SUMMON_NE_SCARECROW, LOGIC_FOREST_MQ_BLOCK_ROOM_TARGETS, LOGIC_FOREST_CAN_TWIST_HALLWAY, LOGIC_FOREST_CLEAR_BETWEEN_JOELLE_AND_BETH, - LOGIC_FOREST_OPEN_BOSS_CORRIDOR, + LOGIC_FOREST_OPEN_BOSS_HALLWAY, LOGIC_FOREST_JOELLE, LOGIC_FOREST_BETH, LOGIC_FOREST_AMY, @@ -815,48 +816,64 @@ typedef enum { RR_JABU_JABUS_BELLY_BOSS_EXIT, RR_JABU_JABUS_BELLY_BOSS_ROOM, - RR_FOREST_TEMPLE_FIRST_ROOM, - RR_FOREST_TEMPLE_SOUTH_CORRIDOR, + RR_FOREST_TEMPLE_TREES, + RR_FOREST_TEMPLE_OVERGROWN_HALLWAY_LOWER, + RR_FOREST_TEMPLE_OVERGROWN_HALLWAY_UPPER, RR_FOREST_TEMPLE_LOBBY, - RR_FOREST_TEMPLE_NORTH_CORRIDOR, + RR_FOREST_TEMPLE_NORTH_HALLWAY, RR_FOREST_TEMPLE_LOWER_STALFOS, - RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, - RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, - RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, - RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER, + RR_FOREST_TEMPLE_NW_COURTYARD_LOWER, + RR_FOREST_TEMPLE_NW_COURTYARD_UPPER, + RR_FOREST_TEMPLE_NE_COURTYARD_LOWER, + RR_FOREST_TEMPLE_NE_COURTYARD_UPPER, + RR_FOREST_TEMPLE_NE_COURTYARD_ISLAND, + RR_FOREST_TEMPLE_NE_COURTYARD_SCARECROW_LEDGE, RR_FOREST_TEMPLE_MAP_ROOM, RR_FOREST_TEMPLE_SEWER, RR_FOREST_TEMPLE_DRAINED_SEWER, RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, RR_FOREST_TEMPLE_FLOORMASTER_ROOM, - RR_FOREST_TEMPLE_WEST_CORRIDOR, - RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, - RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED, - RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, + RR_FOREST_TEMPLE_RED_DOORMAT_HALLWAY, + RR_FOREST_TEMPLE_RED_DOORMAT_HALLWAY_DOORMAT, + RR_FOREST_TEMPLE_LOWER_BLOCK_PUSH_ROOM, + RR_FOREST_TEMPLE_MIDDLE_BLOCK_PUSH_ROOM, + RR_FOREST_TEMPLE_UPPER_BLOCK_PUSH_ROOM, + RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM_COURTYARD_ALCOVE, + RR_FOREST_TEMPLE_NW_HALLWAY_TWISTED, + RR_FOREST_TEMPLE_NW_HALLWAY_STRAIGHTENED, RR_FOREST_TEMPLE_RED_POE_ROOM, RR_FOREST_TEMPLE_UPPER_STALFOS, RR_FOREST_TEMPLE_BLUE_POE_ROOM, - RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, - RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED, + RR_FOREST_TEMPLE_NE_HALLWAY_STRAIGHTENED, + RR_FOREST_TEMPLE_NE_HALLWAY_TWISTED, RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, RR_FOREST_TEMPLE_FALLING_ROOM, RR_FOREST_TEMPLE_GREEN_POE_ROOM, - RR_FOREST_TEMPLE_EAST_CORRIDOR, - RR_FOREST_TEMPLE_BOSS_REGION, + RR_FOREST_TEMPLE_BLUE_DOORMAT_HALLWAY_DOORMAT, + RR_FOREST_TEMPLE_BLUE_DOORMAT_HALLWAY, + RR_FOREST_TEMPLE_BASEMENT, + RR_FOREST_TEMPLE_MQ_TREES, + RR_FOREST_TEMPLE_MQ_OVERGROWN_HALLWAY_LOWER, + RR_FOREST_TEMPLE_MQ_OVERGROWN_HALLWAY_UPPER, RR_FOREST_TEMPLE_MQ_LOBBY, - RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, + RR_FOREST_TEMPLE_MQ_NORTH_HALLWAY, RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM, + RR_FOREST_TEMPLE_MQ_RED_DOORMAT_HALLWAY, RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE, RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE, RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE, RR_FOREST_TEMPLE_MQ_STRAIGHT_HALLWAY, RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM, - RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, - RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, - RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, - RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, - RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, + RR_FOREST_TEMPLE_MQ_INDOOR_LEDGE, + RR_FOREST_TEMPLE_MQ_NW_COURTYARD_LEDGE, + RR_FOREST_TEMPLE_MQ_REDEAD_ROOM, + RR_FOREST_TEMPLE_MQ_NW_COURTYARD, + RR_FOREST_TEMPLE_MQ_NORTH_PASSAGE, + RR_FOREST_TEMPLE_MQ_NE_COURTYARD, + RR_FOREST_TEMPLE_MQ_COURTYARD_TOP_LEDGES, + RR_FOREST_TEMPLE_MQ_NE_COURTYARD_ISLAND, + RR_FOREST_TEMPLE_MQ_NE_COURTYARD_LEDGE_ABOVE_ISLAND, RR_FOREST_TEMPLE_MQ_JOELLE_ROOM, RR_FOREST_TEMPLE_MQ_3_STALFOS_ROOM, RR_FOREST_TEMPLE_MQ_BETH_ROOM, @@ -864,8 +881,8 @@ typedef enum { RR_FOREST_TEMPLE_MQ_FALLING_ROOM, RR_FOREST_TEMPLE_MQ_AMY_ROOM, RR_FOREST_TEMPLE_MQ_BASEMENT, + RR_FOREST_TEMPLE_MQ_BLUE_DOORMAT_HALLWAY, RR_FOREST_TEMPLE_MQ_BASEMENT_POT_ROOM, - RR_FOREST_TEMPLE_MQ_BOSS_REGION, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, RR_FOREST_TEMPLE_BOSS_ROOM, @@ -3906,13 +3923,13 @@ typedef enum { RT_BOTW_PITS, RT_BOTW_MQ_DEADHAND_KEY, RT_FOREST_FIRST_GS, - RT_FOREST_OUTDOORS_EAST_GS, + RT_FOREST_COURTYARD_EAST_GS, RT_FOREST_VINES, - RT_FOREST_OUTDOORS_LEDGE, + RT_FOREST_COURTYARD_LEDGE, RT_FOREST_DOORFRAME, RT_FOREST_OUTSIDE_BACKDOOR, - RT_FOREST_OUTDOORS_HEARTS_BOOMERANG, - RT_FOREST_MQ_WELL_SWIM, + RT_FOREST_COURTYARD_HEARTS_BOOMERANG, + RT_FOREST_WELL_SWIM, RT_FOREST_MQ_BLOCK_PUZZLE, RT_FOREST_MQ_JS_HALLWAY_SWITCH, RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 066d2fe49..b600c81aa 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -772,15 +772,15 @@ void Settings::CreateOptions() { "Allows killing this Skulltula with Sword or Sticks by jump slashing it as you let go from the vines. " "You can avoid taking fall damage by recoiling onto the tree. Also allows killing it as Child with a " "Bomb throw. It's much more difficult to use a Bomb as child due to Child Link's shorter height."); - OPT_TRICK(RT_FOREST_OUTDOORS_EAST_GS, RCQUEST_VANILLA, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + OPT_TRICK(RT_FOREST_COURTYARD_EAST_GS, RCQUEST_VANILLA, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, "Forest Temple East Courtyard GS with Boomerang", "Precise Boomerang throws can allow child to kill the Skulltula and collect the token."); OPT_TRICK(RT_FOREST_VINES, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, "Forest Temple East Courtyard Vines with Hookshot", "The vines in Forest Temple leading to where the well drain switch is in the standard form can be barely " "reached with just the Hookshot. Applies to MQ also."); - OPT_TRICK(RT_FOREST_OUTDOORS_LEDGE, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, - "Forest Temple NE Outdoors Ledge with Hover Boots", + OPT_TRICK(RT_FOREST_COURTYARD_LEDGE, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Forest Temple NE Courtyard Ledge with Hover Boots", "With precise Hover Boots movement you can fall down to this ledge from upper balconies. If done " "precisely enough, it is not necessary to take fall damage. In MQ, this skips a Longshot requirement. In " "Vanilla, this can skip a Hookshot requirement in entrance randomizer."); @@ -795,18 +795,18 @@ void Settings::CreateOptions() { "A jump slash recoil can be used to reach the ledge in the block puzzle room that leads to the west " "courtyard. This skips a potential Hover Boots requirement in Vanilla, and it can sometimes apply in MQ " "as well. This trick can be performed as both ages."); - OPT_TRICK(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, - "Forest Temple Outside Hearts with Boomerang", + OPT_TRICK(RT_FOREST_COURTYARD_HEARTS_BOOMERANG, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Forest Temple Courtyard Hearts with Boomerang", "A well aimed boomerang from the water's edge can reach the hearts from ground level. If unable to swim, " "you can back away from the water while the boomerang is returning so the hearts land on the ground."); - OPT_TRICK(RT_FOREST_MQ_WELL_SWIM, RCQUEST_MQ, RA_FOREST_TEMPLE, { Tricks::Tag::ADVANCED }, - "Swim Through Forest Temple MQ Well with Hookshot", + OPT_TRICK(RT_FOREST_WELL_SWIM, RCQUEST_BOTH, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, + "Swim Through Forest Temple Well with Hookshot", "Shoot the vines in the well as low and as far to the right as possible, and then immediately swim under " - "the ceiling to the right. This can only be required if Forest Temple is in its Master Quest form."); + "the ceiling to the right. This is usually only useful in Master Quest."); OPT_TRICK(RT_FOREST_MQ_BLOCK_PUZZLE, RCQUEST_MQ, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, "Skip Forest Temple MQ Block Puzzle with Bombchu", "Send the Bombchu straight up the center of the wall directly to the left upon entering the room."); - // Child with hovers cannot do this from the lower floor, and most go to the upper floor which needs goron bracelet. + // Child with hovers cannot do this from the lower floor, and must go to the upper floor which needs goron bracelet. // Adult can do this with hammer and KSword, But child cannot. OPT_TRICK(RT_FOREST_MQ_JS_HALLWAY_SWITCH, RCQUEST_MQ, RA_FOREST_TEMPLE, { Tricks::Tag::NOVICE }, "Forest Temple MQ Twisted Hallway Switch with Jump Slash",