diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 1cd4160de..2b74fe5f2 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -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_BY_CORRIDOR, ENTR_THIEVES_HIDEOUT_8 }, + { EntranceType::GerudoFortress, RR_TH_KITCHEN_BY_CORRIDOR, RR_GF_TOP_OF_LOWER_VINES, ENTR_GERUDOS_FORTRESS_9 } }, + { { EntranceType::GerudoFortress, RR_GF_NEAR_GS, RR_TH_KITCHEN_OPPOSITE_CORRIDOR, ENTR_THIEVES_HIDEOUT_9 }, + { EntranceType::GerudoFortress, RR_TH_KITCHEN_OPPOSITE_CORRIDOR, 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 EntranceShuffler::AssumeEntrancePool(std::vectorGetOption(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)) { diff --git a/soh/soh/Enhancements/randomizer/entrance.h b/soh/soh/Enhancements/randomizer/entrance.h index 5b14611fe..91fa4007d 100644 --- a/soh/soh/Enhancements/randomizer/entrance.h +++ b/soh/soh/Enhancements/randomizer/entrance.h @@ -28,6 +28,8 @@ enum class EntranceType { Interior, InteriorReverse, SpecialInterior, + GerudoFortress, + GerudoFortressReverse, GrottoGrave, GrottoGraveReverse, Overworld, diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp index 3929faf86..e5af00ba0 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp @@ -98,7 +98,7 @@ void RegionTable_Init_GerudoFortress() { areaTable[RR_GF_TOP_OF_LOWER_VINES] = Region("GF Top of Lower Vines", SCENE_GERUDOS_FORTRESS, {}, {}, { //Exits - Entrance(RR_TH_KITCHEN_TOP, []{return true;}), + Entrance(RR_TH_KITCHEN_BY_CORRIDOR, []{return true;}), Entrance(RR_TH_DOUBLE_CELL, []{return true;}), Entrance(RR_GF_ABOVE_GTG, []{return true;}), Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), @@ -111,13 +111,13 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) && logic->CanGetNightTimeGS()), }, { //Exits - Entrance(RR_TH_KITCHEN_TOP, []{return true;}), - Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult;}), - Entrance(RR_GF_LONG_ROOF, []{return logic->CanUse(RG_HOVER_BOOTS) /* || bunny hood jump */ || logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP);}), - Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), - Entrance(RR_GF_BELOW_GS, []{return true;}), + Entrance(RR_TH_KITCHEN_OPPOSITE_CORRIDOR, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult;}), + Entrance(RR_GF_LONG_ROOF, []{return logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), + Entrance(RR_GF_BELOW_GS, []{return true;}), }); areaTable[RR_GF_SLOPED_ROOF] = Region("GF Sloped Roof", SCENE_GERUDOS_FORTRESS, {}, {}, { @@ -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, {}, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp index 0a70e77e8..281c60d8e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp @@ -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, {}, { @@ -98,20 +99,33 @@ void RegionTable_Init_ThievesHideout() { LOCATION(RC_TH_KITCHEN_SUN_FAIRY, logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_SUNS_SONG)), }, { //Exits - Entrance(RR_TH_KITCHEN_CORRIDOR, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), - Entrance(RR_TH_KITCHEN_TOP, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + Entrance(RR_TH_KITCHEN_CORRIDOR, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + Entrance(RR_TH_KITCHEN_BY_CORRIDOR, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + Entrance(RR_TH_KITCHEN_OPPOSITE_CORRIDOR, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), }); - areaTable[RR_TH_KITCHEN_TOP] = Region("Thieves Hideout Kitchen Top", SCENE_THIEVES_HIDEOUT, {}, { + areaTable[RR_TH_KITCHEN_BY_CORRIDOR] = Region("Thieves Hideout Kitchen Top By Corridor", SCENE_THIEVES_HIDEOUT, {}, { //Locations LOCATION(RC_TH_KITCHEN_POT_1, logic->CanUse(RG_BOOMERANG)), LOCATION(RC_TH_KITCHEN_POT_2, logic->CanUse(RG_BOOMERANG)), }, { //Exits - Entrance(RR_TH_KITCHEN_MAIN, []{return true;}), - //hookshot to cross using the rafters is implied in logic->CanPassEnemy(RE_GERUDO_GUARD) - Entrance(RR_GF_NEAR_GS, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_TH_KITCHEN_MAIN, []{return true;}), + //hookshot to cross using rafters implied by logic->CanPassEnemy(RE_GERUDO_GUARD) + Entrance(RR_TH_KITCHEN_OPPOSITE_CORRIDOR, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + }); + + areaTable[RR_TH_KITCHEN_OPPOSITE_CORRIDOR] = Region("Thieves Hideout Kitchen Top Across From Corridor", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_KITCHEN_POT_1, logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_TH_KITCHEN_POT_2, logic->CanUse(RG_BOOMERANG)), + }, { + //Exits + Entrance(RR_TH_KITCHEN_MAIN, []{return true;}), + //hookshot to cross using rafters implied by logic->CanPassEnemy(RE_GERUDO_GUARD) + Entrance(RR_TH_KITCHEN_BY_CORRIDOR, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_GF_NEAR_GS, []{return true;}), }); areaTable[RR_TH_BREAK_ROOM] = Region("Thieves Hideout Break Room", SCENE_THIEVES_HIDEOUT, {}, { diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 50d11d9b2..35ff80d37 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -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 " diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 15a2fbd37..491ee3fc5 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -445,7 +445,8 @@ typedef enum { RR_TH_STEEP_SLOPE_CELL, RR_TH_KITCHEN_CORRIDOR, RR_TH_KITCHEN_MAIN, - RR_TH_KITCHEN_TOP, + RR_TH_KITCHEN_BY_CORRIDOR, + RR_TH_KITCHEN_OPPOSITE_CORRIDOR, RR_TH_BREAK_ROOM, RR_TH_BREAK_ROOM_CORRIDOR, RR_WASTELAND_NEAR_FORTRESS, @@ -5924,6 +5925,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 +5935,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, diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index e32223124..d36451049 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -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); } } @@ -673,15 +673,21 @@ void Entrance_OverrideWeatherState() { // In ER, Adult should be placed at the fortress entrance when getting caught in the fortress without a hookshot, // instead of being thrown in the valley Child should always be thrown in the stream when caught in the valley, and // placed at the fortress entrance from valley when caught in the fortress -void Entrance_OverrideGeurdoGuardCapture(void) { - if (LINK_IS_CHILD) { - gPlayState->nextEntranceIndex = ENTR_GERUDO_VALLEY_1; // Geurdo Valley thrown out - } +void Entrance_OverrideGerudoGuardCapture(void) { + if (gPlayState->sceneNum == SCENE_THIEVES_HIDEOUT && + Randomizer_GetSettingValue(RSK_MIX_GERUDO_FORTRESS_ENTRANCES)) { + // If GF entrances in mixed shuffle, TH captures stay in TH + gPlayState->nextEntranceIndex = gSaveContext.entranceIndex; + } else { + if (LINK_IS_CHILD) { + gPlayState->nextEntranceIndex = ENTR_GERUDO_VALLEY_1; // Gerudo Valley thrown out + } - if ((LINK_IS_CHILD || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) && - gPlayState->nextEntranceIndex == ENTR_GERUDO_VALLEY_1) { // Geurdo Valley thrown out - if (gPlayState->sceneNum != SCENE_GERUDO_VALLEY) { // Geurdo Valley - gPlayState->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_EAST_EXIT; // Gerudo Fortress + if ((LINK_IS_CHILD || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) && + gPlayState->nextEntranceIndex == ENTR_GERUDO_VALLEY_1) { // Gerudo Valley thrown out + if (gPlayState->sceneNum != SCENE_GERUDO_VALLEY) { // Gerudo Valley + gPlayState->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_EAST_EXIT; // Gerudo Fortress + } } } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.h b/soh/soh/Enhancements/randomizer/randomizer_entrance.h index ca840f396..db81c864a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.h @@ -47,7 +47,7 @@ void Entrance_SetWarpSongEntrance(void); void Entrance_OverrideBlueWarp(void); void Entrance_HandleEponaState(void); void Entrance_OverrideWeatherState(void); -void Entrance_OverrideGeurdoGuardCapture(void); +void Entrance_OverrideGerudoGuardCapture(void); void Entrance_OverrideSpawnScene(int32_t sceneNum, int32_t spawn); int32_t Entrance_OverrideSpawnSceneRoom(int32_t sceneNum, int32_t spawn, int32_t room); void Entrance_EnableFW(void); diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 1a635f58e..72135b81b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -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), "GF Outskirts", "TH 1 Torch Cell", 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), "GF Near Grotto", "TH 1 Torch Cell", 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), "GF Near Grotto", "TH Kitchen Corridor", 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), "GF Above GTG", "TH Kitchen Corridor", 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), "GF Near Grotto", "TH Steep Slope Cell", 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), "GF Bottom of Lower Vines", "TH Steep Slope Cell", 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), "GF Above GTG", "TH Double Cell", 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), "GF Top of Lower Vines", "TH Double Cell", 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), "GF Top of Lower Vines", "TH Kitchen By Corridor", 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), "GF Near GS", "TH Kitchen Opposite Corridor", 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), "GF Below Chest", "TH Break Room", 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), "GF Above Jail", "TH Break Room Corridor", 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), "GF Below GS", "TH Dead End Cell", 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), "TH 1 Torch Cell", "GF Outskirts", 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), "TH 1 Torch Cell", "GF Near Grotto", 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), "TH Kitchen Corridor", "GF Near Grotto", 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), "TH Kitchen Corridor", "GF Above GTG", 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), "TH Steep Slope Cell", "GF Near Grotto", 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), "TH Steep Slope Cell", "GF Bottom of Lower Vines", 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), "TH Double Cell", "GF Above GTG", 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), "TH Double Cell", "GF Top of Lower Vines", 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), "TH Kitchen By Corridor", "GF Top of Lower Vines", 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), "TH Kitchen Opposite Corridor", "GF Near GS", 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), "TH Break Room", "GF Below Chest", 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), "TH Break Room Corridor", "GF Above Jail", 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), "TH Dead End Cell", "GF Below GS", 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"}, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 5f8c60ac0..1b0850dfb 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -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& 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& 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& 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); } diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index eadd847b5..e4b16a8ba 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -247,7 +247,7 @@ void EnGe1_KickPlayer(EnGe1* this, PlayState* play) { } if (IS_RANDO) { - Entrance_OverrideGeurdoGuardCapture(); + Entrance_OverrideGerudoGuardCapture(); } play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); diff --git a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index 776a241b1..f060df525 100644 --- a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -255,7 +255,7 @@ void EnGe2_CaptureClose(EnGe2* this, PlayState* play) { } if (IS_RANDO) { - Entrance_OverrideGeurdoGuardCapture(); + Entrance_OverrideGerudoGuardCapture(); } play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); @@ -285,7 +285,7 @@ void EnGe2_CaptureCharge(EnGe2* this, PlayState* play) { } if (IS_RANDO) { - Entrance_OverrideGeurdoGuardCapture(); + Entrance_OverrideGerudoGuardCapture(); } play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); diff --git a/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c b/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c index 44bec7b31..db8466075 100644 --- a/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c +++ b/soh/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c @@ -1576,7 +1576,7 @@ void EnGeldB_Draw(Actor* thisx, PlayState* play) { } if (IS_RANDO) { - Entrance_OverrideGeurdoGuardCapture(); + Entrance_OverrideGerudoGuardCapture(); } play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST);