From cc9d15e1b7e05f307e8047ba302951137bec7889 Mon Sep 17 00:00:00 2001 From: aMannus Date: Fri, 23 May 2025 01:21:29 +0200 Subject: [PATCH] Initial AP save data --- soh/include/z64save.h | 31 ++++++++++--------- soh/soh/Network/Archipelago/Archipelago.cpp | 27 ++++++++++++++++ soh/soh/Network/Archipelago/Archipelago.h | 3 ++ .../Archipelago/ArchipelagoSettingsWindow.cpp | 8 +++++ .../Archipelago/ArchipelagoSettingsWindow.h | 2 +- soh/soh/SaveManager.cpp | 1 + 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 9cadc7320..acee40aad 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -69,6 +69,7 @@ typedef enum { // Pre-existing IDs for save sections in base code SECTION_ID_ENTRANCES, SECTION_ID_SCENES, SECTION_ID_TRACKER_DATA, + SECTION_ID_ARCHIPELAGO, SECTION_ID_MAX } SaveFuncIDs; @@ -168,9 +169,24 @@ typedef struct ShipBossRushSaveContextData { u8 options[BR_OPTIONS_MAX]; } ShipBossRushSaveContextData; +typedef struct ArchipelagoLocationData { + char itemName[100]; + char locationName[100]; + char playerName[17]; + u8 itemType; +} ArchipelagoLocationData; + +typedef struct ShipArchipelagoSaveContextData { + char roomHash[100]; + char slotName[17]; + u32 lastReceivedItemIndex; + ArchipelagoLocationData locations[RC_MAX]; +} ShipArchipelagoSaveContextData; + typedef union ShipQuestSpecificSaveContextData { ShipRandomizerSaveContextData randomizer; ShipBossRushSaveContextData bossRush; + ShipArchipelagoSaveContextData archipelago; } ShipQuestSpecificSaveContextData; typedef struct ShipQuestSaveContextData { @@ -178,20 +194,6 @@ typedef struct ShipQuestSaveContextData { ShipQuestSpecificSaveContextData data; } ShipQuestSaveContextData; -typedef struct ArchipelagoLocationData { - char itemName[100]; - char locationName[100]; - char playerName[17]; - u8 flags; -} ArchipelagoLocationData; - -typedef struct ArchipelagoData { - char roomHash[100]; - char slotName[17]; - u32 lastReceivedItemIndex; - ArchipelagoLocationData locations[RC_MAX]; -} ArchipelagoData; - typedef struct ShipSaveContextData { u16 pendingSale; u16 pendingSaleMod; @@ -199,7 +201,6 @@ typedef struct ShipSaveContextData { SohStats stats; FaroresWindData backupFW; ShipQuestSaveContextData quest; - ArchipelagoData apData; u8 maskMemory; u8 filenameLanguage; //TODO: Move non-rando specific flags to a new sohInf and move the remaining randomizerInf to ShipRandomizerSaveContextData diff --git a/soh/soh/Network/Archipelago/Archipelago.cpp b/soh/soh/Network/Archipelago/Archipelago.cpp index d0449f034..7d6de525e 100644 --- a/soh/soh/Network/Archipelago/Archipelago.cpp +++ b/soh/soh/Network/Archipelago/Archipelago.cpp @@ -12,6 +12,13 @@ #include "soh/Enhancements/randomizer/static_data.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/ShipInit.hpp" +#include "soh/SaveManager.h" + +extern "C" { +#include "variables.h" +#include "macros.h" +extern PlayState* gPlayState; +} ArchipelagoClient::ArchipelagoClient() { std::string uuid = ap_get_uuid("uuid"); @@ -201,6 +208,26 @@ const char* ArchipelagoClient::GetConnectionStatus() { } } + +void LoadArchipelagoData() { + SaveManager::Instance->LoadCharArray("roomHash", gSaveContext.ship.quest.data.archipelago.roomHash, + ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.roomHash)); + SaveManager::Instance->LoadData("lastReceivedItemIndex", gSaveContext.ship.quest.data.archipelago.lastReceivedItemIndex); +} + +void SaveArchipelagoData(SaveContext* saveContext, int sectionID, bool fullSave) { + SaveManager::Instance->SaveData("roomHash", saveContext->ship.quest.data.archipelago.roomHash); + SaveManager::Instance->SaveData("lastReceivedItemIndex", + saveContext->ship.quest.data.archipelago.lastReceivedItemIndex); +} + +void InitArchipelagoData(bool isDebug) { + SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.roomHash, "", + ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.roomHash)); + + gSaveContext.ship.quest.data.archipelago.lastReceivedItemIndex = 0; +} + // Implement this properly once we have some kind of indication within a save file wether the player is in a normal // rando save or an archipelago one. #define IS_ARCHIPELAGO true diff --git a/soh/soh/Network/Archipelago/Archipelago.h b/soh/soh/Network/Archipelago/Archipelago.h index 838dd748e..c4c6c21d1 100644 --- a/soh/soh/Network/Archipelago/Archipelago.h +++ b/soh/soh/Network/Archipelago/Archipelago.h @@ -80,3 +80,6 @@ class ArchipelagoClient{ }; +void LoadArchipelagoData(); +void SaveArchipelagoData(SaveContext* saveContext, int sectionID, bool fullSave); +void InitArchipelagoData(bool isDebug); diff --git a/soh/soh/Network/Archipelago/ArchipelagoSettingsWindow.cpp b/soh/soh/Network/Archipelago/ArchipelagoSettingsWindow.cpp index cc561a720..3e685e6bd 100644 --- a/soh/soh/Network/Archipelago/ArchipelagoSettingsWindow.cpp +++ b/soh/soh/Network/Archipelago/ArchipelagoSettingsWindow.cpp @@ -4,6 +4,7 @@ #include "soh/SohGui/UIWidgets.hpp" #include "soh/SohGui/SohGui.hpp" #include "soh/Network/Archipelago/ArchipelagoConsoleWindow.h" +#include "soh/SaveManager.h" void ArchipelagoSettingsWindow::DrawElement() { ArchipelagoClient& AP_client = ArchipelagoClient::GetInstance(); @@ -66,3 +67,10 @@ void ArchipelagoSettingsWindow::DrawElement() { } } }; + +void ArchipelagoSettingsWindow::InitElement() { + SaveManager::Instance->AddLoadFunction("archipelagoData", 1, LoadArchipelagoData); + SaveManager::Instance->AddSaveFunction("archipelagoData", 1, SaveArchipelagoData, true, + SECTION_PARENT_NONE); + SaveManager::Instance->AddInitFunction(InitArchipelagoData); +} diff --git a/soh/soh/Network/Archipelago/ArchipelagoSettingsWindow.h b/soh/soh/Network/Archipelago/ArchipelagoSettingsWindow.h index 22331e86f..11cbc49a1 100644 --- a/soh/soh/Network/Archipelago/ArchipelagoSettingsWindow.h +++ b/soh/soh/Network/Archipelago/ArchipelagoSettingsWindow.h @@ -10,7 +10,7 @@ class ArchipelagoSettingsWindow final : public Ship::GuiWindow { ~ArchipelagoSettingsWindow() {}; protected: - void InitElement() override {}; + void InitElement() override; void DrawElement() override; void UpdateElement() override {}; }; diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 97ab6a52a..bd781a00e 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -113,6 +113,7 @@ SaveManager::SaveManager() { coreSectionIDsByName["entrances"] = SECTION_ID_ENTRANCES; coreSectionIDsByName["scenes"] = SECTION_ID_SCENES; coreSectionIDsByName["trackerData"] = SECTION_ID_TRACKER_DATA; + coreSectionIDsByName["archipelagoData"] = SECTION_ID_ARCHIPELAGO; AddLoadFunction("base", 1, LoadBaseVersion1); AddLoadFunction("base", 2, LoadBaseVersion2); AddLoadFunction("base", 3, LoadBaseVersion3);