diff options
| author | Léo Lam <leo@leolam.fr> | 2020-10-13 02:11:12 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2020-10-15 17:09:26 +0200 |
| commit | b16ba552db85d87409a610ab39fbde6670f73bde (patch) | |
| tree | db89213555787f250df86b730c6c34c11b04bbff /src/KingSystem/Resource/resUnit.cpp | |
| parent | 436085f61dc25a387b2c0eae0380eaf1e1aa6e12 (diff) | |
ksys/res: Implement all of Handle
Diffstat (limited to 'src/KingSystem/Resource/resUnit.cpp')
| -rw-r--r-- | src/KingSystem/Resource/resUnit.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/KingSystem/Resource/resUnit.cpp b/src/KingSystem/Resource/resUnit.cpp index a93e5266..ee252d84 100644 --- a/src/KingSystem/Resource/resUnit.cpp +++ b/src/KingSystem/Resource/resUnit.cpp @@ -50,7 +50,7 @@ bool ResourceUnit::init(const ResourceUnit::InitArg& arg) { request.mRequester = "ResourceUnit"; request._c = 2; request.mPack = arg.load_req->mPackHandle; - mArchiveRes = sead::DynamicCast<sead::ArchiveRes>(mArchiveResHandle.load("", request)); + mArchiveRes = sead::DynamicCast<sead::ArchiveRes>(mArchiveResHandle.load("", &request)); } mMapNode.key().setKey(mPath); @@ -123,7 +123,7 @@ ResourceUnit::~ResourceUnit() { void ResourceUnit::unloadArchiveRes() { if (mArchiveRes) { mArchiveRes = nullptr; - mArchiveResHandle.unload(); + mArchiveResHandle.requestUnload(); } } @@ -141,11 +141,16 @@ ResourceUnit::Status ResourceUnit::getStatus() const { return mStatus; } +static const ResourceUnit::Status sUnitStatusTransitionTable[] = { + ResourceUnit::Status::_8, ResourceUnit::Status::_11, ResourceUnit::Status::_11, + ResourceUnit::Status::_14, ResourceUnit::Status::_14, +}; + // NON_MATCHING: ldr + sxtw -> ldrsw void ResourceUnit::updateStatus() { - static const Status sMap[] = {Status::_8, Status::_11, Status::_11, Status::_14, Status::_14}; - if (Status::_2 <= mStatus && mStatus <= Status::_6) - mStatus = sMap[s32(mStatus)]; + const s32 idx = mStatus; + if (Status::_2 <= idx && idx <= Status::_6) + mStatus = sUnitStatusTransitionTable[idx]; } bool ResourceUnit::isTask1NotQueued() const { @@ -168,6 +173,13 @@ bool ResourceUnit::isStatus1() const { return mStatus == Status::_1; } +bool ResourceUnit::needsParse() const { + auto* res = sead::DynamicCast<Resource>(mResource); + if (mStatus != Status::_8 && mStatus != Status::_11) + return false; + return res && res->needsParse(); +} + bool ResourceUnit::isStatus9_12_15() const { return mStatus == Status::_9 || mStatus == Status::_12 || mStatus == Status::_15; } @@ -176,13 +188,15 @@ bool ResourceUnit::isStatus9_12_15() const { bool ResourceUnit::isParseOk() const { auto* ksys_res = sead::DynamicCast<res::Resource>(mResource); - if (mStatus == Status::_14) + const auto status = mStatus.value(); + + if (status == Status::_14) return true; - if (mStatus == Status::_8 && !ksys_res) + if (status == Status::_8 && !ksys_res) return mResource != nullptr; - if (mStatus == Status::_8 && ksys_res) + if (status == Status::_8 && ksys_res) return !ksys_res->needsParse(); return false; |
