mirror of
https://github.com/zeldaret/ss
synced 2026-06-24 01:11:25 -04:00
CurrentStageArcManager WIP
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user