From b6ce810d36d177cff06665d7aaa000db79b7d1fa Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Thu, 14 Sep 2023 22:15:21 -0500 Subject: [PATCH] Store seed string in the save, and use it for mirror mode & enemy rando (#3175) --- soh/include/z64save.h | 2 ++ soh/soh/Enhancements/enemyrandomizer.cpp | 2 +- soh/soh/Enhancements/mods.cpp | 3 +-- .../Enhancements/randomizer/3drando/spoiler_log.cpp | 1 + soh/soh/Enhancements/randomizer/randomizer.cpp | 6 ++++++ soh/soh/SaveManager.cpp | 10 ++++++++++ 6 files changed, 21 insertions(+), 3 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 4fa02f157..25f051f23 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -316,6 +316,8 @@ typedef struct { /* */ RandomizerCheck ganonHintCheck; /* */ RandomizerCheck gregCheck; /* */ RandomizerCheck dampeCheck; + /* */ char inputSeed[1024]; + /* */ u32 finalSeed; /* */ u8 seedIcons[5]; /* */ u16 randomizerInf[9]; /* */ u16 adultTradeItems; diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 681f2cd9e..454fe43c1 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -234,7 +234,7 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po EnemyEntry GetRandomizedEnemyEntry(uint32_t seed) { if (CVarGetInteger("gRandomizedEnemies", ENEMY_RANDOMIZER_OFF) == ENEMY_RANDOMIZER_RANDOM_SEEDED) { - uint32_t finalSeed = seed + (gSaveContext.n64ddFlag ? (gSaveContext.seedIcons[0] + gSaveContext.seedIcons[1] + gSaveContext.seedIcons[2] + gSaveContext.seedIcons[3] + gSaveContext.seedIcons[4]) : gSaveContext.sohStats.fileCreatedAt); + uint32_t finalSeed = seed + (gSaveContext.n64ddFlag ? gSaveContext.finalSeed : gSaveContext.sohStats.fileCreatedAt); Random_Init(finalSeed); } diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 31f1f24d7..567853a48 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -579,8 +579,7 @@ void UpdateMirrorModeState(int32_t sceneNum) { (sceneNum == SCENE_GANON_BOSS); if (mirroredMode == MIRRORED_WORLD_RANDOM_SEEDED || mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED) { - uint32_t seed = sceneNum + (gSaveContext.n64ddFlag ? (gSaveContext.seedIcons[0] + gSaveContext.seedIcons[1] + - gSaveContext.seedIcons[2] + gSaveContext.seedIcons[3] + gSaveContext.seedIcons[4]) : gSaveContext.sohStats.fileCreatedAt); + uint32_t seed = sceneNum + (gSaveContext.n64ddFlag ? gSaveContext.finalSeed : gSaveContext.sohStats.fileCreatedAt); Random_Init(seed); } diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index af048ac75..e361781b4 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -852,6 +852,7 @@ const char* SpoilerLog_Write(int language) { jsonData["version"] = (char*) gBuildVersion; jsonData["seed"] = Settings::seedString; + jsonData["finalSeed"] = Settings::seed; // Write Hash int index = 0; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 0c295d419..fd4baa8b4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1509,6 +1509,12 @@ void Randomizer::ParseItemLocationsFile(const char* spoilerFileName, bool silent index++; } + std::string inputSeed = spoilerFileJson["seed"].get(); + strncpy(gSaveContext.inputSeed, inputSeed.c_str(), sizeof(gSaveContext.inputSeed) - 1); + gSaveContext.inputSeed[sizeof(gSaveContext.inputSeed) - 1] = 0; + + gSaveContext.finalSeed = spoilerFileJson["finalSeed"].get(); + for (auto it = locationsJson.begin(); it != locationsJson.end(); ++it) { RandomizerCheck randomizerCheck = SpoilerfileCheckNameToEnum[it.key()]; if (it->is_structured()) { diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index a4ac50831..e24afe0a3 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -186,6 +186,12 @@ void SaveManager::LoadRandomizerVersion2() { SaveManager::Instance->LoadData("", gSaveContext.seedIcons[i]); }); + std::string inputSeed; + SaveManager::Instance->LoadData("inputSeed", inputSeed); + memcpy(gSaveContext.inputSeed, inputSeed.c_str(), inputSeed.length() + 1); + + SaveManager::Instance->LoadData("finalSeed", gSaveContext.finalSeed); + SaveManager::Instance->LoadArray("randoSettings", RSK_MAX, [&](size_t i) { gSaveContext.randoSettings[i].key = RandomizerSettingKey(i); SaveManager::Instance->LoadData("", gSaveContext.randoSettings[i].value); @@ -294,6 +300,10 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f SaveManager::Instance->SaveData("", saveContext->seedIcons[i]); }); + SaveManager::Instance->SaveData("inputSeed", saveContext->inputSeed); + + SaveManager::Instance->SaveData("finalSeed", saveContext->finalSeed); + SaveManager::Instance->SaveArray("randoSettings", RSK_MAX, [&](size_t i) { SaveManager::Instance->SaveData("", saveContext->randoSettings[i].value); });