From 4451710b716ca4e60fbf072b6532a81927b2bf73 Mon Sep 17 00:00:00 2001 From: C Date: Wed, 21 Oct 2026 19:07:36 -0400 Subject: [PATCH] [Bugfix] Older saves cannot be read (#7434) --- soh/soh/SaveManager.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 5b55b033b1..53825bb61d 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -705,8 +705,10 @@ void SaveManager::StartupCheckAndInitMeta(int fileNum) { } fileMetaInfo[fileNum].equipment = baseBlock["inventory"]["equipment"]; fileMetaInfo[fileNum].upgrades = baseBlock["inventory"]["upgrades"]; - fileMetaInfo[fileNum].isMagicAcquired = baseBlock["isMagicAcquired"]; - fileMetaInfo[fileNum].isDoubleMagicAcquired = baseBlock["isDoubleMagicAcquired"]; + // saves before 5.1.0 called these magicAcquired and doubleMagic + fileMetaInfo[fileNum].isMagicAcquired = baseBlock.value("isMagicAcquired", baseBlock.value("magicAcquired", 0)); + fileMetaInfo[fileNum].isDoubleMagicAcquired = + baseBlock.value("isDoubleMagicAcquired", baseBlock.value("doubleMagic", 0)); fileMetaInfo[fileNum].rupees = baseBlock["rupees"]; fileMetaInfo[fileNum].gsTokens = baseBlock["inventory"]["gsTokens"]; // base version 1 and 2 called this doubleDefense @@ -723,7 +725,8 @@ void SaveManager::StartupCheckAndInitMeta(int fileNum) { fileMetaInfo[fileNum].health = baseBlock["health"]; // isMasterQuest arrived in base version 2 - bool isMasterQuest = baseBlock.value("isMasterQuest", false); + // older saves store this as a number rather than a bool + bool isMasterQuest = baseBlock.value("isMasterQuest", 0) != 0; fileMetaInfo[fileNum].requiresOriginal = !isMasterQuest; fileMetaInfo[fileNum].requiresMasterQuest = isMasterQuest; @@ -756,7 +759,12 @@ void SaveManager::StartupCheckAndInitMeta(int fileNum) { fileMetaInfo[fileNum].requiresOriginal = randoBlock["masterQuestDungeonCount"] < 12; } - nlohmann::json& statsBlock = sections["sohStats"]["data"]; + // sohStats didn't exist in older saves + nlohmann::json statsBlock = nlohmann::json::object(); + if (sections.contains("sohStats") && sections["sohStats"].contains("data") && + sections["sohStats"]["data"].is_object()) { + statsBlock = sections["sohStats"]["data"]; + } fileMetaInfo[fileNum].buildVersionMajor = statsBlock.value("buildVersionMajor", 0); fileMetaInfo[fileNum].buildVersionMinor = statsBlock.value("buildVersionMinor", 0); fileMetaInfo[fileNum].buildVersionPatch = statsBlock.value("buildVersionPatch", 0);