shuffle gerudo fortress entrances

This commit is contained in:
Demur Rumed 2025-06-26 20:03:25 +00:00
commit 6983ffdb29
9 changed files with 121 additions and 23 deletions

View file

@ -343,7 +343,7 @@ void SetAllEntrancesData() {
{ { EntranceType::Interior, RR_HYRULE_CASTLE_GROUNDS, RR_HC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC },
{ EntranceType::Interior, RR_HC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT } },
{ { EntranceType::Interior, RR_GANONS_CASTLE_GROUNDS, RR_OGC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD },
// 0x3E8 is an unused entrance index repruposed to differentiate between the HC and OGC fairy
// 0x3E8 is an unused entrance index repurposed to differentiate between the HC and OGC fairy
// fountain exits (normally they both use 0x340)
{ EntranceType::Interior, RR_OGC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_POTION_SHOP_KAKARIKO_1 } },
{ { EntranceType::Interior, RR_DMC_LOWER_NEARBY, RR_DMC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC },
@ -364,6 +364,33 @@ void SetAllEntrancesData() {
{ { EntranceType::SpecialInterior, RR_KAK_BACKYARD, RR_KAK_POTION_SHOP_BACK, ENTR_POTION_SHOP_KAKARIKO_BACK },
{ EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_BACK, RR_KAK_BACKYARD, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK } },
{ { EntranceType::GerudoFortress, RR_GF_OUTSKIRTS, RR_TH_1_TORCH_CELL, ENTR_THIEVES_HIDEOUT_0 },
{ EntranceType::GerudoFortress, RR_TH_1_TORCH_CELL, RR_GF_OUTSKIRTS, ENTR_GERUDOS_FORTRESS_1 } },
{ { EntranceType::GerudoFortress, RR_GF_NEAR_GROTTO, RR_TH_1_TORCH_CELL, ENTR_THIEVES_HIDEOUT_1 },
{ EntranceType::GerudoFortress, RR_TH_1_TORCH_CELL, RR_GF_NEAR_GROTTO, ENTR_GERUDOS_FORTRESS_2 } },
{ { EntranceType::GerudoFortress, RR_GF_NEAR_GROTTO, RR_TH_KITCHEN_CORRIDOR, ENTR_THIEVES_HIDEOUT_2 },
{ EntranceType::GerudoFortress, RR_TH_KITCHEN_CORRIDOR, RR_GF_NEAR_GROTTO, ENTR_GERUDOS_FORTRESS_3 } },
{ { EntranceType::GerudoFortress, RR_GF_ABOVE_GTG, RR_TH_KITCHEN_CORRIDOR, ENTR_THIEVES_HIDEOUT_3 },
{ EntranceType::GerudoFortress, RR_TH_KITCHEN_CORRIDOR, RR_GF_ABOVE_GTG, ENTR_GERUDOS_FORTRESS_4 } },
{ { EntranceType::GerudoFortress, RR_GF_NEAR_GROTTO, RR_TH_STEEP_SLOPE_CELL, ENTR_THIEVES_HIDEOUT_4 },
{ EntranceType::GerudoFortress, RR_TH_STEEP_SLOPE_CELL, RR_GF_NEAR_GROTTO, ENTR_GERUDOS_FORTRESS_5 } },
{ { EntranceType::GerudoFortress, RR_GF_BOTTOM_OF_LOWER_VINES, RR_TH_STEEP_SLOPE_CELL, ENTR_THIEVES_HIDEOUT_5 },
{ EntranceType::GerudoFortress, RR_TH_STEEP_SLOPE_CELL, RR_GF_BOTTOM_OF_LOWER_VINES, ENTR_GERUDOS_FORTRESS_6 } },
{ { EntranceType::GerudoFortress, RR_GF_ABOVE_GTG, RR_TH_DOUBLE_CELL, ENTR_THIEVES_HIDEOUT_6 },
{ EntranceType::GerudoFortress, RR_TH_DOUBLE_CELL, RR_GF_ABOVE_GTG, ENTR_GERUDOS_FORTRESS_7 } },
{ { EntranceType::GerudoFortress, RR_GF_TOP_OF_LOWER_VINES, RR_TH_DOUBLE_CELL, ENTR_THIEVES_HIDEOUT_7 },
{ EntranceType::GerudoFortress, RR_TH_DOUBLE_CELL, RR_GF_TOP_OF_LOWER_VINES, ENTR_GERUDOS_FORTRESS_8 } },
{ { EntranceType::GerudoFortress, RR_GF_TOP_OF_LOWER_VINES, RR_TH_KITCHEN_TOP, ENTR_THIEVES_HIDEOUT_8 },
{ EntranceType::GerudoFortress, RR_TH_KITCHEN_TOP, RR_GF_TOP_OF_LOWER_VINES, ENTR_GERUDOS_FORTRESS_9 } },
{ { EntranceType::GerudoFortress, RR_GF_NEAR_GS, RR_TH_KITCHEN_TOP, ENTR_THIEVES_HIDEOUT_9 },
{ EntranceType::GerudoFortress, RR_TH_KITCHEN_TOP, RR_GF_NEAR_GS, ENTR_GERUDOS_FORTRESS_10 } },
{ { EntranceType::GerudoFortress, RR_GF_BELOW_CHEST, RR_TH_BREAK_ROOM, ENTR_THIEVES_HIDEOUT_10 },
{ EntranceType::GerudoFortress, RR_TH_BREAK_ROOM, RR_GF_BELOW_CHEST, ENTR_GERUDOS_FORTRESS_11 } },
{ { EntranceType::GerudoFortress, RR_GF_ABOVE_JAIL, RR_TH_BREAK_ROOM_CORRIDOR, ENTR_THIEVES_HIDEOUT_11 },
{ EntranceType::GerudoFortress, RR_TH_BREAK_ROOM_CORRIDOR, RR_GF_ABOVE_JAIL, ENTR_GERUDOS_FORTRESS_12 } },
{ { EntranceType::GerudoFortress, RR_GF_BELOW_GS, RR_TH_DEAD_END_CELL, ENTR_THIEVES_HIDEOUT_12 },
{ EntranceType::GerudoFortress, RR_TH_DEAD_END_CELL, RR_GF_BELOW_GS, ENTR_GERUDOS_FORTRESS_13 } },
// Grotto Loads use an entrance index of 0x0700 + their grotto id. The id is used as index for the
// grottoLoadTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c
// Grotto Returns use an entrance index of 0x0800 + their grotto id. The id is used as index for the
@ -643,7 +670,8 @@ std::vector<Entrance*> EntranceShuffler::AssumeEntrancePool(std::vector<Entrance
(ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) ||
ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)))) {
auto type = entrance->GetType();
if (((type == EntranceType::Dungeon || type == EntranceType::GrottoGrave) &&
if (((type == EntranceType::Dungeon || type == EntranceType::GerudoFortress ||
type == EntranceType::GrottoGrave) &&
entrance->GetReverse()->GetName() !=
"Spirit Temple Entryway -> Desert Colossus From Spirit Entryway") ||
(type == EntranceType::Interior &&
@ -1260,6 +1288,17 @@ int EntranceShuffler::ShuffleAllEntrances() {
}
}
// Gerudo Fortress entrances
if (ctx->GetOption(RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES)) {
entrancePools[EntranceType::GerudoFortress] = GetShuffleableEntrances(EntranceType::GerudoFortress);
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
for (Entrance* entrance : entrancePools[EntranceType::GerudoFortress]) {
entrancePools[EntranceType::GerudoFortressReverse].push_back(entrance->GetReverse());
}
}
}
// grotto entrances
if (ctx->GetOption(RSK_SHUFFLE_GROTTO_ENTRANCES)) {
entrancePools[EntranceType::GrottoGrave] = GetShuffleableEntrances(EntranceType::GrottoGrave);
@ -1327,6 +1366,12 @@ int EntranceShuffler::ShuffleAllEntrances() {
poolsToMix.insert(EntranceType::InteriorReverse);
}
}
if (ctx->GetOption(RSK_MIX_GERUDO_FORTRESS_ENTRANCES)) {
poolsToMix.insert(EntranceType::GerudoFortress);
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
poolsToMix.insert(EntranceType::GerudoFortressReverse);
}
}
if (ctx->GetOption(RSK_MIX_GROTTO_ENTRANCES)) {
poolsToMix.insert(EntranceType::GrottoGrave);
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {

View file

@ -28,6 +28,8 @@ enum class EntranceType {
Interior,
InteriorReverse,
SpecialInterior,
GerudoFortress,
GerudoFortressReverse,
GrottoGrave,
GrottoGraveReverse,
Overworld,

View file

@ -193,10 +193,11 @@ void RegionTable_Init_GerudoFortress() {
//Exits
//you don't take fall damage if you land on the rock with the flag on for some reason
//there's a trick to reach RR_GF_LONG_ROOF but that's too intricate for GF_JUMP
Entrance(RR_GF_OUTSKIRTS, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0;}),
Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}),
Entrance(RR_GF_BELOW_CHEST, []{return logic->TakeDamage();}),
Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}),
Entrance(RR_GF_OUTSKIRTS, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0;}),
Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}),
Entrance(RR_GF_BELOW_CHEST, []{return logic->TakeDamage();}),
Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}),
Entrance(RR_TH_BREAK_ROOM_CORRIDOR, []{return true;}),
});
areaTable[RR_GF_JAIL_WINDOW] = Region("GF Jail Window", SCENE_GERUDOS_FORTRESS, {}, {}, {

View file

@ -43,8 +43,9 @@ void RegionTable_Init_ThievesHideout() {
LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters),
}, {
//Exits
Entrance(RR_GF_OUTSKIRTS, []{return true;}),
Entrance(RR_GF_NEAR_GROTTO, []{return true;}),
Entrance(RR_GF_OUTSKIRTS, []{return true;}),
Entrance(RR_GF_ABOVE_GTG, []{return true;}),
Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}),
});
areaTable[RR_TH_DEAD_END_CELL] = Region("Thieves Hideout Dead End Cell", SCENE_THIEVES_HIDEOUT, {
@ -73,8 +74,8 @@ void RegionTable_Init_ThievesHideout() {
LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters),
}, {
//Exits
Entrance(RR_GF_ABOVE_GTG, []{return true;}),
Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}),
Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}),
Entrance(RR_GF_NEAR_GROTTO, []{return true;}),
});
areaTable[RR_TH_KITCHEN_CORRIDOR] = Region("Thieves Hideout Kitchen Corridor", SCENE_THIEVES_HIDEOUT, {}, {

View file

@ -166,6 +166,8 @@ void Settings::CreateOptionDescriptions() {
"- Link's House\n"
"- Temple of Time\n"
"- Kakariko Potion Shop";
mOptionDescriptions[RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES] =
"Shuffle the pool of entrances between Gerudo Fortress & Thieves' Hideout.";
mOptionDescriptions[RSK_SHUFFLE_GROTTO_ENTRANCES] =
"Shuffle the pool of grotto entrances, including all graves, small Fairy fountains and the Deku Theatre.";
mOptionDescriptions[RSK_SHUFFLE_OWL_DROPS] = "Randomize where Kaepora Gaebora (the Owl) drops you at when you talk "

View file

@ -5924,6 +5924,7 @@ typedef enum {
RSK_SHUFFLE_DUNGEON_ENTRANCES,
RSK_SHUFFLE_OVERWORLD_ENTRANCES,
RSK_SHUFFLE_INTERIOR_ENTRANCES,
RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES,
RSK_SHUFFLE_GROTTO_ENTRANCES,
RSK_SHUFFLE_OWL_DROPS,
RSK_SHUFFLE_WARP_SONGS,
@ -5933,6 +5934,7 @@ typedef enum {
RSK_MIX_BOSS_ENTRANCES,
RSK_MIX_OVERWORLD_ENTRANCES,
RSK_MIX_INTERIOR_ENTRANCES,
RSK_MIX_GERUDO_FORTRESS_ENTRANCES,
RSK_MIX_GROTTO_ENTRANCES,
RSK_DECOUPLED_ENTRANCES,
RSK_STARTING_SKULLTULA_TOKEN,

View file

@ -409,9 +409,10 @@ void Entrance_SetSavewarpEntrance(void) {
} else if (scene == SCENE_GANONS_TOWER || scene == SCENE_GANONDORF_BOSS ||
scene == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || scene == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR ||
scene == SCENE_GANON_BOSS || scene == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) {
gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb
} else if (scene == SCENE_THIEVES_HIDEOUT) { // Theives hideout
gSaveContext.entranceIndex = ENTR_THIEVES_HIDEOUT_0; // Gerudo Fortress -> Thieve's Hideout spawn 0
gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb
} else if (scene == SCENE_THIEVES_HIDEOUT &&
!Randomizer_GetSettingValue(RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES)) { // Thieves' Hideout
gSaveContext.entranceIndex = ENTR_THIEVES_HIDEOUT_0; // Gerudo Fortress -> Thieves' Hideout spawn 0
} else if (scene == SCENE_LINKS_HOUSE &&
Randomizer_GetSettingValue(RSK_SHUFFLE_INTERIOR_ENTRANCES) != RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) {
// Save warping in Link's house keeps the player there if Link's house not shuffled,
@ -425,10 +426,9 @@ void Entrance_SetSavewarpEntrance(void) {
} else if (LINK_IS_CHILD) {
gSaveContext.entranceIndex = Entrance_OverrideNextIndex(ENTR_LINKS_HOUSE_CHILD_SPAWN); // Child Overworld Spawn
} else {
gSaveContext.entranceIndex = Entrance_OverrideNextIndex(
ENTR_HYRULE_FIELD_10); // Adult Overworld Spawn (Normally 0x5F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD), but 0x282
// (ENTR_HYRULE_FIELD_10) has been repurposed to differentiate from Prelude which
// also uses 0x5F4)
// Adult Overworld Spawn. Normally 0x5F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD), but 0x282
// (ENTR_HYRULE_FIELD_10) has been repurposed to differentiate from Prelude which also uses 0x5F4
gSaveContext.entranceIndex = Entrance_OverrideNextIndex(ENTR_HYRULE_FIELD_10);
}
}

View file

@ -328,6 +328,32 @@ const EntranceData entranceData[] = {
{ ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "GF Outside Training Ground", "Gerudo Training Ground Entrance", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON, "gtg", 1},
{ ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET), ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET), {{ SCENE_FAIRYS_FOUNTAIN, 0x00 }}, "GF Fairy Grotto", "GF Storms Grotto Entry", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_GROTTO, ""},
{ ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, SINGLE_SCENE_INFO(SCENE_GERUDO_TRAINING_GROUND), "Gerudo Training Ground Entrance", "GF Outside Training Ground", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON, "gtg"},
{ ENTR_GERUDOS_FORTRESS_1, ENTR_THIEVES_HIDEOUT_0, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 1", "Thieves 1", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_2, ENTR_THIEVES_HIDEOUT_1, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 2", "Thieves 2", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_3, ENTR_THIEVES_HIDEOUT_2, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 3", "Thieves 3", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_4, ENTR_THIEVES_HIDEOUT_3, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 4", "Thieves 4", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_5, ENTR_THIEVES_HIDEOUT_4, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 5", "Thieves 5", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_6, ENTR_THIEVES_HIDEOUT_5, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 6", "Thieves 6", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_7, ENTR_THIEVES_HIDEOUT_6, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 7", "Thieves 7", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_8, ENTR_THIEVES_HIDEOUT_7, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 8", "Thieves 8", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_9, ENTR_THIEVES_HIDEOUT_8, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 9", "Thieves 9", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_10, ENTR_THIEVES_HIDEOUT_9, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 10", "Thieves 10", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_11, ENTR_THIEVES_HIDEOUT_10, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 11", "Thieves 11", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_12, ENTR_THIEVES_HIDEOUT_11, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 12", "Thieves 12", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_GERUDOS_FORTRESS_13, ENTR_THIEVES_HIDEOUT_12, SINGLE_SCENE_INFO(SCENE_THIEVES_HIDEOUT), "Gerudo 13", "Thieves 13", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_0, ENTR_GERUDOS_FORTRESS_1, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 1", "Gerudo 1", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_1, ENTR_GERUDOS_FORTRESS_2, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 2", "Gerudo 2", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_2, ENTR_GERUDOS_FORTRESS_3, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 3", "Gerudo 3", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_3, ENTR_GERUDOS_FORTRESS_4, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 4", "Gerudo 4", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_4, ENTR_GERUDOS_FORTRESS_5, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 5", "Gerudo 5", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_5, ENTR_GERUDOS_FORTRESS_6, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 6", "Gerudo 6", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_6, ENTR_GERUDOS_FORTRESS_7, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 7", "Gerudo 7", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_7, ENTR_GERUDOS_FORTRESS_8, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 8", "Gerudo 8", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_8, ENTR_GERUDOS_FORTRESS_9, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 9", "Gerudo 9", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_9, ENTR_GERUDOS_FORTRESS_10, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 10", "Gerudo 10", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_10, ENTR_GERUDOS_FORTRESS_11, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 11", "Gerudo 11", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_11, ENTR_GERUDOS_FORTRESS_12, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 12", "Gerudo 12", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
{ ENTR_THIEVES_HIDEOUT_12, ENTR_GERUDOS_FORTRESS_13, SINGLE_SCENE_INFO(SCENE_GERUDOS_FORTRESS), "Thieves 13", "Gerudo 13", ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON},
// The Wasteland
{ ENTR_GERUDOS_FORTRESS_GATE_EXIT, ENTR_HAUNTED_WASTELAND_EAST_EXIT, SINGLE_SCENE_INFO(SCENE_HAUNTED_WASTELAND), "Haunted Wasteland East Exit", "Gerudo Fortress Gate Exit", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_OVERWORLD, "hw,gf"},

View file

@ -144,6 +144,7 @@ void Settings::CreateOptions() {
OPT_U8(RSK_SHUFFLE_BOSS_ENTRANCES, "Boss Entrances", {"Off", "Age Restricted", "Full"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), mOptionDescriptions[RSK_SHUFFLE_BOSS_ENTRANCES], WidgetType::Combobox, RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF);
OPT_BOOL(RSK_SHUFFLE_OVERWORLD_ENTRANCES, "Overworld Entrances", CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), mOptionDescriptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES]);
OPT_U8(RSK_SHUFFLE_INTERIOR_ENTRANCES, "Interior Entrances", {"Off", "Simple", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), mOptionDescriptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], WidgetType::Combobox, RO_INTERIOR_ENTRANCE_SHUFFLE_OFF);
OPT_BOOL(RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES, "Gerudo Fortress Entrances", CVAR_RANDOMIZER_SETTING("ShuffleGerudoFortressEntrances"), mOptionDescriptions[RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES]);
OPT_BOOL(RSK_SHUFFLE_GROTTO_ENTRANCES, "Grottos Entrances", CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), mOptionDescriptions[RSK_SHUFFLE_GROTTO_ENTRANCES]);
OPT_BOOL(RSK_SHUFFLE_OWL_DROPS, "Owl Drops", CVAR_RANDOMIZER_SETTING("ShuffleOwlDrops"), mOptionDescriptions[RSK_SHUFFLE_OWL_DROPS]);
OPT_BOOL(RSK_SHUFFLE_WARP_SONGS, "Warp Songs", CVAR_RANDOMIZER_SETTING("ShuffleWarpSongs"), mOptionDescriptions[RSK_SHUFFLE_WARP_SONGS]);
@ -153,6 +154,7 @@ void Settings::CreateOptions() {
OPT_BOOL(RSK_MIX_BOSS_ENTRANCES, "Mix Bosses", CVAR_RANDOMIZER_SETTING("MixBosses"), mOptionDescriptions[RSK_MIX_BOSS_ENTRANCES], IMFLAG_NONE);
OPT_BOOL(RSK_MIX_OVERWORLD_ENTRANCES, "Mix Overworld", CVAR_RANDOMIZER_SETTING("MixOverworld"), mOptionDescriptions[RSK_MIX_OVERWORLD_ENTRANCES], IMFLAG_NONE);
OPT_BOOL(RSK_MIX_INTERIOR_ENTRANCES, "Mix Interiors", CVAR_RANDOMIZER_SETTING("MixInteriors"), mOptionDescriptions[RSK_MIX_INTERIOR_ENTRANCES], IMFLAG_NONE);
OPT_BOOL(RSK_MIX_GERUDO_FORTRESS_ENTRANCES, "Mix Gerudo Fortress", CVAR_RANDOMIZER_SETTING("MixGerudo Fortress"), mOptionDescriptions[RSK_MIX_GERUDO_FORTRESS_ENTRANCES]);
OPT_BOOL(RSK_MIX_GROTTO_ENTRANCES, "Mix Grottos", CVAR_RANDOMIZER_SETTING("MixGrottos"), mOptionDescriptions[RSK_MIX_GROTTO_ENTRANCES]);
OPT_BOOL(RSK_DECOUPLED_ENTRANCES, "Decouple Entrances", CVAR_RANDOMIZER_SETTING("DecoupleEntrances"), mOptionDescriptions[RSK_DECOUPLED_ENTRANCES]);
OPT_BOOL(RSK_BOMBCHU_BAG, "Bombchu Bag", CVAR_RANDOMIZER_SETTING("BombchuBag"), mOptionDescriptions[RSK_BOMBCHU_BAG]);
@ -1216,10 +1218,11 @@ void Settings::CreateOptions() {
"Shuffle Entrances",
{ &mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], &mOptions[RSK_SHUFFLE_BOSS_ENTRANCES],
&mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES], &mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES],
&mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES], &mOptions[RSK_SHUFFLE_OWL_DROPS], &mOptions[RSK_SHUFFLE_WARP_SONGS],
&mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS], &mOptions[RSK_DECOUPLED_ENTRANCES],
&mOptions[RSK_MIXED_ENTRANCE_POOLS], &mOptions[RSK_MIX_DUNGEON_ENTRANCES], &mOptions[RSK_MIX_BOSS_ENTRANCES],
&mOptions[RSK_MIX_OVERWORLD_ENTRANCES], &mOptions[RSK_MIX_INTERIOR_ENTRANCES],
&mOptions[RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES], &mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES],
&mOptions[RSK_SHUFFLE_OWL_DROPS], &mOptions[RSK_SHUFFLE_WARP_SONGS], &mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS],
&mOptions[RSK_DECOUPLED_ENTRANCES], &mOptions[RSK_MIXED_ENTRANCE_POOLS], &mOptions[RSK_MIX_DUNGEON_ENTRANCES],
&mOptions[RSK_MIX_BOSS_ENTRANCES], &mOptions[RSK_MIX_OVERWORLD_ENTRANCES],
&mOptions[RSK_MIX_INTERIOR_ENTRANCES], &mOptions[RSK_MIX_GERUDO_FORTRESS_ENTRANCES],
&mOptions[RSK_MIX_GROTTO_ENTRANCES] },
WidgetContainerType::COLUMN);
mOptionGroups[RSG_WORLD_IMGUI_TABLE] = OptionGroup::SubGroup("World",
@ -1452,6 +1455,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_SHUFFLE_BOSS_ENTRANCES],
&mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES],
&mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES],
&mOptions[RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES],
&mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES],
&mOptions[RSK_SHUFFLE_OWL_DROPS],
&mOptions[RSK_SHUFFLE_WARP_SONGS],
@ -1461,6 +1465,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_MIX_BOSS_ENTRANCES],
&mOptions[RSK_MIX_OVERWORLD_ENTRANCES],
&mOptions[RSK_MIX_INTERIOR_ENTRANCES],
&mOptions[RSK_MIX_GERUDO_FORTRESS_ENTRANCES],
&mOptions[RSK_MIX_GROTTO_ENTRANCES],
&mOptions[RSK_DECOUPLED_ENTRANCES],
&mOptions[RSK_BOMBCHU_BAG],
@ -2070,6 +2075,7 @@ void Settings::UpdateOptionProperties() {
mOptions[RSK_MIX_BOSS_ENTRANCES].Hide();
mOptions[RSK_MIX_OVERWORLD_ENTRANCES].Hide();
mOptions[RSK_MIX_INTERIOR_ENTRANCES].Hide();
mOptions[RSK_MIX_GERUDO_FORTRESS_ENTRANCES].Hide();
mOptions[RSK_MIX_GROTTO_ENTRANCES].Hide();
} else {
mOptions[RSK_MIXED_ENTRANCE_POOLS].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM);
@ -2077,6 +2083,7 @@ void Settings::UpdateOptionProperties() {
mOptions[RSK_MIX_BOSS_ENTRANCES].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM);
mOptions[RSK_MIX_OVERWORLD_ENTRANCES].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM);
mOptions[RSK_MIX_INTERIOR_ENTRANCES].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM);
mOptions[RSK_MIX_GERUDO_FORTRESS_ENTRANCES].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM);
mOptions[RSK_MIX_GROTTO_ENTRANCES].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM);
RandomizerSettingKey lastKey = RSK_MIXED_ENTRANCE_POOLS;
if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), RO_DUNGEON_ENTRANCE_SHUFFLE_OFF) ==
@ -2105,6 +2112,13 @@ void Settings::UpdateOptionProperties() {
mOptions[RSK_MIX_INTERIOR_ENTRANCES].Unhide();
lastKey = RSK_MIX_INTERIOR_ENTRANCES;
}
if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGerudoFortressEntrances"), RO_GENERIC_OFF) ==
RO_GENERIC_OFF) {
mOptions[RSK_MIX_GERUDO_FORTRESS_ENTRANCES].Hide();
} else {
mOptions[RSK_MIX_GERUDO_FORTRESS_ENTRANCES].Unhide();
lastKey = RSK_MIX_GERUDO_FORTRESS_ENTRANCES;
}
if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), RO_GENERIC_OFF) == RO_GENERIC_OFF) {
mOptions[RSK_MIX_GROTTO_ENTRANCES].Hide();
} else {
@ -2562,8 +2576,8 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
mOptions[RSK_SHUFFLE_BOSS_ENTRANCES].IsNot(RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF) ||
mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES] ||
mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES].IsNot(RO_INTERIOR_ENTRANCE_SHUFFLE_OFF) ||
mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES] || mOptions[RSK_SHUFFLE_OWL_DROPS] || mOptions[RSK_SHUFFLE_WARP_SONGS] ||
mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS]) {
mOptions[RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES] || mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES] ||
mOptions[RSK_SHUFFLE_OWL_DROPS] || mOptions[RSK_SHUFFLE_WARP_SONGS] || mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS]) {
mOptions[RSK_SHUFFLE_ENTRANCES].Set(RO_GENERIC_ON);
} else {
mOptions[RSK_SHUFFLE_ENTRANCES].Set(RO_GENERIC_OFF);
@ -2819,6 +2833,7 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
bool bossShuffle = !mOptions[RSK_SHUFFLE_BOSS_ENTRANCES].Is(RO_GENERIC_OFF);
bool overworldShuffle = !mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES].Is(RO_GENERIC_OFF);
bool interiorShuffle = !mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES].Is(RO_INTERIOR_ENTRANCE_SHUFFLE_OFF);
bool gerudoFortressShuffle = !mOptions[RSK_SHUFFLE_GERUDO_FORTRESS_ENTRANCES].Is(RO_GENERIC_OFF);
bool grottoShuffle = !mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES].Is(RO_GENERIC_OFF);
if (dungeonShuffle + bossShuffle + overworldShuffle + interiorShuffle + grottoShuffle <= 1) {
@ -2841,6 +2856,10 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
mOptions[RSK_MIX_INTERIOR_ENTRANCES].Set(RO_GENERIC_OFF);
}
if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !gerudoFortressShuffle) {
mOptions[RSK_MIX_GERUDO_FORTRESS_ENTRANCES].Set(RO_GENERIC_OFF);
}
if (!mOptions[RSK_MIXED_ENTRANCE_POOLS] || !grottoShuffle) {
mOptions[RSK_MIX_GROTTO_ENTRANCES].Set(RO_GENERIC_OFF);
}