diff options
| author | robojumper <robojumper@gmail.com> | 2024-05-02 00:10:44 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2024-05-02 00:44:15 +0200 |
| commit | 210e350ee02a8d6348fdddf0792ecd772ab7a784 (patch) | |
| tree | 183f3914fd5bed02719ca077c71db1ec84a63b39 /src/toBeSorted | |
| parent | cc3b62d6c131fd54db75b7dbc76b1fc7659f25ca (diff) | |
some crc
Diffstat (limited to 'src/toBeSorted')
| -rw-r--r-- | src/toBeSorted/file_manager.cpp | 237 | ||||
| -rw-r--r-- | src/toBeSorted/save_file.cpp | 40 |
2 files changed, 234 insertions, 43 deletions
diff --git a/src/toBeSorted/file_manager.cpp b/src/toBeSorted/file_manager.cpp index 436720f2..cde98210 100644 --- a/src/toBeSorted/file_manager.cpp +++ b/src/toBeSorted/file_manager.cpp @@ -1,25 +1,27 @@ #include "toBeSorted/file_manager.h" #include "f/f_base.h" #include <m/m_heap.h> -#include "libc.h" +// #include "libc.h" +#include <MSL_C/string.h> // 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 -UnkClass UnkClass::sInstance; +/* 80574FF8 */ UnkClass UnkClass::sInstance; -UnkClass::UnkClass() {} -UnkClass::~UnkClass() {} +/* 80009D30 */ UnkClass::UnkClass() {} +/* 80009D40 */ UnkClass::~UnkClass() {} -FileManager *FileManager::sInstance; +/* 80574FFC */ FileManager *FileManager::sInstance; extern "C" { /* 80009D80 */ void fn_80009D80() {} // return @@ -39,8 +41,9 @@ extern "C" { mHeroName[0] = '\0'; mCurrentArea[0] = '\0'; sInstance = this; - mpSavedSaveFiles = mHeap::g_gameHeaps[0]->alloc(0xfbe0, 0x20); - mpSkipData = mHeap::g_gameHeaps[0]->alloc(0x80, 0x20); + // 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(); @@ -96,7 +99,58 @@ u16* FileManager::getStoryFlagsMut() { /* 8000AA30 */ u16* FileManager::getSkipFlags() {} /* 8000AA40 */ void FileManager::setSkipFlagsChecked(u16* flags, u32 offset, u16 count) {} -/* 8000AAA0 */ void FileManager::initFile(int fileNum) {} +inline void strncat(char *dest, const char *src, size_t count) { + if (dest != src) { + dest[0] = '\0'; + if (src != nullptr) { + size_t len = strlen(dest); + size_t count = strlen(src); + count = len + count + 1 >= 0x20 ? 0x1f - len : count; + strncpy(dest + len, src, count)[count] = '\0'; + } + } +} + +/* 8000AAA0 */ void FileManager::initFile(int fileNum) { + SaveFile *file; + char buf[0x20]; + + mIsFileInvalid[1] = 1; + 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; + + buf[0] = '\0'; + strncat(buf, "F405", 0x20); + /* + buf[0] = '\0'; + // TODO looks like an inlined strncat, + // hence the needless comparison to a .data string + // Not sure how we can do this? + // strncat(buf, etc, 0x20); + if (etc != buf) { + buf[0] = '\0'; + if (etc != nullptr) { + size_t len = strlen(buf); + size_t count = strlen(etc); + count = len + count + 1 >= 0x20 ? 0x1f - len : count; + strncpy(buf + len, etc, count)[count] = '\0'; + } + }*/ + 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() {} @@ -229,29 +283,163 @@ 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; + int i; + for (data = &mpSkipData[0], i = 0; i < 3; i++, data++) { + u32 crc = calcFileCRC(data->data, sizeof(data->data)); + if (crc == data->crc) { + mIsFileSkipDataDirty[i & 0xff] = 0; + } else { + mIsFileSkipDataDirty[i & 0xff] = 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() { + 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[0]; + 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; + } -/* 80010000 */ void FileManager::initBlankSaveFiles() {} -/* 80010160 */ void FileManager::initSkipData() {} + 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[0]; 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() { @@ -264,14 +452,17 @@ u16* FileManager::getStoryFlagsMut() { /* 80011270 */ SaveFile* FileManager::getFileB() { return &mFileB; } -/* 80011280 */ void FileManager::calcFileCRC(const SaveFile* file, u32 length) {} -/* 80011290 */ void FileManager::updateEmptyFiles() {} +/* 80011280 */ u32 FileManager::calcFileCRC(const void *data, u32 length) {} +/* 80011290 */ void FileManager::updateEmptyFiles() { + updateEmptyFileFlags(); + refreshSaveFileData(); +} /* 800112D0 */ void FileManager::updateEmptyFileFlags() {} /* 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() const { fBase_c* actor = fManager_c::searchBaseByGroupType(1, nullptr); diff --git a/src/toBeSorted/save_file.cpp b/src/toBeSorted/save_file.cpp index d55d11f3..c41f1fcb 100644 --- a/src/toBeSorted/save_file.cpp +++ b/src/toBeSorted/save_file.cpp @@ -5,7 +5,7 @@ u16* SaveFile::getStoryFlags0() { return story_flags; } -// 0x800099c0 getStoryFlags1__8SaveFileFv +// 0x800099c0 getStoryFlags1__8SaveFileCFv const u16* SaveFile::getStoryFlags1() const { return story_flags; } @@ -13,60 +13,60 @@ const u16* SaveFile::getStoryFlags1() const { 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; } |
