Fix rando code not using rando rng (#6730)

This commit is contained in:
Philip Dubé
2026-06-12 06:06:58 +00:00
committed by GitHub
parent 739225d222
commit 2da8cf50c9
4 changed files with 37 additions and 45 deletions
@@ -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;
}
+12 -18
View File
@@ -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[] = {
+2 -2
View File
@@ -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
+20 -23
View File
@@ -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()) {