From dd04da230ff7ee8e5c0e0a4fa1c5a246d14ef406 Mon Sep 17 00:00:00 2001 From: gymnast86 Date: Tue, 21 Apr 2026 01:32:08 -0700 Subject: [PATCH] add necessary settings to rando context --- src/dusk/imgui/ImGuiMenuRandomizer.cpp | 9 ++++++- .../randomizer/game/randomizer_context.cpp | 11 ++++++++ .../randomizer/game/randomizer_context.hpp | 2 ++ .../generator/data/settings_list.yaml | 25 +++++++++++++++++++ .../randomizer/generator/seedgen/settings.cpp | 11 +++++--- .../randomizer/generator/seedgen/settings.hpp | 5 +++- 6 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/dusk/imgui/ImGuiMenuRandomizer.cpp b/src/dusk/imgui/ImGuiMenuRandomizer.cpp index 90c894e726..25b36d2067 100644 --- a/src/dusk/imgui/ImGuiMenuRandomizer.cpp +++ b/src/dusk/imgui/ImGuiMenuRandomizer.cpp @@ -36,9 +36,16 @@ namespace dusk { return; } - auto& world = r.GetWorlds()[0]; + const auto& world = r.GetWorlds()[0]; RandomizerContext randoData{}; + + for (const auto& [setting, info] : *randomizer::seedgen::settings::GetAllSettingsInfo()) { + if (info->NeedInGame()) { + randoData.mSettings[setting] = world->Setting(setting).GetCurrentOption(); + } + } + // Chest overrides for (const auto& location : world->GetAllLocations()) { const auto& metaData = location->GetMetadata(); diff --git a/src/dusk/randomizer/game/randomizer_context.cpp b/src/dusk/randomizer/game/randomizer_context.cpp index e2726a8a28..681b996615 100644 --- a/src/dusk/randomizer/game/randomizer_context.cpp +++ b/src/dusk/randomizer/game/randomizer_context.cpp @@ -29,6 +29,10 @@ std::optional RandomizerContext::WriteToFile() { YAML::Node out{}; + for (const auto& [settingName, option] : this->mSettings) { + out["Settings"][settingName] = option; + } + // NOTE: When dumping u8s, they must be converted to u16s (or higher), otherwise they get dumped // as single characters and not numbers @@ -61,6 +65,13 @@ std::optional RandomizerContext::LoadFromHash(const std::string& ha auto in = LoadYAML(this->GetSeedDataPath()); + // Necessary settings + for (const auto& settingNode : in["mSettings"] ) { + const auto& settingName = settingNode.first.as(); + const auto& option = settingNode.second.as(); + this->mSettings[settingName] = option; + } + // Event flags for (const auto& flag : in["mStartEventFlags"]) { this->mStartEventFlags.push_back(flag.as()); diff --git a/src/dusk/randomizer/game/randomizer_context.hpp b/src/dusk/randomizer/game/randomizer_context.hpp index 83b4ca24af..8737b6bb2e 100644 --- a/src/dusk/randomizer/game/randomizer_context.hpp +++ b/src/dusk/randomizer/game/randomizer_context.hpp @@ -16,6 +16,8 @@ public: u32 mSeedID{0}; std::string mHash{""}; + std::unordered_map mSettings{}; + std::list mStartEventFlags{}; std::unordered_map> mStartRegionFlags{}; std::list mStartingInventory{}; diff --git a/src/dusk/randomizer/generator/data/settings_list.yaml b/src/dusk/randomizer/generator/data/settings_list.yaml index 4783a0f52e..761e8d7d32 100644 --- a/src/dusk/randomizer/generator/data/settings_list.yaml +++ b/src/dusk/randomizer/generator/data/settings_list.yaml @@ -17,6 +17,8 @@ ###################### - Name: Hyrule Barrier Requirements + Need In Game: True + Tracker Important: True Default Option: Vanilla Options: - Open: "The barrier around Hyrule Castle is dispelled from the beginning." @@ -28,36 +30,43 @@ - Hearts: "The barrier will be dispelled once the required number of Hearts have been reached." - Name: Hyrule Barrier Fused Shadows + Need In Game: True Tracker Important: True Default Option: 1 Options: - 1-3: description - Name: Hyrule Barrier Mirror Shards + Need In Game: True Tracker Important: True Default Option: 1 Options: - 1-4: description - Name: Hyrule Barrier Dungeons + Need In Game: True Tracker Important: True Default Option: 1 Options: - 1-8: description - Name: Hyrule Barrier Poe Souls + Need In Game: True Tracker Important: True Default Option: 1 Options: - 1-60: description - Name: Hyrule Barrier Hearts + Need In Game: True Tracker Important: True Default Option: 4 Options: - 4-20: description # Hehe 420 - Name: Palace of Twilight Requirements + Need In Game: True + Tracker Important: True Default Option: Vanilla Options: - Open: "The barrier around Hyrule Castle is dispelled from the beginning." @@ -66,6 +75,7 @@ - Vanilla: "The player must complete City in the Sky." - Name: Faron Woods Logic + Tracker Important: True Default Option: Closed Options: - Closed: "Midna will block the player from leaving Faron Woods until Forest Temple is completed." @@ -76,48 +86,56 @@ ###################### - Name: Golden Bugs + Tracker Important: True Default Option: "Off" Options: - "Off": "The Golden Bug locations across Hyrule will not be randomized." - "On": "The Golden Bug locations across Hyrule will be randomized." - Name: Sky Characters + Tracker Important: True Default Option: "Off" Options: - "Off": description - "On": description - Name: Gifts From NPCs + Tracker Important: True Default Option: "Off" Options: - "Off": description - "On": description - Name: Shop Items + Tracker Important: True Default Option: "Off" Options: - "Off": description - "On": description - Name: Hidden Skills + Tracker Important: True Default Option: "Off" Options: - "Off": description - "On": description - Name: Hidden Rupees + Tracker Important: True Default Option: "Off" Options: - "Off": description - "On": description - Name: Freestanding Rupees + Tracker Important: True Default Option: "Off" Options: - "Off": description - "On": description - Name: Poe Souls + Tracker Important: True Default Option: Vanilla Options: - Vanilla: description @@ -126,6 +144,7 @@ - All: description - Name: Ilia Memory Quest + Tracker Important: True Default Option: Vanilla Options: - Vanilla: description @@ -183,6 +202,7 @@ - Start With: "The player starts with all Maps and Compasses." - Name: Hyrule Castle Big Key Requirements + Need In Game: True Tracker Important: True Default Option: None Options: @@ -194,30 +214,35 @@ - Hearts: "The gate will open once the required number of Hearts have been reached." - Name: Hyrule Castle Big Key Fused Shadows + Need In Game: True Tracker Important: True Default Option: 1 Options: - 1-3: description - Name: Hyrule Castle Big Key Mirror Shards + Need In Game: True Tracker Important: True Default Option: 1 Options: - 1-4: description - Name: Hyrule Castle Big Key Dungeons + Need In Game: True Tracker Important: True Default Option: 1 Options: - 1-8: description - Name: Hyrule Castle Big Key Poe Souls + Need In Game: True Tracker Important: True Default Option: 1 Options: - 1-60: description - Name: Hyrule Castle Big Key Hearts + Need In Game: True Tracker Important: True Default Option: 4 Options: diff --git a/src/dusk/randomizer/generator/seedgen/settings.cpp b/src/dusk/randomizer/generator/seedgen/settings.cpp index c648f7054e..9aa852715c 100644 --- a/src/dusk/randomizer/generator/seedgen/settings.cpp +++ b/src/dusk/randomizer/generator/seedgen/settings.cpp @@ -36,7 +36,8 @@ namespace randomizer::seedgen::settings const int& randomOptionIndex, const int& randomLow, const int& randomHigh, - const bool& trackerImportant): + const bool& trackerImportant, + const bool& needInGame): _id(id), _name(name), _type(type), @@ -47,7 +48,8 @@ namespace randomizer::seedgen::settings _randomOptionIndex(randomOptionIndex), _randomLow(randomLow), _randomHigh(randomHigh), - _trackerImportant(trackerImportant) + _trackerImportant(trackerImportant), + _needInGame(needInGame) { // The logic expression of a setting replaces spaces with underscores, // and removes apostraphes and parenthesis @@ -280,6 +282,8 @@ namespace randomizer::seedgen::settings const auto& trackerImportant = settingNode["Tracker Important"] ? settingNode["Tracker Important"].as() : false; + const auto& needInGame = + settingNode["Need In Game"] ? settingNode["Need In Game"].as() : false; const auto& hasRandomOption = settingNode["Autogenerate Random"] ? settingNode["Autogenerate Random"].as() : true; const auto& randomAlias = settingNode["Random Alias"] ? settingNode["Random Alias"].as() : "Random"; @@ -327,7 +331,8 @@ namespace randomizer::seedgen::settings randomOptionIndex, randomLow, randomHigh, - trackerImportant); + trackerImportant, + needInGame); settingInfoMap->emplace(name, std::move(info)); } diff --git a/src/dusk/randomizer/generator/seedgen/settings.hpp b/src/dusk/randomizer/generator/seedgen/settings.hpp index e04cf518cc..33f604e6a9 100644 --- a/src/dusk/randomizer/generator/seedgen/settings.hpp +++ b/src/dusk/randomizer/generator/seedgen/settings.hpp @@ -58,7 +58,8 @@ namespace randomizer::seedgen::settings const int& randomOptionIndex, const int& randomLow, const int& randomHigh, - const bool& trackerImportant); + const bool& trackerImportant, + const bool& needInGame); int GetID() const { return this->_id; } @@ -98,6 +99,7 @@ namespace randomizer::seedgen::settings int GetRandomLow() const { return this->_randomLow; } int GetRandomHigh() const { return this->_randomHigh; } bool TrackerImportant() const { return this->_trackerImportant; } + bool NeedInGame() const { return this->_needInGame; } private: int _id = -1; @@ -111,6 +113,7 @@ namespace randomizer::seedgen::settings int _randomLow = 0; // Lower bound when choosing a random option int _randomHigh = 0; // Upper bound when choosing a random option bool _trackerImportant = false; // Whether or not this setting can affect trackers + bool _needInGame = false; // Whether or not we need to read this setting during gameplay // Variables that hold the setting's name and options when being checked // in a logical requirement string.