CurrentStageArcManager WIP

This commit is contained in:
robojumper
2024-05-28 23:15:30 +02:00
parent 82d7176ed1
commit be163e6de7
6 changed files with 251 additions and 37 deletions
+8
View File
@@ -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
+33 -33
View File
@@ -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
+1
View File
@@ -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"),
+2 -2
View File
@@ -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);
+2 -2
View File
@@ -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;
@@ -0,0 +1,205 @@
#include <d/d_heap.h>
#include <d/d_rawarchive.h>
#include <egg/core/eggHeap.h>
// clang-format off
#include <MSL_C/string.h>
// clang-format on
template <size_t Size>
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;
}