diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 6414087d..821c6294 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -127,6 +127,12 @@ toBeSorted/arc_managers/current_stage_arc_manager.cpp: .sbss start:0x80575278 end:0x80575280 .bss start:0x805A0868 end:0x805A08C8 +toBeSorted/arc_managers/oarc_manager.cpp: + .text start:0x80069910 end:0x80069ED4 + .data start:0x8050E010 end:0x8050E038 + .sdata start:0x80571D40 end:0x80571D68 + .sbss start:0x80575280 end:0x80575288 + 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 665363a2..e92c1510 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1552,7 +1552,7 @@ fn_8003D590 = .text:0x8003D590; // type:function size:0x30 fn_8003D5C0 = .text:0x8003D5C0; // type:function size:0x4 fn_8003D5D0 = .text:0x8003D5D0; // type:function size:0xC fn_8003D5E0 = .text:0x8003D5E0; // type:function size:0x68 -fn_8003D650 = .text:0x8003D650; // type:function size:0xD0 +sprintf__16SizedString<128>FPCce = .text:0x8003D650; // type:function size:0xD0 fn_8003D720 = .text:0x8003D720; // type:function size:0x40 fn_8003D760 = .text:0x8003D760; // type:function size:0x11C fn_8003D880 = .text:0x8003D880; // type:function size:0x20C @@ -2750,7 +2750,7 @@ destroy__14dRawArcEntry_cFPv = .text:0x80061D60; // type:function size:0x104 loadArcFromDiskChecked__14dRawArcEntry_cFPCcPCcUcPQ23EGG4Heap = .text:0x80061E70; // type:function size:0x74 loadArcFromDisk__14dRawArcEntry_cFPCcPCcUcPQ23EGG4Heap = .text:0x80061EF0; // type:function size:0xD0 checkArcExistsOnDisk__14dRawArcEntry_cFPCcPCc = .text:0x80061FC0; // type:function size:0x34 -checkArcExistsOnDiskInner__14dRawArcEntry_cFPcPCcPCc = .text:0x80062000; // type:function size:0x9C +checkArcExistsOnDiskInner__14dRawArcEntry_cFR16SizedString<128>PCcPCc = .text:0x80062000; // type:function size:0x9C mount__14dRawArcEntry_cFPCcPvPvUcPQ23EGG4Heap = .text:0x800620A0; // type:function size:0x104 ensureLoadedMaybe__14dRawArcEntry_cFPv = .text:0x800621B0; // type:function size:0x14C onMount__14dRawArcEntry_cFPv = .text:0x80062300; // type:function size:0x5C @@ -3002,23 +3002,23 @@ getCurrentStageDirectory__22CurrentStageArcManagerFv = .text:0x800696B0; // type 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 -fn_800699F0 = .text:0x800699F0; // type:function size:0x34 -fn_80069A30 = .text:0x80069A30; // type:function size:0x48 -fn_80069A80 = .text:0x80069A80; // type:function size:0x44 -fn_80069AD0 = .text:0x80069AD0; // type:function size:0x8 -fn_80069AE0 = .text:0x80069AE0; // type:function size:0x8 -fn_80069AF0 = .text:0x80069AF0; // type:function size:0x30 -fn_80069B20 = .text:0x80069B20; // type:function size:0x8 -fn_80069B30 = .text:0x80069B30; // type:function size:0x10 -fn_80069B40 = .text:0x80069B40; // type:function size:0x10 -fn_80069B50 = .text:0x80069B50; // type:function size:0x10 -fn_80069B60 = .text:0x80069B60; // type:function size:0x178 -fn_80069CE0 = .text:0x80069CE0; // type:function size:0x178 -fn_80069E60 = .text:0x80069E60; // type:function size:0x8 -fn_80069E70 = .text:0x80069E70; // type:function size:0x64 +__ct__11OarcManagerFv = .text:0x80069910; // type:function size:0x44 +__dt__11OarcManagerFv = .text:0x80069960; // type:function size:0x64 +init__11OarcManagerFPQ23EGG4Heap = .text:0x800699D0; // type:function size:0x14 +checkIfObjectArcExistsOnDisk__11OarcManagerFPCc = .text:0x800699F0; // type:function size:0x34 +loadObjectArcFromDisk__11OarcManagerFPCcPQ23EGG4Heap = .text:0x80069A30; // type:function size:0x48 +addEntryFromSuperArc__11OarcManagerFPCcPvPQ23EGG4Heap = .text:0x80069A80; // type:function size:0x44 +ensureLoaded1__11OarcManagerFPCc = .text:0x80069AD0; // type:function size:0x8 +ensureLoaded2__11OarcManagerFPCc = .text:0x80069AE0; // type:function size:0x8 +decrement__11OarcManagerFPCc = .text:0x80069AF0; // type:function size:0x30 +getData__11OarcManagerFPCcPCc = .text:0x80069B20; // type:function size:0x8 +getMdlFromArc2__11OarcManagerFPCc = .text:0x80069B30; // type:function size:0x10 +getMdlFromArc__11OarcManagerFPCc = .text:0x80069B40; // type:function size:0x10 +getZevFromArc__11OarcManagerFPCc = .text:0x80069B50; // type:function size:0x10 +getDzbFromArc__11OarcManagerFPCcPCc = .text:0x80069B60; // type:function size:0x178 +getPlcFromArc__11OarcManagerFPCcPCc = .text:0x80069CE0; // type:function size:0x178 +getSubEntryData__11OarcManagerFPCcPCc = .text:0x80069E60; // type:function size:0x8 +create__11OarcManagerFPQ23EGG4Heap = .text:0x80069E70; // type:function size:0x64 fn_80069EE0 = .text:0x80069EE0; // type:function size:0x6C fn_80069F50 = .text:0x80069F50; // type:function size:0xC fn_80069F60 = .text:0x80069F60; // type:function size:0x88 @@ -30789,7 +30789,7 @@ 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 +__vt__11OarcManager = .data:0x8050E02C; // type:object size:0xC lbl_8050E038 = .data:0x8050E038; // type:object size:0x10 lbl_8050E048 = .data:0x8050E048; // type:object size:0xC lbl_8050E054 = .data:0x8050E054; // type:object size:0xC @@ -35664,7 +35664,7 @@ lbl_80541980 = .data:0x80541980; // type:object size:0x28 lbl_805419A8 = .data:0x805419A8; // type:object size:0x40 lbl_805419E8 = .data:0x805419E8; // type:object size:0xC data:string lbl_805419F4 = .data:0x805419F4; // type:object size:0xC data:string -lbl_80541A00 = .data:0x80541A00; // type:object size:0x10 +@LOCAL@getModuleTypeString__20DynamicModuleControlCFv@REL_LOAD_TYPES = .data:0x80541A00; // type:object size:0x10 __vt__20DynamicModuleControl = .data:0x80541A10; // type:object size:0x30 __vt__24DynamicModuleControlBase = .data:0x80541A40; // type:object size:0x30 lbl_80541A70 = .data:0x80541A70; // type:object size:0x808 @@ -37660,11 +37660,11 @@ 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: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 -lbl_80571D58 = .sdata:0x80571D58; // type:object size:0x8 -lbl_80571D60 = .sdata:0x80571D60; // type:object size:0x8 +lbl_80571D40 = .sdata:0x80571D40; // type:object size:0x7 data:string +lbl_80571D48 = .sdata:0x80571D48; // type:object size:0x5 data:string +lbl_80571D50 = .sdata:0x80571D50; // type:object size:0x5 data:string +lbl_80571D58 = .sdata:0x80571D58; // type:object size:0x5 data:string +lbl_80571D60 = .sdata:0x80571D60; // type:object size:0x5 data:string lbl_80571D68 = .sdata:0x80571D68; // type:object size:0x8 lbl_80571D70 = .sdata:0x80571D70; // type:object size:0x4 lbl_80571D74 = .sdata:0x80571D74; // type:object size:0x4 @@ -39823,7 +39823,7 @@ lbl_80575270 = .sbss:0x80575270; // type:object size:0x1 data:byte lbl_80575274 = .sbss:0x80575274; // type:object size:0x4 data:4byte 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 +sInstance__11OarcManager = .sbss:0x80575280; // type:object size:0x4 data:4byte lbl_80575288 = .sbss:0x80575288; // type:object size:0x8 data:4byte lbl_80575290 = .sbss:0x80575290; // type:object size:0x4 lbl_80575294 = .sbss:0x80575294; // type:object size:0x4 diff --git a/configure.py b/configure.py index 6db3bbcc..508f7951 100644 --- a/configure.py +++ b/configure.py @@ -293,6 +293,7 @@ config.libs = [ 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/arc_managers/oarc_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 61d048f4..53ec867a 100644 --- a/include/d/d_rawarchive.h +++ b/include/d/d_rawarchive.h @@ -19,8 +19,8 @@ public: bool destroy(void *arg); bool loadArcFromDiskChecked(const char *fileName, const char *dirName, u8 mountDirection, EGG::Heap *heap); bool loadArcFromDisk(const char *fileName, const char *dirName, u8 mountDirection, EGG::Heap *heap); - static bool checkArcExistsOnDisk(const char *fileName, const char *dirName); - static bool checkArcExistsOnDiskInner(char *outBuf, const char *fileName, const char *dirName); + static BOOL checkArcExistsOnDisk(const char *fileName, const char *dirName); + static BOOL checkArcExistsOnDiskInner(SizedString<128> &path, const char *fileName, const char *dirName); int mount(const char *name, void *data, void *callbackArg, u8 mountDirection, EGG::Heap *heap); int onMount(void *callbackArg); @@ -84,12 +84,12 @@ public: ~dRawArcTable_c(); bool init(u16 count, void *callbackArg, 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); + BOOL 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); - u32 decreaseRefCount(const char *name); + BOOL 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/include/sized_string.h b/include/sized_string.h index 1d619dda..c1abcd5f 100644 --- a/include/sized_string.h +++ b/include/sized_string.h @@ -17,6 +17,10 @@ struct SizedString { mChars[0] = '\0'; } + SizedString(const char *src) { + operator=(src); + } + char mChars[Size]; char *operator&() { diff --git a/src/d/d_dvd.cpp b/src/d/d_dvd.cpp index 2f7b9cfa..3afda769 100644 --- a/src/d/d_dvd.cpp +++ b/src/d/d_dvd.cpp @@ -1,6 +1,8 @@ #include #include - +// clang-format off +#include +// clang-format on namespace dDvd { /** 800520f0 */ @@ -19,25 +21,20 @@ loader_c::loader_c() { /** 80052130 */ loader_c::~loader_c() {} -// sprintf2 -extern "C" void fn_8003D650(char *out, const char *fmt, ...); - /** 80052170 */ void *loader_c::request(const char *path, u8 mountDirection, EGG::Heap *heap) { - char buf[128]; - if (mpBuffer != nullptr) { return mpBuffer; } if (mpCommand == 0) { mSize = -1; mpHeap = heap != nullptr ? heap : mDvd::getArchiveHeap(); - buf[0] = '\0'; - fn_8003D650(buf, "US%s", path); - if (!mDvd::IsExistPath(buf)) { - fn_8003D650(buf, "%s", path); + SizedString<128> buf; + buf.sprintf("US%s", path); + if (!mDvd::IsExistPath(&buf)) { + buf.sprintf("%s", path); } - mpCommand = mDvd_toMainRam_normal_c::create(buf, mountDirection, heap); + mpCommand = mDvd_toMainRam_normal_c::create(&buf, mountDirection, heap); } if (mpCommand != nullptr && mpCommand->mStatus != 0) { mpBuffer = mpCommand->mDataPtr; diff --git a/src/d/d_rawarchive.cpp b/src/d/d_rawarchive.cpp index 9adc35b4..64bfbaa4 100644 --- a/src/d/d_rawarchive.cpp +++ b/src/d/d_rawarchive.cpp @@ -120,11 +120,10 @@ bool dRawArcEntry_c::destroy(void *arg) { bool dRawArcEntry_c::loadArcFromDiskChecked(const char *fileName, const char *dirName, u8 mountDirection, EGG::Heap *heap) { - char arcPath[128]; - arcPath[0] = '\0'; + SizedString<128> path; - if (checkArcExistsOnDiskInner(arcPath, fileName, dirName)) { - return loadArcFromDisk(fileName, arcPath, mountDirection, heap); + if (checkArcExistsOnDiskInner(path, fileName, dirName)) { + return loadArcFromDisk(fileName, &path, mountDirection, heap); } return false; } @@ -138,20 +137,19 @@ bool dRawArcEntry_c::loadArcFromDisk(const char *arcName, const char *arcPath, u return true; } -bool dRawArcEntry_c::checkArcExistsOnDisk(const char *fileName, const char *dirName) { - char path[128]; - path[0] = '\0'; +BOOL dRawArcEntry_c::checkArcExistsOnDisk(const char *fileName, const char *dirName) { + SizedString<128> path; return checkArcExistsOnDiskInner(path, fileName, dirName); } // sprintf2 extern "C" void fn_8003D650(char *out, const char *fmt, ...); -bool dRawArcEntry_c::checkArcExistsOnDiskInner(char *outBuf, const char *fileName, const char *dirName) { - fn_8003D650(outBuf, "/US/%s/%s.arc", dirName, fileName); - if (!mDvd::IsExistPath(outBuf)) { - fn_8003D650(outBuf, "/%s/%s.arc", dirName, fileName); - if (!mDvd::IsExistPath(outBuf)) { +BOOL dRawArcEntry_c::checkArcExistsOnDiskInner(SizedString<128> &path, const char *fileName, const char *dirName) { + path.sprintf("/US/%s/%s.arc", dirName, fileName); + if (!mDvd::IsExistPath(&path)) { + path.sprintf("/%s/%s.arc", dirName, fileName); + if (!mDvd::IsExistPath(&path)) { return false; } } @@ -249,7 +247,7 @@ bool dRawArcTable_c::init(u16 count, void *callbackArg, EGG::Heap *heap) { return true; } -u32 dRawArcTable_c::getArcOrLoadFromDisk(const char *name, const char *dirName, u8 mountDirection, EGG::Heap *heap) { +BOOL dRawArcTable_c::getArcOrLoadFromDisk(const char *name, const char *dirName, u8 mountDirection, EGG::Heap *heap) { dRawArcEntry_c *entry = findEntry(name); if (entry == nullptr) { entry = findEmptySlot(); @@ -266,7 +264,7 @@ u32 dRawArcTable_c::getArcOrLoadFromDisk(const char *name, const char *dirName, return true; } -bool dRawArcTable_c::addEntryFromSuperArc(const char *name, void *data, u8 mountDirection, EGG::Heap *heap) { +BOOL dRawArcTable_c::addEntryFromSuperArc(const char *name, void *data, u8 mountDirection, EGG::Heap *heap) { dRawArcEntry_c *entry = findEntry(name); if (entry == nullptr) { entry = findEmptySlot(); @@ -303,7 +301,7 @@ bool dRawArcTable_c::hasEntry(const char *name) { return findEntry(name) != nullptr; } -u32 dRawArcTable_c::decreaseRefCount(const char *name) { +BOOL 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 index 87b1dd91..0e1d7111 100644 --- a/src/toBeSorted/arc_managers/current_stage_arc_manager.cpp +++ b/src/toBeSorted/arc_managers/current_stage_arc_manager.cpp @@ -54,8 +54,6 @@ 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 = newStage; diff --git a/src/toBeSorted/arc_managers/oarc_manager.cpp b/src/toBeSorted/arc_managers/oarc_manager.cpp new file mode 100644 index 00000000..61a3b650 --- /dev/null +++ b/src/toBeSorted/arc_managers/oarc_manager.cpp @@ -0,0 +1,124 @@ +#include +#include +#include +// clang-format off +#include +// clang-format on + +class OarcManager { + OarcManager(); + virtual ~OarcManager(); + + dRawArcTable_c mArcTable; + + static OarcManager *sInstance; + + static bool create(EGG::Heap *heap); + + void init(EGG::Heap *heap); + + bool checkIfObjectArcExistsOnDisk(const char *object); + bool loadObjectArcFromDisk(const char *object, EGG::Heap *heap); + bool addEntryFromSuperArc(const char *object, void *data, EGG::Heap *heap); + void ensureLoaded1(const char *object); + void ensureLoaded2(const char *object); + bool decrement(const char *path); + void *getData(const char *oarcName, const char *fileName); + + void *getMdlFromArc2(const char *oarcName); + void *getMdlFromArc(const char *oarcName); + void *getZevFromArc(const char *oarcName); + void *getDzbFromArc(const char *oarcName, const char *fileName); + void *getPlcFromArc(const char *oarcName, const char *fileName); + void *getSubEntryData(const char *oarcName, const char *fileName); +}; + +OarcManager *OarcManager::sInstance; + +OarcManager::OarcManager() { + sInstance = this; +} + +OarcManager::~OarcManager() { + sInstance = nullptr; +} + +extern char lbl_80575250; + +void OarcManager::init(EGG::Heap *heap) { + mArcTable.init(200, &lbl_80575250, heap); +} + +bool OarcManager::checkIfObjectArcExistsOnDisk(const char *object) { + return dRawArcEntry_c::checkArcExistsOnDisk(object, "Object"); +} + +bool OarcManager::loadObjectArcFromDisk(const char *object, EGG::Heap *heap) { + if (heap == nullptr) { + heap = dHeap::work2Heap.heap; + } + return mArcTable.getArcOrLoadFromDisk(object, "Object", 0, heap); +} + +bool OarcManager::addEntryFromSuperArc(const char *object, void *data, EGG::Heap *heap) { + if (heap == nullptr) { + heap = EGG::Heap::sCurrentHeap; + } + return mArcTable.addEntryFromSuperArc(object, data, 0, heap); +} + +void OarcManager::ensureLoaded1(const char *object) { + mArcTable.ensureLoadedMaybe2(object); +} + +void OarcManager::ensureLoaded2(const char *object) { + mArcTable.ensureLoadedMaybe(object); +} + +bool OarcManager::decrement(const char *path) { + return mArcTable.decreaseRefCount(path); +} + +void *OarcManager::getData(const char *oarcName, const char *fileName) { + return mArcTable.getDataFromOarc(oarcName, fileName); +} + +void *OarcManager::getMdlFromArc2(const char *oarcName) { + return mArcTable.getDataFromOarc(oarcName, "g3d/model.brres"); +} + +void *OarcManager::getMdlFromArc(const char *oarcName) { + return mArcTable.getSubEntryData(oarcName, "g3d/model.brres"); +} + +void *OarcManager::getZevFromArc(const char *oarcName) { + return mArcTable.getDataFromOarc(oarcName, "dat/zev.dat"); +} + +void *OarcManager::getDzbFromArc(const char *oarcName, const char *fileName) { + SizedString<32> str = "dzb/"; + str += fileName; + str += ".dzb"; + return mArcTable.getDataFromOarc(oarcName, &str); +} + +void *OarcManager::getPlcFromArc(const char *oarcName, const char *fileName) { + SizedString<32> str = "dat/"; + str += fileName; + str += ".plc"; + return mArcTable.getDataFromOarc(oarcName, &str); +} + +void *OarcManager::getSubEntryData(const char *oarcName, const char *fileName) { + return mArcTable.getSubEntryData(oarcName, fileName); +} + +bool OarcManager::create(EGG::Heap *heap) { + new (heap, 0x04) OarcManager(); + + if (OarcManager::sInstance == nullptr) { + return false; + } + OarcManager::sInstance->init(heap); + return true; +}