mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-19 21:03:42 -07:00
reduce logical implications of closed forest
closed forest should only be about kokiri blocking the way, no need to try plug alternate forest escapes out
This commit is contained in:
parent
9924ebbd05
commit
94ca250ef1
10 changed files with 15 additions and 68 deletions
|
@ -1214,15 +1214,6 @@ int EntranceShuffler::ShuffleAllEntrances() {
|
||||||
if (ctx->GetOption(RSK_SHUFFLE_BOSS_ENTRANCES).Is(RO_BOSS_ROOM_ENTRANCE_SHUFFLE_FULL)) {
|
if (ctx->GetOption(RSK_SHUFFLE_BOSS_ENTRANCES).Is(RO_BOSS_ROOM_ENTRANCE_SHUFFLE_FULL)) {
|
||||||
entrancePools[EntranceType::Boss] = GetShuffleableEntrances(EntranceType::ChildBoss);
|
entrancePools[EntranceType::Boss] = GetShuffleableEntrances(EntranceType::ChildBoss);
|
||||||
AddElementsToPool(entrancePools[EntranceType::Boss], GetShuffleableEntrances(EntranceType::AdultBoss));
|
AddElementsToPool(entrancePools[EntranceType::Boss], GetShuffleableEntrances(EntranceType::AdultBoss));
|
||||||
// If forest is closed, ensure Ghoma is inside the Deku tree
|
|
||||||
// Deku tree being in its vanilla location is handled below
|
|
||||||
if (ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_ON) &&
|
|
||||||
!(ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES))) {
|
|
||||||
FilterAndEraseFromPool(entrancePools[EntranceType::Boss], [](const Entrance* entrance) {
|
|
||||||
return entrance->GetParentRegionKey() == RR_DEKU_TREE_BOSS_ENTRYWAY &&
|
|
||||||
entrance->GetConnectedRegionKey() == RR_DEKU_TREE_BOSS_ROOM;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
|
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
|
||||||
for (Entrance* entrance : entrancePools[EntranceType::Boss]) {
|
for (Entrance* entrance : entrancePools[EntranceType::Boss]) {
|
||||||
entrancePools[EntranceType::BossReverse].push_back(entrance->GetReverse());
|
entrancePools[EntranceType::BossReverse].push_back(entrance->GetReverse());
|
||||||
|
@ -1231,14 +1222,6 @@ int EntranceShuffler::ShuffleAllEntrances() {
|
||||||
} else {
|
} else {
|
||||||
entrancePools[EntranceType::ChildBoss] = GetShuffleableEntrances(EntranceType::ChildBoss);
|
entrancePools[EntranceType::ChildBoss] = GetShuffleableEntrances(EntranceType::ChildBoss);
|
||||||
entrancePools[EntranceType::AdultBoss] = GetShuffleableEntrances(EntranceType::AdultBoss);
|
entrancePools[EntranceType::AdultBoss] = GetShuffleableEntrances(EntranceType::AdultBoss);
|
||||||
// If forest is closed, ensure Ghoma is inside the Deku tree
|
|
||||||
if (ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_ON) &&
|
|
||||||
!(ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES))) {
|
|
||||||
FilterAndEraseFromPool(entrancePools[EntranceType::ChildBoss], [](const Entrance* entrance) {
|
|
||||||
return entrance->GetParentRegionKey() == RR_DEKU_TREE_BOSS_ENTRYWAY &&
|
|
||||||
entrance->GetConnectedRegionKey() == RR_DEKU_TREE_BOSS_ROOM;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
|
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
|
||||||
for (Entrance* entrance : entrancePools[EntranceType::ChildBoss]) {
|
for (Entrance* entrance : entrancePools[EntranceType::ChildBoss]) {
|
||||||
entrancePools[EntranceType::ChildBossReverse].push_back(entrance->GetReverse());
|
entrancePools[EntranceType::ChildBossReverse].push_back(entrance->GetReverse());
|
||||||
|
@ -1258,14 +1241,6 @@ int EntranceShuffler::ShuffleAllEntrances() {
|
||||||
AddElementsToPool(entrancePools[EntranceType::Dungeon],
|
AddElementsToPool(entrancePools[EntranceType::Dungeon],
|
||||||
GetShuffleableEntrances(EntranceType::GanonDungeon));
|
GetShuffleableEntrances(EntranceType::GanonDungeon));
|
||||||
}
|
}
|
||||||
// If forest is closed don't allow a forest escape via spirit temple hands
|
|
||||||
if (ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_ON) &&
|
|
||||||
!(ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES))) {
|
|
||||||
FilterAndEraseFromPool(entrancePools[EntranceType::Dungeon], [](const Entrance* entrance) {
|
|
||||||
return entrance->GetParentRegionKey() == RR_KF_OUTSIDE_DEKU_TREE &&
|
|
||||||
entrance->GetConnectedRegionKey() == RR_DEKU_TREE_ENTRYWAY;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
|
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
|
||||||
for (Entrance* entrance : entrancePools[EntranceType::Dungeon]) {
|
for (Entrance* entrance : entrancePools[EntranceType::Dungeon]) {
|
||||||
entrancePools[EntranceType::DungeonReverse].push_back(entrance->GetReverse());
|
entrancePools[EntranceType::DungeonReverse].push_back(entrance->GetReverse());
|
||||||
|
|
|
@ -1993,9 +1993,7 @@ void RandomizerOnActorInitHandler(void* actorRef) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actor->id == ACTOR_BG_TREEMOUTH && LINK_IS_ADULT &&
|
if (actor->id == ACTOR_BG_TREEMOUTH && LINK_IS_ADULT &&
|
||||||
RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF &&
|
RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF) {
|
||||||
(RAND_GET_OPTION(RSK_FOREST) == RO_CLOSED_FOREST_OFF ||
|
|
||||||
Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD))) {
|
|
||||||
BgTreemouth* bgTreemouth = static_cast<BgTreemouth*>(actorRef);
|
BgTreemouth* bgTreemouth = static_cast<BgTreemouth*>(actorRef);
|
||||||
bgTreemouth->unk_168 = 1.0f;
|
bgTreemouth->unk_168 = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
|
@ -692,11 +692,11 @@ void RegionTable_Init() {
|
||||||
Entrance(RR_CHILD_SPAWN, []{return logic->IsChild;}),
|
Entrance(RR_CHILD_SPAWN, []{return logic->IsChild;}),
|
||||||
Entrance(RR_ADULT_SPAWN, []{return logic->IsAdult;}),
|
Entrance(RR_ADULT_SPAWN, []{return logic->IsAdult;}),
|
||||||
Entrance(RR_MINUET_OF_FOREST_WARP, []{return logic->CanUse(RG_MINUET_OF_FOREST);}),
|
Entrance(RR_MINUET_OF_FOREST_WARP, []{return logic->CanUse(RG_MINUET_OF_FOREST);}),
|
||||||
Entrance(RR_BOLERO_OF_FIRE_WARP, []{return logic->CanUse(RG_BOLERO_OF_FIRE) && logic->CanLeaveForest();}),
|
Entrance(RR_BOLERO_OF_FIRE_WARP, []{return logic->CanUse(RG_BOLERO_OF_FIRE);}),
|
||||||
Entrance(RR_SERENADE_OF_WATER_WARP, []{return logic->CanUse(RG_SERENADE_OF_WATER) && logic->CanLeaveForest();}),
|
Entrance(RR_SERENADE_OF_WATER_WARP, []{return logic->CanUse(RG_SERENADE_OF_WATER);}),
|
||||||
Entrance(RR_NOCTURNE_OF_SHADOW_WARP, []{return logic->CanUse(RG_NOCTURNE_OF_SHADOW) && logic->CanLeaveForest();}),
|
Entrance(RR_NOCTURNE_OF_SHADOW_WARP, []{return logic->CanUse(RG_NOCTURNE_OF_SHADOW);}),
|
||||||
Entrance(RR_REQUIEM_OF_SPIRIT_WARP, []{return logic->CanUse(RG_REQUIEM_OF_SPIRIT) && logic->CanLeaveForest();}),
|
Entrance(RR_REQUIEM_OF_SPIRIT_WARP, []{return logic->CanUse(RG_REQUIEM_OF_SPIRIT);}),
|
||||||
Entrance(RR_PRELUDE_OF_LIGHT_WARP, []{return logic->CanUse(RG_PRELUDE_OF_LIGHT) && logic->CanLeaveForest();}),
|
Entrance(RR_PRELUDE_OF_LIGHT_WARP, []{return logic->CanUse(RG_PRELUDE_OF_LIGHT);}),
|
||||||
});
|
});
|
||||||
|
|
||||||
areaTable[RR_CHILD_SPAWN] = Region("Child Spawn", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, {
|
areaTable[RR_CHILD_SPAWN] = Region("Child Spawn", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, {
|
||||||
|
|
|
@ -63,7 +63,7 @@ void RegionTable_Init_GoronCity() {
|
||||||
EventAccess(&logic->GCWoodsWarpOpen, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE);}),
|
EventAccess(&logic->GCWoodsWarpOpen, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE);}),
|
||||||
}, {}, {
|
}, {}, {
|
||||||
//Exits
|
//Exits
|
||||||
Entrance(RR_GORON_CITY, []{return logic->CanLeaveForest() && logic->GCWoodsWarpOpen;}),
|
Entrance(RR_GORON_CITY, []{return logic->GCWoodsWarpOpen;}),
|
||||||
Entrance(RR_THE_LOST_WOODS, []{return true;}),
|
Entrance(RR_THE_LOST_WOODS, []{return true;}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ void RegionTable_Init_KokiriForest() {
|
||||||
}, {
|
}, {
|
||||||
//Locations
|
//Locations
|
||||||
LOCATION(RC_KF_KOKIRI_SWORD_CHEST, logic->IsChild),
|
LOCATION(RC_KF_KOKIRI_SWORD_CHEST, logic->IsChild),
|
||||||
LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanAttack() && (/*TODO: HasNightStart ||*/ logic->CanLeaveForest() || logic->CanUse(RG_SUNS_SONG)) && logic->CanGetNightTimeGS()),
|
LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanAttack() && logic->CanGetNightTimeGS()),
|
||||||
LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanSpawnSoilSkull() && logic->CanAttack()),
|
LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanSpawnSoilSkull() && logic->CanAttack()),
|
||||||
LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && (logic->HookshotOrBoomerang() || (ctx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanGetNightTimeGS()),
|
LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && (logic->HookshotOrBoomerang() || (ctx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanGetNightTimeGS()),
|
||||||
LOCATION(RC_KF_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
|
LOCATION(RC_KF_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
|
||||||
|
@ -104,7 +104,7 @@ void RegionTable_Init_KokiriForest() {
|
||||||
LOCATION(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, true),
|
LOCATION(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, true),
|
||||||
}, {
|
}, {
|
||||||
//Exits
|
//Exits
|
||||||
Entrance(RR_DEKU_TREE_ENTRYWAY, []{return logic->IsChild || (ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF) && (ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_OFF) || logic->ShowedMidoSwordAndShield));}),
|
Entrance(RR_DEKU_TREE_ENTRYWAY, []{return logic->IsChild || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF);}),
|
||||||
Entrance(RR_KOKIRI_FOREST, []{return (logic->IsAdult && (logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->ForestTempleClear)) || ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_OFF) || logic->ShowedMidoSwordAndShield;}),
|
Entrance(RR_KOKIRI_FOREST, []{return (logic->IsAdult && (logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->ForestTempleClear)) || ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_OFF) || logic->ShowedMidoSwordAndShield;}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -56,8 +56,8 @@ void RegionTable_Init_LostWoods() {
|
||||||
//Exits
|
//Exits
|
||||||
Entrance(RR_LW_FOREST_EXIT, []{return true;}),
|
Entrance(RR_LW_FOREST_EXIT, []{return true;}),
|
||||||
Entrance(RR_GC_WOODS_WARP, []{return true;}),
|
Entrance(RR_GC_WOODS_WARP, []{return true;}),
|
||||||
Entrance(RR_LW_BRIDGE, []{return logic->CanLeaveForest() && ((logic->IsAdult && (CanPlantBean(RR_THE_LOST_WOODS) || ctx->GetTrickOption(RT_LW_BRIDGE))) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT));}),
|
Entrance(RR_LW_BRIDGE, []{return (logic->IsAdult && (CanPlantBean(RR_THE_LOST_WOODS) || ctx->GetTrickOption(RT_LW_BRIDGE))) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT);}),
|
||||||
Entrance(RR_ZR_FROM_SHORTCUT, []{return logic->CanLeaveForest() && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LOST_WOOD_NAVI_DIVE) && logic->IsChild && logic->HasItem(RG_BRONZE_SCALE) && logic->CanJumpslash()));}),
|
Entrance(RR_ZR_FROM_SHORTCUT, []{return logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LOST_WOOD_NAVI_DIVE) && logic->IsChild && logic->HasItem(RG_BRONZE_SCALE) && logic->CanJumpslash());}),
|
||||||
Entrance(RR_LW_BEYOND_MIDO, []{return logic->IsChild || logic->CanUse(RG_SARIAS_SONG) || ctx->GetTrickOption(RT_LW_MIDO_BACKFLIP);}),
|
Entrance(RR_LW_BEYOND_MIDO, []{return logic->IsChild || logic->CanUse(RG_SARIAS_SONG) || ctx->GetTrickOption(RT_LW_MIDO_BACKFLIP);}),
|
||||||
Entrance(RR_LW_NEAR_SHORTCUTS_GROTTO, []{return Here(RR_THE_LOST_WOODS, []{return logic->BlastOrSmash();});}),
|
Entrance(RR_LW_NEAR_SHORTCUTS_GROTTO, []{return Here(RR_THE_LOST_WOODS, []{return logic->BlastOrSmash();});}),
|
||||||
});
|
});
|
||||||
|
|
|
@ -1177,11 +1177,6 @@ bool Logic::CanStunDeku() {
|
||||||
return CanAttack() || CanUse(RG_NUTS) || CanReflectNuts();
|
return CanAttack() || CanUse(RG_NUTS) || CanReflectNuts();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Logic::CanLeaveForest() {
|
|
||||||
return ctx->GetOption(RSK_FOREST).IsNot(RO_CLOSED_FOREST_ON) || IsAdult || DekuTreeClear ||
|
|
||||||
ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Logic::CallGossipFairyExceptSuns() {
|
bool Logic::CallGossipFairyExceptSuns() {
|
||||||
return CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME);
|
return CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME);
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,7 +228,6 @@ class Logic {
|
||||||
bool CanReflectNuts();
|
bool CanReflectNuts();
|
||||||
bool CanCutShrubs();
|
bool CanCutShrubs();
|
||||||
bool CanStunDeku();
|
bool CanStunDeku();
|
||||||
bool CanLeaveForest();
|
|
||||||
bool CallGossipFairy();
|
bool CallGossipFairy();
|
||||||
bool CallGossipFairyExceptSuns();
|
bool CallGossipFairyExceptSuns();
|
||||||
uint8_t EffectiveHealth();
|
uint8_t EffectiveHealth();
|
||||||
|
|
|
@ -358,17 +358,6 @@ extern "C" void Randomizer_InitSaveFile() {
|
||||||
gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch |= (1 << 0x15);
|
gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch |= (1 << 0x15);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now handled on the fly.
|
|
||||||
// int openForest = Randomizer_GetSettingValue(RSK_FOREST);
|
|
||||||
// switch (openForest) {
|
|
||||||
// case RO_CLOSED_FOREST_OFF:
|
|
||||||
// Flags_SetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD);
|
|
||||||
// // Fallthrough
|
|
||||||
// case RO_CLOSED_FOREST_DEKU_ONLY:
|
|
||||||
// Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_KOKIRI_EMERALD_DEKU_TREE_DEAD);
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
|
|
||||||
int doorOfTime = Randomizer_GetSettingValue(RSK_DOOR_OF_TIME);
|
int doorOfTime = Randomizer_GetSettingValue(RSK_DOOR_OF_TIME);
|
||||||
switch (doorOfTime) {
|
switch (doorOfTime) {
|
||||||
case RO_DOOROFTIME_OPEN:
|
case RO_DOOROFTIME_OPEN:
|
||||||
|
|
|
@ -1826,10 +1826,9 @@ void Settings::UpdateOptionProperties() {
|
||||||
} else {
|
} else {
|
||||||
mOptionGroups[RSG_AREA_ACCESS_IMGUI].Enable();
|
mOptionGroups[RSG_AREA_ACCESS_IMGUI].Enable();
|
||||||
// Starting Age - Disabled when Forest is set to Closed or under very specific conditions
|
// Starting Age - Disabled when Forest is set to Closed or under very specific conditions
|
||||||
if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_ON) == RO_CLOSED_FOREST_ON ||
|
if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_CLOSED) == RO_DOOROFTIME_CLOSED &&
|
||||||
(CVarGetInteger(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_CLOSED) == RO_DOOROFTIME_CLOSED &&
|
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), RO_GENERIC_OFF) ==
|
||||||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), RO_GENERIC_OFF) ==
|
RO_GENERIC_OFF) /* closed door of time with ocarina shuffle off */ {
|
||||||
RO_GENERIC_OFF)) /* closed door of time with ocarina shuffle off */ {
|
|
||||||
mOptions[RSK_STARTING_AGE].Disable(
|
mOptions[RSK_STARTING_AGE].Disable(
|
||||||
"This option is disabled due to other options making the game unbeatable.");
|
"This option is disabled due to other options making the game unbeatable.");
|
||||||
} else {
|
} else {
|
||||||
|
@ -2526,8 +2525,7 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
|
||||||
}
|
}
|
||||||
|
|
||||||
// With certain access settings, the seed is only beatable if Starting Age is set to Child.
|
// With certain access settings, the seed is only beatable if Starting Age is set to Child.
|
||||||
if (mOptions[RSK_FOREST].Is(RO_CLOSED_FOREST_ON) ||
|
if (mOptions[RSK_DOOR_OF_TIME].Is(RO_DOOROFTIME_CLOSED) && !mOptions[RSK_SHUFFLE_OCARINA]) {
|
||||||
(mOptions[RSK_DOOR_OF_TIME].Is(RO_DOOROFTIME_CLOSED) && !mOptions[RSK_SHUFFLE_OCARINA])) {
|
|
||||||
mOptions[RSK_STARTING_AGE].Set(RO_AGE_CHILD);
|
mOptions[RSK_STARTING_AGE].Set(RO_AGE_CHILD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2841,13 +2839,6 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
|
||||||
mOptions[RSK_MIX_GROTTO_ENTRANCES].Set(RO_GENERIC_OFF);
|
mOptions[RSK_MIX_GROTTO_ENTRANCES].Set(RO_GENERIC_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mOptions[RSK_FOREST].Is(RO_CLOSED_FOREST_ON) &&
|
|
||||||
(mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES].Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) ||
|
|
||||||
mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES] || mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS] ||
|
|
||||||
mOptions[RSK_DECOUPLED_ENTRANCES] || mOptions[RSK_MIXED_ENTRANCE_POOLS])) {
|
|
||||||
mOptions[RSK_FOREST].Set(RO_CLOSED_FOREST_DEKU_ONLY);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mOptions[RSK_STARTING_AGE].Is(RO_AGE_RANDOM)) {
|
if (mOptions[RSK_STARTING_AGE].Is(RO_AGE_RANDOM)) {
|
||||||
if (const uint32_t choice = Random(0, 2); choice == 0) {
|
if (const uint32_t choice = Random(0, 2); choice == 0) {
|
||||||
mOptions[RSK_SELECTED_STARTING_AGE].Set(RO_AGE_CHILD);
|
mOptions[RSK_SELECTED_STARTING_AGE].Set(RO_AGE_CHILD);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue