Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions soh/soh/Enhancements/randomizer/randomizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"), "");
Expand Down
46 changes: 46 additions & 0 deletions soh/soh/Enhancements/randomizer/settings.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "settings.h"
#include "trial.h"
#include "dungeon.h"
#include "3drando/random.hpp"

#include "soh/OTRGlobals.h"

Expand All @@ -9,6 +10,7 @@
#include <utility>

#include <libultraship/bridge/consolevariablebridge.h>
#include <libultraship/libultraship.h>

namespace Rando {
std::shared_ptr<Settings> Settings::mInstance;
Expand Down Expand Up @@ -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<RandomizerSettingKey>(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<RandomizerSettingKey>(i);
Option& option = mOptions[key];

if (option.GetOptionCount() == 0) {
continue;
}

uint8_t randomIndex = Random(0, static_cast<uint32_t>(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> Settings::GetInstance() {
if (mInstance == nullptr) {
mInstance = std::make_shared<Settings>();
Expand Down
7 changes: 7 additions & 0 deletions soh/soh/Enhancements/randomizer/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<Settings> GetInstance();

private:
Expand Down
Loading