diff options
| author | Garrett Cox <garrettjcox@gmail.com> | 2023-12-04 17:29:48 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-04 11:29:48 -0600 |
| commit | 2d22a3ebcc9d735eeccc4df6eb6e78a4a31cfb91 (patch) | |
| tree | 4c6a5f2401a918499b3942e892e3ed569dda830b | |
| parent | a8c18882f0eeeb5054c99bb3b4c2ec37c0caa6fd (diff) | |
Add vanilla logic option (#2191)
8 files changed, 136 insertions, 51 deletions
diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index f9d3a9592..7063a3191 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -913,6 +913,8 @@ void VanillaFill() { ShuffleAllEntrances(); printf("\x1b[7;32HDone"); } + // Populate the playthrough for entrances so they are placed in the spoiler log + GeneratePlaythrough(); //Finish up CreateItemOverrides(); CreateEntranceOverrides(); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp index 0ab29d869..850157ad8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_location.cpp @@ -26,7 +26,7 @@ void LocationTable_Init() { locationTable[LW_NEAR_SHORTCUTS_GROTTO_CHEST] = ItemLocation::Chest (RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, 0x3E, 0x14, "LW Near Shortcuts Grotto Chest", LW_NEAR_SHORTCUTS_GROTTO_CHEST, BLUE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_SKULL_KID] = ItemLocation::Base (RC_LW_SKULL_KID, 0x5B, "LW Skull Kid", LW_SKULL_KID, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(22), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_TRADE_COJIRO] = ItemLocation::Base (RC_LW_TRADE_COJIRO, 0x5B, "LW Trade Cojiro", LW_TRADE_COJIRO, ODD_MUSHROOM, {Category::cAdultTrade}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[LW_TRADE_ODD_POTION] = ItemLocation::Base (RC_LW_TRADE_ODD_POTION, 0x5B, "LW Trade Odd Potion", LW_TRADE_ODD_POTION, ODD_POTION, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(49), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_TRADE_ODD_POTION] = ItemLocation::Base (RC_LW_TRADE_ODD_POTION, 0x5B, "LW Trade Odd Potion", LW_TRADE_ODD_POTION, POACHERS_SAW, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(49), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_OCARINA_MEMORY_GAME] = ItemLocation::Base (RC_LW_OCARINA_MEMORY_GAME, 0x5B, "LW Ocarina Memory Game", LW_OCARINA_MEMORY_GAME, PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(23), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_TARGET_IN_WOODS] = ItemLocation::Base (RC_LW_TARGET_IN_WOODS, 0x5B, "LW Target in Woods", LW_TARGET_IN_WOODS, PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheck::ItemGetInf(29), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = ItemLocation::Base (RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, 0x5B, "LW Deku Scrub Near Deku Theater Right",LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, BUY_DEKU_NUT_5, {Category::cDekuScrub}, SpoilerCollectionCheck::Scrub(), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); @@ -120,7 +120,7 @@ void LocationTable_Init() { locationTable[KAK_SHOOTING_GALLERY_REWARD] = ItemLocation::Base (RC_KAK_SHOOTING_GALLERY_REWARD, 0x42, "Kak Shooting Gallery Reward", KAK_SHOOTING_GALLERY_REWARD, PROGRESSIVE_BOW, {}, SpoilerCollectionCheck::Chest(0x42, 0x1F), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_TRADE_ODD_MUSHROOM] = ItemLocation::Base (RC_KAK_TRADE_ODD_MUSHROOM, 0x4E, "Kak Trade Odd Mushroom", KAK_TRADE_ODD_MUSHROOM, ODD_POTION, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(48), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_GRANNYS_SHOP] = ItemLocation::Base (RC_KAK_GRANNYS_SHOP, 0x4E, "Kak Granny's Shop", KAK_GRANNYS_SHOP, BLUE_POTION_REFILL, {Category::cMerchant}, SpoilerCollectionCheck::RandomizerInf(), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); - locationTable[KAK_ANJU_AS_ADULT] = ItemLocation::Base (RC_KAK_ANJU_AS_ADULT, 0x52, "Kak Anju as Adult", KAK_ANJU_AS_ADULT, CLAIM_CHECK, {}, SpoilerCollectionCheck::ItemGetInf(44), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[KAK_ANJU_AS_ADULT] = ItemLocation::Base (RC_KAK_ANJU_AS_ADULT, 0x52, "Kak Anju as Adult", KAK_ANJU_AS_ADULT, POCKET_EGG, {}, SpoilerCollectionCheck::ItemGetInf(44), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_ANJU_AS_CHILD] = ItemLocation::Base (RC_KAK_ANJU_AS_CHILD, 0x52, "Kak Anju as Child", KAK_ANJU_AS_CHILD, EMPTY_BOTTLE, {}, SpoilerCollectionCheck::ItemGetInf(12), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_TRADE_POCKET_CUCCO] = ItemLocation::Base (RC_KAK_TRADE_POCKET_CUCCO, 0x52, "Kak Trade Pocket Cucco", KAK_TRADE_POCKET_CUCCO, COJIRO, {Category::cAdultTrade}, SpoilerCollectionCheck::ItemGetInf(46), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); locationTable[KAK_IMPAS_HOUSE_FREESTANDING_POH] = ItemLocation::Collectable(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, 0x37, 0x01, "Kak Impas House Freestanding PoH", KAK_IMPAS_HOUSE_FREESTANDING_POH, PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); @@ -492,7 +492,7 @@ void LocationTable_Init() { locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, 0x0B, 0x09, "Gerudo Training Grounds MQ Maze Path Third Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_THIRD_CHEST, TREASURE_GAME_GREEN_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); locationTable[GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, 0x0B, 0x0A, "Gerudo Training Grounds MQ Maze Path Second Chest", GERUDO_TRAINING_GROUNDS_MQ_MAZE_PATH_SECOND_CHEST, RED_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); locationTable[GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, 0x0B, 0x0B, "Gerudo Training Grounds MQ Hidden Ceiling Chest", GERUDO_TRAINING_GROUNDS_MQ_HIDDEN_CEILING_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, 0x0B, 0x0D, "Gerudo Training Grounds MQ Underwater Silver Rupee Chest",GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, TREASURE_GAME_GREEN_RUPEE, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, 0x0B, 0x0D, "Gerudo Training Grounds MQ Underwater Silver Rupee Chest",GERUDO_TRAINING_GROUNDS_MQ_UNDERWATER_SILVER_RUPEE_CHEST, GERUDO_TRAINING_GROUNDS_SMALL_KEY, {Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); locationTable[GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST] = ItemLocation::Chest (RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, 0x0B, 0x02, "Gerudo Training Grounds MQ Heavy Block Chest", GERUDO_TRAINING_GROUNDS_MQ_HEAVY_BLOCK_CHEST, PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); //Ganons Castle Shared @@ -918,7 +918,7 @@ void LocationTable_Init() { locationTable[DMC_UPPER_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, "DMC Upper Grotto Gossip Stone"); locationTable[GANONDORF_HINT] = ItemLocation::OtherHint(RC_GANONDORF_HINT, "Ganondorf Hint"); - locationTable[TRIFORCE_COMPLETED] = ItemLocation::Reward (RC_TRIFORCE_COMPLETED, 0xFF, "Completed Triforce", NONE, TRIFORCE_COMPLETED, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP); + locationTable[TRIFORCE_COMPLETED] = ItemLocation::Reward (RC_TRIFORCE_COMPLETED, 0xFF, "Completed Triforce", NONE, NONE, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP); for (int i = NONE; i != KEY_ENUM_MAX; i++) locationLookupTable.insert(std::make_pair(locationTable[i].GetRandomizerCheck(), static_cast<Key>(i))); diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.cpp b/soh/soh/Enhancements/randomizer/3drando/menu.cpp index 5da2b618c..9f6cc2796 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.cpp @@ -22,6 +22,14 @@ std::vector<std::string> presetEntries; Option* currentSetting; } // namespace +static void RestoreOverrides() { + if (Settings::Logic.Is(LOGIC_VANILLA)) { + for (auto overridePair : Settings::vanillaLogicOverrides) { + overridePair.first->RestoreDelayedOption(); + } + } +} + std::string GenerateRandomizer(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings, std::set<RandomizerCheck> excludedLocations, std::set<RandomizerTrick> enabledTricks, std::string seedString) { @@ -52,20 +60,17 @@ std::string GenerateRandomizer(std::unordered_map<RandomizerSettingKey, uint8_t> printf("\n\nFailed to generate after 5 tries.\nPress B to go back to the menu.\nA different seed might be " "successful."); SPDLOG_DEBUG("\nRANDOMIZATION FAILED COMPLETELY. PLZ FIX\n"); + RestoreOverrides(); return ""; } else { printf("\n\nError %d with fill.\nPress Select to exit or B to go back to the menu.\n", ret); + RestoreOverrides(); return ""; } } - // Restore settings that were set to a specific value for vanilla logic - if (Settings::Logic.Is(LOGIC_VANILLA)) { - for (Option* setting : Settings::vanillaLogicDefaults) { - setting->RestoreDelayedOption(); - } - Settings::Keysanity.RestoreDelayedOption(); - } + RestoreOverrides(); + std::ostringstream fileNameStream; for (int i = 0; i < Settings::hashIconIndexes.size(); i++) { if (i) { diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 08d09cfa8..684e3ec9a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -2060,21 +2060,65 @@ namespace Settings { } //Options that should be saved, set to default, then restored after finishing when vanilla logic is enabled - std::vector<Option *> vanillaLogicDefaults = { - &LinksPocketItem, - &ShuffleRewards, - &ShuffleSongs, - &Shopsanity, - &ShopsanityPrices, - &ShopsanityPricesAffordable, - &Scrubsanity, - &ShuffleCows, - &ShuffleMagicBeans, - &ShuffleMerchants, - &ShuffleFrogSongRupees, - &ShuffleAdultTradeQuest, - &Shuffle100GSReward, - &GossipStoneHints, + std::vector<std::pair<Option*, uint8_t>> vanillaLogicOverrides = { + { &OpenForest, OPENFOREST_CLOSED }, + { &OpenKakariko, OPENKAKARIKO_CLOSED }, + { &OpenDoorOfTime, OPENDOOROFTIME_CLOSED }, + { &ZorasFountain, ZORASFOUNTAIN_NORMAL }, + { &GerudoFortress, GERUDOFORTRESS_NORMAL }, + { &Bridge, RAINBOWBRIDGE_VANILLA }, + { &RandomGanonsTrials, OFF }, + { &GanonsTrialsCount, 6 }, + + { &StartingAge, AGE_CHILD }, + { &TriforceHunt, TRIFORCE_HUNT_OFF }, + + { &ShuffleRewards, REWARDSHUFFLE_END_OF_DUNGEON }, + { &LinksPocketItem, LINKSPOCKETITEM_DUNGEON_REWARD }, + { &ShuffleSongs, SONGSHUFFLE_SONG_LOCATIONS }, + { &Shopsanity, SHOPSANITY_OFF }, + { &Tokensanity, TOKENSANITY_OFF }, + { &Scrubsanity, SCRUBSANITY_OFF }, + { &ShuffleCows, OFF }, + { &ShuffleKokiriSword, OFF }, + { &ShuffleMasterSword, OFF }, + { &ShuffleOcarinas, OFF }, + { &ShuffleWeirdEgg, OFF }, + { &ShuffleGerudoToken, OFF }, + { &ShuffleMagicBeans, OFF }, + { &ShuffleMerchants, SHUFFLEMERCHANTS_OFF }, + { &ShuffleFrogSongRupees, SHUFFLEFROGSONGRUPEES_OFF }, + { &ShuffleAdultTradeQuest, SHUFFLEADULTTRADEQUEST_OFF }, + { &ShuffleChestMinigame, SHUFFLECHESTMINIGAME_OFF }, + { &Shuffle100GSReward, OFF }, + + { &MapsAndCompasses, MAPSANDCOMPASSES_VANILLA }, + { &Keysanity, KEYSANITY_ANY_DUNGEON }, // Set small keys to any dungeon so FiT basement door will be locked + { &GerudoKeys, GERUDOKEYS_VANILLA }, + { &BossKeysanity, BOSSKEYSANITY_VANILLA }, + { &GanonsBossKey, GANONSBOSSKEY_VANILLA }, + { &KeyRings, KEYRINGS_OFF }, + + { &StartingOcarina, OFF }, + + { &SkipChildStealth, DONT_SKIP }, + { &SkipTowerEscape, DONT_SKIP }, + { &SkipEponaRace, DONT_SKIP }, + + { &GossipStoneHints, HINTS_NO_HINTS }, + { &AltarHintText, HINTS_NO_HINTS }, + { &LightArrowHintText, HINTS_NO_HINTS }, + { &DampeHintText, HINTS_NO_HINTS }, + { &GregHintText, HINTS_NO_HINTS }, + { &SariaHintText, HINTS_NO_HINTS }, + { &FrogsHintText, HINTS_NO_HINTS }, + { &WarpSongHints, HINTS_NO_HINTS }, + { &Kak10GSHintText, HINTS_NO_HINTS }, + { &Kak20GSHintText, HINTS_NO_HINTS }, + { &Kak30GSHintText, HINTS_NO_HINTS }, + { &Kak40GSHintText, HINTS_NO_HINTS }, + { &Kak50GSHintText, HINTS_NO_HINTS }, + { &ScrubHintText, HINTS_NO_HINTS }, }; // Randomizes all settings in a category if chosen @@ -2207,6 +2251,9 @@ namespace Settings { case RO_LOGIC_NO_LOGIC: Logic.SetSelectedIndex(2); break; + case RO_LOGIC_VANILLA: + Logic.SetSelectedIndex(3); + break; } LocationsReachable.SetSelectedIndex(cvarSettings[RSK_ALL_LOCATIONS_REACHABLE]); @@ -2428,6 +2475,15 @@ namespace Settings { // RANDOTODO implement chest shuffle with keysanity // ShuffleChestMinigame.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_CHEST_MINIGAME]); + if (Logic.Is(LOGIC_VANILLA)) { + LACSCondition = LACSCONDITION_VANILLA; + skipChildZelda = false; + for (auto overridePair : vanillaLogicOverrides) { + overridePair.first->SetDelayedOption(); + overridePair.first->SetSelectedIndex(overridePair.second); + } + } + RandomizeAllSettings(true); //now select any random options instead of just hiding them //shuffle the dungeons and then set MQ for as many as necessary @@ -2594,16 +2650,6 @@ namespace Settings { } else { LACSCondition = LACSCONDITION_VANILLA; } - - //If vanilla logic, we want to set all settings which unnecessarily modify vanilla behavior to off - if (Logic.Is(LOGIC_VANILLA)) { - for (Option* setting : vanillaLogicDefaults) { - setting->SetDelayedOption(); - setting->SetSelectedIndex(0); - } - Keysanity.SetDelayedOption(); - Keysanity.SetSelectedIndex(3); //Set small keys to any dungeon so FiT basement door will be locked - } } //If this is an option menu, return the options diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.hpp b/soh/soh/Enhancements/randomizer/3drando/settings.hpp index fc1df2959..12e6443a4 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.hpp @@ -189,6 +189,11 @@ typedef enum { } ShuffleMerchantsSetting; typedef enum { + SHUFFLEFROGSONGRUPEES_OFF, + SHUFFLEFROGSONGRUPEES_ON, +} ShuffleFrogSongRupeesSetting; + +typedef enum { SHUFFLEADULTTRADEQUEST_OFF, SHUFFLEADULTTRADEQUEST_ON, } ShuffleAdultTradeQuestSetting; @@ -1173,5 +1178,5 @@ void UpdateSettings(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettin extern std::vector<Menu *> mainMenu; - extern std::vector<Option *> vanillaLogicDefaults; + extern std::vector<std::pair<Option*, uint8_t>> vanillaLogicOverrides; } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index ccebd33d9..4609d0f98 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -223,9 +223,9 @@ std::unordered_map<s16, s16> getItemIdToItemId = { }; std::unordered_map<std::string, RandomizerSettingKey> SpoilerfileSettingNameToEnum = { - { "Detailed Logic Settings:Logic", RSK_LOGIC_RULES }, - { "Detailed Logic Settings:Night GSs Expect Sun's", RSK_SKULLS_SUNS_SONG }, - { "Detailed Logic Settings:All Locations Reachable", RSK_ALL_LOCATIONS_REACHABLE }, + { "Logic Options:Logic", RSK_LOGIC_RULES }, + { "Logic Options:Night GSs Expect Sun's", RSK_SKULLS_SUNS_SONG }, + { "Logic Options:All Locations Reachable", RSK_ALL_LOCATIONS_REACHABLE }, { "Item Pool Settings:Item Pool", RSK_ITEM_POOL }, { "Item Pool Settings:Ice Traps", RSK_ICE_TRAPS }, { "Open Settings:Forest", RSK_FOREST }, @@ -691,6 +691,8 @@ void Randomizer::ParseRandomizerSettingsFile(const char* spoilerFileName) { gSaveContext.randoSettings[index].value = RO_LOGIC_GLITCHLESS; } else if (it.value() == "No Logic") { gSaveContext.randoSettings[index].value = RO_LOGIC_NO_LOGIC; + } else if (it.value() == "Vanilla") { + gSaveContext.randoSettings[index].value = RO_LOGIC_VANILLA; } break; case RSK_FOREST: @@ -3069,7 +3071,7 @@ void RandomizerSettingsWindow::DrawElement() { // Randomizer settings // Logic Settings - static const char* randoLogicRules[2] = { "Glitchless", "No logic" }; + static const char* randoLogicRules[3] = { "Glitchless", "No logic", "Vanilla" }; // Open Settings static const char* randoForest[3] = { "Closed", "Closed Deku", "Open" }; @@ -3203,6 +3205,7 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::PopItemFlag(); ImGui::TableNextRow(); + ImGui::BeginDisabled(CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); // COLUMN 1 - Area Access ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; @@ -3497,6 +3500,8 @@ void RandomizerSettingsWindow::DrawElement() { UIWidgets::PaddedSeparator(); + ImGui::EndDisabled(); + // Master Quest Dungeons if (OTRGlobals::Instance->HasMasterQuest() && OTRGlobals::Instance->HasOriginal()) { ImGui::PushItemWidth(-FLT_MIN); @@ -3549,6 +3554,8 @@ void RandomizerSettingsWindow::DrawElement() { UIWidgets::PaddedSeparator(); } + ImGui::BeginDisabled(CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); + // Triforce Hunt UIWidgets::EnhancementCheckbox("Triforce Hunt", "gRandomizeTriforceHunt"); UIWidgets::InsertHelpHoverText( @@ -3583,6 +3590,7 @@ void RandomizerSettingsWindow::DrawElement() { UIWidgets::PaddedSeparator(); ImGui::EndChild(); + ImGui::EndDisabled(); // COLUMN 3 - Shuffle Entrances ImGui::TableNextColumn(); @@ -3744,6 +3752,7 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::EndTabItem(); } + ImGui::BeginDisabled(CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); if (ImGui::BeginTabItem("Items")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); if (ImGui::BeginTable("tableRandoStartingInventory", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { @@ -4329,7 +4338,9 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::PopStyleVar(1); ImGui::EndTabItem(); } + ImGui::EndDisabled(); + ImGui::BeginDisabled(CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); if (ImGui::BeginTabItem("Gameplay")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); if (ImGui::BeginTable("tableRandoGameplay", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { @@ -4599,7 +4610,9 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::PopStyleVar(1); ImGui::EndTabItem(); } + ImGui::EndDisabled(); + ImGui::BeginDisabled(CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); static bool locationsTabOpen = false; if (ImGui::BeginTabItem("Locations")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); @@ -4718,6 +4731,7 @@ void RandomizerSettingsWindow::DrawElement() { } else { locationsTabOpen = false; } + ImGui::EndDisabled(); static bool tricksTabOpen = false; if (ImGui::BeginTabItem("Tricks/Glitches")) { @@ -4751,10 +4765,12 @@ void RandomizerSettingsWindow::DrawElement() { "\n" //"Glitched - Glitches may be required to beat the game. You can disable and enable glitches below.\n" //"\n" - "No logic - Item placement is completely random. MAY BE IMPOSSIBLE TO BEAT." + "No logic - Item placement is completely random. MAY BE IMPOSSIBLE TO BEAT.\n" + "\n" + "Vanilla - Places all items and dungeon rewards in their vanilla locations." ); UIWidgets::EnhancementCombobox("gRandomizeLogicRules", randoLogicRules, RO_LOGIC_GLITCHLESS); - if (CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) != RO_LOGIC_NO_LOGIC) { + if (CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_GLITCHLESS) { ImGui::SameLine(); UIWidgets::EnhancementCheckbox(Settings::LocationsReachable.GetName().c_str(), "gRandomizeAllLocationsReachable", false, "", UIWidgets::CheckboxGraphics::Cross, RO_GENERIC_ON); UIWidgets::InsertHelpHoverText( @@ -4765,6 +4781,10 @@ void RandomizerSettingsWindow::DrawElement() { "will be guaranteed reachable." ); } + if (CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA) { + ImGui::SameLine(); + ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "Heads up! This will disable all rando settings except for entrance shuffle and starter items"); + } UIWidgets::PaddedSeparator(); @@ -4778,6 +4798,8 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::EndTable(); } + ImGui::BeginDisabled(CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); + // Tricks static std::unordered_map<RandomizerTrickArea, bool> areaTreeDisabled { {RTAREA_GENERAL, true}, @@ -5150,6 +5172,7 @@ void RandomizerSettingsWindow::DrawElement() { } ImGui::EndTable(); } + ImGui::EndDisabled(); ImGui::PopStyleVar(1); ImGui::EndTabItem(); } else { @@ -5171,13 +5194,14 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; ImGui::BeginChild("ChildStartingEquipment", ImVec2(0, -8)); - // Don't display this option if Dungeon Rewards are Shuffled to End of Dungeon. - // TODO: Show this but disabled when we have options for disabled Comboboxes. - if (CVarGetInteger("gRandomizeShuffleDungeonReward", RO_DUNGEON_REWARDS_END_OF_DUNGEON) != RO_DUNGEON_REWARDS_END_OF_DUNGEON) { - ImGui::Text("%s", Settings::LinksPocketItem.GetName().c_str()); - UIWidgets::EnhancementCombobox("gRandomizeLinksPocket", randoLinksPocket, RO_LINKS_POCKET_DUNGEON_REWARD); - UIWidgets::PaddedSeparator(); - } + ImGui::BeginDisabled( + CVarGetInteger("gRandomizeShuffleDungeonReward", RO_DUNGEON_REWARDS_END_OF_DUNGEON) == RO_DUNGEON_REWARDS_END_OF_DUNGEON || + CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA + ); + ImGui::Text("%s", Settings::LinksPocketItem.GetName().c_str()); + UIWidgets::EnhancementCombobox("gRandomizeLinksPocket", randoLinksPocket, RO_LINKS_POCKET_DUNGEON_REWARD); + UIWidgets::PaddedSeparator(); + ImGui::EndDisabled(); UIWidgets::EnhancementCheckbox(Settings::StartingKokiriSword.GetName().c_str(), "gRandomizeStartingKokiriSword"); UIWidgets::PaddedSeparator(); @@ -5192,8 +5216,10 @@ void RandomizerSettingsWindow::DrawElement() { window->DC.CurrLineTextBaseOffset = 0.0f; ImGui::BeginChild("ChildStartingItems", ImVec2(0, -8)); + ImGui::BeginDisabled(CVarGetInteger("gRandomizeLogicRules", RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); UIWidgets::EnhancementCheckbox(Settings::StartingOcarina.GetName().c_str(), "gRandomizeStartingOcarina"); UIWidgets::PaddedSeparator(); + ImGui::EndDisabled(); UIWidgets::EnhancementCheckbox(Settings::StartingConsumables.GetName().c_str(), "gRandomizeStartingConsumables"); UIWidgets::PaddedSeparator(); UIWidgets::EnhancementSliderInt("Gold Skulltula Tokens: %d", "##RandoStartingSkulltulaToken", "gRandomizeStartingSkulltulaToken", 0, 100, "", 0); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 5437de269..700cddf76 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1774,6 +1774,7 @@ typedef enum { RO_LOGIC_GLITCHLESS, //RO_LOGIC_GLITCHED, RO_LOGIC_NO_LOGIC, + RO_LOGIC_VANILLA, } RandoOptionLogic; // MQ Dungeons diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 003c8c135..af3275fa8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -1127,7 +1127,7 @@ void LoadSettings() { } bool IsVisibleInCheckTracker(RandomizerCheckObject rcObj) { - if (IS_RANDO) { + if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) != RO_LOGIC_VANILLA) { return (rcObj.rcArea != RCAREA_INVALID) && // don't show Invalid locations (rcObj.rcType != RCTYPE_GOSSIP_STONE) && //TODO: Don't show hints until tracker supports them |
