From be163e6de709e5d44ed3faf38b69202d16bfe6b0 Mon Sep 17 00:00:00 2001 From: robojumper Date: Tue, 28 May 2024 23:15:30 +0200 Subject: [PATCH] CurrentStageArcManager WIP --- config/SOUE01/splits.txt | 8 + config/SOUE01/symbols.txt | 66 +++--- configure.py | 1 + include/d/d_rawarchive.h | 4 +- src/d/d_rawarchive.cpp | 4 +- .../current_stage_arc_manager.cpp | 205 ++++++++++++++++++ 6 files changed, 251 insertions(+), 37 deletions(-) create mode 100644 src/toBeSorted/arc_managers/current_stage_arc_manager.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index d9385aba..6414087d 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -119,6 +119,14 @@ d/d_stage.cpp: d/d_sys.cpp: .text start:0x80064250 end:0x80064920 +toBeSorted/arc_managers/current_stage_arc_manager.cpp: + .text start:0x80068FD0 end:0x80069910 + .ctors start:0x804DB6A8 end:0x804DB6AC + .data start:0x8050DFE0 end:0x8050E010 + .sdata start:0x80571D30 end:0x80571D40 + .sbss start:0x80575278 end:0x80575280 + .bss start:0x805A0868 end:0x805A08C8 + toBeSorted/sceneflag_manager.cpp: .text start:0x800BD8C0 end:0x800BE7A8 .sbss start:0x805753E0 end:0x805753F0 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index d978003d..665363a2 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -723,7 +723,7 @@ fn_8001F680 = .text:0x8001F680; // type:function size:0x70 fn_8001F6F0 = .text:0x8001F6F0; // type:function size:0x4 fn_8001F700 = .text:0x8001F700; // type:function size:0xA8 fn_8001F7B0 = .text:0x8001F7B0; // type:function size:0x64 -fn_8001F820 = .text:0x8001F820; // type:function size:0xD0 +sprintf__15SizedString<32>FPCce = .text:0x8001F820; // type:function size:0xD0 fn_8001F8F0 = .text:0x8001F8F0; // type:function size:0x14 fn_8001F910 = .text:0x8001F910; // type:function size:0xD4 fn_8001F9F0 = .text:0x8001F9F0; // type:function size:0xB4 @@ -2982,26 +2982,26 @@ fn_80068E70 = .text:0x80068E70; // type:function size:0xC fn_80068E80 = .text:0x80068E80; // type:function size:0x6C fn_80068EF0 = .text:0x80068EF0; // type:function size:0xC0 fn_80068FB0 = .text:0x80068FB0; // type:function size:0x20 -fn_80068FD0 = .text:0x80068FD0; // type:function size:0x54 -fn_80069030 = .text:0x80069030; // type:function size:0x64 -fn_800690A0 = .text:0x800690A0; // type:function size:0x14 -fn_800690C0 = .text:0x800690C0; // type:function size:0x218 -fn_800692E0 = .text:0x800692E0; // type:function size:0x38 -fn_80069320 = .text:0x80069320; // type:function size:0x14 -fn_80069340 = .text:0x80069340; // type:function size:0x14 -fn_80069360 = .text:0x80069360; // type:function size:0x10C -fn_80069470 = .text:0x80069470; // type:function size:0x5C -fn_800694D0 = .text:0x800694D0; // type:function size:0x74 -fn_80069550 = .text:0x80069550; // type:function size:0x38 -fn_80069590 = .text:0x80069590; // type:function size:0x3C -fn_800695D0 = .text:0x800695D0; // type:function size:0x28 -fn_80069600 = .text:0x80069600; // type:function size:0x48 -fn_80069650 = .text:0x80069650; // type:function size:0x48 -fn_800696A0 = .text:0x800696A0; // type:function size:0x8 -fn_800696B0 = .text:0x800696B0; // type:function size:0x12C -fn_800697E0 = .text:0x800697E0; // type:function size:0xB0 -fn_80069890 = .text:0x80069890; // type:function size:0x64 -fn_80069900 = .text:0x80069900; // type:function size:0x10 +__ct__22CurrentStageArcManagerFv = .text:0x80068FD0; // type:function size:0x54 +__dt__22CurrentStageArcManagerFv = .text:0x80069030; // type:function size:0x64 +init__22CurrentStageArcManagerFPQ23EGG4Heap = .text:0x800690A0; // type:function size:0x14 +setStage__22CurrentStageArcManagerFPCc = .text:0x800690C0; // type:function size:0x218 +decrement__22CurrentStageArcManagerFv = .text:0x800692E0; // type:function size:0x38 +getData__22CurrentStageArcManagerFPCc = .text:0x80069320; // type:function size:0x14 +getFileFromCurrentLay0Arc__22CurrentStageArcManagerFPCc = .text:0x80069340; // type:function size:0x14 +loadFileFromExtraLayerArc__22CurrentStageArcManagerFi = .text:0x80069360; // type:function size:0x10C +unloadExtraLayerArc__22CurrentStageArcManagerFv = .text:0x80069470; // type:function size:0x5C +loadRoomArc__22CurrentStageArcManagerFi = .text:0x800694D0; // type:function size:0x74 +addEntryFromSuperArc__22CurrentStageArcManagerFPCcPv = .text:0x80069550; // type:function size:0x38 +unloadRoomArc__22CurrentStageArcManagerFi = .text:0x80069590; // type:function size:0x3C +decrement__22CurrentStageArcManagerFPCc = .text:0x800695D0; // type:function size:0x28 +loadFromRoomArc__22CurrentStageArcManagerFiPCc = .text:0x80069600; // type:function size:0x48 +getDataFromRoomArc__22CurrentStageArcManagerFiPCc = .text:0x80069650; // type:function size:0x48 +getHeap__Fv = .text:0x800696A0; // type:function size:0x8 +getCurrentStageDirectory__22CurrentStageArcManagerFv = .text:0x800696B0; // type:function size:0x12C +getRoomArcDirectory__22CurrentStageArcManagerCFi = .text:0x800697E0; // type:function size:0xB0 +create__22CurrentStageArcManagerFPQ23EGG4Heap = .text:0x80069890; // type:function size:0x64 +__sinit_\current_stage_arc_manager_cpp = .text:0x80069900; // type:function size:0x10 scope:local fn_80069910 = .text:0x80069910; // type:function size:0x44 fn_80069960 = .text:0x80069960; // type:function size:0x64 fn_800699D0 = .text:0x800699D0; // type:function size:0x14 @@ -30762,8 +30762,8 @@ lbl_8050DD58 = .data:0x8050DD58; // type:object size:0x18 lbl_8050DD70 = .data:0x8050DD70; // type:object size:0x30 lbl_8050DDA0 = .data:0x8050DDA0; // type:object size:0x18 lbl_8050DDB8 = .data:0x8050DDB8; // type:object size:0x20 -lbl_8050DDD8 = .data:0x8050DDD8; // type:object size:0x10 -lbl_8050DDE8 = .data:0x8050DDE8; // type:object size:0x10 +lbl_8050DDD8 = .data:0x8050DDD8; // type:object size:0xE data:string +lbl_8050DDE8 = .data:0x8050DDE8; // type:object size:0xB data:string lbl_8050DDF8 = .data:0x8050DDF8; // type:object size:0x50 lbl_8050DE48 = .data:0x8050DE48; // type:object size:0x10 lbl_8050DE58 = .data:0x8050DE58; // type:object size:0x5C @@ -30783,10 +30783,10 @@ lbl_8050DFB0 = .data:0x8050DFB0; // type:object size:0xC lbl_8050DFBC = .data:0x8050DFBC; // type:object size:0xC lbl_8050DFC8 = .data:0x8050DFC8; // type:object size:0xC lbl_8050DFD4 = .data:0x8050DFD4; // type:object size:0xC -lbl_8050DFE0 = .data:0x8050DFE0; // type:object size:0xC -lbl_8050DFEC = .data:0x8050DFEC; // type:object size:0xC -lbl_8050DFF8 = .data:0x8050DFF8; // type:object size:0xC -lbl_8050E004 = .data:0x8050E004; // type:object size:0xC +lbl_8050DFE0 = .data:0x8050DFE0; // type:object size:0xA data:string +lbl_8050DFEC = .data:0x8050DFEC; // type:object size:0xB data:string +lbl_8050DFF8 = .data:0x8050DFF8; // type:object size:0x9 data:string +__vt__22CurrentStageArcManager = .data:0x8050E004; // type:object size:0xC lbl_8050E010 = .data:0x8050E010; // type:object size:0x10 data:string lbl_8050E020 = .data:0x8050E020; // type:object size:0xC data:string lbl_8050E02C = .data:0x8050E02C; // type:object size:0xC @@ -37658,8 +37658,8 @@ lbl_80571D10 = .sdata:0x80571D10; // type:object size:0x8 lbl_80571D18 = .sdata:0x80571D18; // type:object size:0x8 lbl_80571D20 = .sdata:0x80571D20; // type:object size:0x8 lbl_80571D28 = .sdata:0x80571D28; // type:object size:0x8 data:string -lbl_80571D30 = .sdata:0x80571D30; // type:object size:0x8 -lbl_80571D38 = .sdata:0x80571D38; // type:object size:0x8 +lbl_80571D30 = .sdata:0x80571D30; // type:object size:0x7 data:string +lbl_80571D38 = .sdata:0x80571D38; // type:object size:0x7 data:string lbl_80571D40 = .sdata:0x80571D40; // type:object size:0x8 lbl_80571D48 = .sdata:0x80571D48; // type:object size:0x8 lbl_80571D50 = .sdata:0x80571D50; // type:object size:0x8 @@ -39821,8 +39821,8 @@ lbl_80575260 = .sbss:0x80575260; // type:object size:0x8 data:4byte lbl_80575268 = .sbss:0x80575268; // type:object size:0x8 data:4byte lbl_80575270 = .sbss:0x80575270; // type:object size:0x1 data:byte lbl_80575274 = .sbss:0x80575274; // type:object size:0x4 data:4byte -lbl_80575278 = .sbss:0x80575278; // type:object size:0x4 data:4byte -lbl_8057527C = .sbss:0x8057527C; // type:object size:0x1 data:byte +sInstance__22CurrentStageArcManager = .sbss:0x80575278; // type:object size:0x4 data:4byte +@GUARD@getCurrentStageDirectory__22CurrentStageArcManagerFv@sStageDirTmp = .sbss:0x8057527C; // type:object size:0x1 data:byte lbl_80575280 = .sbss:0x80575280; // type:object size:0x8 data:4byte lbl_80575288 = .sbss:0x80575288; // type:object size:0x8 data:4byte lbl_80575290 = .sbss:0x80575290; // type:object size:0x4 @@ -48208,8 +48208,8 @@ lbl_805A07E4 = .bss:0x805A07E4; // type:object size:0xC lbl_805A07F0 = .bss:0x805A07F0; // type:object size:0xC lbl_805A07FC = .bss:0x805A07FC; // type:object size:0x44 data:byte lbl_805A0840 = .bss:0x805A0840; // type:object size:0x28 data:byte -lbl_805A0868 = .bss:0x805A0868; // type:object size:0x40 data:byte -lbl_805A08A8 = .bss:0x805A08A8; // type:object size:0x20 data:byte +@LOCAL@getCurrentStageDirectory__22CurrentStageArcManagerFv@sStageDirTmp = .bss:0x805A0868; // type:object size:0x40 data:byte +s_roomArcTmp = .bss:0x805A08A8; // type:object size:0x20 data:byte lbl_805A08C8 = .bss:0x805A08C8; // type:object size:0x138 data:2byte lbl_805A0A00 = .bss:0x805A0A00; // type:object size:0x28 data:byte lbl_805A0A28 = .bss:0x805A0A28; // type:object size:0x28 data:byte diff --git a/configure.py b/configure.py index 4d2e457c..6db3bbcc 100644 --- a/configure.py +++ b/configure.py @@ -292,6 +292,7 @@ config.libs = [ Object(NonMatching, "d/d_sys.cpp"), Object(NonMatching, "d/a/d_a_base.cpp"), Object(NonMatching, "d/a/obj/d_a_obj_base.cpp"), + Object(Matching, "toBeSorted/arc_managers/current_stage_arc_manager.cpp"), Object(Matching, "toBeSorted/save_file.cpp"), Object(Matching, "toBeSorted/counters/counter.cpp"), Object(Matching, "toBeSorted/counters/rupee_counter.cpp"), diff --git a/include/d/d_rawarchive.h b/include/d/d_rawarchive.h index 7432f3f3..43abc63c 100644 --- a/include/d/d_rawarchive.h +++ b/include/d/d_rawarchive.h @@ -81,12 +81,12 @@ public: ~dRawArcTable_c(); bool init(u16 count, void *callbackArg, EGG::Heap *heap); - bool getArcOrLoadFromDisk(const char *name, const char *dirName, u8 mountDirection, EGG::Heap *heap); + u32 getArcOrLoadFromDisk(const char *name, const char *dirName, u8 mountDirection, EGG::Heap *heap); bool addEntryFromSuperArc(const char *name, void *data, u8 mountDirection, EGG::Heap *heap); int ensureLoadedMaybe2(const char *name); int ensureLoadedMaybe(const char *name); bool hasEntry(const char *name); - bool decreaseRefCount(const char *name); + u32 decreaseRefCount(const char *name); void *getDataFromOarc(const char *name, const char *path); void *getSubEntryData(const char *name, const char *path); void *getLoadedArcData(const char *name); diff --git a/src/d/d_rawarchive.cpp b/src/d/d_rawarchive.cpp index 279bfd2c..7a1da9d5 100644 --- a/src/d/d_rawarchive.cpp +++ b/src/d/d_rawarchive.cpp @@ -251,7 +251,7 @@ bool dRawArcTable_c::init(u16 count, void *callbackArg, EGG::Heap *heap) { return true; } -bool dRawArcTable_c::getArcOrLoadFromDisk(const char *name, const char *dirName, u8 mountDirection, EGG::Heap *heap) { +u32 dRawArcTable_c::getArcOrLoadFromDisk(const char *name, const char *dirName, u8 mountDirection, EGG::Heap *heap) { dRawArcEntry_c *entry = findEntry(name); if (entry == nullptr) { entry = findEmptySlot(); @@ -305,7 +305,7 @@ bool dRawArcTable_c::hasEntry(const char *name) { return findEntry(name) != nullptr; } -bool dRawArcTable_c::decreaseRefCount(const char *name) { +u32 dRawArcTable_c::decreaseRefCount(const char *name) { dRawArcEntry_c *entry = findEntry(name); if (entry == nullptr) { return false; diff --git a/src/toBeSorted/arc_managers/current_stage_arc_manager.cpp b/src/toBeSorted/arc_managers/current_stage_arc_manager.cpp new file mode 100644 index 00000000..6f0f33bd --- /dev/null +++ b/src/toBeSorted/arc_managers/current_stage_arc_manager.cpp @@ -0,0 +1,205 @@ +#include +#include +#include +// clang-format off +#include +// clang-format on + +template +struct SizedString { + SizedString() { + mChars[0] = '\0'; + } + + char mChars[Size]; + + char *operator&() { + return mChars; + } + + const char *operator&() const { + return mChars; + } + + inline void set(const char *src) { + if (src != mChars) { + mChars[0] = '\0'; + append(src); + } + } + + inline void append(const char *src) { + if (src != nullptr) { + size_t destLen = strlen(mChars); + size_t copyLen = strlen(src); + + // Make sure copy length isnt more than destination length + if (destLen + copyLen + 1 >= Size) { + size_t tmpLen = Size - destLen; + copyLen = tmpLen - 1; + } + + strncpy(mChars + destLen, src, copyLen); + + // make sure string is null terminated + size_t offset = destLen + copyLen; + mChars[offset] = '\0'; + } + } + + void sprintf(const char *fmt, ...); +}; + +class CurrentStageArcManager { + CurrentStageArcManager(); + virtual ~CurrentStageArcManager(); + + SizedString<32> mStageName; + SizedString<32> mCurrentLoadingStageArcName; + SizedString<32> mStageExtraLayerArcName; + + dRawArcTable_c mArcTable; + + static CurrentStageArcManager *sInstance; + + static bool create(EGG::Heap *heap); + + void init(EGG::Heap *heap); + bool setStage(const char *stage); + bool decrement(); + void *getData(const char *fileName); + void *getFileFromCurrentLay0Arc(const char *fileName); + bool loadFileFromExtraLayerArc(int layer); + bool unloadExtraLayerArc(); + bool loadRoomArc(int room); + bool addEntryFromSuperArc(const char *name, void *data); + bool unloadRoomArc(int room); + bool decrement(const char *path); + void *loadFromRoomArc(int roomId, const char *fileName); + void *getDataFromRoomArc(int roomId, const char *fileName); + const char *getCurrentStageDirectory(); + const char *getRoomArcDirectory(int room) const; + + static EGG::ExpHeap *getHeap(); +}; + +CurrentStageArcManager *CurrentStageArcManager::sInstance; + +CurrentStageArcManager::CurrentStageArcManager() { + sInstance = this; +} + +CurrentStageArcManager::~CurrentStageArcManager() { + sInstance = nullptr; +} + +extern char lbl_80575250; + +void CurrentStageArcManager::init(EGG::Heap *heap) { + mArcTable.init(18, &lbl_80575250, heap); +} + +// sprintf +extern "C" void fn_8001F820(char *str, const char *src, ...); + +bool CurrentStageArcManager::setStage(const char *newStage) { + mStageName.set(newStage); + + mCurrentLoadingStageArcName.sprintf("%s_stg_l0", mStageName); + if (dRawArcEntry_c::checkArcExistsOnDisk(&mCurrentLoadingStageArcName, getCurrentStageDirectory())) { + return (bool)mArcTable.getArcOrLoadFromDisk(&mCurrentLoadingStageArcName, getCurrentStageDirectory(), 0, + dHeap::work2Heap.heap); + } else { + mCurrentLoadingStageArcName.sprintf("%s_stg", mStageName); + return (bool)mArcTable.getArcOrLoadFromDisk(&mCurrentLoadingStageArcName, getCurrentStageDirectory(), 0, + dHeap::work2Heap.heap); + } +} + +bool CurrentStageArcManager::decrement() { + return mArcTable.decreaseRefCount(&mCurrentLoadingStageArcName); +} + +void *CurrentStageArcManager::getData(const char *fileName) { + return mArcTable.getDataFromOarc(&mCurrentLoadingStageArcName, fileName); +} + +void *CurrentStageArcManager::getFileFromCurrentLay0Arc(const char *fileName) { + return mArcTable.getSubEntryData(&mCurrentLoadingStageArcName, fileName); +} + +bool CurrentStageArcManager::loadFileFromExtraLayerArc(int layer) { + if (layer == 0) { + return true; + } + + mStageExtraLayerArcName.sprintf("%s_stg_l%d", mStageName, layer); + if (dRawArcEntry_c::checkArcExistsOnDisk(&mStageExtraLayerArcName, getCurrentStageDirectory())) { + return (bool)mArcTable.getArcOrLoadFromDisk(&mStageExtraLayerArcName, getCurrentStageDirectory(), 0, + dHeap::work2Heap.heap); + } else { + return true; + } +} + +bool CurrentStageArcManager::unloadExtraLayerArc() { + if (mArcTable.hasEntry(&mStageExtraLayerArcName)) { + return mArcTable.decreaseRefCount(&mStageExtraLayerArcName); + } + return true; +} + +bool CurrentStageArcManager::loadRoomArc(int room) { + return (bool)mArcTable.getArcOrLoadFromDisk(getRoomArcDirectory(room), getCurrentStageDirectory(), 0, dHeap::work2Heap.heap); +} + +bool CurrentStageArcManager::addEntryFromSuperArc(const char *path, void *data) { + return (bool)mArcTable.addEntryFromSuperArc(path, data, 0, EGG::Heap::sCurrentHeap); +} + +bool CurrentStageArcManager::unloadRoomArc(int room) { + mArcTable.decreaseRefCount(getRoomArcDirectory(room)); + return true; +} + +bool CurrentStageArcManager::decrement(const char *path) { + mArcTable.decreaseRefCount(path); + return true; +} + +void *CurrentStageArcManager::loadFromRoomArc(int roomId, const char *fileName) { + return mArcTable.getDataFromOarc(getRoomArcDirectory(roomId), fileName); +} + +void *CurrentStageArcManager::getDataFromRoomArc(int roomId, const char *fileName) { + return mArcTable.getSubEntryData(getRoomArcDirectory(roomId), fileName); +} + +EGG::ExpHeap *getHeap() { + return dHeap::workExHeap.heap; +} + +const char *CurrentStageArcManager::getCurrentStageDirectory() { + static SizedString<64> sStageDirTmp; + sStageDirTmp.set("Stage/"); + sStageDirTmp.append(&mStageName); + + return &sStageDirTmp; +} + +static SizedString<32> s_roomArcTmp; + +const char *CurrentStageArcManager::getRoomArcDirectory(int room) const { + s_roomArcTmp.sprintf("%s_r%02d", mStageName, room); + return &s_roomArcTmp; +} + +bool CurrentStageArcManager::create(EGG::Heap *heap) { + new (heap, 0x04) CurrentStageArcManager(); + + if (CurrentStageArcManager::sInstance == nullptr) { + return false; + } + CurrentStageArcManager::sInstance->init(heap); + return true; +}