summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-09-13 10:05:17 +0200
committerGitHub <noreply@github.com>2025-09-13 10:05:17 +0200
commit342f867df2825eb5d76bea7e2a85cba1cdd60c80 (patch)
tree8de6499e1a3ae3dec95d22550b6f68bf20b7f2b7 /src
parent8efc3f6de1b84b3c7f2424e8984b8b0a8fdc2f73 (diff)
parentda63feb111ea145e33be6d6bf108e6d8f559e77b (diff)
Merge pull request #233 from robojumper/arc-dvd-ret-cleanups
Small status/result cleanups for arc managers
Diffstat (limited to 'src')
-rw-r--r--src/DynamicLink.cpp2
-rw-r--r--src/REL/d/d_s_boot.cpp12
-rw-r--r--src/d/a/obj/d_a_obj_tbox.cpp7
-rw-r--r--src/d/d_dvd.cpp2
-rw-r--r--src/d/d_dylink.cpp2
-rw-r--r--src/d/d_rawarchive.cpp56
-rw-r--r--src/d/d_sc_game.cpp4
-rw-r--r--src/d/d_sc_title.cpp13
-rw-r--r--src/d/d_stage_mgr.cpp14
-rw-r--r--src/d/d_thp_player.cpp4
-rw-r--r--src/toBeSorted/arc_managers/layout_arc_manager.cpp70
-rw-r--r--src/toBeSorted/arc_managers/oarc_manager.cpp55
12 files changed, 175 insertions, 66 deletions
diff --git a/src/DynamicLink.cpp b/src/DynamicLink.cpp
index cf9c5e52..5154cf57 100644
--- a/src/DynamicLink.cpp
+++ b/src/DynamicLink.cpp
@@ -197,7 +197,7 @@ BOOL DynamicModuleControl::do_load_async() {
mDvdCallbackRequest = mDvd_callback_c::create(callback, this);
}
- if (mDvdCallbackRequest != nullptr && mDvdCallbackRequest->mStatus != 0) {
+ if (mDvdCallbackRequest != nullptr && mDvdCallbackRequest->isDone()) {
mDvdCallbackRequest->do_delete();
mDvdCallbackRequest = nullptr;
return true;
diff --git a/src/REL/d/d_s_boot.cpp b/src/REL/d/d_s_boot.cpp
index ea55d6c0..758a75ef 100644
--- a/src/REL/d/d_s_boot.cpp
+++ b/src/REL/d/d_s_boot.cpp
@@ -69,10 +69,10 @@ sFPhaseBase::sFPhaseState dScBoot_c::cb1() {
}
sFPhaseBase::sFPhaseState dScBoot_c::cb2() {
- if (OarcManager::GetInstance()->ensureAllEntriesLoaded()) {
+ if (OarcManager::GetInstance()->ensureAllEntriesLoaded() != D_ARC_RESULT_OK) {
return sFPhaseBase::PHASE_RETRY;
}
- if (LayoutArcManager::GetInstance()->ensureAllEntriesLoaded()) {
+ if (LayoutArcManager::GetInstance()->ensureAllEntriesLoaded() != D_ARC_RESULT_OK) {
return sFPhaseBase::PHASE_RETRY;
}
@@ -104,7 +104,7 @@ sFPhaseBase::sFPhaseState dScBoot_c::cb5() {
return sFPhaseBase::PHASE_RETRY;
}
}
- if (mpDvdCallback->mStatus == 0) {
+ if (!mpDvdCallback->isDone()) {
return sFPhaseBase::PHASE_RETRY;
} else {
mpDvdCallback->do_delete();
@@ -271,11 +271,11 @@ sFPhaseBase::sFPhaseState dScBoot_c::cb7() {
return sFPhaseBase::PHASE_RETRY;
}
- if (OarcManager::GetInstance()->ensureAllEntriesLoaded()) {
+ if (OarcManager::GetInstance()->ensureAllEntriesLoaded() != D_ARC_RESULT_OK) {
return sFPhaseBase::PHASE_RETRY;
}
- if (LayoutArcManager::GetInstance()->ensureAllEntriesLoaded()) {
+ if (LayoutArcManager::GetInstance()->ensureAllEntriesLoaded() != D_ARC_RESULT_OK) {
return sFPhaseBase::PHASE_RETRY;
}
@@ -341,7 +341,7 @@ dScBoot_c::strap_c::strap_c() {
bool dScBoot_c::strap_c::create() {
if (!field_0x4EC) {
- if (LayoutArcManager::GetInstance()->ensureLoaded1(mArcName)) {
+ if (LayoutArcManager::GetInstance()->ensureLoaded1(mArcName) != D_ARC_RESULT_OK) {
return false;
}
void *data = LayoutArcManager::GetInstance()->getLoadedData(mArcName);
diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp
index 6c9e99dd..ef3c05de 100644
--- a/src/d/a/obj/d_a_obj_tbox.cpp
+++ b/src/d/a/obj/d_a_obj_tbox.cpp
@@ -13,6 +13,7 @@
#include "d/col/cc/d_cc_s.h"
#include "d/d_light_env.h"
#include "d/d_pouch.h"
+#include "d/d_rawarchive.h"
#include "d/d_room.h"
#include "d/d_stage.h"
#include "d/flag/sceneflag_manager.h"
@@ -1165,7 +1166,7 @@ int dAcTbox_c::doDelete() {
}
if (sCurrentObtainingItemOarcName != nullptr) {
OarcManager *mng = OarcManager::GetInstance();
- if (!mng->ensureLoaded1(sCurrentObtainingItemOarcName)) {
+ if (mng->ensureLoaded1(sCurrentObtainingItemOarcName) == D_ARC_RESULT_OK) {
mng->decrement(sCurrentObtainingItemOarcName);
sCurrentObtainingItemOarcName = nullptr;
}
@@ -1884,7 +1885,7 @@ void dAcTbox_c::initializeState_DeleteArchive() {
void dAcTbox_c::executeState_DeleteArchive() {
if (sCurrentObtainingItemOarcName != nullptr) {
OarcManager *mng = OarcManager::GetInstance();
- if (!mng->ensureLoaded1(sCurrentObtainingItemOarcName)) {
+ if (mng->ensureLoaded1(sCurrentObtainingItemOarcName) == D_ARC_RESULT_OK) {
mng->decrement(sCurrentObtainingItemOarcName);
sCurrentObtainingItemOarcName = nullptr;
}
@@ -1922,7 +1923,7 @@ void dAcTbox_c::initializeState_LoadArchive() {
field_0x120C = 0;
}
void dAcTbox_c::executeState_LoadArchive() {
- if (!OarcManager::GetInstance()->ensureLoaded1(sCurrentObtainingItemOarcName)) {
+ if (OarcManager::GetInstance()->ensureLoaded1(sCurrentObtainingItemOarcName) == D_ARC_RESULT_OK) {
mStateMgr.changeState(StateID_Open);
}
}
diff --git a/src/d/d_dvd.cpp b/src/d/d_dvd.cpp
index 464702e5..9cdbb85a 100644
--- a/src/d/d_dvd.cpp
+++ b/src/d/d_dvd.cpp
@@ -38,7 +38,7 @@ void *loader_c::request(const char *path, u8 mountDirection, EGG::Heap *heap) {
}
mpCommand = mDvd_toMainRam_normal_c::create(buf, mountDirection, heap);
}
- if (mpCommand != nullptr && mpCommand->mStatus != 0) {
+ if (mpCommand != nullptr && mpCommand->isDone()) {
mpBuffer = mpCommand->mDataPtr;
mSize = mpCommand->mAmountRead;
mpCommand->mDataPtr = nullptr;
diff --git a/src/d/d_dylink.cpp b/src/d/d_dylink.cpp
index 2c17a470..9ba0d681 100644
--- a/src/d/d_dylink.cpp
+++ b/src/d/d_dylink.cpp
@@ -336,7 +336,7 @@ bool destroy() {
return true;
}
- if (DVD->mStatus != 0) {
+ if (DVD->isDone()) {
DVD->do_delete();
DVD = nullptr;
return true;
diff --git a/src/d/d_rawarchive.cpp b/src/d/d_rawarchive.cpp
index d3854d37..99b393c6 100644
--- a/src/d/d_rawarchive.cpp
+++ b/src/d/d_rawarchive.cpp
@@ -36,10 +36,10 @@ dRawArcEntry_c::dRawArcEntry_c() {
dRawArcEntry_c::~dRawArcEntry_c() {
// Wait for request to complete before destroying
- if (mpDvdReq->mStatus == 0) {
+ if (!mpDvdReq->isDone()) {
do {
VIWaitForRetrace();
- } while (mpDvdReq->mStatus == 0);
+ } while (!mpDvdReq->isDone());
}
destroy(nullptr);
}
@@ -72,7 +72,7 @@ void dRawArcEntry_c::searchCallback2(void *a, void *b, const ARCDirEntry *c, con
bool dRawArcEntry_c::destroy(void *arg) {
if (mpDvdReq != nullptr) {
- if (mpDvdReq->mStatus == 0) {
+ if (!mpDvdReq->isDone()) {
// Can't destroy if the request is still ongoing
return false;
}
@@ -144,31 +144,27 @@ BOOL dRawArcEntry_c::checkArcExistsOnDiskInner(SizedString<128> &path, const cha
return true;
}
-int dRawArcEntry_c::mount(
+dArcResult_e dRawArcEntry_c::mount(
const char *name, void *data, ArcCallbackHandler *callbackArg, u8 mountDirection, EGG::Heap *heap
) {
mArcName = name;
mpArc = EGG::Archive::mount(data, heap, (mountDirection == 0 || mountDirection == 1) ? 4 : -4);
if (mpArc == nullptr) {
- return -1;
+ return D_ARC_RESULT_ERROR_INTERNAL;
} else {
- int result = onMount(callbackArg);
- int ret = 0;
- if (result == -1) {
- ret = result;
- }
- return ret;
+ dArcResult_e result = onMount(callbackArg);
+ return result == D_ARC_RESULT_ERROR_INTERNAL ? result : D_ARC_RESULT_OK;
}
}
-int dRawArcEntry_c::ensureLoadedMaybe(void *callbackArg) {
+dArcResult_e dRawArcEntry_c::ensureLoadedMaybe(void *callbackArg) {
if (mpArc == nullptr) {
if (mpDvdReq == nullptr) {
- return -1;
+ return D_ARC_RESULT_ERROR_INTERNAL;
}
- if (mpDvdReq->mStatus == 0) {
- return 1;
+ if (!mpDvdReq->isDone()) {
+ return D_ARC_RESULT_WAIT;
}
mpArc = mpDvdReq->mDataPtr;
@@ -185,31 +181,31 @@ int dRawArcEntry_c::ensureLoadedMaybe(void *callbackArg) {
mpDvdReq->do_delete();
mpDvdReq = nullptr;
if (mpArc == nullptr) {
- return -1;
+ return D_ARC_RESULT_ERROR_INTERNAL;
}
mpFrmHeap = mHeap::makeHeapOnCurrentGameHeap(-1, name(), 0x20, mHeap::OPT_NONE);
if (mpFrmHeap == nullptr) {
- return -1;
+ return D_ARC_RESULT_ERROR_INTERNAL;
}
- int result = onMount(callbackArg);
+ dArcResult_e result = onMount(callbackArg);
mHeap::restoreCurrentHeap();
mHeap::adjustFrmHeap(mpFrmHeap);
mChecksum = computeChecksum(mpData, mAmountRead);
- if (result == -1) {
+ if (result == D_ARC_RESULT_ERROR_INTERNAL) {
return result;
}
DCStoreRange(mpFrmHeap, mpFrmHeap->mHeapHandle->end - (u8 *)mpFrmHeap);
}
- return 0;
+ return D_ARC_RESULT_OK;
}
-int dRawArcEntry_c::onMount(void *callbackArg) {
+dArcResult_e dRawArcEntry_c::onMount(void *callbackArg) {
mpArc->countFile();
if (callbackArg != nullptr) {
mpArc->searchInside(searchCallback1, callbackArg);
}
- return 0;
+ return D_ARC_RESULT_OK;
}
dRawArcTable_c::dRawArcTable_c() {
@@ -271,18 +267,18 @@ BOOL dRawArcTable_c::addEntryFromSuperArc(const char *name, void *data, u8 mount
return true;
}
-int dRawArcTable_c::ensureLoadedMaybe2(const char *name) {
+dArcResult_e dRawArcTable_c::ensureLoadedMaybe2(const char *name) {
dRawArcEntry_c *entry = findEntry(name);
if (entry == nullptr) {
- return -2;
+ return D_ARC_RESULT_ERROR_NOT_FOUND;
}
return entry->ensureLoadedMaybe(mCallbackArg);
}
-int dRawArcTable_c::ensureLoadedMaybe(const char *name) {
+dArcResult_e dRawArcTable_c::ensureLoadedMaybe(const char *name) {
dRawArcEntry_c *entry = findEntry(name);
if (entry == nullptr) {
- return -2;
+ return D_ARC_RESULT_ERROR_NOT_FOUND;
}
return entry->ensureLoadedMaybe(mCallbackArg);
}
@@ -335,20 +331,20 @@ void *dRawArcTable_c::getLoadedArcData(const char *name) {
return entry == nullptr ? nullptr : entry->getData();
}
-int dRawArcTable_c::ensureAllEntriesLoaded() {
+dArcResult_e dRawArcTable_c::ensureAllEntriesLoaded() {
dRawArcEntry_c *entry = mpEntries;
- int result = 0;
+ dArcResult_e result = D_ARC_RESULT_OK;
for (int i = 0; i < mCount; i++) {
if (entry->isLoading()) {
result = entry->ensureLoadedMaybe(mCallbackArg);
- if (result != 0) {
+ if (result != D_ARC_RESULT_OK) {
return result;
}
}
entry++;
}
- return 0;
+ return D_ARC_RESULT_OK;
}
dRawArcEntry_c *dRawArcTable_c::findEntry(const char *name) const {
diff --git a/src/d/d_sc_game.cpp b/src/d/d_sc_game.cpp
index 0399b3de..10f2c796 100644
--- a/src/d/d_sc_game.cpp
+++ b/src/d/d_sc_game.cpp
@@ -117,11 +117,11 @@ sFPhaseBase::sFPhaseState dScGame_c::cb2() {
return sFPhaseBase::PHASE_RETRY;
}
- if (OarcManager::GetInstance()->ensureAllEntriesLoaded()) {
+ if (OarcManager::GetInstance()->ensureAllEntriesLoaded() != D_ARC_RESULT_OK) {
return sFPhaseBase::PHASE_RETRY;
}
- if (LayoutArcManager::GetInstance()->ensureAllEntriesLoaded()) {
+ if (LayoutArcManager::GetInstance()->ensureAllEntriesLoaded() != D_ARC_RESULT_OK) {
return sFPhaseBase::PHASE_RETRY;
}
diff --git a/src/d/d_sc_title.cpp b/src/d/d_sc_title.cpp
index 73e578d7..91cede66 100644
--- a/src/d/d_sc_title.cpp
+++ b/src/d/d_sc_title.cpp
@@ -112,32 +112,31 @@ int dScTitle_c::execute() {
}
int dScTitle_c::doDelete() {
- // TODO return codes
int result;
result = LayoutArcManager::GetInstance()->ensureLoaded2(sFileSelect);
- if (result != -2) {
- if (result != 0) {
+ if (result != D_ARC_RESULT_ERROR_NOT_FOUND) {
+ if (result != D_ARC_RESULT_OK) {
return NOT_READY;
}
LayoutArcManager::GetInstance()->decrement(sFileSelect);
}
result = LayoutArcManager::GetInstance()->ensureLoaded2(sSkb);
- if (result != -2) {
- if (result != 0) {
+ if (result != D_ARC_RESULT_ERROR_NOT_FOUND) {
+ if (result != D_ARC_RESULT_OK) {
return NOT_READY;
}
LayoutArcManager::GetInstance()->decrement(sSkb);
}
// TODO here's the other half of the ::destroy fakematch...
- if (mpSkbArc->mStatus != 0) {
+ if (mpSkbArc->isDone()) {
mDvd_command_c::destroy((mDvd_command_c **)&mpSkbArc);
} else {
return NOT_READY;
}
- if (mpSkbFont->mStatus != 0) {
+ if (mpSkbFont->isDone()) {
mDvd_command_c::destroy((mDvd_command_c **)&mpSkbFont);
} else {
return NOT_READY;
diff --git a/src/d/d_stage_mgr.cpp b/src/d/d_stage_mgr.cpp
index f300116f..678848e0 100644
--- a/src/d/d_stage_mgr.cpp
+++ b/src/d/d_stage_mgr.cpp
@@ -45,7 +45,7 @@ void dStageMgr_c::initializeState_ReadStageRes() {
}
void dStageMgr_c::executeState_ReadStageRes() {
- if (CurrentStageArcManager::GetInstance()->ensureAllEntriesLoaded() == 0) {
+ if (CurrentStageArcManager::GetInstance()->ensureAllEntriesLoaded() == D_ARC_RESULT_OK) {
mStateMgr.changeState(StateID_ReadRoomRes);
}
}
@@ -62,8 +62,8 @@ void dStageMgr_c::finalizeState_ReadStageRes() {
void dStageMgr_c::initializeState_ReadRoomRes() {}
void dStageMgr_c::executeState_ReadRoomRes() {
- if (CurrentStageArcManager::GetInstance()->ensureAllEntriesLoaded() == 0 &&
- LayoutArcManager::GetInstance()->ensureAllEntriesLoaded() == 0) {
+ if (CurrentStageArcManager::GetInstance()->ensureAllEntriesLoaded() == D_ARC_RESULT_OK &&
+ LayoutArcManager::GetInstance()->ensureAllEntriesLoaded() == D_ARC_RESULT_OK) {
mStateMgr.changeState(StateID_ReadObjectRes);
}
}
@@ -100,7 +100,7 @@ void dStageMgr_c::initializeState_ReadStageLayerRes() {
}
void dStageMgr_c::executeState_ReadStageLayerRes() {
- if (CurrentStageArcManager::GetInstance()->ensureAllEntriesLoaded() == 0) {
+ if (CurrentStageArcManager::GetInstance()->ensureAllEntriesLoaded() == D_ARC_RESULT_OK) {
mStateMgr.changeState(StateID_ReadLayerObjectRes);
}
}
@@ -142,7 +142,7 @@ void dStageMgr_c::initializeState_ReadLayerObjectRes() {
}
void dStageMgr_c::executeState_ReadLayerObjectRes() {
- if (mLayerObjCtrl.isLoaded() && LayoutArcManager::GetInstance()->ensureAllEntriesLoaded() == 0) {
+ if (mLayerObjCtrl.isLoaded() && LayoutArcManager::GetInstance()->ensureAllEntriesLoaded() == D_ARC_RESULT_OK) {
mStateMgr.changeState(StateID_SoundLoadSceneData);
}
}
@@ -172,7 +172,7 @@ void dStageMgr_c::initializeState_SoundLoadSceneData() {
}
void dStageMgr_c::executeState_SoundLoadSceneData() {
- if (mpDvdCallback != nullptr && mpDvdCallback->mStatus != 0) {
+ if (mpDvdCallback != nullptr && mpDvdCallback->isDone()) {
mStateMgr.changeState(StateID_CreateObject);
}
}
@@ -208,7 +208,7 @@ void dStageMgr_c::executeState_ReadObjectSound() {
return;
}
- if (mpDvdCallback2->mStatus == 0) {
+ if (!mpDvdCallback2->isDone()) {
return;
}
diff --git a/src/d/d_thp_player.cpp b/src/d/d_thp_player.cpp
index 3728ec60..2e08fd1d 100644
--- a/src/d/d_thp_player.cpp
+++ b/src/d/d_thp_player.cpp
@@ -91,7 +91,7 @@ void dThpPlayer_c::setupFile(char* filename, s32 loadAllAtOnce) {
static const u8 SPECIAL_TYPES[] = {0x7A, 0x78, 0x78};
void dThpPlayer_c::reallyExecute() {
- if (mDvdCallback == nullptr || mDvdCallback->mStatus == 0 || !mFilenameSet || mSetupDone) {
+ if (mDvdCallback == nullptr || !mDvdCallback->isDone() || !mFilenameSet || mSetupDone) {
return;
}
if (mFilename == "THP/Demo01_01.thp") {
@@ -139,7 +139,7 @@ s32 dThpPlayer_c::play() {
s32 dThpPlayer_c::destroy() {
if (mDvdCallback != nullptr) {
- if (mDvdCallback->mStatus == 0) {
+ if (!mDvdCallback->isDone()) {
return NOT_READY;
}
THPPlayerStop();
diff --git a/src/toBeSorted/arc_managers/layout_arc_manager.cpp b/src/toBeSorted/arc_managers/layout_arc_manager.cpp
index 464a4022..091fe504 100644
--- a/src/toBeSorted/arc_managers/layout_arc_manager.cpp
+++ b/src/toBeSorted/arc_managers/layout_arc_manager.cpp
@@ -2,7 +2,6 @@
#include "d/d_heap.h"
-
LayoutArcManager *LayoutArcManager::sInstance;
LayoutArcManager::LayoutArcManager() {
@@ -24,11 +23,11 @@ bool LayoutArcManager::loadLayoutArcFromDisk(const char *object, EGG::Heap *heap
return mArcTable.getArcOrLoadFromDisk(object, "Layout", 0, heap);
}
-int LayoutArcManager::ensureLoaded1(const char *object) {
+dArcResult_e LayoutArcManager::ensureLoaded1(const char *object) {
return mArcTable.ensureLoadedMaybe2(object);
}
-int LayoutArcManager::ensureLoaded2(const char *object) {
+dArcResult_e LayoutArcManager::ensureLoaded2(const char *object) {
return mArcTable.ensureLoadedMaybe(object);
}
@@ -57,3 +56,68 @@ bool LayoutArcManager::create(EGG::Heap *heap) {
GetInstance()->init(heap);
return true;
}
+
+LayoutArcControl::~LayoutArcControl() {
+ if (mLayoutArcs != nullptr) {
+ release();
+ }
+}
+
+void LayoutArcControl::set(const char *const *layoutArcs, s32 numArcs) {
+ mLayoutArcs = layoutArcs;
+ mNumArcs = numArcs;
+}
+
+bool LayoutArcControl::load(EGG::Heap *heap) const {
+ if (mLayoutArcs == nullptr) {
+ return true;
+ }
+
+ const char *const *ptr = mLayoutArcs;
+ for (int i = 0; i < mNumArcs; i++) {
+ LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(*ptr, heap);
+ ptr++;
+ }
+
+ return true;
+}
+
+bool LayoutArcControl::allLoaded() const {
+ if (mLayoutArcs == nullptr) {
+ return true;
+ }
+
+ const char *const *ptr = mLayoutArcs;
+ for (int i = 0; i < mNumArcs; i++) {
+ dArcResult_e res = LayoutArcManager::GetInstance()->ensureLoaded1(*ptr);
+ if (res != D_ARC_RESULT_OK) {
+ return false;
+ }
+ ptr++;
+ }
+ return true;
+}
+
+bool LayoutArcControl::release() {
+ if (mLayoutArcs == nullptr) {
+ return true;
+ }
+
+ const char *const *ptr = mLayoutArcs;
+ for (int i = 0; i < mNumArcs; i++) {
+ dArcResult_e res = LayoutArcManager::GetInstance()->ensureLoaded2(*ptr);
+ if (res != D_ARC_RESULT_ERROR_NOT_FOUND && res != D_ARC_RESULT_OK) {
+ return false;
+ }
+ ptr++;
+ }
+
+ ptr = mLayoutArcs;
+ for (int i = 0; i < mNumArcs; i++) {
+ LayoutArcManager::GetInstance()->decrement(*ptr);
+ ptr++;
+ }
+ mLayoutArcs = nullptr;
+
+ return true;
+}
diff --git a/src/toBeSorted/arc_managers/oarc_manager.cpp b/src/toBeSorted/arc_managers/oarc_manager.cpp
index 351e31c2..aa284e3f 100644
--- a/src/toBeSorted/arc_managers/oarc_manager.cpp
+++ b/src/toBeSorted/arc_managers/oarc_manager.cpp
@@ -34,12 +34,12 @@ bool OarcManager::addEntryFromSuperArc(const char *object, void *data, EGG::Heap
return mArcTable.addEntryFromSuperArc(object, data, 0, heap);
}
-int OarcManager::ensureLoaded1(const char *object) {
+dArcResult_e OarcManager::ensureLoaded1(const char *object) {
return mArcTable.ensureLoadedMaybe2(object);
}
-void OarcManager::ensureLoaded2(const char *object) {
- mArcTable.ensureLoadedMaybe(object);
+dArcResult_e OarcManager::ensureLoaded2(const char *object) {
+ return mArcTable.ensureLoadedMaybe(object);
}
bool OarcManager::decrement(const char *path) {
@@ -89,3 +89,52 @@ bool OarcManager::create(EGG::Heap *heap) {
GetInstance()->init(heap);
return true;
}
+
+ObjectArcControl::~ObjectArcControl() {
+ if (mObjectArcs != nullptr) {
+ release();
+ }
+}
+
+void ObjectArcControl::set(const char *const *objectArcs, s32 numArcs) {
+ mObjectArcs = objectArcs;
+ mNumArcs = numArcs;
+}
+
+bool ObjectArcControl::load(EGG::Heap *heap) const {
+ if (mObjectArcs == nullptr) {
+ return true;
+ }
+
+ const char *const *ptr = mObjectArcs;
+ for (int i = 0; i < mNumArcs; i++) {
+ OarcManager::GetInstance()->loadObjectArcFromDisk(*ptr, heap);
+ ptr++;
+ }
+
+ return true;
+}
+
+bool ObjectArcControl::release() {
+ if (mObjectArcs == nullptr) {
+ return true;
+ }
+
+ const char *const *ptr = mObjectArcs;
+ for (int i = 0; i < mNumArcs; i++) {
+ dArcResult_e res = OarcManager::GetInstance()->ensureLoaded2(*ptr);
+ if (res != D_ARC_RESULT_ERROR_NOT_FOUND && res != D_ARC_RESULT_OK) {
+ return false;
+ }
+ ptr++;
+ }
+
+ ptr = mObjectArcs;
+ for (int i = 0; i < mNumArcs; i++) {
+ OarcManager::GetInstance()->decrement(*ptr);
+ ptr++;
+ }
+ mObjectArcs = nullptr;
+
+ return true;
+}