From 7d8831508e72c43ab5bac9e03d79256ede991a30 Mon Sep 17 00:00:00 2001 From: robojumper Date: Wed, 29 May 2024 23:02:12 +0200 Subject: [PATCH] Layout arc manager --- config/SOUE01/splits.txt | 6 ++ config/SOUE01/symbols.txt | 28 +++---- configure.py | 1 + .../arc_managers/layout_arc_manager.cpp | 84 +++++++++++++++++++ 4 files changed, 105 insertions(+), 14 deletions(-) create mode 100644 src/toBeSorted/arc_managers/layout_arc_manager.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 821c6294..780ca726 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -133,6 +133,12 @@ toBeSorted/arc_managers/oarc_manager.cpp: .sdata start:0x80571D40 end:0x80571D68 .sbss start:0x80575280 end:0x80575288 +toBeSorted/arc_managers/layout_arc_manager.cpp: + .text start:0x8006A0C0 end:0x8006A2D4 + .data start:0x8050E048 end:0x8050E054 + .sdata start:0x80571D68 end:0x80571D70 + .sbss start:0x80575288 end:0x80575290 + 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 e92c1510..309f9c48 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3023,17 +3023,17 @@ fn_80069EE0 = .text:0x80069EE0; // type:function size:0x6C fn_80069F50 = .text:0x80069F50; // type:function size:0xC fn_80069F60 = .text:0x80069F60; // type:function size:0x88 fn_80069FF0 = .text:0x80069FF0; // type:function size:0xC4 -fn_8006A0C0 = .text:0x8006A0C0; // type:function size:0x44 -fn_8006A110 = .text:0x8006A110; // type:function size:0x64 -fn_8006A180 = .text:0x8006A180; // type:function size:0x14 -fn_8006A1A0 = .text:0x8006A1A0; // type:function size:0x48 -fn_8006A1F0 = .text:0x8006A1F0; // type:function size:0x8 -fn_8006A200 = .text:0x8006A200; // type:function size:0x8 -fn_8006A210 = .text:0x8006A210; // type:function size:0x8 -fn_8006A220 = .text:0x8006A220; // type:function size:0x30 -fn_8006A250 = .text:0x8006A250; // type:function size:0x8 -fn_8006A260 = .text:0x8006A260; // type:function size:0x8 -fn_8006A270 = .text:0x8006A270; // type:function size:0x64 +__ct__16LayoutArcManagerFv = .text:0x8006A0C0; // type:function size:0x44 +__dt__16LayoutArcManagerFv = .text:0x8006A110; // type:function size:0x64 +init__16LayoutArcManagerFPQ23EGG4Heap = .text:0x8006A180; // type:function size:0x14 +loadLayoutArcFromDisk__16LayoutArcManagerFPCcPQ23EGG4Heap = .text:0x8006A1A0; // type:function size:0x48 +ensureLoaded1__16LayoutArcManagerFPCc = .text:0x8006A1F0; // type:function size:0x8 +ensureLoaded2__16LayoutArcManagerFPCc = .text:0x8006A200; // type:function size:0x8 +hasEntry__16LayoutArcManagerFPCc = .text:0x8006A210; // type:function size:0x8 +decrement__16LayoutArcManagerFPCc = .text:0x8006A220; // type:function size:0x30 +getData__16LayoutArcManagerFPCcPCc = .text:0x8006A250; // type:function size:0x8 +getLoadedData__16LayoutArcManagerFPCc = .text:0x8006A260; // type:function size:0x8 +create__16LayoutArcManagerFPQ23EGG4Heap = .text:0x8006A270; // type:function size:0x64 fn_8006A2E0 = .text:0x8006A2E0; // type:function size:0x6C fn_8006A350 = .text:0x8006A350; // type:function size:0xC fn_8006A360 = .text:0x8006A360; // type:function size:0x88 @@ -30791,7 +30791,7 @@ lbl_8050E010 = .data:0x8050E010; // type:object size:0x10 data:string lbl_8050E020 = .data:0x8050E020; // type:object size:0xC data:string __vt__11OarcManager = .data:0x8050E02C; // type:object size:0xC lbl_8050E038 = .data:0x8050E038; // type:object size:0x10 -lbl_8050E048 = .data:0x8050E048; // type:object size:0xC +__vt__16LayoutArcManager = .data:0x8050E048; // type:object size:0xC lbl_8050E054 = .data:0x8050E054; // type:object size:0xC lbl_8050E060 = .data:0x8050E060; // type:object size:0x30 lbl_8050E090 = .data:0x8050E090; // type:object size:0x2FC @@ -37665,7 +37665,7 @@ 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_80571D68 = .sdata:0x80571D68; // type:object size:0x7 data:string lbl_80571D70 = .sdata:0x80571D70; // type:object size:0x4 lbl_80571D74 = .sdata:0x80571D74; // type:object size:0x4 lbl_80571D78 = .sdata:0x80571D78; // type:object size:0x4 data:wstring @@ -39824,7 +39824,7 @@ 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 sInstance__11OarcManager = .sbss:0x80575280; // type:object size:0x4 data:4byte -lbl_80575288 = .sbss:0x80575288; // type:object size:0x8 data:4byte +sInstance__16LayoutArcManager = .sbss:0x80575288; // type:object size:0x8 data:4byte lbl_80575290 = .sbss:0x80575290; // type:object size:0x4 lbl_80575294 = .sbss:0x80575294; // type:object size:0x4 lbl_80575298 = .sbss:0x80575298; // type:object size:0x4 data:4byte diff --git a/configure.py b/configure.py index 508f7951..89ec3c98 100644 --- a/configure.py +++ b/configure.py @@ -294,6 +294,7 @@ config.libs = [ 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/arc_managers/layout_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/src/toBeSorted/arc_managers/layout_arc_manager.cpp b/src/toBeSorted/arc_managers/layout_arc_manager.cpp new file mode 100644 index 00000000..6c38803f --- /dev/null +++ b/src/toBeSorted/arc_managers/layout_arc_manager.cpp @@ -0,0 +1,84 @@ +#include +#include +#include +// clang-format off +#include +// clang-format on + +class LayoutArcManager { + LayoutArcManager(); + virtual ~LayoutArcManager(); + + dRawArcTable_c mArcTable; + + static LayoutArcManager *sInstance; + + static bool create(EGG::Heap *heap); + + void init(EGG::Heap *heap); + + bool loadLayoutArcFromDisk(const char *object, EGG::Heap *heap); + void ensureLoaded1(const char *object); + void ensureLoaded2(const char *object); + bool hasEntry(const char *object); + bool decrement(const char *path); + void *getData(const char *oarcName, const char *fileName); + void *getLoadedData(const char *path); +}; + +LayoutArcManager *LayoutArcManager::sInstance; + +LayoutArcManager::LayoutArcManager() { + sInstance = this; +} + +LayoutArcManager::~LayoutArcManager() { + sInstance = nullptr; +} + +extern char lbl_80575250; + +void LayoutArcManager::init(EGG::Heap *heap) { + mArcTable.init(16, &lbl_80575250, heap); +} + +bool LayoutArcManager::loadLayoutArcFromDisk(const char *object, EGG::Heap *heap) { + if (heap == nullptr) { + heap = dHeap::layoutResHeap.heap; + } + return mArcTable.getArcOrLoadFromDisk(object, "Layout", 0, heap); +} + +void LayoutArcManager::ensureLoaded1(const char *object) { + mArcTable.ensureLoadedMaybe2(object); +} + +void LayoutArcManager::ensureLoaded2(const char *object) { + mArcTable.ensureLoadedMaybe(object); +} + +bool LayoutArcManager::hasEntry(const char *object) { + return mArcTable.hasEntry(object); +} + +bool LayoutArcManager::decrement(const char *path) { + return mArcTable.decreaseRefCount(path); +} + +void *LayoutArcManager::getData(const char *oarcName, const char *fileName) { + return mArcTable.getDataFromOarc(oarcName, fileName); +} + +void *LayoutArcManager::getLoadedData(const char *path) { + return mArcTable.getLoadedArcData(path); +} + +bool LayoutArcManager::create(EGG::Heap *heap) { + new (heap, 0x04) LayoutArcManager(); + + if (LayoutArcManager::sInstance == nullptr) { + return false; + } + LayoutArcManager::sInstance->init(heap); + return true; +}