mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-03-03 10:11:51 -05:00
Add vanilla logic option (#2191)
This commit is contained in:
parent
a8c18882f0
commit
2d22a3ebcc
@ -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();
|
||||
|
@ -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)));
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -188,6 +188,11 @@ typedef enum {
|
||||
SHUFFLEMERCHANTS_HINTS,
|
||||
} ShuffleMerchantsSetting;
|
||||
|
||||
typedef enum {
|
||||
SHUFFLEFROGSONGRUPEES_OFF,
|
||||
SHUFFLEFROGSONGRUPEES_ON,
|
||||
} ShuffleFrogSongRupeesSetting;
|
||||
|
||||
typedef enum {
|
||||
SHUFFLEADULTTRADEQUEST_OFF,
|
||||
SHUFFLEADULTTRADEQUEST_ON,
|
||||
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -1774,6 +1774,7 @@ typedef enum {
|
||||
RO_LOGIC_GLITCHLESS,
|
||||
//RO_LOGIC_GLITCHED,
|
||||
RO_LOGIC_NO_LOGIC,
|
||||
RO_LOGIC_VANILLA,
|
||||
} RandoOptionLogic;
|
||||
|
||||
// MQ Dungeons
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user