summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Dubé <159546+serprex@users.noreply.github.com>2026-06-12 06:06:58 +0000
committerGitHub <noreply@github.com>2026-06-12 06:06:58 +0000
commit2da8cf50c928ad3534d3b3c9ccea670133b47ce6 (patch)
tree90017a7296b63e44dab146cfb046dc44c4e60a99
parent739225d222d2dc3f70b3ad420f702814bd0e834d (diff)
Fix rando code not using rando rng (#6730)
-rw-r--r--soh/soh/Enhancements/randomizer/SeedContext.cpp5
-rw-r--r--soh/soh/Enhancements/randomizer/Traps.cpp30
-rw-r--r--soh/soh/Enhancements/randomizer/Traps.h4
-rw-r--r--soh/soh/Enhancements/randomizer/settings.cpp43
4 files changed, 37 insertions, 45 deletions
diff --git a/soh/soh/Enhancements/randomizer/SeedContext.cpp b/soh/soh/Enhancements/randomizer/SeedContext.cpp
index 5a2eb7785..9ac56f777 100644
--- a/soh/soh/Enhancements/randomizer/SeedContext.cpp
+++ b/soh/soh/Enhancements/randomizer/SeedContext.cpp
@@ -13,6 +13,7 @@
#include "soh/util.h"
#include "../kaleido.h"
#include "soh/Enhancements/randomizer/Traps.h"
+#include "soh/Enhancements/randomizer/3drando/random.hpp"
#include "soh/Enhancements/randomizer/randomizer.h"
#include <fstream>
@@ -330,9 +331,9 @@ void Context::CreateItemOverrides() {
// If this is an ice trap, store the disguise model in iceTrapModels
const auto itemLoc = GetItemLocation(locKey);
if (itemLoc->GetPlacedRandomizerGet() == RG_ICE_TRAP) {
- ItemOverride val(locKey, Traps::GetTrapTrickModel());
+ ItemOverride val(locKey, Traps::GetTrapTrickModel(&rando_state));
iceTrapModels[locKey] = val.LooksLike();
- val.SetTrickName(Traps::GetTrapName(val.LooksLike()));
+ val.SetTrickName(Traps::GetTrapName(val.LooksLike(), &rando_state));
// If this is ice trap is in a shop, change the name based on what the model will look like
overrides[locKey] = val;
}
diff --git a/soh/soh/Enhancements/randomizer/Traps.cpp b/soh/soh/Enhancements/randomizer/Traps.cpp
index d6334ba3a..8c55d1031 100644
--- a/soh/soh/Enhancements/randomizer/Traps.cpp
+++ b/soh/soh/Enhancements/randomizer/Traps.cpp
@@ -4,6 +4,8 @@
#include "soh/Enhancements/randomizer/static_data.h"
#include "soh/ShipUtils.h"
+#include "soh/Enhancements/randomizer/3drando/random.hpp"
+
#include <vector>
static std::array<std::vector<Text>, RG_MAX> trickNameTable; // Table of trick names for ice traps
@@ -1418,7 +1420,7 @@ static void InitTrickNames() {
}
// Generate a fake name for the ice trap based on the item it's displayed as
-Text Rando::Traps::GetTrapName(uint16_t id) {
+Text Rando::Traps::GetTrapName(uint16_t id, uint64_t* state) {
// If the trick names table has not been initialized, do so
if (!initTrickNames) {
InitTrickNames();
@@ -1431,19 +1433,19 @@ Text Rando::Traps::GetTrapName(uint16_t id) {
}
// Randomly get the easy, medium, or hard name for the given item id
- return ShipUtils::RandomElement(trickNameTable[id]);
+ return ShipUtils::RandomElement(trickNameTable[id], state);
}
-RandomizerGet Rando::Traps::GetTrapTrickModel() {
+RandomizerGet Rando::Traps::GetTrapTrickModel(uint64_t* state) {
auto ctx = Rando::Context::GetInstance();
- RandomizerGet trickModel = ShipUtils::RandomElementFromSet(ctx->possibleIceTrapModels);
+ RandomizerGet trickModel = ShipUtils::RandomElementFromSet(ctx->possibleIceTrapModels, state);
if (trickModel == RG_EMPTY_BOTTLE) {
- trickModel = ShipUtils::RandomElement(Rando::StaticData::normalBottles);
+ trickModel = ShipUtils::RandomElement(Rando::StaticData::normalBottles, state);
} else if (trickModel == RG_GUARD_HOUSE_KEY) {
- trickModel = ShipUtils::RandomElement(Rando::StaticData::overworldKeys);
+ trickModel = ShipUtils::RandomElement(Rando::StaticData::overworldKeys, state);
} else if (trickModel == RG_DEATH_MOUNTAIN_CRATER_BEAN_SOUL) {
- trickModel = ShipUtils::RandomElement(Rando::StaticData::beanSouls);
+ trickModel = ShipUtils::RandomElement(Rando::StaticData::beanSouls, state);
}
return trickModel;
@@ -1451,17 +1453,9 @@ RandomizerGet Rando::Traps::GetTrapTrickModel() {
bool Rando::Traps::ShouldJunkItemBeTrap() {
auto ctx = Rando::Context::GetInstance();
-
- if (ctx->GetOption(RSK_ICE_TRAP_PERCENT).Is(0)) {
- return false;
- }
-
- if (ctx->GetOption(RSK_ICE_TRAP_PERCENT).Is(100) ||
- ShipUtils::Random(0, 100) < ctx->GetOption(RSK_ICE_TRAP_PERCENT).Get()) {
- return true;
- }
-
- return false;
+ return ctx->GetOption(RSK_ICE_TRAP_PERCENT).IsNot(0) &&
+ (ctx->GetOption(RSK_ICE_TRAP_PERCENT).Is(100) ||
+ Random(0, 100) < ctx->GetOption(RSK_ICE_TRAP_PERCENT).Get());
}
static const char* const englishIceTrapMessages[] = {
diff --git a/soh/soh/Enhancements/randomizer/Traps.h b/soh/soh/Enhancements/randomizer/Traps.h
index cf8f8905c..dbb4fb6a7 100644
--- a/soh/soh/Enhancements/randomizer/Traps.h
+++ b/soh/soh/Enhancements/randomizer/Traps.h
@@ -11,8 +11,8 @@
namespace Rando {
namespace Traps {
-Text GetTrapName(uint16_t id);
-RandomizerGet GetTrapTrickModel();
+Text GetTrapName(uint16_t id, uint64_t* state = nullptr);
+RandomizerGet GetTrapTrickModel(uint64_t* state = nullptr);
bool ShouldJunkItemBeTrap();
void BuildIceTrapMessage(CustomMessage& msg, GetItemEntry getItemEntry);
} // namespace Traps
diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp
index e0b8c2f39..552c602c8 100644
--- a/soh/soh/Enhancements/randomizer/settings.cpp
+++ b/soh/soh/Enhancements/randomizer/settings.cpp
@@ -1,13 +1,11 @@
#include "settings.h"
-#include "soh/Enhancements/randomizer/randomizerTypes.h"
#include "trial.h"
#include "dungeon.h"
-#include "soh/ShipUtils.h"
-
+#include "soh/Enhancements/randomizer/randomizerTypes.h"
+#include "soh/Enhancements/randomizer/3drando/random.hpp"
#include "soh/OTRGlobals.h"
#include <spdlog/spdlog.h>
-
#include <libultraship/bridge/consolevariablebridge.h>
#include <libultraship/libultraship.h>
@@ -2628,7 +2626,7 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
case RO_MQ_SET_RANDOM:
// 50% per dungeon, rolled separatly so people can either have a linear distribtuion
// or a bell curve for the number of MQ dungeons per seed.
- if (ShipUtils::Random(0, 2)) {
+ if (Random(0, 2)) {
dungeon->SetMQ();
mqSet += 1;
}
@@ -2695,13 +2693,13 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
if (randMQOption.size() > 0) {
// Figure out how many dungeons to select, rolling the random number if needed
if (mOptions[RSK_MQ_DUNGEON_RANDOM].Is(RO_MQ_DUNGEONS_RANDOM_NUMBER)) {
- mqToSet = ShipUtils::Random(0, static_cast<int>(randMQOption.size()) + 1);
+ mqToSet = Random(0, static_cast<int>(randMQOption.size()) + 1);
} else if (mqCount > mqSet) {
mqToSet = std::min(mqCount - mqSet, static_cast<int>(randMQOption.size()));
}
// we only need to shuffle if we're not using them all
if (mqToSet <= static_cast<int8_t>(randMQOption.size()) && mqToSet > 0) {
- ShipUtils::Shuffle(randMQOption);
+ Shuffle(randMQOption);
}
for (uint8_t i = 0; i < mqToSet; i++) {
dungeons[randMQOption[i]]->SetMQ();
@@ -2750,8 +2748,8 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
if (mOptions[RSK_KEYRINGS].Is(RO_KEYRINGS_RANDOM) || mOptions[RSK_KEYRINGS].Is(RO_KEYRINGS_COUNT)) {
const uint32_t keyRingCount = mOptions[RSK_KEYRINGS].Is(RO_KEYRINGS_COUNT)
? mOptions[RSK_KEYRINGS_RANDOM_COUNT].Get()
- : ShipUtils::Random(0, static_cast<int>(keyrings.size()));
- ShipUtils::Shuffle(keyrings);
+ : Random(0, static_cast<int>(keyrings.size()));
+ Shuffle(keyrings);
for (size_t i = 0; i < keyRingCount; i++) {
keyrings[i]->Set(RO_KEYRING_FOR_DUNGEON_ON);
}
@@ -2760,50 +2758,49 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
}
}
if (mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL].Is(RO_KEYRING_FOR_DUNGEON_ON) ||
- (mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) &&
- ShipUtils::Random(0, 2) == 0)) {
+ (mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 0)) {
this->GetDungeon(BOTTOM_OF_THE_WELL)->SetKeyRing();
}
if (mOptions[RSK_KEYRINGS_FOREST_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) ||
- (mOptions[RSK_KEYRINGS_FOREST_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && ShipUtils::Random(0, 2) == 0)) {
+ (mOptions[RSK_KEYRINGS_FOREST_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 0)) {
this->GetDungeon(FOREST_TEMPLE)->SetKeyRing();
}
if (mOptions[RSK_KEYRINGS_FIRE_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) ||
- (mOptions[RSK_KEYRINGS_FIRE_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && ShipUtils::Random(0, 2) == 0)) {
+ (mOptions[RSK_KEYRINGS_FIRE_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 0)) {
this->GetDungeon(FIRE_TEMPLE)->SetKeyRing();
}
if (mOptions[RSK_KEYRINGS_WATER_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) ||
- (mOptions[RSK_KEYRINGS_WATER_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && ShipUtils::Random(0, 2) == 0)) {
+ (mOptions[RSK_KEYRINGS_WATER_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 0)) {
this->GetDungeon(WATER_TEMPLE)->SetKeyRing();
}
if (mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) ||
- (mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && ShipUtils::Random(0, 2) == 0)) {
+ (mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 0)) {
this->GetDungeon(SPIRIT_TEMPLE)->SetKeyRing();
}
if (mOptions[RSK_KEYRINGS_SHADOW_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_ON) ||
- (mOptions[RSK_KEYRINGS_SHADOW_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && ShipUtils::Random(0, 2) == 0)) {
+ (mOptions[RSK_KEYRINGS_SHADOW_TEMPLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 0)) {
this->GetDungeon(SHADOW_TEMPLE)->SetKeyRing();
}
if (mOptions[RSK_KEYRINGS_GTG].Is(RO_KEYRING_FOR_DUNGEON_ON) ||
- (mOptions[RSK_KEYRINGS_GTG].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && ShipUtils::Random(0, 2) == 0)) {
+ (mOptions[RSK_KEYRINGS_GTG].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 0)) {
this->GetDungeon(GERUDO_TRAINING_GROUND)->SetKeyRing();
}
if (mOptions[RSK_KEYRINGS_GANONS_CASTLE].Is(RO_KEYRING_FOR_DUNGEON_ON) ||
- (mOptions[RSK_KEYRINGS_GANONS_CASTLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && ShipUtils::Random(0, 2) == 0)) {
+ (mOptions[RSK_KEYRINGS_GANONS_CASTLE].Is(RO_KEYRING_FOR_DUNGEON_RANDOM) && Random(0, 2) == 0)) {
this->GetDungeon(GANONS_CASTLE)->SetKeyRing();
}
}
auto trials = this->GetTrials()->GetTrialList();
- ShipUtils::Shuffle(trials);
+ Shuffle(trials);
for (const auto trial : trials) {
trial->SetAsSkipped();
}
if (mOptions[RSK_GANONS_TRIALS].Is(RO_GANONS_TRIALS_SKIP)) {
mOptions[RSK_TRIAL_COUNT].Set(0);
} else if (mOptions[RSK_GANONS_TRIALS].Is(RO_GANONS_TRIALS_RANDOM_NUMBER)) {
- mOptions[RSK_TRIAL_COUNT].Set(ShipUtils::Random(
- 0, static_cast<int>(Rando::Settings::GetInstance()->GetOption(RSK_TRIAL_COUNT).GetOptionCount())));
+ mOptions[RSK_TRIAL_COUNT].Set(
+ Random(0, static_cast<int>(Rando::Settings::GetInstance()->GetOption(RSK_TRIAL_COUNT).GetOptionCount())));
}
for (uint8_t i = 0; i < mOptions[RSK_TRIAL_COUNT].Get(); i++) {
trials[i]->SetAsRequired();
@@ -2845,7 +2842,7 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
}
if (mOptions[RSK_STARTING_AGE].Is(RO_AGE_RANDOM)) {
- if (const uint32_t choice = ShipUtils::Random(0, 2); choice == 0) {
+ if (const uint32_t choice = Random(0, 2); choice == 0) {
mOptions[RSK_SELECTED_STARTING_AGE].Set(RO_AGE_CHILD);
} else {
mOptions[RSK_SELECTED_STARTING_AGE].Set(RO_AGE_ADULT);
@@ -2970,7 +2967,7 @@ void Settings::RandomizeAllSettings() {
continue;
}
- uint8_t randomIndex = ShipUtils::Random(0, static_cast<uint32_t>(option.GetOptionCount()));
+ uint8_t randomIndex = Random(0, static_cast<uint32_t>(option.GetOptionCount()));
option.SetContextIndex(randomIndex);
if (!option.GetCVarName().empty()) {