Initial AP save data

This commit is contained in:
aMannus
2025-05-23 01:21:29 +02:00
parent 1510c23684
commit cc9d15e1b7
6 changed files with 56 additions and 16 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -80,3 +80,6 @@ class ArchipelagoClient{
};
void LoadArchipelagoData();
void SaveArchipelagoData(SaveContext* saveContext, int sectionID, bool fullSave);
void InitArchipelagoData(bool isDebug);

View File

@@ -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);
}

View File

@@ -10,7 +10,7 @@ class ArchipelagoSettingsWindow final : public Ship::GuiWindow {
~ArchipelagoSettingsWindow() {};
protected:
void InitElement() override {};
void InitElement() override;
void DrawElement() override;
void UpdateElement() override {};
};

View File

@@ -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);