mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-20 21:33:40 -07:00
refactor forest
This commit is contained in:
parent
237dcfec74
commit
ae639780ab
3 changed files with 174 additions and 118 deletions
|
@ -9,14 +9,14 @@ void RegionTable_Init_ForestTemple() {
|
|||
// 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))))),
|
||||
|
@ -28,7 +28,7 @@ void RegionTable_Init_ForestTemple() {
|
|||
|
||||
areaTable[RR_FOREST_TEMPLE_SOUTH_CORRIDOR] = Region("Forest Temple South Corridor", SCENE_FOREST_TEMPLE, {}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_TREES, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}),
|
||||
});
|
||||
|
||||
|
@ -48,9 +48,9 @@ void RegionTable_Init_ForestTemple() {
|
|||
//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(RR_FOREST_TEMPLE, 1, 5);}),
|
||||
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_WEST_CORRIDOR, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 1);}),
|
||||
Entrance(RR_FOREST_TEMPLE_EAST_CORRIDOR, []{return false;}),
|
||||
Entrance(RR_FOREST_TEMPLE_BOSS_REGION, []{return logic->ForestTempleMeg;}),
|
||||
Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
|
||||
|
@ -75,25 +75,25 @@ void RegionTable_Init_ForestTemple() {
|
|||
Entrance(RR_FOREST_TEMPLE_NORTH_CORRIDOR, []{return true;}),
|
||||
});
|
||||
|
||||
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->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}),
|
||||
EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}),
|
||||
}, {
|
||||
//Locations
|
||||
LOCATION(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, logic->CanUse(RG_LONGSHOT) || Here(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return logic->HookshotOrBoomerang();})),
|
||||
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_GS_LEVEL_ISLAND_COURTYARD, logic->CanUse(RG_LONGSHOT) || Here(RR_FOREST_TEMPLE_NW_COURTYARD_UPPER, []{return logic->HookshotOrBoomerang();})),
|
||||
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 ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanUse(RG_HOVER_BOOTS);}),
|
||||
Entrance(RR_FOREST_TEMPLE_NW_COURTYARD_UPPER, []{return ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanUse(RG_HOVER_BOOTS);}),
|
||||
Entrance(RR_FOREST_TEMPLE_MAP_ROOM, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_SEWER, []{return logic->HasItem(RG_GOLDEN_SCALE) || logic->CanUse(RG_IRON_BOOTS) || HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER);}),
|
||||
Entrance(RR_FOREST_TEMPLE_SEWER, []{return logic->HasItem(RG_GOLDEN_SCALE) || logic->CanUse(RG_IRON_BOOTS) || HasAccessTo(RR_FOREST_TEMPLE_NE_COURTYARD_UPPER);}),
|
||||
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->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}),
|
||||
EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}),
|
||||
|
@ -103,35 +103,35 @@ 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_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, []{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->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}),
|
||||
EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}),
|
||||
}, {
|
||||
//Locations
|
||||
LOCATION(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, logic->CanUse(RG_HOOKSHOT) || HasAccessTo(RR_FOREST_TEMPLE_FALLING_ROOM) || (HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) && logic->IsAdult && ctx->GetTrickOption(RT_FOREST_OUTDOORS_LEDGE) && logic->CanUse(RG_HOVER_BOOTS))),
|
||||
LOCATION(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_FOREST_OUTDOORS_EAST_GS) && logic->CanUse(RG_BOOMERANG)) || Here(RR_FOREST_TEMPLE_FALLING_ROOM, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_DINS_FIRE) || logic->HasExplosives();})),
|
||||
LOCATION(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, logic->CanUse(RG_HOOKSHOT) || HasAccessTo(RR_FOREST_TEMPLE_FALLING_ROOM) || (HasAccessTo(RR_FOREST_TEMPLE_NE_COURTYARD_UPPER) && logic->IsAdult && ctx->GetTrickOption(RT_FOREST_COURTYARD_LEDGE) && logic->CanUse(RG_HOVER_BOOTS))),
|
||||
LOCATION(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_FOREST_COURTYARD_EAST_GS) && logic->CanUse(RG_BOOMERANG)) || Here(RR_FOREST_TEMPLE_FALLING_ROOM, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_DINS_FIRE) || logic->HasExplosives();})),
|
||||
}, {
|
||||
//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) || HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER);}),
|
||||
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_SEWER, []{return logic->HasItem(RG_GOLDEN_SCALE) || logic->CanUse(RG_IRON_BOOTS) || HasAccessTo(RR_FOREST_TEMPLE_NE_COURTYARD_UPPER);}),
|
||||
Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return false;}),
|
||||
});
|
||||
|
||||
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->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}),
|
||||
EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}),
|
||||
}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_LOWER, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_MAP_ROOM, []{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);}),
|
||||
});
|
||||
|
@ -141,24 +141,24 @@ 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, {}, {
|
||||
//Locations
|
||||
LOCATION(RC_FOREST_TEMPLE_WELL_CHEST, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanOpenUnderwaterChest() && logic->WaterTimer() >= 8)),
|
||||
LOCATION(RC_FOREST_TEMPLE_WELL_WEST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)),
|
||||
LOCATION(RC_FOREST_TEMPLE_WELL_EAST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)),
|
||||
LOCATION(RC_FOREST_TEMPLE_WELL_CHEST, HasAccessTo(RR_FOREST_TEMPLE_NE_COURTYARD_UPPER) || (logic->CanOpenUnderwaterChest() && logic->WaterTimer() >= 8)),
|
||||
LOCATION(RC_FOREST_TEMPLE_WELL_WEST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_COURTYARD_UPPER) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)),
|
||||
LOCATION(RC_FOREST_TEMPLE_WELL_EAST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_COURTYARD_UPPER) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)),
|
||||
}, {
|
||||
//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, {}, {
|
||||
|
@ -166,12 +166,12 @@ 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, {}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 1, 5);}),
|
||||
Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 1);}),
|
||||
Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}),
|
||||
});
|
||||
|
||||
|
@ -181,7 +181,7 @@ void RegionTable_Init_ForestTemple() {
|
|||
}, {
|
||||
//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_COURTYARD_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(RR_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(RR_FOREST_TEMPLE, 2);}),
|
||||
});
|
||||
|
@ -268,7 +268,7 @@ void RegionTable_Init_ForestTemple() {
|
|||
LOCATION(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, true),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_NE_COURTYARD_LOWER, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, []{return true;}),
|
||||
});
|
||||
|
||||
|
@ -305,18 +305,25 @@ void RegionTable_Init_ForestTemple() {
|
|||
|
||||
#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)
|
||||
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(RR_FOREST_TEMPLE, 1) && logic->CanPassEnemy(RE_BIG_SKULLTULA);}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_SOUTH_CORRIDOR, []{return true;}),
|
||||
});
|
||||
|
||||
areaTable[RR_FOREST_TEMPLE_MQ_CENTRAL_AREA] = Region("Forest Temple MQ Central Region", SCENE_FOREST_TEMPLE, {
|
||||
areaTable[RR_FOREST_TEMPLE_MQ_SOUTH_CORRIDOR] = Region("Forest Temple MQ South Corridor", SCENE_FOREST_TEMPLE, {}, {
|
||||
//Locations
|
||||
LOCATION(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, logic->HookshotOrBoomerang()),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_TREES, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) && logic->SmallKeys(RR_FOREST_TEMPLE, 1);}),
|
||||
});
|
||||
|
||||
areaTable[RR_FOREST_TEMPLE_MQ_LOBBY] = Region("Forest Temple MQ Lobby", SCENE_FOREST_TEMPLE, {
|
||||
//Events
|
||||
EventAccess(&logic->ForestTempleMeg, []{return logic->ForestTempleJoelle && logic->ForestTempleBeth && logic->ForestTempleAmy && logic->CanKillEnemy(RE_MEG);}),
|
||||
}, {
|
||||
|
@ -329,14 +336,22 @@ 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_SOUTH_CORRIDOR, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 1);}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_NORTH_CORRIDOR, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_WEST_CORRIDOR, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_EAST_CORRIDOR, []{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->ForestTempleMeg;}),
|
||||
});
|
||||
|
||||
areaTable[RR_FOREST_TEMPLE_MQ_NORTH_CORRIDOR] = Region("Forest Temple MQ North Corridor", 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, {
|
||||
//Events
|
||||
EventAccess(&logic->FairyPot, []{return true;}),
|
||||
|
@ -348,7 +363,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->ForestClearBelowBowChest && (logic->IsChild || logic->CanUse(RG_SONG_OF_TIME));}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_NORTH_CORRIDOR, []{return logic->ForestClearBelowBowChest && (logic->IsChild || logic->CanUse(RG_SONG_OF_TIME));}),
|
||||
});
|
||||
|
||||
areaTable[RR_FOREST_TEMPLE_MQ_WEST_CORRIDOR] = Region("Forest Temple MQ West Corridor", SCENE_FOREST_TEMPLE, {}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return Here(RR_FOREST_TEMPLE_MQ_WEST_CORRIDOR, []{return logic->CanKillEnemy(RE_STALFOS);});}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE, []{return Here(RR_FOREST_TEMPLE_MQ_WEST_CORRIDOR, []{return logic->CanKillEnemy(RE_STALFOS);});}),
|
||||
});
|
||||
|
||||
areaTable[RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE] = Region("Forest Temple MQ Lower Block Puzzle", SCENE_FOREST_TEMPLE, {
|
||||
|
@ -361,11 +382,11 @@ 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_CENTRAL_AREA, []{return logic->CanKillEnemy(RE_STALFOS);});}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_WEST_CORRIDOR, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE, []{return logic->HasItem(RG_GORONS_BRACELET) || (logic->MQForestBlockRoomTargets && 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->MQForestBlockRoomTargets && logic->CanUse(RG_HOOKSHOT));}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return logic->ForestCanTwistHallway && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_INDOOR_LEDGE, []{return logic->ForestCanTwistHallway && (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, {
|
||||
|
@ -377,21 +398,18 @@ 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->MQForestBlockRoomTargets && 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->ForestCanTwistHallway && 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->ForestCanTwistHallway && 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(RR_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(RR_FOREST_TEMPLE, 3);}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_JOELLE_ROOM, []{return logic->ForestCanTwistHallway && logic->SmallKeys(RR_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(RR_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(RR_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, {}, {
|
||||
|
@ -404,41 +422,64 @@ 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->ForestCanTwistHallway, []{return logic->CanHitSwitch();}),
|
||||
}, {
|
||||
}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE, []{return logic->ForestCanTwistHallway;}),
|
||||
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 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_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_NORTH_PASSAGE, []{return logic->CanUse(RG_FIRE_ARROWS);}), // TODO event access with north passage?
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_NW_COURTYARD_LEDGE, []{return ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanUse(RG_HOVER_BOOTS);}),
|
||||
});
|
||||
|
||||
//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->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}),
|
||||
EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}),
|
||||
|
@ -453,35 +494,36 @@ 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_LEDGE, []{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)))))),
|
||||
}, {
|
||||
//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_LEDGE, []{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_LEDGE] = Region("Forest Temple MQ NE Courtyard Ledge", 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_NE_COURTYARD, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{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_JOELLE_ROOM] = Region("Forest Temple MQ Joelle Room", SCENE_FOREST_TEMPLE, {
|
||||
//Events
|
||||
EventAccess(&logic->ForestTempleJoelle, []{return logic->CanUse(RG_FAIRY_BOW);}),
|
||||
}, {
|
||||
|
@ -530,7 +572,8 @@ void RegionTable_Init_ForestTemple() {
|
|||
});
|
||||
|
||||
//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, {}, {
|
||||
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()),
|
||||
LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()),
|
||||
|
@ -546,7 +589,7 @@ 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_NE_COURTYARD_LEDGE, []{return true;}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_AMY_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 6);}),
|
||||
});
|
||||
|
||||
|
@ -559,10 +602,16 @@ 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->ForestTempleAmy;}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_EAST_CORRIDOR, []{return logic->ForestTempleAmy;}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return true;}),
|
||||
});
|
||||
|
||||
areaTable[RR_FOREST_TEMPLE_MQ_EAST_CORRIDOR] = Region("Forest Temple MQ East Corridor", 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()
|
||||
|
@ -572,7 +621,7 @@ void RegionTable_Init_ForestTemple() {
|
|||
LOCATION(RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, true),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->ForestTempleMeg;}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return logic->ForestTempleMeg;}),
|
||||
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->ForestOpenBossCorridor;}),
|
||||
});
|
||||
|
|
|
@ -686,15 +686,15 @@ typedef enum {
|
|||
RR_JABU_JABUS_BELLY_BOSS_EXIT,
|
||||
RR_JABU_JABUS_BELLY_BOSS_ROOM,
|
||||
|
||||
RR_FOREST_TEMPLE_FIRST_ROOM,
|
||||
RR_FOREST_TEMPLE_TREES,
|
||||
RR_FOREST_TEMPLE_SOUTH_CORRIDOR,
|
||||
RR_FOREST_TEMPLE_LOBBY,
|
||||
RR_FOREST_TEMPLE_NORTH_CORRIDOR,
|
||||
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_MAP_ROOM,
|
||||
RR_FOREST_TEMPLE_SEWER,
|
||||
RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST,
|
||||
|
@ -714,19 +714,25 @@ typedef enum {
|
|||
RR_FOREST_TEMPLE_EAST_CORRIDOR,
|
||||
RR_FOREST_TEMPLE_BOSS_REGION,
|
||||
|
||||
RR_FOREST_TEMPLE_MQ_TREES,
|
||||
RR_FOREST_TEMPLE_MQ_SOUTH_CORRIDOR,
|
||||
RR_FOREST_TEMPLE_MQ_LOBBY,
|
||||
RR_FOREST_TEMPLE_MQ_CENTRAL_AREA,
|
||||
RR_FOREST_TEMPLE_MQ_NORTH_CORRIDOR,
|
||||
RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM,
|
||||
RR_FOREST_TEMPLE_MQ_WEST_CORRIDOR,
|
||||
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_LEDGE,
|
||||
RR_FOREST_TEMPLE_MQ_JOELLE_ROOM,
|
||||
RR_FOREST_TEMPLE_MQ_3_STALFOS_ROOM,
|
||||
RR_FOREST_TEMPLE_MQ_BETH_ROOM,
|
||||
|
@ -734,6 +740,7 @@ typedef enum {
|
|||
RR_FOREST_TEMPLE_MQ_FALLING_ROOM,
|
||||
RR_FOREST_TEMPLE_MQ_AMY_ROOM,
|
||||
RR_FOREST_TEMPLE_MQ_BASEMENT,
|
||||
RR_FOREST_TEMPLE_MQ_EAST_CORRIDOR,
|
||||
RR_FOREST_TEMPLE_MQ_BASEMENT_POT_ROOM,
|
||||
RR_FOREST_TEMPLE_MQ_BOSS_REGION,
|
||||
|
||||
|
@ -3618,12 +3625,12 @@ typedef enum {
|
|||
RT_BOTW_MQ_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_COURTYARD_HEARTS_BOOMERANG,
|
||||
RT_FOREST_MQ_WELL_SWIM,
|
||||
RT_FOREST_MQ_BLOCK_PUZZLE,
|
||||
RT_FOREST_MQ_JS_HALLWAY_SWITCH,
|
||||
|
|
|
@ -749,15 +749,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.");
|
||||
|
@ -772,8 +772,8 @@ 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 },
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue