diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 505793e0..bb5be7b2 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -19,6 +19,10 @@ toBeSorted/save_file.cpp: toBeSorted/file_manager.cpp: .text start:0x80009D30 end:0x80011730 .ctors start:0x804DB648 end:0x804DB64C + .data start:0x80500400 end:0x80500410 + .sdata start:0x80571848 end:0x80571850 + .sbss start:0x80574FF8 end:0x80575000 + .bss start:0x80580070 end:0x80580080 toBeSorted/save_manager.cpp: .text start:0x80011730 end:0x80015310 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index bf5e4a41..a81e57bd 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -155,7 +155,7 @@ fn_800071D0 = .text:0x800071D0; // type:function size:0x8C fn_80007260 = .text:0x80007260; // type:function size:0xE4 OSPanic = .text:0x80007350; // type:function size:0xDC scope:weak fn_80007430 = .text:0x80007430; // type:function size:0x24 -fn_80007460 = .text:0x80007460; // type:function size:0x40 +__dt__7mVec3_cFv = .text:0x80007460; // type:function size:0x40 scope:weak fn_800074A0 = .text:0x800074A0; // type:function size:0xC8 fn_80007570 = .text:0x80007570; // type:function size:0x58 fn_800075D0 = .text:0x800075D0; // type:function size:0x8C @@ -227,29 +227,29 @@ fn_80009770 = .text:0x80009770; // type:function size:0x74 fn_800097F0 = .text:0x800097F0; // type:function size:0x17C fn_80009970 = .text:0x80009970; // type:function size:0x34 getStoryFlags0__8SaveFileFv = .text:0x800099B0; // type:function size:0x8 -getStoryFlags1__8SaveFileFv = .text:0x800099C0; // type:function size:0x8 +getStoryFlags1__8SaveFileCFv = .text:0x800099C0; // type:function size:0x8 getItemFlags0__8SaveFileFv = .text:0x800099D0; // type:function size:0x8 -getItemFlags1__8SaveFileFv = .text:0x800099E0; // type:function size:0x8 +getItemFlags1__8SaveFileCFv = .text:0x800099E0; // type:function size:0x8 getDungeonFlags0__8SaveFileFv = .text:0x800099F0; // type:function size:0x8 -getDungeonFlags1__8SaveFileFv = .text:0x80009A00; // type:function size:0x8 +getDungeonFlags1__8SaveFileCFv = .text:0x80009A00; // type:function size:0x8 getSceneFlags0__8SaveFileFv = .text:0x80009A10; // type:function size:0x8 -getSceneFlags1__8SaveFileFv = .text:0x80009A20; // type:function size:0x8 +getSceneFlags1__8SaveFileCFv = .text:0x80009A20; // type:function size:0x8 getTboxFlags0__8SaveFileFv = .text:0x80009A30; // type:function size:0x8 -getTboxFlags1__8SaveFileFv = .text:0x80009A40; // type:function size:0x8 +getTboxFlags1__8SaveFileCFv = .text:0x80009A40; // type:function size:0x8 getTempFlags0__8SaveFileFv = .text:0x80009A50; // type:function size:0x8 -getTempFlags1__8SaveFileFv = .text:0x80009A60; // type:function size:0x8 +getTempFlags1__8SaveFileCFv = .text:0x80009A60; // type:function size:0x8 getZoneFlags0__8SaveFileFv = .text:0x80009A70; // type:function size:0x8 -getZoneFlags1__8SaveFileFv = .text:0x80009A80; // type:function size:0x8 -getUnkFlags0__8SaveFileFv = .text:0x80009A90; // type:function size:0x8 -getUnkFlags1__8SaveFileFv = .text:0x80009AA0; // type:function size:0x8 +getZoneFlags1__8SaveFileCFv = .text:0x80009A80; // type:function size:0x8 +getEnemyFlags0__8SaveFileFv = .text:0x80009A90; // type:function size:0x8 +getEnemyFlags1__8SaveFileCFv = .text:0x80009AA0; // type:function size:0x8 getPlayerName__8SaveFileFv = .text:0x80009AB0; // type:function size:0x8 setAreaT1__8SaveFileFPc = .text:0x80009AC0; // type:function size:0x11C getAreaT1__8SaveFileFv = .text:0x80009BE0; // type:function size:0x8 setAreaT2__8SaveFileFPc = .text:0x80009BF0; // type:function size:0x11C getAreaT2__8SaveFileFv = .text:0x80009D10; // type:function size:0x8 getAreaT3__8SaveFileFv = .text:0x80009D20; // type:function size:0x8 -fn_80009D30 = .text:0x80009D30; // type:function size:0x10 -fn_80009D40 = .text:0x80009D40; // type:function size:0x40 +__ct__8UnkClassFv = .text:0x80009D30; // type:function size:0x10 +__dt__8UnkClassFv = .text:0x80009D40; // type:function size:0x40 fn_80009D80 = .text:0x80009D80; // type:function size:0x4 fn_80009D90 = .text:0x80009D90; // type:function size:0x4 fn_80009DA0 = .text:0x80009DA0; // type:function size:0xC @@ -265,7 +265,7 @@ getFileCurrentHealth__11FileManagerFi = .text:0x8000A2A0; // type:function size: getFileHealthCapacity__11FileManagerFi = .text:0x8000A2C0; // type:function size:0x14 fn_8000A2E0__11FileManagerFv = .text:0x8000A2E0; // type:function size:0x50 getStoryFlagsMut__11FileManagerFv = .text:0x8000A330; // type:function size:0x24 -getStoryFlagsConst__11FileManagerFv = .text:0x8000A360; // type:function size:0x44 +getStoryFlagsConst__11FileManagerCFv = .text:0x8000A360; // type:function size:0x44 getItemFlagsMut__11FileManagerFv = .text:0x8000A3B0; // type:function size:0x24 getItemFlagsConst__11FileManagerFv = .text:0x8000A3E0; // type:function size:0x44 getDungeonFlagsMut__11FileManagerFv = .text:0x8000A430; // type:function size:0x24 @@ -410,7 +410,7 @@ saveFileAToSelectedFile__11FileManagerFv = .text:0x8000EF80; // type:function si saveFileAToFile__11FileManagerFi = .text:0x8000EF90; // type:function size:0x794 copyCurrentToFileB__11FileManagerFv = .text:0x8000F730; // type:function size:0x6B4 copySelectedFileSkipData__11FileManagerFv = .text:0x8000FDF0; // type:function size:0xC -copySkipData__11FileManagerFi = .text:0x8000FE00; // type:function size:0xA8 +copySkipData__11FileManagerFUc = .text:0x8000FE00; // type:function size:0xA8 setInfo_FileB__11FileManagerFv = .text:0x8000FEB0; // type:function size:0xAC clearFileA__11FileManagerFv = .text:0x8000FF60; // type:function size:0x94 initBlankSaveFiles__11FileManagerFv = .text:0x80010000; // type:function size:0x154 @@ -424,19 +424,19 @@ getCurrentFile__11FileManagerFv = .text:0x80011210; // type:function size:0x40 getSkipFlags2__11FileManagerFv = .text:0x80011250; // type:function size:0xC getFileA__11FileManagerFv = .text:0x80011260; // type:function size:0x8 getFileB__11FileManagerFv = .text:0x80011270; // type:function size:0x8 -calcFileCRC__11FileManagerFPC8SaveFileUi = .text:0x80011280; // type:function size:0xC +calcFileCRC__11FileManagerFPCvUi = .text:0x80011280; // type:function size:0xC updateEmptyFiles__11FileManagerFv = .text:0x80011290; // type:function size:0x34 updateEmptyFileFlags__11FileManagerFv = .text:0x800112D0; // type:function size:0x9C isFileEmpty__11FileManagerFi = .text:0x80011370; // type:function size:0x20 -isFileUnk3__11FileManagerFi = .text:0x80011390; // type:function size:0x20 +isFileDirty__11FileManagerFi = .text:0x80011390; // type:function size:0x20 get_0xA84C__11FileManagerFv = .text:0x800113B0; // type:function size:0xC checkRegionCode__11FileManagerFv = .text:0x800113C0; // type:function size:0x78 -checkFileCRC__11FileManagerFi = .text:0x80011440; // type:function size:0x50 -isFileInactive__11FileManagerFv = .text:0x80011490; // type:function size:0x6C +checkFileCRC__11FileManagerFUc = .text:0x80011440; // type:function size:0x50 +isFileInactive__11FileManagerCFv = .text:0x80011490; // type:function size:0x6C setPlayerInfoFileA__11FileManagerFv = .text:0x80011500; // type:function size:0xE0 setT3Info__11FileManagerFP7mVec3_cP7mAng3_c = .text:0x800115E0; // type:function size:0xD8 getRegionVersion__11FileManagerFPc = .text:0x800116C0; // type:function size:0x28 -fn_800116F0 = .text:0x800116F0; // type:function size:0x3C +__sinit_\file_manager_cpp = .text:0x800116F0; // type:function size:0x3C fn_80011730 = .text:0x80011730; // type:function size:0x2C fn_80011760 = .text:0x80011760; // type:function size:0x1D4 fn_80011940 = .text:0x80011940; // type:function size:0x100 @@ -26206,10 +26206,10 @@ becomeCurrentHeap__Q23EGG4HeapFv = .text:0x804959A0; // type:function size:0x58 _becomeCurrentHeapWithoutLock__Q23EGG4HeapFv = .text:0x80495A00; // type:function size:0x3C initAllocator__Q23EGG4HeapFPQ23EGG9Allocatorl = .text:0x80495A40; // type:function size:0x14 __nw__FUlPv = .text:0x80495A60; // type:function size:0x8 -__nw__FUlPQ23EGG4Heapi = .text:0x80495A70; // type:function size:0x10 +__nw__FUlPQ23EGG4HeapUi = .text:0x80495A70; // type:function size:0x10 __nwa__FUl = .text:0x80495A80; // type:function size:0x10 -__nwa__FUli = .text:0x80495A90; // type:function size:0x8 -__nwa__FUlPQ23EGG4Heapi = .text:0x80495AA0; // type:function size:0x10 +__nwa__FUlUi = .text:0x80495A90; // type:function size:0x8 +__nwa__FUlPQ23EGG4HeapUi = .text:0x80495AA0; // type:function size:0x10 __ct__Q23EGG7ExpHeapFP12MEMiHeapHead = .text:0x80495AB0; // type:function size:0x3C __dt__Q23EGG7ExpHeapFv = .text:0x80495AF0; // type:function size:0x74 create__Q23EGG7ExpHeapFPvUlUs = .text:0x80495B70; // type:function size:0xB8 @@ -29842,7 +29842,7 @@ lbl_80500300 = .data:0x80500300; // type:object size:0x10 lbl_80500310 = .data:0x80500310; // type:object size:0x28 lbl_80500338 = .data:0x80500338; // type:object size:0x5C lbl_80500394 = .data:0x80500394; // type:object size:0x6C -lbl_80500400 = .data:0x80500400; // type:object size:0x10 +__vt__8UnkClass = .data:0x80500400; // type:object size:0x10 lbl_80500410 = .data:0x80500410; // type:object size:0xB0 jumptable_805004C0 = .data:0x805004C0; // type:object size:0x58 scope:local jumptable_80500518 = .data:0x80500518; // type:object size:0x80 scope:local @@ -39635,7 +39635,7 @@ lbl_80574FE0 = .sbss:0x80574FE0; // type:object size:0x1 data:byte lbl_80574FE4 = .sbss:0x80574FE4; // type:object size:0x4 data:4byte lbl_80574FE8 = .sbss:0x80574FE8; // type:object size:0x4 data:4byte lbl_80574FEC = .sbss:0x80574FEC; // type:object size:0xC -lbl_80574FF8 = .sbss:0x80574FF8; // type:object size:0x4 +sInstance__8UnkClass = .sbss:0x80574FF8; // type:object size:0x4 sInstance__11FileManager = .sbss:0x80574FFC; // type:object size:0x4 data:4byte lbl_80575000 = .sbss:0x80575000; // type:object size:0x8 data:4byte lbl_80575008 = .sbss:0x80575008; // type:object size:0x8 data:4byte diff --git a/include/egg/core/eggHeap.h b/include/egg/core/eggHeap.h index 10b114e9..db384abd 100644 --- a/include/egg/core/eggHeap.h +++ b/include/egg/core/eggHeap.h @@ -159,6 +159,6 @@ public: /* 80495a70 */ void *operator new(size_t size, EGG::Heap *heap, u32 align); /* 80495a80 */ void *operator new(size_t size, EGG::Allocator *alloc); /* 80495a90 */ void *operator new[](size_t size, u32 align); -/* 80495aa0 */ void *operator new[](size_t size, EGG::Heap *heap, int align); +/* 80495aa0 */ void *operator new[](size_t size, EGG::Heap *heap, u32 align); #endif diff --git a/include/m/m_heap.h b/include/m/m_heap.h index 6fdd1de7..146c93cf 100644 --- a/include/m/m_heap.h +++ b/include/m/m_heap.h @@ -33,7 +33,7 @@ namespace mHeap { u32 unk); /* 802f1450 */ int getGameHeapNum(); /* 802f1460 */ EGG::ExpHeap *createGameHeap(s32 heapNum, size_t size, EGG::Heap *parentHeap); -/* 802f1510 */ EGG::Heap *createGameHeap1(s32 size, EGG::Heap *parentHeap); +/* 802f1510 */ EGG::ExpHeap *createGameHeap1(s32 size, EGG::Heap *parentHeap); /* 802f1560 */ EGG::ExpHeap *createArchiveHeap(size_t size, EGG::Heap *parentHeap); /* 802f1590 */ EGG::ExpHeap *createCommandHeap(size_t size, EGG::Heap *parentHeap); /* 802f15c0 */ EGG::ExpHeap *createDylinkHeap(size_t size, EGG::Heap *parentHeap); diff --git a/include/m/m_vec.h b/include/m/m_vec.h index 02817ec0..b182642e 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -8,7 +8,8 @@ class mVec3_c : public EGG::Vector3f { public: /// @brief Constructs an empty vector. - mVec3_c() {} + /* 80009ee0 */ mVec3_c() {} + /* 80007460 */ ~mVec3_c() {} /// @brief Constructs a vector from a float array. mVec3_c(const f32 *p) { diff --git a/include/toBeSorted/file_manager.h b/include/toBeSorted/file_manager.h index 9b588943..282cfc4b 100644 --- a/include/toBeSorted/file_manager.h +++ b/include/toBeSorted/file_manager.h @@ -4,18 +4,32 @@ #include "toBeSorted/save_file.h" #include - enum ITEM_ID {}; enum SAVE_ITEM_ID {}; +class SkipData { +public: + /** 0x00 */ u16 data[16]; + /** 0x20 */ u32 crc; +}; + +class SavedSaveFiles { +public: + /* 0x0000 */ char regionCode[4]; + /* 0x0004 */ u8 unk1[0x1C - 0x04]; + /* 0x001C */ u32 m_0x1C; + /* 0x0020 */ SaveFile saveFiles[3]; + /* 0xfb60 */ SkipData skipData[3]; + /* 0xfbcc */ u8 unk2[0xfbe0 - 0xfbcc]; +}; + class FileManager { public: - /* 0x0000 */ void *mpSavedSaveFiles; - /* 0x0004 */ void *mpSkipData; // skip data Arrary (3 entries ) + /* 0x0000 */ SavedSaveFiles *mpSavedSaveFiles; + /* 0x0004 */ SkipData *mpSkipData; // skip data Arrary (3 entries ) /* 0x0008 */ SaveFile mFileA; /* 0x53C8 */ SaveFile mFileB; - /* 0xA788 */ u16 mSkipFlags[16]; - /* 0xA7A8 */ u32 mSkipFlagsCRC; + /* 0xA788 */ SkipData mSkipData; /* 0xA7AC */ wchar_t mHeroNames[3][9]; // each name is 9 wchars /* 0xA7E2 */ wchar_t mHeroName[9]; // The current Hero Name /* 0xA7F4 */ char mCurrentArea[32]; @@ -46,7 +60,7 @@ public: /* 80009DB0 */ FileManager(); // /* 80009EE0 */ // mVec3(); - /* 80009EF0 */ static FileManager create(EGG::Heap *); + /* 80009EF0 */ static FileManager *create(EGG::Heap *); /* 80009F30 */ bool loadSaveData(void *out, char *name, bool isSkipData); /* 80009F70 */ void saveSaveData(void *unk, bool isSkipData); /* 8000A000 */ void refreshSaveFileData(); @@ -57,7 +71,7 @@ public: /* 8000A2E0 */ void fn_8000A2E0(); // idk something blank save files /* 8000A330 */ u16 *getStoryFlagsMut(); - /* 8000A360 */ u16 *getStoryFlagsConst(); + /* 8000A360 */ const u16 *getStoryFlagsConst() const; /* 8000A3B0 */ u16 *getItemFlagsMut(); /* 8000A3E0 */ u16 *getItemFlagsConst(); /* 8000A430 */ u16 *getDungeonFlagsMut(); @@ -219,7 +233,7 @@ public: /* 8000D040 */ u8 getSkykeepPuzzleTile(u32 spot); /* 8000D0B0 */ void checkFileStatus(); - /* 8000D1D0 */ void checkSkipDataCRCs(); + /* 8000D1D0 */ bool checkSkipDataCRCs(); /* 8000D270 */ void saveOrClearSelectedFileToFileA(); /* 8000D280 */ void saveOrClearToFileA(int fileNum); /* 8000D9C0 */ void copyFileBToCurrentFile(); @@ -230,7 +244,7 @@ public: /* 8000EF90 */ void saveFileAToFile(int fileNum); /* 8000F730 */ void copyCurrentToFileB(); /* 8000FDF0 */ void copySelectedFileSkipData(); - /* 8000FE00 */ void copySkipData(int fileNum); + /* 8000FE00 */ void copySkipData(u8 fileNum); /* 8000FEB0 */ void setInfo_FileB(); /* 8000FF60 */ void clearFileA(); @@ -243,18 +257,21 @@ public: /* 80010440 */ void clearTempFileData(); /* 800104A0 */ void saveAfterCredits(); /* 80011210 */ SaveFile *getCurrentFile(); + inline const SaveFile *getCurrentFile() const { + return isFileInactive() ? &mFileB : &mFileA; + } /* 80011250 */ u16 *getSkipFlags2(); /* 80011260 */ SaveFile *getFileA(); /* 80011270 */ SaveFile *getFileB(); - /* 80011280 */ void calcFileCRC(const SaveFile *file, u32 length); + /* 80011280 */ u32 calcFileCRC(const void *data, u32 length); /* 80011290 */ void updateEmptyFiles(); /* 800112D0 */ void updateEmptyFileFlags(); /* 80011370 */ bool isFileEmpty(int fileNum); - /* 80011390 */ bool isFileUnk3(int fileNum); + /* 80011390 */ bool isFileDirty(int fileNum); /* 800113B0 */ u8 get_0xA84C(); /* 800113C0 */ bool checkRegionCode(); - /* 80011440 */ bool checkFileCRC(int fileNum); - /* 80011490 */ bool isFileInactive(); + /* 80011440 */ bool checkFileCRC(u8 fileNum); + /* 80011490 */ bool isFileInactive() const; /* 80011500 */ void setPlayerInfoFileA(); /* 800115E0 */ void setT3Info(mVec3_c *pos, mAng3_c *rot); /* 800116C0 */ static void getRegionVersion(char *out); diff --git a/include/toBeSorted/save_file.h b/include/toBeSorted/save_file.h index ea8d0b45..22c57de2 100644 --- a/include/toBeSorted/save_file.h +++ b/include/toBeSorted/save_file.h @@ -1,27 +1,27 @@ #ifndef SAVE_FILE_H #define SAVE_FILE_H -#include "UnknownTypeBelongings.h" +#include "m/m_vec.h" #include // Ghidra: SaveFile // Size: 0x53c0 // non-offical name -class SaveFile { +struct SaveFile { public: - /* 0x 0000 */ char field_0x0000[0x8 - 0x0]; + /* 0x 0000 */ s64 playTime; /* 0x 0008 */ s64 savedTime; - /* 0x 0010 */ Vec3f pos_t1; - /* 0x 001c */ Vec3f pos_t2; - /* 0x 0028 */ Vec3f pos_t3; - /* 0x 0034 */ Vec3f beacon_pos[32][5]; + /* 0x 0010 */ mVec3_c pos_t1; + /* 0x 001c */ mVec3_c pos_t2; + /* 0x 0028 */ mVec3_c pos_t3; + /* 0x 0034 */ mVec3_c beacon_pos[32][5]; /* 0x 07b4 */ s32 beedleShopPathSegment; /* 0x 07b8 */ f32 beedlShopPathSegFrac; - /* 0x 07bc */ char field_0x07BC[0x7c0 - 0x7bc]; + /* 0x 07bc */ u32 field_0x07BC; /* 0x 07c0 */ s32 pouch_items[8]; /* 0x 07e0 */ s32 item_check_items[60]; /* 0x 08d0 */ int file_area_index; - /* 0x 08d4 */ s16 player_name[8]; + /* 0x 08d4 */ wchar_t player_name[8]; /* 0x 08e4 */ u16 story_flags[128]; /* 0x 09e4 */ u16 item_flags[64]; /* 0x 0a64 */ u16 dungeon_flags[8][22]; @@ -34,15 +34,15 @@ public: /* 0x 302c */ u16 hitByEnemyCounts[100]; /* 0x 30f4 */ u16 temp_flags[4]; /* 0x 30fc */ u16 zone_flags[252]; - /* 0x 32f4 */ u16 unk_flags[4096]; // size guessed? (saw memset) - /* 0x 52f4 */ s16 air_potion_timer; - /* 0x 52f6 */ s16 air_potion_plus_timer; - /* 0x 52f8 */ s16 stamina_potion_timer; - /* 0x 52fa */ s16 stamina_potion_plus_timer; - /* 0x 52fc */ s16 gaurdian_potion_timer; - /* 0x 52fe */ s16 gaurdian_potion_plus_timer; - /* 0x 5300 */ s16 field_0x5300; - /* 0x 5302 */ s16 health_capacity; + /* 0x 32f4 */ u16 enemy_flags[4096]; + /* 0x 52f4 */ u16 air_potion_timer; + /* 0x 52f6 */ u16 air_potion_plus_timer; + /* 0x 52f8 */ u16 stamina_potion_timer; + /* 0x 52fa */ u16 stamina_potion_plus_timer; + /* 0x 52fc */ u16 gaurdian_potion_timer; + /* 0x 52fe */ u16 gaurdian_potion_plus_timer; + /* 0x 5300 */ u16 field_0x5300; + /* 0x 5302 */ u16 health_capacity; /* 0x 5304 */ u16 unused_heart_related; /* 0x 5306 */ u16 current_health; /* 0x 5308 */ u16 room_id_t1; @@ -86,22 +86,22 @@ public: // ---------------------------------------------------------- public: /* 800099b0 */ u16 *getStoryFlags0(); - /* 800099c0 */ u16 *getStoryFlags1(); + /* 800099c0 */ const u16 *getStoryFlags1() const; /* 800099d0 */ u16 *getItemFlags0(); - /* 800099e0 */ u16 *getItemFlags1(); + /* 800099e0 */ const u16 *getItemFlags1() const; /* 800099F0 */ u16 *getDungeonFlags0(); - /* 80009A00 */ u16 *getDungeonFlags1(); + /* 80009A00 */ const u16 *getDungeonFlags1() const; /* 80009A10 */ u16 *getSceneFlags0(); - /* 80009A20 */ u16 *getSceneFlags1(); + /* 80009A20 */ const u16 *getSceneFlags1() const; /* 80009A30 */ u16 *getTboxFlags0(); - /* 80009A40 */ u16 *getTboxFlags1(); + /* 80009A40 */ const u16 *getTboxFlags1() const; /* 80009A50 */ u16 *getTempFlags0(); - /* 80009A60 */ u16 *getTempFlags1(); + /* 80009A60 */ const u16 *getTempFlags1() const; /* 80009A70 */ u16 *getZoneFlags0(); - /* 80009A80 */ u16 *getZoneFlags1(); - /* 80009A90 */ u16 *getUnkFlags0(); - /* 80009AA0 */ u16 *getUnkFlags1(); - /* 80009AB0 */ s16 *getPlayerName(); // UTF16-BE + /* 80009A80 */ const u16 *getZoneFlags1() const; + /* 80009A90 */ u16 *getEnemyFlags0(); + /* 80009AA0 */ const u16 *getEnemyFlags1() const; + /* 80009AB0 */ wchar_t *getPlayerName(); // UTF16-BE /* 80009AC0 */ void setAreaT1(char *name); /* 80009BE0 */ char *getAreaT1(); /* 80009BF0 */ void setAreaT2(char *name); diff --git a/src/toBeSorted/file_manager.cpp b/src/toBeSorted/file_manager.cpp index 3447b05a..84bd84b4 100644 --- a/src/toBeSorted/file_manager.cpp +++ b/src/toBeSorted/file_manager.cpp @@ -1,83 +1,175 @@ #include "toBeSorted/file_manager.h" #include "f/f_base.h" +#include +// #include "libc.h" +#include + +// This class here makes no sense and the name might +// be a total misnomer, but this gets the sinit section correct +class UnkClass { +public: + UnkClass(); + /* vtable at 80500400 */ + virtual ~UnkClass(); + + static UnkClass sInstance; +}; +// This seems really pointless since the class only has a virtual destructor +// and no members but /shrug +/* 80574FF8 */ UnkClass UnkClass::sInstance; + +/* 80009D30 */ UnkClass::UnkClass() {} +/* 80009D40 */ UnkClass::~UnkClass() {} + +/* 80574FFC */ FileManager *FileManager::sInstance; extern "C" { - /* 80009D30 */ void fn_80009D30() {} // some ctor - /* 80009D40 */ void fn_80009D40() {} // some dtor - /* 80009D80 */ void fn_80009D80() {} // return - /* 80009D90 */ void fn_80009D90() {} // return - /* 80009DA0 */ void fn_80009DA0() {} // memset(param_1, 0, 0x20) a 0x24 structure is implied here (0x20 data) a crc is at 0x24 +/* 80009D80 */ void fn_80009D80() {} // return +/* 80009D90 */ void fn_80009D90() {} // return +/* 80009DA0 */ void fn_80009DA0(void *ptr) { + memset(ptr, 0, 0x20); +} // memset(param_1, 0, 0x20) a 0x24 structure is implied here (0x20 data) a crc is at 0x24 } -/* 80009DB0 */ FileManager::FileManager() {} +/* 80009DB0 */ FileManager::FileManager() { + // TODO the assembly code looks really wild + mHeroNames[0][0] = '\0'; + u32 num_files = (u32)(mHeroName - mHeroNames[0]); + num_files = num_files / sizeof(mHeroName); + for (int i = 1; mHeroNames[i] < mHeroName && i < num_files; i++) { + mHeroNames[i][0] = '\0'; + } + mHeroName[0] = '\0'; + mCurrentArea[0] = '\0'; + sInstance = this; + // TODO these should probably use the new operators? + mpSavedSaveFiles = (SavedSaveFiles *)mHeap::g_gameHeaps[0]->alloc(sizeof(SavedSaveFiles), 0x20); + mpSkipData = (SkipData *)mHeap::g_gameHeaps[0]->alloc(0x80, 0x20); + + fn_8000A2E0(); +} /* 80009EE0 */ // mVec3(); -/* 80009EF0 */ FileManager FileManager::create(EGG::Heap*){} -/* 80009F30 */ bool FileManager::loadSaveData(void* out, char* name, bool isSkipData){} -/* 80009F70 */ void FileManager::saveSaveData(void* unk, bool isSkipData){} -/* 8000A000 */ void FileManager::refreshSaveFileData(){} -/* 8000A260 */ wchar_t* FileManager::getFileHeroname(int fileNum){} -/* 8000A280 */ s64 FileManager::getFileSaveTime(int fileNum){} -/* 8000A2A0 */ s16 FileManager::getFileCurrentHealth(int fileNum){} -/* 8000A2C0 */ s16 FileManager::getFileHealthCapacity(int fileNum){} -/* 8000A2E0 */ void FileManager::fn_8000A2E0(){} +/* 80009EF0 */ FileManager *FileManager::create(EGG::Heap *heap) { + return new (heap, 0x04) FileManager(); +} +/* 80009F30 */ bool FileManager::loadSaveData(void *out, char *name, bool isSkipData) {} +/* 80009F70 */ void FileManager::saveSaveData(void *unk, bool isSkipData) {} +/* 8000A000 */ void FileManager::refreshSaveFileData() {} +/* 8000A260 */ wchar_t *FileManager::getFileHeroname(int fileNum) {} +/* 8000A280 */ s64 FileManager::getFileSaveTime(int fileNum) {} +/* 8000A2A0 */ s16 FileManager::getFileCurrentHealth(int fileNum) {} +/* 8000A2C0 */ s16 FileManager::getFileHealthCapacity(int fileNum) {} +/* 8000A2E0 */ void FileManager::fn_8000A2E0() { + // maybe call this function "reset" + mIsFileUnk1[0] = true; + initBlankSaveFiles(); + m_0xA84D = 0; + mSelectedFile = 1; +} -/* 8000A330 */ -u16* FileManager::getStoryFlagsMut() { +/* 8000A330 */ +u16 *FileManager::getStoryFlagsMut() { return getCurrentFile()->getStoryFlags0(); } -/* 8000A360 */ u16* FileManager::getStoryFlagsConst() { - return (isFileInactive() ? mFileB : mFileA).getStoryFlags1(); +/* 8000A360 */ const u16 *FileManager::getStoryFlagsConst() const { + return getCurrentFile()->getStoryFlags1(); } -/* 8000A3B0 */ u16* FileManager::getItemFlagsMut() {} -/* 8000A3E0 */ u16* FileManager::getItemFlagsConst() {} -/* 8000A430 */ u16* FileManager::getDungeonFlagsMut() {} -/* 8000A460 */ u16* FileManager::getDungeonFlagsConst() {} -/* 8000A4B0 */ u16* FileManager::getSceneFlagsMut() {} -/* 8000A4E0 */ u16* FileManager::getSceneFlagsConst() {} -/* 8000A530 */ u16* FileManager::getTBoxFlagsMut() {} -/* 8000A560 */ u16* FileManager::getTBoxFlagsConst() {} -/* 8000A5B0 */ u16* FileManager::getTempFlagsMut() {} -/* 8000A5E0 */ u16* FileManager::getTempFlagsConst() {} -/* 8000A630 */ u16* FileManager::getZoneFlagsMut() {} -/* 8000A660 */ u16* FileManager::getZoneFlagsConst() {} -/* 8000A6B0 */ u16* FileManager::getEnemyDefeatFlagsMut() {} -/* 8000A6E0 */ u16* FileManager::getEnemyDefeatFlagsConst() {} -/* 8000A730 */ void FileManager::setStoryFlags(u16* flags, u32 offset, u16 count) {} -/* 8000A790 */ void FileManager::setItemFlags(u16* flags, u32 offset, u16 count) {} -/* 8000A7F0 */ void FileManager::setDungeonFlags(u16* flags, u32 offset, u16 count) {} -/* 8000A850 */ void FileManager::setSceneFlags(u16* flags, u32 offset, u16 count) {} -/* 8000A8B0 */ void FileManager::setTBoxFlags(u16* flags, u32 offset, u16 count) {} -/* 8000A910 */ void FileManager::setTempFlags(u16* flags, u32 offset, u16 count) {} -/* 8000A970 */ void FileManager::setZoneFlags(u16* flags, u32 offset, u16 count) {} -/* 8000A9D0 */ void FileManager::setEnemyDefeatFlags(u16* flags, u32 offset, u16 count) {} +/* 8000A3B0 */ u16 *FileManager::getItemFlagsMut() {} +/* 8000A3E0 */ u16 *FileManager::getItemFlagsConst() {} +/* 8000A430 */ u16 *FileManager::getDungeonFlagsMut() {} +/* 8000A460 */ u16 *FileManager::getDungeonFlagsConst() {} +/* 8000A4B0 */ u16 *FileManager::getSceneFlagsMut() {} +/* 8000A4E0 */ u16 *FileManager::getSceneFlagsConst() {} +/* 8000A530 */ u16 *FileManager::getTBoxFlagsMut() {} +/* 8000A560 */ u16 *FileManager::getTBoxFlagsConst() {} +/* 8000A5B0 */ u16 *FileManager::getTempFlagsMut() {} +/* 8000A5E0 */ u16 *FileManager::getTempFlagsConst() {} +/* 8000A630 */ u16 *FileManager::getZoneFlagsMut() {} +/* 8000A660 */ u16 *FileManager::getZoneFlagsConst() {} +/* 8000A6B0 */ u16 *FileManager::getEnemyDefeatFlagsMut() {} +/* 8000A6E0 */ u16 *FileManager::getEnemyDefeatFlagsConst() {} +/* 8000A730 */ void FileManager::setStoryFlags(u16 *flags, u32 offset, u16 count) {} +/* 8000A790 */ void FileManager::setItemFlags(u16 *flags, u32 offset, u16 count) {} +/* 8000A7F0 */ void FileManager::setDungeonFlags(u16 *flags, u32 offset, u16 count) {} +/* 8000A850 */ void FileManager::setSceneFlags(u16 *flags, u32 offset, u16 count) {} +/* 8000A8B0 */ void FileManager::setTBoxFlags(u16 *flags, u32 offset, u16 count) {} +/* 8000A910 */ void FileManager::setTempFlags(u16 *flags, u32 offset, u16 count) {} +/* 8000A970 */ void FileManager::setZoneFlags(u16 *flags, u32 offset, u16 count) {} +/* 8000A9D0 */ void FileManager::setEnemyDefeatFlags(u16 *flags, u32 offset, u16 count) {} -/* 8000AA30 */ u16* FileManager::getSkipFlags() {} -/* 8000AA40 */ void FileManager::setSkipFlagsChecked(u16* flags, u32 offset, u16 count) {} +/* 8000AA30 */ u16 *FileManager::getSkipFlags() {} +/* 8000AA40 */ void FileManager::setSkipFlagsChecked(u16 *flags, u32 offset, u16 count) {} -/* 8000AAA0 */ void FileManager::initFile(int fileNum) {} +// This does strncat things - append src to dest +inline void fake_strncat(char *dest, const char *src, size_t max_len) { + if (src != nullptr) { + size_t len = strlen(dest); + size_t count = strlen(src); + count = len + count + 1 >= max_len ? max_len - len - 1 : count; + strncpy(dest + len, src, count); + // one instshuffle here - this should be (len + count), + // but then regalloc blows up and uses one more register in initFile + dest[count + len] = '\0'; + } +} + +// A function like this is inlined into in a bunch of area-related code +// It doesn't make a whole lot of sense to use strncat on a string just +// clipped to zero length... +inline void strnsth(char *dest, const char *src, size_t max_len) { + if (src != dest) { + dest[0] = '\0'; + fake_strncat(dest, src, max_len); + } +} + +/* 8000AAA0 */ void FileManager::initFile(int fileNum) { + + mIsFileInvalid[1] = 1; + SaveFile *file = getFileA(); + if (fileNum != 0) { + file = &mFileB; + } + file->new_file = 0; + file->health_capacity = 0x18; + file->unused_heart_related = 0x18; + file->current_health = 0x18; + file->shield_pouch_slot = 8; + file->equipped_b_item = 0xb; + file->selectedDowsingSlot = 0x8; + file->lastUsedPouchItemSlot = 0x8; + + char buf[0x20]; + buf[0] = '\0'; + strnsth(buf, "F405", 0x20); + file->setAreaT1(buf); + file->room_id_t1 = 0; + file->forced_layer_t1 = 0; + file->entrance_t1_load_flag = 1; +} /* 8000ABD0 */ void FileManager::setCurrentHealthCapacity(s16 health) {} /* 8000AC00 */ s16 FileManager::getCurrentHealthCapacity() {} /* 8000AC50 */ void FileManager::setCurrentHealth(s16 health) {} /* 8000AC80 */ s16 FileManager::getCurrentHealth() {} -/* 8000ACD0 */ u16 FileManager::getLoadRoomT1() {} -/* 8000AD20 */ u16 FileManager::getLoadRoomT2() {} +/* 8000ACD0 */ u16 FileManager::getLoadRoomT1() {} +/* 8000AD20 */ u16 FileManager::getLoadRoomT2() {} /* 8000AD70 */ void FileManager::setLoadRoomT3(s16 room) {} -/* 8000ADA0 */ u16 FileManager::getLoadRoomT3() {} +/* 8000ADA0 */ u16 FileManager::getLoadRoomT3() {} -/* 8000ADF0 */ mVec3_c* FileManager::getPosT1() {} -/* 8000AE40 */ void FileManager::setPosT2(mVec3_c* pos) {} -/* 8000AE90 */ mVec3_c* FileManager::getPosT2() {} -/* 8000AEE0 */ void FileManager::setPosT3(mVec3_c* pos) {} -/* 8000AF30 */ mVec3_c* FileManager::getPosT3() {} +/* 8000ADF0 */ mVec3_c *FileManager::getPosT1() {} +/* 8000AE40 */ void FileManager::setPosT2(mVec3_c *pos) {} +/* 8000AE90 */ mVec3_c *FileManager::getPosT2() {} +/* 8000AEE0 */ void FileManager::setPosT3(mVec3_c *pos) {} +/* 8000AF30 */ mVec3_c *FileManager::getPosT3() {} -/* 8000AF80 */ s16 FileManager::getAngleT1() {} +/* 8000AF80 */ s16 FileManager::getAngleT1() {} /* 8000AFD0 */ void FileManager::setAngleT2(s16 angle) {} -/* 8000B000 */ s16 FileManager::getAngleT2() {} +/* 8000B000 */ s16 FileManager::getAngleT2() {} /* 8000B050 */ void FileManager::setAngleT3(s16 angle) {} -/* 8000B080 */ s16 FileManager::getAngleT3() {} +/* 8000B080 */ s16 FileManager::getAngleT3() {} /* 8000B0D0 */ void FileManager::setPouchData(s32 slot, u32 slotData) {} /* 8000B130 */ u32 FileManager::getPouchData(s32 slot) {} @@ -86,38 +178,38 @@ u16* FileManager::getStoryFlagsMut() { /* 8000B250 */ void FileManager::setPouchUpperData(s32 slot, s32 data) {} /* 8000B2C0 */ u16 FileManager::getPouchUpperData(s32 slot) {} -/* 8000B2F0 */ void FileManager::setItemCheckData(u32 idx, u32 itemData){} -/* 8000B360 */ u32 FileManager::getItemCheckData(u32 idx){} -/* 8000B3F0 */ void FileManager::setItemCheckItem(u32 idx, ITEM_ID item){} -/* 8000B480 */ ITEM_ID FileManager::getItemCheckItem(u32 idx){} -/* 8000B4B0 */ void FileManager::setItemCheckUpperData(u32 idx, u32 itemData){} -/* 8000B540 */ u32 FileManager::getItemCheckUpperData(){} +/* 8000B2F0 */ void FileManager::setItemCheckData(u32 idx, u32 itemData) {} +/* 8000B360 */ u32 FileManager::getItemCheckData(u32 idx) {} +/* 8000B3F0 */ void FileManager::setItemCheckItem(u32 idx, ITEM_ID item) {} +/* 8000B480 */ ITEM_ID FileManager::getItemCheckItem(u32 idx) {} +/* 8000B4B0 */ void FileManager::setItemCheckUpperData(u32 idx, u32 itemData) {} +/* 8000B540 */ u32 FileManager::getItemCheckUpperData() {} -/* 8000B570 */ void FileManager::setEquippedItem(u8 bWheelItem){} -/* 8000B5A0 */ u8 FileManager::getEquippedItem(){} -/* 8000B5F0 */ void FileManager::setSelectedPouchSlot(u8 slot){} -/* 8000B620 */ u8 FileManager::getSelectedPouchSlot(){} -/* 8000B670 */ void FileManager::setShieldPouchSlot(u8 slot){} -/* 8000B6A0 */ u8 FileManager::getShieldPouchSlot(){} +/* 8000B570 */ void FileManager::setEquippedItem(u8 bWheelItem) {} +/* 8000B5A0 */ u8 FileManager::getEquippedItem() {} +/* 8000B5F0 */ void FileManager::setSelectedPouchSlot(u8 slot) {} +/* 8000B620 */ u8 FileManager::getSelectedPouchSlot() {} +/* 8000B670 */ void FileManager::setShieldPouchSlot(u8 slot) {} +/* 8000B6A0 */ u8 FileManager::getShieldPouchSlot() {} -/* 8000B6F0 */ void FileManager::setAirPotionTimer(s16 time){} -/* 8000B720 */ s16 FileManager::getAirPotionTimer(){} -/* 8000B770 */ void FileManager::setAirPotionPlusTimer(s16 time){} -/* 8000B7A0 */ s16 FileManager::getAirPotionPlusTimer(){} -/* 8000B7F0 */ void FileManager::setStaminaPotionTimer(s16 time){} -/* 8000B820 */ s16 FileManager::getStaminaPotionTimer(){} -/* 8000B870 */ void FileManager::setStaminaPotionPlusTimer(s16 time){} -/* 8000B8A0 */ s16 FileManager::getStaminaPotionPlusTimer(){} -/* 8000B8F0 */ void FileManager::setGuardianPotionTimer(s16 time){} -/* 8000B920 */ s16 FileManager::getGuardianPotionTimer(){} -/* 8000B970 */ void FileManager::setGuardianPotionPlusTimer(s16 time){} -/* 8000B9A0 */ s16 FileManager::getGuardianPotionPlusTimer(){} +/* 8000B6F0 */ void FileManager::setAirPotionTimer(s16 time) {} +/* 8000B720 */ s16 FileManager::getAirPotionTimer() {} +/* 8000B770 */ void FileManager::setAirPotionPlusTimer(s16 time) {} +/* 8000B7A0 */ s16 FileManager::getAirPotionPlusTimer() {} +/* 8000B7F0 */ void FileManager::setStaminaPotionTimer(s16 time) {} +/* 8000B820 */ s16 FileManager::getStaminaPotionTimer() {} +/* 8000B870 */ void FileManager::setStaminaPotionPlusTimer(s16 time) {} +/* 8000B8A0 */ s16 FileManager::getStaminaPotionPlusTimer() {} +/* 8000B8F0 */ void FileManager::setGuardianPotionTimer(s16 time) {} +/* 8000B920 */ s16 FileManager::getGuardianPotionTimer() {} +/* 8000B970 */ void FileManager::setGuardianPotionPlusTimer(s16 time) {} +/* 8000B9A0 */ s16 FileManager::getGuardianPotionPlusTimer() {} /* 8000B9F0 */ void FileManager::setDowsingSlotIdx(u8 idx) {} /* 8000BA20 */ u8 FileManager::getDowsingSlotIdx() {} -/* 8000BA70 */ void FileManager::setBeaconPos(u32 beaconArea, u32 beaconNum, mVec3_c* pos) {} -/* 8000BB80 */ mVec3_c* FileManager::getBeaconPos(u32 beaconArea, u32 beaconNum) {} +/* 8000BA70 */ void FileManager::setBeaconPos(u32 beaconArea, u32 beaconNum, mVec3_c *pos) {} +/* 8000BB80 */ mVec3_c *FileManager::getBeaconPos(u32 beaconArea, u32 beaconNum) {} /* 8000BC70 */ void FileManager::setEnemyKillCount(u32 enemy, u16 killCount) {} /* 8000BCE0 */ u16 FileManager::getEnemyKillCount(u32 enemy) {} /* 8000BD60 */ void FileManager::setHitCountFromEnemy(u32 enemy, u16 hitCount) {} @@ -126,9 +218,9 @@ u16* FileManager::getStoryFlagsMut() { /* 8000BE50 */ void FileManager::setLoadRoomT1_FileB(s16 roomId) {} /* 8000BE80 */ s16 FileManager::getLoadRoomT1_FileB() {} /* 8000BE90 */ void FileManager::setEntranceT1_FileB(u8 entrance) {} -/* 8000BEC0 */ u8 FileManager::getEntranceT1_FileB() {} -/* 8000BED0 */ void FileManager::setAreaT1_FileB(const char* name) {} -/* 8000BF80 */ char* FileManager::getAreaT1_FileB() {} +/* 8000BEC0 */ u8 FileManager::getEntranceT1_FileB() {} +/* 8000BED0 */ void FileManager::setAreaT1_FileB(const char *name) {} +/* 8000BF80 */ char *FileManager::getAreaT1_FileB() {} /* 8000C080 */ void FileManager::setNightT1_FileB(bool night) {} /* 8000C0B0 */ bool FileManager::getNightT1_FileB() {} /* 8000C0C0 */ void FileManager::setEntranceT1LoadFlag_FileB(u8 flag) {} @@ -136,13 +228,13 @@ u16* FileManager::getStoryFlagsMut() { /* 8000C120 */ void FileManager::getForcedLayerT1_FileB() {} /* 8000C130 */ void FileManager::setCurrentHealth_FileB(s16 health) {} -/* 8000C160 */ void FileManager::setHeroname(const wchar_t* name) {} -/* 8000C230 */ wchar_t* FileManager::getHeroname() {} +/* 8000C160 */ void FileManager::setHeroname(const wchar_t *name) {} +/* 8000C230 */ wchar_t *FileManager::getHeroname() {} -/* 8000C360 */ char* FileManager::getAreaT1() {} -/* 8000C470 */ char* FileManager::getAreaT2() {} -/* 8000C580 */ void FileManager::setAreaT3(const char* name) {} -/* 8000C630 */ char* FileManager::getAreaT3() {} +/* 8000C360 */ char *FileManager::getAreaT1() {} +/* 8000C470 */ char *FileManager::getAreaT2() {} +/* 8000C580 */ void FileManager::setAreaT3(const char *name) {} +/* 8000C630 */ char *FileManager::getAreaT3() {} /* 8000C740 */ u8 FileManager::getForcedLayerT1() {} /* 8000C790 */ u8 FileManager::getForcedLayerT2() {} @@ -188,54 +280,206 @@ u16* FileManager::getStoryFlagsMut() { /* 8000CFE0 */ void FileManager::setSkykeepPuzzle(u32 spot, u8 tile) {} /* 8000D040 */ u8 FileManager::getSkykeepPuzzleTile(u32 spot) {} -/* 8000D0B0 */ void FileManager::checkFileStatus() {} -/* 8000D1D0 */ void FileManager::checkSkipDataCRCs() {} -/* 8000D270 */ void FileManager::saveOrClearSelectedFileToFileA() {} +/* 8000D0B0 */ void FileManager::checkFileStatus() { + mIsFileInvalid[2] = 0; + SkipData *data; + SavedSaveFiles *files = mpSavedSaveFiles; + + if (!checkRegionCode()) { + mIsFileInvalid[2] = 1; + } + if (files->m_0x1C != 0x1d) { + mIsFileInvalid[2] = 1; + } + + for (u8 i = 0; i < 3; i++) { + if (checkFileCRC(i) == 0) { + mIsFileDataDirty[i] = 1; + } else { + mIsFileDataDirty[i] = 0; + } + } + + int i; + for (i = 0, data = files->skipData; i < 3; i++, data++) { + u32 crc = calcFileCRC(data->data, sizeof(data->data)); + if (crc != data->crc) { + fn_80009DA0(data); + data->crc = calcFileCRC(data->data, sizeof(data->data)); + } + } +} +/* 8000D1D0 */ bool FileManager::checkSkipDataCRCs() { + SkipData *data; + bool dirty = false; + u8 i; + for (data = mpSkipData, i = 0; (s32)i < 3; i++, data++) { + u32 crc = calcFileCRC(data->data, sizeof(data->data)); + if (crc == data->crc) { + mIsFileSkipDataDirty[i] = 0; + } else { + mIsFileSkipDataDirty[i] = 1; + dirty = true; + } + } + return dirty; +} +/* 8000D270 */ void FileManager::saveOrClearSelectedFileToFileA() { + saveOrClearToFileA(mSelectedFile); +} /* 8000D280 */ void FileManager::saveOrClearToFileA(int fileNum) {} /* 8000D9C0 */ void FileManager::copyFileBToCurrentFile() {} -/* 8000E060 */ void FileManager::copyFileAToSelectedFile() {} +/* 8000E060 */ void FileManager::copyFileAToSelectedFile() { + copyFileAToFile(mSelectedFile); +} /* 8000E070 */ void FileManager::copyFileAToFile(int fileNum) {} /* 8000E7C0 */ void FileManager::copyFile(int from, int to) {} -/* 8000EF80 */ void FileManager::saveFileAToSelectedFile() {} +/* 8000EF80 */ void FileManager::saveFileAToSelectedFile() { + saveFileAToFile(mSelectedFile); +} /* 8000EF90 */ void FileManager::saveFileAToFile(int fileNum) {} /* 8000F730 */ void FileManager::copyCurrentToFileB() {} -/* 8000FDF0 */ void FileManager::copySelectedFileSkipData() {} -/* 8000FE00 */ void FileManager::copySkipData(int fileNum) {} +/* 8000FDF0 */ void FileManager::copySelectedFileSkipData() { + copySkipData(mSelectedFile); +} +/* 8000FE00 */ void FileManager::copySkipData(u8 fileNum) { + if (fileNum < 3) { + SkipData *curr = &mSkipData; + SkipData *data = mpSkipData; + curr->crc = calcFileCRC(&curr->data, sizeof(mSkipData.data)); + data[fileNum] = *curr; + } +} /* 8000FEB0 */ void FileManager::setInfo_FileB() {} -/* 8000FF60 */ void FileManager::clearFileA() {} +/* 8000FF60 */ void FileManager::clearFileA() { + SkipData *data; + SaveFile *file = getFileA(); + memset(file, 0, sizeof(SaveFile)); + file->new_file = 1; + file->checksum = calcFileCRC(file, sizeof(SaveFile) - sizeof(u32)); + data = &mSkipData; + memset(&data->data, 0, sizeof(SkipData)); + data->crc = calcFileCRC(data->data, sizeof(mSkipData.data)); +} -/* 80010000 */ void FileManager::initBlankSaveFiles() {} -/* 80010160 */ void FileManager::initSkipData() {} +/* 80010000 */ void FileManager::initBlankSaveFiles() { + memset(mpSavedSaveFiles, 0, 0xfbe0); + mSelectedFile = 0; + memset(mIsFileEmpty, 0, 3); + SkipData *data; + + SaveFile *file; + SavedSaveFiles *saved = mpSavedSaveFiles; + + mHeroNames[0][0] = '\0'; + mPlayTime[0] = 0; + mCurrentHealth[0] = 0; + mCurrentHealthCapacity[0] = 0; + + mHeroNames[1][0] = '\0'; + mPlayTime[1] = 0; + mCurrentHealth[1] = 0; + mCurrentHealthCapacity[1] = 0; + + mHeroNames[2][0] = '\0'; + mPlayTime[2] = 0; + mCurrentHealth[2] = 0; + mCurrentHealthCapacity[2] = 0; + + getRegionVersion(saved->regionCode); + saved->m_0x1C = 0x1d; + + file = saved->saveFiles; + for (int num = 0; num < 3; num++, file++) { + file->new_file = 1; + u32 crc = calcFileCRC(file, sizeof(SaveFile) - sizeof(u32)); + file->checksum = crc; + } + + int i; + for (i = 0, data = saved->skipData; i < 3; i++, data++) { + u32 crc = calcFileCRC(data->data, sizeof(data->data)); + data->crc = crc; + } + + clearFileA(); + mIsFileUnk1[1] = 0; + mIsFileUnk1[2] = 0; + mIsFileInvalid[0] = 0; + mIsFileInvalid[1] = 0; + m_0xA84C = 0; + mIsFileInvalid[2] = 0; + mIsFileDataDirty[0] = 0; + mIsFileDataDirty[1] = 0; + mIsFileDataDirty[2] = 0; + initSkipData(); +} +/* 80010160 */ void FileManager::initSkipData() { + memset(mpSkipData, 0, 0x80); + SkipData *data; + int i; + for (i = 0, data = mpSkipData; i < 3; i++, data++) { + u32 crc = calcFileCRC(data->data, sizeof(data->data)); + data->crc = crc; + } + mIsFileSkipDataDirty[0] = 0; + mIsFileSkipDataDirty[1] = 0; + mIsFileSkipDataDirty[2] = 0; +} /* 800101F0 */ void FileManager::unsetFileANewFile() {} /* 80010220 */ void FileManager::saveT1SaveInfo(u8 entranceT1LoadFlag) {} /* 80010350 */ void FileManager::copyFileSkipData(int fileNum) {} -/* 80010440 */ void FileManager::clearTempFileData() {} +extern "C" void fn_800C01F0(); // todo flag managers +/* 80010440 */ void FileManager::clearTempFileData() { + memset(&mFileA, 0, sizeof(SaveFile)); + memset(&mFileB, 0, sizeof(SaveFile)); + memset(&mSkipData, 0, sizeof(SkipData)); + fn_800C01F0(); +} /* 800104A0 */ void FileManager::saveAfterCredits() {} -/* 80011210 */ SaveFile* FileManager::getCurrentFile() {} -/* 80011250 */ u16* FileManager::getSkipFlags2() {} -/* 80011260 */ SaveFile* FileManager::getFileA() {} -/* 80011270 */ SaveFile* FileManager::getFileB() {} -/* 80011280 */ void FileManager::calcFileCRC(const SaveFile* file, u32 length) {} -/* 80011290 */ void FileManager::updateEmptyFiles() {} -/* 800112D0 */ void FileManager::updateEmptyFileFlags() {} +/* 80011210 */ SaveFile *FileManager::getCurrentFile() { + return isFileInactive() ? &mFileB : &mFileA; +} +/* 80011250 */ u16 *FileManager::getSkipFlags2() {} +/* 80011260 */ SaveFile *FileManager::getFileA() { + return &mFileA; +} +/* 80011270 */ SaveFile *FileManager::getFileB() { + return &mFileB; +} +/* 80011280 */ u32 FileManager::calcFileCRC(const void *data, u32 length) {} +/* 80011290 */ void FileManager::updateEmptyFiles() { + updateEmptyFileFlags(); + refreshSaveFileData(); +} +/* 800112D0 */ void FileManager::updateEmptyFileFlags() { + SaveFile *saves = mpSavedSaveFiles->saveFiles; + for (int i = 0; i < 3; i++) { + if (saves[i].new_file == 1) { + mIsFileEmpty[i] = 1; + } else { + mIsFileEmpty[i] = 0; + } + } +} /* 80011370 */ bool FileManager::isFileEmpty(int fileNum) {} -/* 80011390 */ bool FileManager::isFileUnk3(int fileNum) {} +/* 80011390 */ bool FileManager::isFileDirty(int fileNum) {} /* 800113B0 */ u8 FileManager::get_0xA84C() {} /* 800113C0 */ bool FileManager::checkRegionCode() {} -/* 80011440 */ bool FileManager::checkFileCRC(int fileNum) {} +/* 80011440 */ bool FileManager::checkFileCRC(u8 fileNum) {} /* 80011490 */ -bool FileManager::isFileInactive() { - fBase_c* actor = fManager_c::searchBaseByGroupType(1, nullptr); +bool FileManager::isFileInactive() const { + fBase_c *actor = fManager_c::searchBaseByGroupType(1, nullptr); if (actor) { - if (actor->profile_name == fProfile::TITLE && !mAntiCommitFlag) + if (actor->profile_name == fProfile::TITLE && !mAntiCommitFlag) { return true; + } return false; } return false; } /* 80011500 */ void FileManager::setPlayerInfoFileA() {} -/* 800115E0 */ void FileManager::setT3Info(mVec3_c* pos, mAng3_c* rot) {} -/* 800116C0 */ void FileManager::getRegionVersion(char* out) {} - +/* 800115E0 */ void FileManager::setT3Info(mVec3_c *pos, mAng3_c *rot) {} +/* 800116C0 */ void FileManager::getRegionVersion(char *out) {} diff --git a/src/toBeSorted/save_file.cpp b/src/toBeSorted/save_file.cpp index c876ccd5..c41f1fcb 100644 --- a/src/toBeSorted/save_file.cpp +++ b/src/toBeSorted/save_file.cpp @@ -5,68 +5,68 @@ u16* SaveFile::getStoryFlags0() { return story_flags; } -// 0x800099c0 getStoryFlags1__8SaveFileFv -u16* SaveFile::getStoryFlags1() { +// 0x800099c0 getStoryFlags1__8SaveFileCFv +const u16* SaveFile::getStoryFlags1() const { return story_flags; } // 0x800099d0 getItemFlags0__8SaveFileFv u16* SaveFile::getItemFlags0() { return item_flags; } -// 0x800099e0 getItemFlags1__8SaveFileFv -u16* SaveFile::getItemFlags1() { +// 0x800099e0 getItemFlags1__8SaveFileCFv +const u16* SaveFile::getItemFlags1() const { return item_flags; } // 0x800099F0 getDungeonFlags0__8SaveFileFv u16* SaveFile::getDungeonFlags0() { return dungeon_flags[0]; } -// 0x80009A00 getDungeonFlags1__8SaveFileFv -u16* SaveFile::getDungeonFlags1() { +// 0x80009A00 getDungeonFlags1__8SaveFileCFv +const u16* SaveFile::getDungeonFlags1() const { return dungeon_flags[0]; } // 0x80009A10 getSceneFlags0__8SaveFileFv u16* SaveFile::getSceneFlags0() { return scene_flags; } -// 0x80009A20 getSceneFlags1__8SaveFileFv -u16* SaveFile::getSceneFlags1() { +// 0x80009A20 getSceneFlags1__8SaveFileCFv +const u16* SaveFile::getSceneFlags1() const { return scene_flags; } // 0x80009A30 getTboxFlags0__8SaveFileFv u16* SaveFile::getTboxFlags0() { return tbox_flags; } -// 0x80009A40 getTboxFlags1__8SaveFileFv -u16* SaveFile::getTboxFlags1() { +// 0x80009A40 getTboxFlags1__8SaveFileCFv +const u16* SaveFile::getTboxFlags1() const { return tbox_flags; } // 0x80009A50 getTempFlags0__8SaveFileFv u16* SaveFile::getTempFlags0() { return temp_flags; } -// 0x80009A60 getTempFlags1__8SaveFileFv -u16* SaveFile::getTempFlags1() { +// 0x80009A60 getTempFlags1__8SaveFileCFv +const u16* SaveFile::getTempFlags1() const { return temp_flags; } // 0x80009A70 getZoneFlags0__8SaveFileFv u16* SaveFile::getZoneFlags0() { return zone_flags; } -// 0x80009A80 getZoneFlags1__8SaveFileFv -u16* SaveFile::getZoneFlags1() { +// 0x80009A80 getZoneFlags1__8SaveFileCFv +const u16* SaveFile::getZoneFlags1() const { return zone_flags; } -// 0x80009A90 getUnkFlags0__8SaveFileFv -u16* SaveFile::getUnkFlags0() { - return unk_flags; +// 0x80009A90 getEnemyFlags0__8SaveFileFv +u16* SaveFile::getEnemyFlags0() { + return enemy_flags; } -// 0x80009AA0 getUnkFlags1__8SaveFileFv -u16* SaveFile::getUnkFlags1() { - return unk_flags; +// 0x80009AA0 getEnemyFlags1__8SaveFileCFv +const u16* SaveFile::getEnemyFlags1() const { + return enemy_flags; } // 0x80009AB0 getPlayerName__8SaveFileFv -s16* SaveFile::getPlayerName() { +wchar_t* SaveFile::getPlayerName() { return player_name; } @@ -105,4 +105,4 @@ s8* SaveFile::getAreaT2() { // 0x80009D20 getAreaT3__8SaveFileFv s8* SaveFile::getAreaT3() { return area_t3; -} \ No newline at end of file +}