From 3a9c3ae9492c4cd5339f083985b6290756ecd9e7 Mon Sep 17 00:00:00 2001 From: Garrett Date: Mon, 1 Dec 2025 20:39:18 -0600 Subject: [PATCH] Add button to rando all rando settings --- .../Enhancements/randomizer/randomizer.cpp | 8 ++++ soh/soh/Enhancements/randomizer/settings.cpp | 46 +++++++++++++++++++ soh/soh/Enhancements/randomizer/settings.h | 7 +++ 3 files changed, 61 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 4ad550164d9..8c8a40d9279 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3985,6 +3985,14 @@ void RandomizerSettingsWindow::DrawElement() { GenerateRandomizer(CVarGetInteger(CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), 0) ? seedString : ""); } + ImGui::SameLine(); + UIWidgets::ButtonOptions randomizeOptions = UIWidgets::ButtonOptions().Size(ImVec2(250.f, 0.f)).Color(THEME_COLOR); + randomizeOptions.Disabled(disableEditingRandoSettings); + randomizeOptions.Tooltip("Randomizes all randomizer settings to random valid values (excludes tricks)."); + if (UIWidgets::Button("Randomize All Settings", randomizeOptions)) { + mSettings->RandomizeAllSettings(); + } + ImGui::SameLine(); if (!CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0)) { std::string spoilerfilepath = CVarGetString(CVAR_GENERAL("SpoilerLog"), ""); diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 68bed88c82d..cbac6083c15 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -1,6 +1,7 @@ #include "settings.h" #include "trial.h" #include "dungeon.h" +#include "3drando/random.hpp" #include "soh/OTRGlobals.h" @@ -9,6 +10,7 @@ #include #include +#include namespace Rando { std::shared_ptr Settings::mInstance; @@ -2993,6 +2995,50 @@ void Settings::SetAllToContext() { } } +void Settings::RandomizeAllSettings() { + // Randomize all settings except tricks + for (int i = 0; i < RSK_MAX; i++) { + switch (static_cast(i)) { + case RSK_STARTING_SKULLTULA_TOKEN: + case RSK_STARTING_HEARTS: + case RSK_STARTING_ZELDAS_LULLABY: + case RSK_STARTING_EPONAS_SONG: + case RSK_STARTING_SARIAS_SONG: + case RSK_STARTING_SUNS_SONG: + case RSK_STARTING_SONG_OF_TIME: + case RSK_STARTING_SONG_OF_STORMS: + case RSK_STARTING_MINUET_OF_FOREST: + case RSK_STARTING_BOLERO_OF_FIRE: + case RSK_STARTING_SERENADE_OF_WATER: + case RSK_STARTING_REQUIEM_OF_SPIRIT: + case RSK_STARTING_NOCTURNE_OF_SHADOW: + case RSK_STARTING_PRELUDE_OF_LIGHT: + continue; + default: + break; + } + + auto key = static_cast(i); + Option& option = mOptions[key]; + + if (option.GetOptionCount() == 0) { + continue; + } + + uint8_t randomIndex = Random(0, static_cast(option.GetOptionCount())); + + option.SetContextIndex(randomIndex); + if (!option.GetCVarName().empty()) { + CVarSetInteger(option.GetCVarName().c_str(), randomIndex); + } + } + + // Update option properties to handle dependencies between options + UpdateOptionProperties(); + + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); +} + std::shared_ptr Settings::GetInstance() { if (mInstance == nullptr) { mInstance = std::make_shared(); diff --git a/soh/soh/Enhancements/randomizer/settings.h b/soh/soh/Enhancements/randomizer/settings.h index ed214471a51..a2c925e562a 100644 --- a/soh/soh/Enhancements/randomizer/settings.h +++ b/soh/soh/Enhancements/randomizer/settings.h @@ -130,6 +130,13 @@ class Settings { */ void SetAllToContext(); + /** + * @brief Randomizes all randomizer settings (excluding tricks) to random valid values. + * This function iterates through all options and sets them to a random index within + * their valid range. + */ + void RandomizeAllSettings(); + static std::shared_ptr GetInstance(); private: