From 1c13fdec5ff5eff4a1e7ca7b72617e22ef6ef9f9 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 5 Sep 2022 14:55:34 -0500 Subject: [PATCH] Add trials required and merchant prices to save file instead of loading from active spoiler log --- soh/include/macros.h | 1 + .../Enhancements/randomizer/randomizer.cpp | 8 ++-- soh/soh/Enhancements/randomizer/randomizer.h | 6 ++- soh/soh/SaveManager.cpp | 44 +++++++++++++++++++ soh/src/code/z_sram.c | 1 - 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/soh/include/macros.h b/soh/include/macros.h index 5c441dad9..6360e7970 100644 --- a/soh/include/macros.h +++ b/soh/include/macros.h @@ -261,5 +261,6 @@ extern GraphicsContext* __gfxCtx; #define SEG_ADDR(seg, addr) (addr | (seg << 24) | 1) #define NUM_TRIALS 6 +#define NUM_SCRUBS 35 #endif diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 0187d5486..f62079130 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -110,7 +110,7 @@ Sprite* Randomizer::GetSeedTexture(uint8_t index) { Randomizer::~Randomizer() { this->randoSettings.clear(); this->itemLocations.clear(); - this->randomizerMerchantPrices.clear(); + this->merchantPrices.clear(); } std::unordered_map spoilerFileTrialToEnum = { @@ -1205,7 +1205,7 @@ void Randomizer::ParseItemLocationsFile(const char* spoilerFileName, bool silent gSaveContext.itemLocations[index].check = SpoilerfileCheckNameToEnum[it.key()]; gSaveContext.itemLocations[index].get = SpoilerfileGetNameToEnum[itemit.value()]; } else if (itemit.key() == "price") { - randomizerMerchantPrices[gSaveContext.itemLocations[index].check] = itemit.value(); + merchantPrices[gSaveContext.itemLocations[index].check] = itemit.value(); } } } else { @@ -2416,8 +2416,8 @@ ScrubIdentity Randomizer::IdentifyScrub(s32 sceneNum, s32 actorParams, s32 respa break; } - if (randomizerMerchantPrices.find(scrubIdentity.randomizerCheck) != randomizerMerchantPrices.end()) { - scrubIdentity.itemPrice = randomizerMerchantPrices[scrubIdentity.randomizerCheck]; + if (merchantPrices.find(scrubIdentity.randomizerCheck) != merchantPrices.end()) { + scrubIdentity.itemPrice = merchantPrices[scrubIdentity.randomizerCheck]; } return scrubIdentity; diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 0ebb8d694..c91b28b1d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -14,13 +14,11 @@ class Randomizer { private: std::unordered_map itemLocations; std::unordered_map hintLocations; - std::unordered_map trialsRequired; std::string childAltarText; std::string adultAltarText; std::string ganonHintText; std::string ganonText; std::unordered_map randoSettings; - std::unordered_map randomizerMerchantPrices; void ParseRandomizerSettingsFile(const char* spoilerFileName); void ParseHintLocationsFile(const char* spoilerFileName); void ParseRequiredTrialsFile(const char* spoilerFileName); @@ -38,6 +36,10 @@ class Randomizer { static const std::string rupeeMessageTableID; static const std::string NaviRandoMessageTableID; + // Public for now to be accessed by SaveManager, will be made private again soon :tm: + std::unordered_map trialsRequired; + std::unordered_map merchantPrices; + static Sprite* GetSeedTexture(uint8_t index); s16 GetItemModelFromId(s16 itemId); s32 GetItemIDFromGetItemID(s32 getItemId); diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 3305f1d70..a932f31a4 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -91,6 +91,28 @@ void SaveManager::LoadRandomizerVersion1() { } SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.adultTradeItems); + + std::shared_ptr randomizer = OTRGlobals::Instance->gRandomizer; + + SaveManager::Instance->LoadArray("merchantPrices", NUM_SCRUBS, [&](size_t i) { + SaveManager::Instance->LoadStruct("", [&]() { + RandomizerCheck rc; + SaveManager::Instance->LoadData("check", rc); + uint32_t price; + SaveManager::Instance->LoadData("price", price); + randomizer->merchantPrices[rc] = price; + }); + }); + + SaveManager::Instance->LoadArray("trialsRequired", NUM_TRIALS, [&](size_t i) { + SaveManager::Instance->LoadStruct("", [&]() { + RandomizerInf inf; + SaveManager::Instance->LoadData("inf", inf); + bool required; + SaveManager::Instance->LoadData("price", required); + randomizer->trialsRequired[inf] = required; + }); + }); } void SaveManager::SaveRandomizer() { @@ -135,6 +157,28 @@ void SaveManager::SaveRandomizer() { } SaveManager::Instance->SaveData("adultTradeItems", gSaveContext.adultTradeItems); + + std::shared_ptr randomizer = OTRGlobals::Instance->gRandomizer; + + std::vector> merchantPrices; + for (const auto & [ check, price ] : randomizer->merchantPrices) { + merchantPrices.push_back(std::make_pair(check, price)); + } + + SaveManager::Instance->SaveArray("merchantPrices", NUM_SCRUBS, [&](size_t i) { + SaveManager::Instance->SaveStruct("", [&]() { + SaveManager::Instance->SaveData("check", merchantPrices[i].first); + SaveManager::Instance->SaveData("price", merchantPrices[i].second); + }); + }); + + SaveManager::Instance->SaveArray("trialsRequired", NUM_TRIALS, [&](size_t i) { + SaveManager::Instance->SaveStruct("", [&]() { + RandomizerInf inf = RandomizerInf(RAND_INF_TRIALS_DONE_LIGHT_TRIAL - i); + SaveManager::Instance->SaveData("inf", inf); + SaveManager::Instance->SaveData("required", randomizer->trialsRequired[inf]); + }); + }); } void SaveManager::Init() { diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 9a9407277..c16e5ef48 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -8,7 +8,6 @@ #define NUM_DUNGEONS 8 #define NUM_COWS 10 -#define NUM_SCRUBS 35 /** * Initialize new save.