diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index fa92b968a..703f84a05 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -2230,7 +2230,7 @@ func_ov000_02096b1c kind:function(arm,size=0x78) addr:0x02096b1c func_ov000_02096b94 kind:function(arm,size=0x14) addr:0x02096b94 _ZN9Passenger5ResetEv kind:function(arm,size=0x24) addr:0x02096ba8 func_ov000_02096bcc kind:function(arm,size=0x48) addr:0x02096bcc -_ZN12SaveInfoSub5C1Ev kind:function(arm,size=0x14) addr:0x02096c14 +_ZN27SaveFile_00000_0000_Data_D8C1Ev kind:function(arm,size=0x14) addr:0x02096c14 func_ov000_02096c28 kind:function(arm,size=0x20) addr:0x02096c28 func_ov000_02096c48 kind:function(arm,size=0x48) addr:0x02096c48 func_ov000_02096c90 kind:function(arm,size=0xc) addr:0x02096c90 @@ -2717,11 +2717,11 @@ func_ov000_020a0f84 kind:function(thumb,size=0x30) addr:0x020a0f84 func_ov000_020a0fb4 kind:function(thumb,size=0x10) addr:0x020a0fb4 func_ov000_020a0fc4 kind:function(thumb,size=0x3c) addr:0x020a0fc4 _ZN15SaveManager_21C19func_ov000_020a1000Ev kind:function(thumb,size=0x28) addr:0x020a1000 -_ZN8SaveInfo19func_ov000_020a1028Ev kind:function(thumb,size=0xcc) addr:0x020a1028 -_ZN8SaveSub719func_ov000_020a10f4Ev kind:function(arm,size=0x30) addr:0x020a10f4 +_ZN8SaveSlot19func_ov000_020a1028EP12SaveInfoData kind:function(thumb,size=0xcc) addr:0x020a1028 +_ZN8SaveSlot19func_ov000_020a10f4EP24SaveFile_00000_2600_Data kind:function(arm,size=0x30) addr:0x020a10f4 _ZN8SaveSlot19func_ov000_020a1124Ev kind:function(arm,size=0x13c) addr:0x020a1124 func_ov000_020a1260 kind:function(arm,size=0x40) addr:0x020a1260 -_ZN8SaveSub519func_ov000_020a12a0Ev kind:function(arm,size=0x3c) addr:0x020a12a0 +_ZN8SaveSlot19func_ov000_020a12a0EP24SaveFile_00000_1D00_Data kind:function(arm,size=0x3c) addr:0x020a12a0 func_ov000_020a12dc kind:function(arm,size=0x18) addr:0x020a12dc func_ov000_020a12f4 kind:function(arm,size=0x8) addr:0x020a12f4 func_ov000_020a12fc kind:function(arm,size=0x8) addr:0x020a12fc diff --git a/config/eur/arm9/overlays/ov019/symbols.txt b/config/eur/arm9/overlays/ov019/symbols.txt index 22c909f8f..039e14e50 100644 --- a/config/eur/arm9/overlays/ov019/symbols.txt +++ b/config/eur/arm9/overlays/ov019/symbols.txt @@ -259,13 +259,13 @@ _ZN8SaveFile19func_ov019_020d0ea8Ev kind:function(arm,size=0x260) addr:0x020d0ea _ZN8SaveFile19func_ov019_020d1108Ev kind:function(arm,size=0x174) addr:0x020d1108 _ZN8SaveFile19func_ov019_020d127cEv kind:function(arm,size=0x13c) addr:0x020d127c _ZN8SaveFile19func_ov019_020d13b8Ev kind:function(arm,size=0x48) addr:0x020d13b8 -_ZN8SaveSub719func_ov019_020d1400Ev kind:function(arm,size=0x34) addr:0x020d1400 +_ZN8SaveSlot19func_ov019_020d1400EP24SaveFile_00000_2600_Data kind:function(arm,size=0x34) addr:0x020d1400 _ZN8SaveFile19func_ov019_020d1434Ev kind:function(arm,size=0x8c) addr:0x020d1434 -_ZN8SaveSub519func_ov019_020d14c0Ev kind:function(arm,size=0x3c) addr:0x020d14c0 -_ZN8SaveInfo19func_ov019_020d14fcEv kind:function(arm,size=0x3c) addr:0x020d14fc +_ZN8SaveSlot19func_ov019_020d14c0EP24SaveFile_00000_1D00_Data kind:function(arm,size=0x3c) addr:0x020d14c0 +_ZN8SaveSlot19func_ov019_020d14fcEP12SaveInfoData kind:function(arm,size=0x3c) addr:0x020d14fc _ZN8SaveFile19func_ov019_020d1538Ev kind:function(arm,size=0x94) addr:0x020d1538 -_ZN8SaveSub619func_ov019_020d15ccEv kind:function(arm,size=0x34) addr:0x020d15cc -_ZN13SaveTreasures19func_ov019_020d1600Ev kind:function(arm,size=0x34) addr:0x020d1600 +_ZN8SaveSlot19func_ov019_020d15ccEP24SaveFile_00000_2500_Data kind:function(arm,size=0x34) addr:0x020d15cc +_ZN8SaveSlot19func_ov019_020d1600EP16SaveTreasureData kind:function(arm,size=0x34) addr:0x020d1600 _ZN8SaveFile19func_ov019_020d1634Ev kind:function(arm,size=0x9c) addr:0x020d1634 _ZN8SaveFile19func_ov019_020d16d0Ev kind:function(arm,size=0x110) addr:0x020d16d0 _ZN8SaveFile19func_ov019_020d17e0Ev kind:function(arm,size=0x28) addr:0x020d17e0 diff --git a/config/jp/arm9/overlays/ov000/symbols.txt b/config/jp/arm9/overlays/ov000/symbols.txt index dce4d6e62..3c7fc6b7d 100644 --- a/config/jp/arm9/overlays/ov000/symbols.txt +++ b/config/jp/arm9/overlays/ov000/symbols.txt @@ -2228,7 +2228,7 @@ func_ov000_020982d0 kind:function(arm,size=0x78) addr:0x020982d0 func_ov000_02098348 kind:function(arm,size=0x14) addr:0x02098348 _ZN9Passenger5ResetEv kind:function(arm,size=0x24) addr:0x0209835c func_ov000_02098380 kind:function(arm,size=0x48) addr:0x02098380 -_ZN12SaveInfoSub5C1Ev kind:function(arm,size=0x14) addr:0x020983c8 +_ZN27SaveFile_00000_0000_Data_D8C1Ev kind:function(arm,size=0x14) addr:0x020983c8 func_ov000_020983dc kind:function(arm,size=0x20) addr:0x020983dc func_ov000_020983fc kind:function(arm,size=0x48) addr:0x020983fc func_ov000_02098444 kind:function(arm,size=0xc) addr:0x02098444 @@ -2715,11 +2715,11 @@ func_ov000_020a275c kind:function(thumb,size=0x30) addr:0x020a275c func_ov000_020a278c kind:function(thumb,size=0x10) addr:0x020a278c func_ov000_020a279c kind:function(thumb,size=0x3c) addr:0x020a279c _ZN15SaveManager_21C19func_ov000_020a1000Ev kind:function(thumb,size=0x28) addr:0x020a27d8 -_ZN8SaveInfo19func_ov000_020a1028Ev kind:function(thumb,size=0xcc) addr:0x020a2800 -_ZN8SaveSub719func_ov000_020a10f4Ev kind:function(arm,size=0x30) addr:0x020a28cc +_ZN8SaveSlot19func_ov000_020a1028EP12SaveInfoData kind:function(thumb,size=0xcc) addr:0x020a2800 +_ZN8SaveSlot19func_ov000_020a10f4EP24SaveFile_00000_2600_Data kind:function(arm,size=0x30) addr:0x020a28cc _ZN8SaveSlot19func_ov000_020a1124Ev kind:function(arm,size=0x13c) addr:0x020a28fc func_ov000_020a2a38 kind:function(arm,size=0x40) addr:0x020a2a38 -_ZN8SaveSub519func_ov000_020a12a0Ev kind:function(arm,size=0x3c) addr:0x020a2a78 +_ZN8SaveSlot19func_ov000_020a12a0EP24SaveFile_00000_1D00_Data kind:function(arm,size=0x3c) addr:0x020a2a78 func_ov000_020a2ab4 kind:function(arm,size=0x18) addr:0x020a2ab4 func_ov000_020a2acc kind:function(arm,size=0x8) addr:0x020a2acc func_ov000_020a2ad4 kind:function(arm,size=0x8) addr:0x020a2ad4 diff --git a/config/jp/arm9/overlays/ov019/symbols.txt b/config/jp/arm9/overlays/ov019/symbols.txt index 835e9a14e..bf359663d 100644 --- a/config/jp/arm9/overlays/ov019/symbols.txt +++ b/config/jp/arm9/overlays/ov019/symbols.txt @@ -259,13 +259,13 @@ _ZN8SaveFile19func_ov019_020d0ea8Ev kind:function(arm,size=0x260) addr:0x020d26c _ZN8SaveFile19func_ov019_020d1108Ev kind:function(arm,size=0x174) addr:0x020d2928 _ZN8SaveFile19func_ov019_020d127cEv kind:function(arm,size=0x13c) addr:0x020d2a9c _ZN8SaveFile19func_ov019_020d13b8Ev kind:function(arm,size=0x48) addr:0x020d2bd8 -_ZN8SaveSub719func_ov019_020d1400Ev kind:function(arm,size=0x34) addr:0x020d2c20 +_ZN8SaveSlot19func_ov019_020d1400EP24SaveFile_00000_2600_Data kind:function(arm,size=0x34) addr:0x020d2c20 _ZN8SaveFile19func_ov019_020d1434Ev kind:function(arm,size=0x8c) addr:0x020d2c54 -_ZN8SaveSub519func_ov019_020d14c0Ev kind:function(arm,size=0x3c) addr:0x020d2ce0 -_ZN8SaveInfo19func_ov019_020d14fcEv kind:function(arm,size=0x3c) addr:0x020d2d1c +_ZN8SaveSlot19func_ov019_020d14c0EP24SaveFile_00000_1D00_Data kind:function(arm,size=0x3c) addr:0x020d2ce0 +_ZN8SaveSlot19func_ov019_020d14fcEP12SaveInfoData kind:function(arm,size=0x3c) addr:0x020d2d1c _ZN8SaveFile19func_ov019_020d1538Ev kind:function(arm,size=0x94) addr:0x020d2d58 -_ZN8SaveSub619func_ov019_020d15ccEv kind:function(arm,size=0x34) addr:0x020d2dec -_ZN13SaveTreasures19func_ov019_020d1600Ev kind:function(arm,size=0x34) addr:0x020d2e20 +_ZN8SaveSlot19func_ov019_020d15ccEP24SaveFile_00000_2500_Data kind:function(arm,size=0x34) addr:0x020d2dec +_ZN8SaveSlot19func_ov019_020d1600EP16SaveTreasureData kind:function(arm,size=0x34) addr:0x020d2e20 _ZN8SaveFile19func_ov019_020d1634Ev kind:function(arm,size=0x9c) addr:0x020d2e54 _ZN8SaveFile19func_ov019_020d16d0Ev kind:function(arm,size=0x110) addr:0x020d2ef0 _ZN8SaveFile19func_ov019_020d17e0Ev kind:function(arm,size=0x28) addr:0x020d3000 diff --git a/include/Save/SaveFile.hpp b/include/Save/SaveFile.hpp new file mode 100644 index 000000000..986a24665 --- /dev/null +++ b/include/Save/SaveFile.hpp @@ -0,0 +1,328 @@ +#pragma once + +#include "Item/ItemManager.hpp" +#include "MainGame/MiscAdvManager.hpp" +#include "math.hpp" +#include "types.h" + +#include + +// probably related to the map data? +#define NUM_UNK_BLOCKS 120 +#define SIZE_UNK_BLOCK 0x1000 + +#define MAX_SAVE_SLOTS 2 +#define COUNT_DATA 2 // main data + backup (?) +#define LENGTH_PLAYER_NAME 8 + +struct SaveFile_00000_0000_Data_D8 { + /* 00 */ unk32 unk_00; + /* 04 */ STRUCT_PAD(0x04, 0x6C); + /* 6C */ u32 trackFlags[2]; + /* 74 */ unk32 spiritTrackFlags[1]; + /* 78 */ unk32 unk_74; + /* 7C */ unk32 unk_78; + /* 80 */ + + SaveFile_00000_0000_Data_D8(); +}; + +struct SaveFile_00000_0000_Data_184 { + /* 00 */ unk32 unk_00; + /* 04 */ unk16 unk_04; + /* 06 */ unk16 unk_06; + /* 08 */ + + SaveFile_00000_0000_Data_184() : + unk_00(0), + unk_04(0) {} +}; + +struct SaveFile_00000_0000_Data_484 { + /* 00 */ unk32 unk_00; + /* 04 */ unk32 unk_04; + /* 08 */ + + SaveFile_00000_0000_Data_484() : + unk_00(0), + unk_04(0) {} +}; + +// same layout as `MiscAdvManager` +struct SaveMiscAdvManager { + /* 00 */ u16 stampDates[StampType_Max]; + /* 28 */ u16 unk_28; + /* 2A */ u16 postDate; + /* 2C */ union { + Vec2b stampPositions[StampType_Max]; + u16 stampPos[StampType_Max]; + }; + /* 54 */ s8 obtainedLetters[LetterType_Max]; + /* 68 */ s8 obtainedStamps[StampType_Max]; + /* 7C */ u8 lastRandomNum; + /* 7D */ u8 randomNum; + /* 7E */ s8 numPriceCards; // current amount of price cards + /* 7F */ s8 numPostedPriceCards; // current amount of posted price cards + /* 80 */ unk8 unk_80; + /* 81 */ unk8 unk_81; // pad? + /* 82 */ unk8 unk_82; // pad? + /* 83 */ unk8 unk_83; // pad? + /* 84 */ unk32 lettersRead; // bitfield + /* 88 */ unk32 stampsFlag; // bitfield, related to the checkmarks from the stampbook + /* 8C */ unk16 songs; // bitfield + /* 8E */ unk16 unk_8E; // pad? + /* 90 */ + + SaveMiscAdvManager() : + lettersRead(0), + stampsFlag(0), + songs(0) {} +}; + +struct SaveInventory { + /* 00 */ u32 adventureFlags[32]; + /* 80 */ unk32 unk_80; + /* 84 */ u32 unk_84[2]; + /* 8C */ u16 numRupees; + /* 8E */ u16 unk_8E; + /* 90 */ ItemFlag equippedItem; + /* 94 */ unk32 unk_94; + /* 98 */ + + SaveInventory() { + MI_CpuFill32(0, this->adventureFlags, sizeof(this->adventureFlags)); + MI_CpuFill32(0, this->unk_84, sizeof(this->unk_84)); + this->unk_8E = 0; + } +}; + +struct SaveFile_00000_0000_Data_158 { + /* 00 */ unk8 unk_00[0x0C]; + /* 0C */ unk8 unk_0C[0x20]; + /* 2C */ + + SaveFile_00000_0000_Data_158() { + MI_CpuFill32(0, this->unk_00, sizeof(this->unk_00)); + MI_CpuFill32(0, this->unk_0C, sizeof(this->unk_0C)); + } +}; + +struct SaveFile_00000_0000_Data_C84 { + /* 00 */ u32 unk_00[4]; + /* 10 */ + + SaveFile_00000_0000_Data_C84() { + MI_CpuFill32(0, this->unk_00, sizeof(this->unk_00)); + } +}; + +struct SaveFile_00000_0000_Data_TEST4 { + /* D24 */ unk32 unk_D4C; + /* D24 */ unk32 unk_D50; + /* D24 */ unk32 unk_D54; + /* D24 */ unk32 unk_D58; + /* D24 */ unk32 unk_D5C; + /* D24 */ unk32 unk_D60; + /* D24 */ unk32 unk_D64; + /* D24 */ unk32 unk_D68; + /* D6C */ unk8 unk_D6C[0x08]; + /* D74 */ unk16 unk_D74; + + SaveFile_00000_0000_Data_TEST4() { + MI_CpuFill32(0, this->unk_D6C, sizeof(this->unk_D6C)); + this->unk_D74 = 0; + } +}; + +struct SaveInfoData { + /* 000 */ unk32 unk_000; + /* 004 */ unk32 unk_004; + /* 008 */ unk32 unk_008; + /* 00C */ unk32 unk_00C; + /* 010 */ unk32 unk_010; + /* 014 */ unk16 unk_014; + /* 016 */ u16 sceneIndex; + /* 018 */ u8 roomIndex; + /* 019 */ u8 spawnIndex; + /* 01A */ unk16 unk_01A; + /* 01C */ unk32 unk_01C; + /* 020 */ unk32 unk_020; + /* 024 */ unk32 unk_024; + /* 028 */ STRUCT_PAD(0x28, 0x40); + /* 040 */ SaveInventory inventory; + /* 0D8 */ SaveFile_00000_0000_Data_D8 unk_0D8; + /* 158 */ SaveFile_00000_0000_Data_158 unk_158; + /* 184 */ SaveFile_00000_0000_Data_184 unk_184[96]; + /* 484 */ SaveFile_00000_0000_Data_484 unk_484[256]; + /* C84 */ SaveFile_00000_0000_Data_C84 unk_C84; + /* C94 */ SaveMiscAdvManager miscAdvManager; + /* D24 */ unk32 unk_D24; + /* D24 */ unk32 unk_D28; + /* D24 */ unk32 unk_D2C; + /* D24 */ unk32 unk_D30; + /* D24 */ unk32 unk_D34; + /* D24 */ unk32 unk_D38; + /* D24 */ unk32 unk_D3C; + /* D24 */ unk32 unk_D40; + /* D24 */ unk32 unk_D44; + /* D24 */ unk32 unk_D48; + /* D4C */ SaveFile_00000_0000_Data_TEST4 unk_D4C; + /* D78 */ unk32 unk_D78; + /* D7C */ unk32 unk_D7C; + /* D80 */ unk32 unk_D80; + /* D84 */ unk32 unk_D84; + /* D88 */ unk32 unk_D88; + /* D8C */ unk32 unk_D8C; + /* D90 */ unk32 unk_D90; + /* D94 */ unk32 unk_D94; + /* D98 */ unk32 unk_D98; + /* D9C */ unk32 unk_D9C; + /* DA0 */ unk16 unk_DA0; + /* DA2 */ wchar_t mPlayerName[LENGTH_PLAYER_NAME + 1]; + /* DB4 */ unk32 unk_DB4; + /* DB8 */ unk32 unk_DB8; + /* DBC */ unk32 unk_DBC; + /* DC0 */ unk32 unk_DC0; + /* DC4 */ unk32 unk_DC4; + /* DC8 */ unk32 unk_DC8; + /* DCC */ unk32 unk_DCC; + /* DD0 */ unk32 unk_DD0; + /* DD4 */ unk32 unk_DD4; + /* DD8 */ unk32 unk_DD8; + /* DDC */ unk32 unk_DDC; + /* DE0 */ unk32 unk_DE0; + /* DE4 */ unk32 unk_DE4; + /* DE8 */ unk32 unk_DE8; + /* DEC */ unk32 unk_DEC; + /* DF0 */ unk32 unk_DF0; + /* DF4 */ unk32 unk_DF4; + /* DF8 */ unk32 unk_DF8; + /* DFC */ unk16 unk_DFC; + /* DFE */ u16 unk_DFE; + /* E00 */ + + SaveInfoData() : + unk_014(0) {} +}; + +struct SaveTreasureData { + /* 00 */ STRUCT_PAD(0x00, 0x3C); + /* 3C */ s16 unk_3C[TreasureType_Max]; + /* 5C */ unk16 unk_5C; + /* 5E */ unk16 unk_5E; + /* 60 */ STRUCT_PAD(0x60, 0x7E); + /* 7E */ u16 unk_7E; + /* 80 */ + + SaveTreasureData() : + unk_5C(0) {} +}; + +struct SaveFile_00000_1D00_Data { + /* 000 */ STRUCT_PAD(0x00, 0x3C4); + /* 3C4 */ wchar_t unk_3C4[LENGTH_PLAYER_NAME + 1]; + /* 3D6 */ STRUCT_PAD(0x3D6, 0x3FE); + /* 3FE */ u16 unk_3FE; + /* 400 */ +}; + +struct SaveFile_00000_2500_Data { + /* 00 */ unk8 unk_00[0x7E]; + /* 7E */ u16 unk_7E; + /* 80 */ +}; + +struct SaveFile_00000_2600_Data { + /* 00 */ u8 unk_00; + /* 01 */ u8 unk_01; + /* 02 */ u8 unk_02; + /* 03 */ Vec2b unk_03[61]; + /* 7E */ u16 unk_7E; + /* 80 */ +}; + +class SaveSlot { +public: + /* 0000 */ SaveInfoData mInfoData[COUNT_DATA]; + /* 1C00 */ SaveTreasureData mTreasureData[COUNT_DATA]; + /* 1D00 */ SaveFile_00000_1D00_Data mUnk_1D00[COUNT_DATA]; + /* 2500 */ SaveFile_00000_2500_Data mUnk_2500[COUNT_DATA]; + /* 2600 */ SaveFile_00000_2600_Data mUnk_2600[COUNT_DATA]; + /* 2700 */ + + void func_ov000_020a1124(void); + + bool GetAdventureFlag(AdventureFlag flag) { + return GET_FLAG(this->mInfoData[0].inventory.adventureFlags, flag); + } + + wchar_t *GetPlayerName() { + return this->mInfoData[0].mPlayerName; + } + + bool IsPlayerNameSet() { + return this->mInfoData[0].mPlayerName[0] != L'\0'; + } + + SaveFile_00000_2600_Data *Get2600Ptr() { + return this->mUnk_2600; + } + + u8 Get2600_00() { + return this->mUnk_2600[0].unk_00; + } + + u8 Get2600_01() { + return this->mUnk_2600[0].unk_01; + } + + u8 Get2600_02() { + return this->mUnk_2600[0].unk_02; + } + + static void func_ov000_020a1028(SaveInfoData *param1); + static void func_ov000_020a10f4(SaveFile_00000_2600_Data *param1); + static void func_ov000_020a12a0(SaveFile_00000_1D00_Data *param1); + + static void func_ov019_020d14c0(SaveFile_00000_1D00_Data *param1); + static void func_ov019_020d14fc(SaveInfoData *param1); + static void func_ov019_020d15cc(SaveFile_00000_2500_Data *param1); + static void func_ov019_020d1400(SaveFile_00000_2600_Data *param1); + static void func_ov019_020d1600(SaveTreasureData *param1); +}; + +struct SaveFile_04E00 { + u16 unk_00; + + SaveFile_04E00() : + unk_00(0) {} +}; + +class SaveFile { +public: + /* 00000 */ SaveSlot mSlots[MAX_SAVE_SLOTS]; + /* 04E00 */ SaveFile_04E00 mUnk_04E00[2][2]; + /* 04E08 */ unk16 mUnk_04E08; + /* 04E0A */ u16 mSaveSlotIndex; + /* 04E0C */ u8 mUnk_04E0C[NUM_UNK_BLOCKS * SIZE_UNK_BLOCK]; + /* 7CE0C */ + + SaveFile(); + + unk16 func_ov019_020d0c4c(unk32 param1, unk32 param2); + unk16 func_ov019_020d0c90(unk32 param1); + void func_ov019_020d0d50(); + void func_ov019_020d0e18(unk32 param1); + void func_ov019_020d0ea8(); + void func_ov019_020d1108(); + void func_ov019_020d127c(); + void func_ov019_020d13b8(); + void func_ov019_020d1434(); + void func_ov019_020d1538(); + void func_ov019_020d1634(); + void func_ov019_020d16d0(); + void func_ov019_020d17e0(); + void func_ov019_020d1808(unk32 param1); + void func_ov019_020d1aac(unk32 param1, const wchar_t *param2); + void func_ov019_020d1b14(unk32 param1); +}; diff --git a/include/Save/SaveManager.hpp b/include/Save/SaveManager.hpp index 8a30f0c69..dde08b7a2 100644 --- a/include/Save/SaveManager.hpp +++ b/include/Save/SaveManager.hpp @@ -3,23 +3,15 @@ #include "Item/ItemManager.hpp" #include "MainGame/MiscAdvManager.hpp" #include "Save/AdventureFlags.hpp" +#include "Save/SaveFile.hpp" #include "System/SysNew.hpp" #include "Unknown/UnkStruct_ov000_02067bc4.hpp" #include "global.h" #include "types.h" -#include //! TODO: kinda draft state for now -// probably related to the map data? -#define NUM_UNK_BLOCKS 120 -#define SIZE_UNK_BLOCK 0x1000 - -#define LENGTH_PLAYER_NAME 8 -#define COUNT_DATA 2 // main data + backup (?) - #define SAVE_DATA_SIZE (sizeof(SaveSlot) + sizeof(u8) * NUM_UNK_BLOCKS * SIZE_UNK_BLOCK) -#define MAX_SAVE_SLOTS 2 enum { SaveDataIndex_SaveInfo, @@ -29,335 +21,6 @@ enum { SaveDataIndex_04, }; -class SaveAdventureFlags { -public: - /* 00 */ u32 data[32]; - /* 80 */ - - SaveAdventureFlags() { - MI_CpuFill32(0, this, sizeof(SaveAdventureFlags)); - }; -}; - -class SaveInventory { -public: - /* 00 */ unk32 mUnk_00; - /* 04 */ u32 mUnk_04[2]; - /* 0C */ u16 mNumRupees; - /* 0E */ u16 mUnk_12; - /* 10 */ ItemFlag mEquippedItem; - /* 14 */ unk32 mUnk_14; - /* 18 */ - - SaveInventory() { - MI_CpuFill32(0, this->mUnk_04, sizeof(mUnk_04)); - this->mUnk_12 = 0; - }; -}; - -class TreasureData { -public: - /* 00 */ unk8 mUnk_00[0x3C]; - /* 3C */ s16 mUnk_3C[TreasureType_Max]; - /* 5C */ unk16 mUnk_5C; - /* 5E */ unk16 mUnk_5E; - /* 60 */ unsigned char _pad_0x60[(0x7E) - (0x60)]; - /* 7E */ u16 mUnk_7E; - /* 80 */ - - TreasureData() : - mUnk_5C(0) {} -}; - -class SaveTreasures { -public: - /* 000 */ TreasureData mTreasureData[2]; - /* 100 */ - - SaveTreasures() {} - void func_ov019_020d1600(); -}; - -class SaveInfoSub5 { -public: - /* 00 */ unk32 mUnk_00; - SaveInfoSub5(); -}; - -class SaveUnknown158 { -public: - /* 00 */ unk8 mUnk_00[0x0C]; - SaveUnknown158() { - MI_CpuFill32(0, this, sizeof(SaveUnknown158)); - }; -}; - -class SaveUnknown164 { -public: - /* 00 */ unk8 mUnk_00[0x20]; - SaveUnknown164() { - MI_CpuFill32(0, this, sizeof(SaveUnknown164)); - }; -}; - -class Sub1Test { -public: - int a; - short b; - short p; - Sub1Test() { - a = 0; - b = 0; - } -}; - -class Sub2Test { -public: - int a; - int b; - Sub2Test() { - a = 0; - b = 0; - } -}; -class Sub2Test2 { -public: - Sub2Test tab2[0xE0]; - /* C84 */ unk32 mUnk_00_SaveInfoSub10[4]; - - Sub2Test2() { - MI_CpuFill32(0, this->mUnk_00_SaveInfoSub10, 16); - } -}; - -class SaveUnknown184_Sub { -public: - /* */ u8 pad1[390]; - /* */ Sub1Test tab1[0x4F]; - /* */ Sub2Test2 tab2; - - SaveUnknown184_Sub() {} -}; - -class SaveUnknown184 { -public: - /* 184 */ SaveUnknown184_Sub mUnk_184; - - SaveUnknown184() {} -}; - -class SaveUnknown14C { -public: - /* 14C */ unk32 mSpiritTrackFlags[1]; - /* 150 */ unk32 mUnk_150; - /* 154 */ unk32 mUnk_154; - /* 158 */ SaveUnknown158 mUnk_158; - /* 164 */ SaveUnknown164 mUnk_164; - - /* 184 */ SaveUnknown184 mUnk_184; - - /* C94 */ MiscAdvManager mMiscAdvManager; - /* D24 */ unk8 mUnk_00_SaveUnknownD24[0x48]; - /* D6C */ unk8 mUnk_48_SaveUnknownD24[8]; - /* D74 */ unk16 mUnk_50_SaveUnknownD24; - /* D76 */ unk16 mUnk_52_SaveUnknownD24; - /* D78 */ STRUCT_PAD(0xD78, 0xD8C); - /* D8C */ - - SaveUnknown14C() { - this->mMiscAdvManager.mLettersRead = 0; - this->mMiscAdvManager.mStampsFlag = 0; - this->mMiscAdvManager.mSongs = 0; - MI_CpuFill32(0, this->mUnk_48_SaveUnknownD24, sizeof(this->mUnk_48_SaveUnknownD24)); - this->mUnk_50_SaveUnknownD24 = 0; - } -}; - -class SaveInfoData { -public: - /* 000 */ unk32 mUnk_000; - /* 004 */ unk32 mUnk_004; - /* 008 */ unk32 mUnk_008; - /* 00C */ unk32 mUnk_00C; - /* 010 */ unk32 mUnk_010; - /* 014 */ unk16 mUnk_014; - /* 016 */ u16 mSceneIndex; - /* 018 */ u8 mRoomIndex; // "house" index but could be more? - /* 019 */ u8 mSpawnIndex; - /* 01A */ unk16 mUnk_01A; - /* 01C */ unk32 mUnk_01C; - /* 020 */ unk32 mUnk_020; - /* 024 */ unk32 mUnk_024; - /* 028 */ STRUCT_PAD(0x28, 0x40); - /* 040 */ SaveAdventureFlags mAdventureFlags; - /* 0C0 */ SaveInventory mInventory; - /* 0D8 */ SaveInfoSub5 mUnk_0D8; - /* 0DC */ STRUCT_PAD(0xDC, 0x144); - /* 144 */ u32 mTrackFlags[2]; - /* 14C */ SaveUnknown14C mUnk_14C; - /* D8C */ STRUCT_PAD(0xD8C, 0xDA2); - /* DA2 */ wchar_t mPlayerName[LENGTH_PLAYER_NAME + 1]; - /* DB4 */ STRUCT_PAD(0xDB4, 0xDFE); - /* DFE */ u16 mUnk_DFE; - /* E00 */ - - SaveInfoData() : - mUnk_014(0) {} -}; - -class SaveInfo { -public: - /* 0000 */ SaveInfoData mSaveInfoData[COUNT_DATA]; - /* 1C00 */ - - SaveInfo() {} - - void func_ov000_020a1028(void); - void func_ov019_020d14fc(void); -}; - -class SaveSub15 { -public: - /* 000 */ unk8 mUnk_000[(0x3C4) - (0x000)]; - /* 3C4 */ wchar_t mUnk_3C4[LENGTH_PLAYER_NAME + 1]; - /* 3D6 */ STRUCT_PAD(0x3D6, 0x3FE); - /* 3FE */ u16 mUnk_3FE; - /* 400 */ - - // SaveSub15() {} -}; - -class SaveSub5 { -public: - /* 000 */ SaveSub15 mUnk_000[COUNT_DATA]; - /* 800 */ - - void func_ov000_020a12a0(); - void func_ov019_020d14c0(); -}; - -class SaveSub16 { -public: - /* 00 */ unk8 mUnk_00[0x7E]; - /* 7E */ u16 mUnk_7E; - /* 80 */ -}; - -class SaveSub6 { -public: - /* 000 */ SaveSub16 mUnk_00[COUNT_DATA]; - /* 100 */ - - void func_ov019_020d15cc(); -}; - -struct SaveSub17_03 { - /* 00 */ u8 mUnk_00; - /* 01 */ u8 mUnk_01; - /* 02 */ -}; - -class SaveSub17 { -public: - // /* 00 */ unk8 mUnk_00[0x7E]; - /* 00 */ u8 mUnk_00; - /* 01 */ u8 mUnk_01; - /* 02 */ u8 mUnk_02; - /* 03 */ SaveSub17_03 mUnk_03[61]; - /* 7E */ u16 mUnk_7E; -}; - -class SaveSub7 { -public: - /* 000 */ SaveSub17 mUnk_00[COUNT_DATA]; - /* 100 */ - - void func_ov000_020a10f4(); - void func_ov019_020d1400(); -}; - -class SaveSlot { -public: - /* 0000 */ SaveInfo mSaveInfo; - /* 1C00 */ SaveTreasures mTreasures; - // /* 1D00 */ u8 mUnk_1D00[0x2500 - 0x1D00]; - // /* 2500 */ u8 mUnk_2500[0x100]; - // /* 2600 */ u8 mUnk_2600[0x100]; - /* 1D00 */ SaveSub5 mUnk_1D00; - /* 2500 */ SaveSub6 mUnk_2500; - /* 2600 */ SaveSub7 mUnk_2600; - /* 2700 */ - - SaveSlot() {} - void func_ov000_020a1124(void); - - bool GetAdventureFlag(AdventureFlag flag) { - return GET_FLAG(this->mSaveInfo.mSaveInfoData[0].mAdventureFlags.data, flag); - } - - wchar_t *GetPlayerName() { - return this->mSaveInfo.mSaveInfoData[0].mPlayerName; - } - - bool IsPlayerNameSet() { - return this->mSaveInfo.mSaveInfoData[0].mPlayerName[0] != L'\0'; - } - - SaveSub17 *Get2600Ptr() { - return this->mUnk_2600.mUnk_00; - } - - u8 Get2600_00() { - return this->mUnk_2600.mUnk_00[0].mUnk_00; - } - - u8 Get2600_01() { - return this->mUnk_2600.mUnk_00[0].mUnk_01; - } - - u8 Get2600_02() { - return this->mUnk_2600.mUnk_00[0].mUnk_02; - } -}; - -class SaveFileSub1 { -public: - u16 mUnk_00; - - SaveFileSub1() : - mUnk_00(0) {} -}; - -// save data -class SaveFile : public SysObject { -public: - /* 00000 */ SaveSlot mSlots[MAX_SAVE_SLOTS]; - /* 04E00 */ SaveFileSub1 mUnk_04E00[2][2]; - /* 04E08 */ unk16 mUnk_04E08; - /* 04E0A */ u16 mSaveSlotIndex; - /* 04E0C */ u8 mUnk_04E0C[NUM_UNK_BLOCKS * SIZE_UNK_BLOCK]; - /* 7CE0C */ - - SaveFile(); - - unk16 func_ov019_020d0c4c(unk32 param1, unk32 param2); - unk16 func_ov019_020d0c90(unk32 param1); - void func_ov019_020d0d50(); - void func_ov019_020d0e18(unk32 param1); - void func_ov019_020d0ea8(); - void func_ov019_020d1108(); - void func_ov019_020d127c(); - void func_ov019_020d13b8(); - void func_ov019_020d1434(); - void func_ov019_020d1538(); - void func_ov019_020d1634(); - void func_ov019_020d16d0(); - void func_ov019_020d17e0(); - void func_ov019_020d1808(unk32 param1); - void func_ov019_020d1aac(unk32 param1, const wchar_t *param2); - void func_ov019_020d1b14(unk32 param1); -}; - class SaveManager_21C { public: /* 00 */ unk32 mUnk_00; diff --git a/src/019_MainSelect/019_SaveManager.cpp b/src/019_MainSelect/019_SaveManager.cpp index bcf753b26..34f635721 100644 --- a/src/019_MainSelect/019_SaveManager.cpp +++ b/src/019_MainSelect/019_SaveManager.cpp @@ -13,11 +13,15 @@ void func_ov000_020a0b58(); }; const size_t data_ov019_020d1bd4[] = { - sizeof(SaveInfoData), sizeof(TreasureData), sizeof(SaveSub15), sizeof(SaveSub16), sizeof(SaveSub17), + sizeof(SaveInfoData), + sizeof(SaveTreasureData), + sizeof(SaveFile_00000_1D00_Data), + sizeof(SaveFile_00000_2500_Data), + sizeof(SaveFile_00000_2600_Data), }; const unk32 data_ov019_020d1be8[] = { - offsetof(SaveSlot, mSaveInfo), offsetof(SaveSlot, mTreasures), offsetof(SaveSlot, mUnk_1D00), + offsetof(SaveSlot, mInfoData), offsetof(SaveSlot, mTreasureData), offsetof(SaveSlot, mUnk_1D00), offsetof(SaveSlot, mUnk_2500), offsetof(SaveSlot, mUnk_2600), }; @@ -102,19 +106,17 @@ ARM void SaveManager::func_ov019_020d0ae0(unk32 param1) { data_02049b80.func_02013ecc(0, SaveManager::func_ov019_020d0a2c, param1); } -#pragma optimization_level 2 - -ARM SaveFile::SaveFile() : +SaveFile::SaveFile() : mUnk_04E08(0), mSaveSlotIndex(0) {} -#pragma optimization_level reset +#pragma optimization_level 2 ARM unk16 SaveFile::func_ov019_020d0c4c(unk32 param1, unk32 param2) { s16 i = 0; do { - if ((this->mUnk_04E00[param1][i].mUnk_00 & (1 << param1)) != 0) { + if ((this->mUnk_04E00[i][param2].unk_00 & (1 << param1)) != 0) { return i; } @@ -124,6 +126,8 @@ ARM unk16 SaveFile::func_ov019_020d0c4c(unk32 param1, unk32 param2) { return -1; } +#pragma optimization_level reset + ARM unk16 SaveFile::func_ov019_020d0c90(unk32 param1) { unk16 var_r7; unk16 var_r8; @@ -202,11 +206,12 @@ ARM void SaveFile::func_ov019_020d0e18(unk32 param1) { size_t offset = param1 * SAVE_DATA_SIZE; SaveSlot *puVar3 = &this->mSlots[param1]; - if (!func_ov000_020a0a90(offset, &puVar3->mSaveInfo, sizeof(puVar3->mSaveInfo))) { + if (!func_ov000_020a0a90(offset + offsetof(SaveSlot, mInfoData), &puVar3->mInfoData, sizeof(puVar3->mInfoData))) { return; } - if (!func_ov000_020a0a90(offset + offsetof(SaveSlot, mTreasures), &puVar3->mTreasures, sizeof(puVar3->mTreasures))) { + if (!func_ov000_020a0a90(offset + offsetof(SaveSlot, mTreasureData), &puVar3->mTreasureData, + sizeof(puVar3->mTreasureData))) { return; } @@ -218,39 +223,43 @@ ARM void SaveFile::func_ov019_020d0e18(unk32 param1) { return; } - func_ov000_020a0a90(offset + offsetof(SaveSlot, mUnk_2600), &puVar3->mUnk_2600, sizeof(puVar3->mUnk_2600)); + if (!func_ov000_020a0a90(offset + offsetof(SaveSlot, mUnk_2600), &puVar3->mUnk_2600, sizeof(puVar3->mUnk_2600))) { + return; + } } ARM void SaveFile::func_ov019_020d0ea8() {} + ARM void SaveFile::func_ov019_020d1108() {} + ARM void SaveFile::func_ov019_020d127c() {} // https://decomp.me/scratch/lmC67 ARM void SaveFile::func_ov019_020d13b8() { u16 saveSlotIndex = this->mSaveSlotIndex; - this->mSlots[this->mSaveSlotIndex].mUnk_2600.func_ov019_020d1400(); + SaveSlot::func_ov019_020d1400(this->mSlots[this->mSaveSlotIndex].mUnk_2600); func_ov000_020a0a90(saveSlotIndex * SAVE_DATA_SIZE + offsetof(SaveSlot, mUnk_2600), - &this->mSlots[this->mSaveSlotIndex].mUnk_2600, sizeof(this->mSlots->mUnk_2600)); + this->mSlots[this->mSaveSlotIndex].mUnk_2600, sizeof(this->mSlots->mUnk_2600)); } -ARM void SaveSub7::func_ov019_020d1400() { - this->mUnk_00[0].mUnk_7E = func_020328c8(&gSaveManager.mUnk_004, &this->mUnk_00, sizeof(SaveSub17) - sizeof(u16)); - MI_CpuCopyFast(&this->mUnk_00[0], &this->mUnk_00[1], sizeof(SaveSub17)); +ARM void SaveSlot::func_ov019_020d1400(SaveFile_00000_2600_Data *param1) { + param1->unk_7E = func_020328c8(&gSaveManager.mUnk_004, param1, sizeof(SaveFile_00000_2600_Data) - sizeof(u16)); + MI_CpuCopyFast(param1, (u8 *) param1 + sizeof(SaveFile_00000_2600_Data), sizeof(SaveFile_00000_2600_Data)); } // non-matching ARM void SaveFile::func_ov019_020d1434() { size_t offset = this->mSaveSlotIndex * SAVE_DATA_SIZE; - this->mSlots[this->mSaveSlotIndex].mSaveInfo.func_ov019_020d14fc(); - if (!func_ov000_020a0a90(offset, &this->mSlots[this->mSaveSlotIndex].mSaveInfo, - sizeof(this->mSlots[this->mSaveSlotIndex].mSaveInfo))) { + SaveSlot::func_ov019_020d14fc(this->mSlots[this->mSaveSlotIndex].mInfoData); + if (!func_ov000_020a0a90(offset, &this->mSlots[this->mSaveSlotIndex].mInfoData, + sizeof(this->mSlots[this->mSaveSlotIndex].mInfoData))) { return; } - this->mSlots[this->mSaveSlotIndex].mUnk_1D00.func_ov019_020d14c0(); + SaveSlot::func_ov019_020d14c0(this->mSlots[this->mSaveSlotIndex].mUnk_1D00); if (!func_ov000_020a0a90(offset + offsetof(SaveSlot, mUnk_1D00), &this->mSlots[this->mSaveSlotIndex].mUnk_1D00, sizeof(this->mSlots[this->mSaveSlotIndex].mUnk_1D00))) { return; @@ -258,15 +267,15 @@ ARM void SaveFile::func_ov019_020d1434() { this->func_ov019_020d13b8(); } -ARM void SaveSub5::func_ov019_020d14c0() { - this->mUnk_000[0].mUnk_3FE = func_020328c8(&gSaveManager.mUnk_004, &this->mUnk_000, offsetof(SaveSub15, mUnk_3FE)); - MI_CpuCopyFast(&this->mUnk_000[0], &this->mUnk_000[1], sizeof(SaveSub15)); + +ARM void SaveSlot::func_ov019_020d14c0(SaveFile_00000_1D00_Data *param1) { + param1->unk_3FE = func_020328c8(&gSaveManager.mUnk_004, param1, offsetof(SaveFile_00000_1D00_Data, unk_3FE)); + MI_CpuCopyFast(param1, (u8 *) param1 + sizeof(SaveFile_00000_1D00_Data), sizeof(SaveFile_00000_1D00_Data)); } -ARM void SaveInfo::func_ov019_020d14fc() { - this->mSaveInfoData[0].mUnk_DFE = - func_020328c8(&gSaveManager.mUnk_004, &this->mSaveInfoData[0].mUnk_000, offsetof(SaveInfoData, mUnk_DFE)); - MI_CpuCopyFast(&this->mSaveInfoData[0], &this->mSaveInfoData[1], sizeof(SaveInfoData)); +ARM void SaveSlot::func_ov019_020d14fc(SaveInfoData *param1) { + param1->unk_DFE = func_020328c8(&gSaveManager.mUnk_004, param1, offsetof(SaveInfoData, unk_DFE)); + MI_CpuCopyFast(param1, (u8 *) param1 + sizeof(SaveInfoData), sizeof(SaveInfoData)); } //! TODO: weird sizeof @@ -275,13 +284,13 @@ ARM void SaveFile::func_ov019_020d1538() { offset = this->mSaveSlotIndex * SAVE_DATA_SIZE; - this->mSlots[this->mSaveSlotIndex].mTreasures.func_ov019_020d1600(); - if (!func_ov000_020a0a90(offset + offsetof(SaveSlot, mTreasures), &this->mSlots[this->mSaveSlotIndex].mTreasures, + SaveSlot::func_ov019_020d1600(this->mSlots[this->mSaveSlotIndex].mTreasureData); + if (!func_ov000_020a0a90(offset + offsetof(SaveSlot, mTreasureData), &this->mSlots[this->mSaveSlotIndex].mTreasureData, 0x1C00)) { return; } - this->mSlots[this->mSaveSlotIndex].mUnk_2500.func_ov019_020d15cc(); + SaveSlot::func_ov019_020d15cc(this->mSlots[this->mSaveSlotIndex].mUnk_2500); if (!func_ov000_020a0a90(offset + offsetof(SaveSlot, mUnk_2500), &this->mSlots[this->mSaveSlotIndex].mUnk_2500, 0x800)) { return; } @@ -289,15 +298,14 @@ ARM void SaveFile::func_ov019_020d1538() { this->func_ov019_020d1434(); } -ARM void SaveSub6::func_ov019_020d15cc() { - this->mUnk_00[0].mUnk_7E = func_020328c8(&gSaveManager.mUnk_004, &this->mUnk_00, offsetof(SaveSub16, mUnk_7E)); - MI_CpuCopyFast(&this->mUnk_00[0], &this->mUnk_00[1], sizeof(SaveSub16)); +ARM void SaveSlot::func_ov019_020d15cc(SaveFile_00000_2500_Data *param1) { + param1->unk_7E = func_020328c8(&gSaveManager.mUnk_004, param1, offsetof(SaveFile_00000_2500_Data, unk_7E)); + MI_CpuCopyFast(param1, (u8 *) param1 + sizeof(SaveFile_00000_2500_Data), sizeof(SaveFile_00000_2500_Data)); } -ARM void SaveTreasures::func_ov019_020d1600() { - this->mTreasureData[0].mUnk_7E = - func_020328c8(&gSaveManager.mUnk_004, &this->mTreasureData, offsetof(TreasureData, mUnk_7E)); - MI_CpuCopyFast(&this->mTreasureData[0], &this->mTreasureData[1], sizeof(TreasureData)); +ARM void SaveSlot::func_ov019_020d1600(SaveTreasureData *param1) { + param1->unk_7E = func_020328c8(&gSaveManager.mUnk_004, param1, offsetof(SaveTreasureData, unk_7E)); + MI_CpuCopyFast(param1, (u8 *) param1 + sizeof(SaveTreasureData), sizeof(SaveTreasureData)); } // https://decomp.me/scratch/ibnQS @@ -305,12 +313,11 @@ ARM void SaveFile::func_ov019_020d1634() { SaveSlot *pSlot = &this->mSlots[this->mSaveSlotIndex]; size_t offset = this->mSaveSlotIndex * SAVE_DATA_SIZE; - for (int i = 0; i < 120; i++) { - // if (pSlot->mSaveInfo.mSaveInfoData[0].mUnk_C84.mUnk_00[(u32) i >> 5] & (1 << (i & 0x1F))) { - // u32 dest = (i << 12) + sizeof(SaveSlot); - // u8 *src = &this->mUnk_04E0C[i << 12]; - // CARD_ReadWriteBackupAsync(src, offset + dest, 0x1000, 0, 0, 0, 6, 1, 0); - // } + for (int i = 0; i < NUM_UNK_BLOCKS; i++) { + if (GET_FLAG(pSlot->mInfoData[0].unk_C84.unk_00, i)) { + u32 dest = (i * SIZE_UNK_BLOCK) + sizeof(SaveSlot); + CARD_ReadFlashAsync(offset + dest, &this->mUnk_04E0C[i * SIZE_UNK_BLOCK], 0x1000, 0, 0); + } } } @@ -320,26 +327,27 @@ ARM void SaveFile::func_ov019_020d16d0() { SaveSlot *pSub2 = &this->mSlots[this->mSaveSlotIndex]; SaveSlot *pSub3 = &this->mSlots[saveSlotIndex]; - MI_CpuCopyFast(&pSub2->mSaveInfo, &pSub3->mSaveInfo, sizeof(SaveInfo)); - MI_CpuCopyFast(&pSub2->mTreasures, &pSub3->mTreasures, sizeof(SaveTreasures)); - MI_CpuCopyFast(&pSub2->mUnk_2600, &pSub3->mUnk_2600, sizeof(SaveSub7)); + MI_CpuCopyFast(&pSub2->mInfoData, &pSub3->mInfoData, sizeof(SaveInfoData)); + MI_CpuCopyFast(&pSub2->mTreasureData, &pSub3->mTreasureData, sizeof(SaveTreasureData)); + MI_CpuCopyFast(&pSub2->mUnk_2600, &pSub3->mUnk_2600, sizeof(SaveFile_00000_2600_Data)); - pSub3->mUnk_1D00.func_ov000_020a12a0(); - MI_CpuCopyFast(&pSub2->mUnk_1D00, &pSub3->mUnk_1D00, sizeof(SaveSub5)); + SaveSlot::func_ov000_020a12a0(pSub3->mUnk_1D00); + MI_CpuCopyFast(&pSub2->mUnk_1D00, &pSub3->mUnk_1D00, sizeof(SaveFile_00000_1D00_Data)); - MI_CpuClearFast(&pSub3->mUnk_2500, sizeof(SaveSub6)); - MI_CpuCopyFast(&pSub2->mUnk_2500, &pSub3->mUnk_2500, sizeof(SaveSub6)); + MI_CpuClearFast(&pSub3->mUnk_2500, sizeof(SaveFile_00000_2500_Data)); + MI_CpuCopyFast(&pSub2->mUnk_2500, &pSub3->mUnk_2500, sizeof(SaveFile_00000_2500_Data)); this->mSaveSlotIndex = saveSlotIndex; this->func_ov019_020d1538(); for (int i = 0; i < NUM_UNK_BLOCKS; i++) { - // if (pSub2->mSaveInfo.mSaveInfoData[i >> 5].mUnk_C84.mUnk_00[0] & (1 << (i & 0x1F))) { - // func_ov000_020a0a90(slot * SAVE_DATA_SIZE + i * SIZE_UNK_BLOCK + sizeof(SaveSlot), - // &this->mUnk_04E0C[i * SIZE_UNK_BLOCK], SIZE_UNK_BLOCK); - // } + if (pSub2->mInfoData[i >> 5].unk_C84.unk_00[0] & (1 << (i & 0x1F))) { + func_ov000_020a0a90(saveSlotIndex * SAVE_DATA_SIZE + i * SIZE_UNK_BLOCK + sizeof(SaveSlot), + &this->mUnk_04E0C[i * SIZE_UNK_BLOCK], SIZE_UNK_BLOCK); + } } } + ARM void SaveFile::func_ov019_020d17e0() { for (int i = 0; i < MAX_SAVE_SLOTS; i++) { this->func_ov019_020d1808(i); @@ -363,29 +371,25 @@ ARM void SaveFile::func_ov019_020d1808(unk32 param1) { for (int i = 0; i < COUNT_DATA; i++) { stack1[SaveDataIndex_SaveInfo].mUnk_00 = - func_020328c8(&gSaveManager.mUnk_004, &pSub2->mSaveInfo.mSaveInfoData[i], sizeof(SaveInfoData) - sizeof(u16)); - stack1[SaveDataIndex_SaveInfo].mUnk_04 = - pSub2->mSaveInfo.mSaveInfoData[i].mUnk_DFE == stack1[SaveDataIndex_SaveInfo].mUnk_00; + func_020328c8(&gSaveManager.mUnk_004, &pSub2->mInfoData[i], sizeof(SaveInfoData) - sizeof(u16)); + stack1[SaveDataIndex_SaveInfo].mUnk_04 = pSub2->mInfoData[i].unk_DFE == stack1[SaveDataIndex_SaveInfo].mUnk_00; stack1[SaveDataIndex_Treasures].mUnk_00 = - func_020328c8(&gSaveManager.mUnk_004, &pSub2->mTreasures.mTreasureData[i], sizeof(TreasureData) - sizeof(u16)); + func_020328c8(&gSaveManager.mUnk_004, &pSub2->mTreasureData[i], sizeof(SaveTreasureData) - sizeof(u16)); stack1[SaveDataIndex_Treasures].mUnk_04 = - pSub2->mTreasures.mTreasureData[i].mUnk_7E == stack1[SaveDataIndex_Treasures].mUnk_00 ? true : false; + pSub2->mTreasureData[i].unk_7E == stack1[SaveDataIndex_Treasures].mUnk_00 ? true : false; stack1[SaveDataIndex_02].mUnk_00 = - func_020328c8(&gSaveManager.mUnk_004, &pSub2->mUnk_1D00.mUnk_000[i], sizeof(SaveSub15) - sizeof(u16)); - stack1[SaveDataIndex_02].mUnk_04 = - pSub2->mUnk_1D00.mUnk_000[i].mUnk_3FE == stack1[SaveDataIndex_02].mUnk_00 ? true : false; + func_020328c8(&gSaveManager.mUnk_004, &pSub2->mUnk_1D00[i], sizeof(SaveFile_00000_1D00_Data) - sizeof(u16)); + stack1[SaveDataIndex_02].mUnk_04 = pSub2->mUnk_1D00[i].unk_3FE == stack1[SaveDataIndex_02].mUnk_00 ? true : false; stack1[SaveDataIndex_03].mUnk_00 = - func_020328c8(&gSaveManager.mUnk_004, &pSub2->mUnk_2500.mUnk_00[i], sizeof(SaveSub16) - sizeof(u16)); - stack1[SaveDataIndex_03].mUnk_04 = - pSub2->mUnk_2500.mUnk_00[i].mUnk_7E == stack1[SaveDataIndex_03].mUnk_00 ? true : false; + func_020328c8(&gSaveManager.mUnk_004, &pSub2->mUnk_2500[i], sizeof(SaveFile_00000_2500_Data) - sizeof(u16)); + stack1[SaveDataIndex_03].mUnk_04 = pSub2->mUnk_2500[i].unk_7E == stack1[SaveDataIndex_03].mUnk_00 ? true : false; stack1[SaveDataIndex_04].mUnk_00 = - func_020328c8(&gSaveManager.mUnk_004, &pSub2->mUnk_2600.mUnk_00[i], sizeof(SaveSub17) - sizeof(u16)); - stack1[SaveDataIndex_04].mUnk_04 = - pSub2->mUnk_2600.mUnk_00[i].mUnk_7E == stack1[SaveDataIndex_04].mUnk_00 ? true : false; + func_020328c8(&gSaveManager.mUnk_004, &pSub2->mUnk_2600[i], sizeof(SaveFile_00000_2600_Data) - sizeof(u16)); + stack1[SaveDataIndex_04].mUnk_04 = pSub2->mUnk_2600[i].unk_7E == stack1[SaveDataIndex_04].mUnk_00 ? true : false; } for (u32 i = 0; i < 5; i++) { @@ -394,13 +398,13 @@ ARM void SaveFile::func_ov019_020d1808(unk32 param1) { if (stack1[i].mUnk_00 != 0) { if (stack1[i].mUnk_04 == 0 || stack1[i].mUnk_00 != stack1[i * 2].mUnk_04) { MI_CpuCopyFast(puVar5, puVar5 + data_ov019_020d1bd4[i], data_ov019_020d1bd4[i]); - this->mUnk_04E00[param1][1].mUnk_00 |= 1 << (i & 0xFF); + this->mUnk_04E00[param1][1].unk_00 |= 1 << (i & 0xFF); } } else { - this->mUnk_04E00[param1][0].mUnk_00 |= 1 << (i & 0xFF); + this->mUnk_04E00[param1][0].unk_00 |= 1 << (i & 0xFF); if (stack1[i * 2].mUnk_04 == 0) { - this->mUnk_04E00[param1][1].mUnk_00 |= 1 << (i & 0xFF); + this->mUnk_04E00[param1][1].unk_00 |= 1 << (i & 0xFF); } else { MI_CpuCopyFast(puVar5 + data_ov019_020d1bd4[i], puVar5, data_ov019_020d1bd4[i]); } @@ -413,9 +417,9 @@ ARM void SaveFile::func_ov019_020d1aac(unk32 param1, const wchar_t *param2) { awStack_28[8] = L'\0'; wcsncpy(awStack_28, param2, LENGTH_PLAYER_NAME); - MI_CpuCopy16((u16 *) awStack_28, (u16 *) this->mSlots[param1].mSaveInfo.mSaveInfoData[0].mPlayerName, + MI_CpuCopy16((u16 *) awStack_28, (u16 *) this->mSlots[param1].mInfoData[0].mPlayerName, sizeof(wchar_t) * (LENGTH_PLAYER_NAME + 1)); - MI_CpuCopy16((u16 *) awStack_28, (u16 *) this->mSlots[param1].mUnk_1D00.mUnk_000[0].mUnk_3C4, + MI_CpuCopy16((u16 *) awStack_28, (u16 *) this->mSlots[param1].mUnk_1D00[0].unk_3C4, sizeof(wchar_t) * (LENGTH_PLAYER_NAME + 1)); } @@ -423,22 +427,22 @@ ARM void SaveFile::func_ov019_020d1aac(unk32 param1, const wchar_t *param2) { ARM void SaveFile::func_ov019_020d1b14(unk32 param1) { SaveSlot *pSVar3; - pSVar3 = this->mSlots + param1; - pSVar3->mSaveInfo.func_ov000_020a1028(); - pSVar3->mSaveInfo.func_ov019_020d14fc(); + pSVar3 = &this->mSlots[param1]; + SaveSlot::func_ov000_020a1028(pSVar3->mInfoData); + SaveSlot::func_ov019_020d14fc(pSVar3->mInfoData); - MI_CpuClearFast(&pSVar3->mTreasures, sizeof(SaveTreasures)); + MI_CpuClearFast(pSVar3->mTreasureData, sizeof(SaveTreasureData)); for (int i = 0; i < TreasureType_Max; i++) { - pSVar3->mTreasures.mTreasureData[0].mUnk_3C[i] = TreasureType_None; + pSVar3->mTreasureData[0].unk_3C[i] = TreasureType_None; } - pSVar3->mTreasures.func_ov019_020d1600(); + SaveSlot::func_ov019_020d1600(pSVar3->mTreasureData); - this->mSlots[param1].mUnk_1D00.func_ov000_020a12a0(); - this->mSlots[param1].mUnk_1D00.func_ov019_020d14c0(); + SaveSlot::func_ov000_020a12a0(this->mSlots[param1].mUnk_1D00); + SaveSlot::func_ov019_020d14c0(this->mSlots[param1].mUnk_1D00); - MI_CpuClearFast(&this->mSlots[param1].mUnk_2500, 0x80); - this->mSlots[param1].mUnk_2500.func_ov019_020d15cc(); + MI_CpuClearFast(this->mSlots[param1].mUnk_2500, sizeof(SaveFile_00000_2500_Data)); + SaveSlot::func_ov019_020d15cc(this->mSlots[param1].mUnk_2500); - this->mSlots[param1].mUnk_2600.func_ov000_020a10f4(); - this->mSlots[param1].mUnk_2600.func_ov019_020d1400(); + SaveSlot::func_ov000_020a10f4(this->mSlots[param1].mUnk_2600); + SaveSlot::func_ov019_020d1400(this->mSlots[param1].mUnk_2600); } diff --git a/src/019_MainSelect/019_UnkSubStruct9.cpp b/src/019_MainSelect/019_UnkSubStruct9.cpp index 53479c45a..61a868b18 100644 --- a/src/019_MainSelect/019_UnkSubStruct9.cpp +++ b/src/019_MainSelect/019_UnkSubStruct9.cpp @@ -157,13 +157,13 @@ ARM void UnkSubStruct9::func_ov019_020cbc0c() { } unk32 uVar10 = 0; - unk32 uVar6 = (pSlot->mSaveInfo.mSaveInfoData[0].mInventory.mUnk_00 << 4) >> 26; + unk32 uVar6 = (pSlot->mInfoData[0].inventory.unk_80 << 4) >> 26; if (uVar6 == 0) { uVar6 = 0x40; } - unk32 uVar13 = (pSlot->mSaveInfo.mSaveInfoData[0].mInventory.mUnk_00 << 10) >> 26; + unk32 uVar13 = (pSlot->mInfoData[0].inventory.unk_80 << 10) >> 26; if (uVar13 == 0) { uVar13 = uVar6; } diff --git a/src/019_MainSelect/019_UnkSystem1_ov019_Derived2.cpp b/src/019_MainSelect/019_UnkSystem1_ov019_Derived2.cpp index 176f0649f..5f5b8001a 100644 --- a/src/019_MainSelect/019_UnkSystem1_ov019_Derived2.cpp +++ b/src/019_MainSelect/019_UnkSystem1_ov019_Derived2.cpp @@ -38,7 +38,7 @@ ARM unk32 UnkSystem1_ov019_Derived2::vfunc_1C(u32 param1, unk32 param2, unk32 pa if (this->mUnk_04 == 0x0F) { SaveFile *pSaveFile = gSaveManager.mpSaveFile; pSaveFile->func_ov019_020d1aac(this->mUnk_12, data_ov003_020ba740->mUnk_9D0); - pSaveFile->mSlots[this->mUnk_12].mUnk_2600.mUnk_00[0].mUnk_02 = param1; + pSaveFile->mSlots[this->mUnk_12].mUnk_2600[0].unk_02 = param1; gSaveManager.func_ov019_020d09dc(this->mUnk_12); } else if (this->mUnk_04 > 0x1E) { if (gSaveManager.mUnk_210 != 0 ? 0 : 1) { diff --git a/src/019_MainSelect/FileSelectOptions.cpp b/src/019_MainSelect/FileSelectOptions.cpp index e42772f30..965fe5c56 100644 --- a/src/019_MainSelect/FileSelectOptions.cpp +++ b/src/019_MainSelect/FileSelectOptions.cpp @@ -482,10 +482,10 @@ ARM void FileSelectOptions::func_ov019_020cd788() { ARM void FileSelectOptions::func_ov019_020cd7f8() { switch (data_0204a110.func_01ff9b50()) { case BTN_ID_RETURN: - SaveSub17 *pSaveSub17 = gSaveManager.GetSaveSlot(this->mUnk_0024.mSaveSlotIndex)->Get2600Ptr(); - data_0204a110.mUnk_000 = pSaveSub17->mUnk_02; - data_ov000_020b504c.mUnk_030 = pSaveSub17->mUnk_00; - data_ov000_020b50c0.func_ov000_0206a6a4(pSaveSub17->mUnk_01); + SaveFile_00000_2600_Data *pSaveSub17 = gSaveManager.GetSaveSlot(this->mUnk_0024.mSaveSlotIndex)->Get2600Ptr(); + data_0204a110.mUnk_000 = pSaveSub17->unk_02; + data_ov000_020b504c.mUnk_030 = pSaveSub17->unk_00; + data_ov000_020b50c0.func_ov000_0206a6a4(pSaveSub17->unk_01); data_0204a088->func_ov000_020611fc(0); data_ov000_020b5214.func_ov000_0206db44(0x2E); break; @@ -566,10 +566,10 @@ ARM void FileSelectOptions::func_ov019_020cdcb8() { if (ptr->vfunc_08() == 0 ? true : false) { if (data_ov000_020b504c.func_ov000_020682c0(0) == 0) { - SaveSub17 *pSaveSub17 = gSaveManager.GetSaveSlot(this->mUnk_0024.mSaveSlotIndex)->Get2600Ptr(); - pSaveSub17->mUnk_00 = this->mUnk_0024.mUnk_FC0; - pSaveSub17->mUnk_01 = this->mUnk_0024.mUnk_FC1; - pSaveSub17->mUnk_02 = this->mUnk_0024.mUnk_FC2; + SaveFile_00000_2600_Data *pSaveSub17 = gSaveManager.GetSaveSlot(this->mUnk_0024.mSaveSlotIndex)->Get2600Ptr(); + pSaveSub17->unk_00 = this->mUnk_0024.mUnk_FC0; + pSaveSub17->unk_01 = this->mUnk_0024.mUnk_FC1; + pSaveSub17->unk_02 = this->mUnk_0024.mUnk_FC2; gSaveManager.mpSaveFile->mSaveSlotIndex = this->mUnk_0024.mSaveSlotIndex; gSaveManager.func_ov019_020d08fc(2, SaveFile::func_ov019_020d13b8); @@ -580,7 +580,7 @@ ARM void FileSelectOptions::func_ov019_020cdcb8() { data_0204a110.mUnk_000 = this->mUnk_0024.mUnk_FC2; this->mUnk_1CF5 = true; } else { - data_ov000_020b504c.mUnk_030 = gSaveManager.GetSaveSlot(this->mUnk_0024.mSaveSlotIndex)->Get2600Ptr()->mUnk_00; + data_ov000_020b504c.mUnk_030 = gSaveManager.GetSaveSlot(this->mUnk_0024.mSaveSlotIndex)->Get2600Ptr()->unk_00; this->func_ov019_020cde8c(FSOptionsState_Idle); } } @@ -617,13 +617,13 @@ ARM UnkStruct_ov019_020d24c8_2C_24::UnkStruct_ov019_020d24c8_2C_24(GameModeManag mUnk_FB8(NULL), mUnk_FBC(NULL) { - SaveSlot *pSlot = gSaveManager.GetSaveSlot(this->mSaveSlotIndex); - SaveSub17 *pSaveSub17 = pSlot->Get2600Ptr(); - this->mUnk_FC0 = pSaveSub17->mUnk_00; - this->mUnk_FC1 = pSaveSub17->mUnk_01; - this->mUnk_FC2 = pSaveSub17->mUnk_02; + SaveSlot *pSlot = gSaveManager.GetSaveSlot(this->mSaveSlotIndex); + SaveFile_00000_2600_Data *pSaveSub17 = pSlot->Get2600Ptr(); + this->mUnk_FC0 = pSaveSub17->unk_00; + this->mUnk_FC1 = pSaveSub17->unk_01; + this->mUnk_FC2 = pSaveSub17->unk_02; - u8 *src = (u8 *) pSaveSub17->mUnk_03; + u8 *src = (u8 *) pSaveSub17->unk_03; u8 *dst = (u8 *) &this->mUnk_FC3[0]; for (u32 i = ARRAY_LEN(this->mUnk_FC3); i != 0; i--) { u8 b1 = *src++; @@ -632,7 +632,7 @@ ARM UnkStruct_ov019_020d24c8_2C_24::UnkStruct_ov019_020d24c8_2C_24(GameModeManag this->mUnk_FC3[i].mUnk_01 = b2; } this->mUnk_FC3[0].mUnk_00 = *src; - this->mUnk_103E = pSaveSub17->mUnk_7E; + this->mUnk_103E = pSaveSub17->unk_7E; param1->Append(&this->mUnk_490); param1->Append(&this->mUnk_4F0); diff --git a/src/024_MainGame/Game/GameModeAdventure_024.cpp b/src/024_MainGame/Game/GameModeAdventure_024.cpp index 193d9731f..e08d9256f 100644 --- a/src/024_MainGame/Game/GameModeAdventure_024.cpp +++ b/src/024_MainGame/Game/GameModeAdventure_024.cpp @@ -36,13 +36,13 @@ void GameModeAdventure::vfunc_08() { SaveFile *pSaveFile = data_ov000_020b4eec.func_ov001_020be12c(); #if IS_JP - SaveInfoData *pSaveInfoData = &pSaveFile->mSlots[0].mSaveInfo.mSaveInfoData[0]; + SaveInfoData *pSaveInfoData = &pSaveFile->mSlots[0].mInfoData[0]; - if (pSaveInfoData->mSceneIndex == SceneIndex_f_ajito2) { - pSaveInfoData->mSceneIndex = SceneIndex_f_ajito; - pSaveInfoData->mRoomIndex = 0; - pSaveInfoData->mSpawnIndex = 0; - UNSET_FLAG(pSaveInfoData->mAdventureFlags.data, AdventureFlag_WadatsumiMinigameSequence); + if (pSaveInfoData->sceneIndex == SceneIndex_f_ajito2) { + pSaveInfoData->sceneIndex = SceneIndex_f_ajito; + pSaveInfoData->roomIndex = 0; + pSaveInfoData->spawnIndex = 0; + UNSET_FLAG(pSaveInfoData->inventory.adventureFlags, AdventureFlag_WadatsumiMinigameSequence); } #endif