diff options
Diffstat (limited to 'src/KingSystem/ActorSystem/actActorParamMgr.cpp')
| -rw-r--r-- | src/KingSystem/ActorSystem/actActorParamMgr.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/KingSystem/ActorSystem/actActorParamMgr.cpp b/src/KingSystem/ActorSystem/actActorParamMgr.cpp index f4b3d5cb..82fa697e 100644 --- a/src/KingSystem/ActorSystem/actActorParamMgr.cpp +++ b/src/KingSystem/ActorSystem/actActorParamMgr.cpp @@ -1,5 +1,9 @@ #include "KingSystem/ActorSystem/actActorParamMgr.h" +#include <prim/seadScopedLock.h> #include "KingSystem/ActorSystem/actASSetting.h" +#include "KingSystem/ActorSystem/actActorParam.h" +#include "KingSystem/Resource/resLoadRequest.h" +#include "KingSystem/Resource/resResourceGParamList.h" namespace ksys::act { @@ -11,4 +15,75 @@ ActorParamMgr::~ActorParamMgr() { ASSetting::deleteInstance(); } +// NON_MATCHING: addressing mode +ActorParam* ActorParamMgr::getParam(const char* actor_name, ActorParam** out_free_param) const { + auto lock = sead::makeScopedLock(mCS); + for (s32 i = 0; i < NumParams; ++i) { + auto* param = &mParams[i]; + if (param->getActorName().isEmpty()) { + if (out_free_param && !*out_free_param) + *out_free_param = param; + } else if (param->getActorName() == actor_name) { + return param; + } + } + return nullptr; +} + +ActorParam* ActorParamMgr::loadParam(const char* actor_name, res::Handle* handle, void* x, + u32 load_req_c) { + ActorParam* param; + bool existing = false; + + { + auto lock = sead::makeScopedLock(mCS); + + ActorParam* free_param = nullptr; + param = getParam(actor_name, &free_param); + + if (param) { + existing = true; + } else { + param = free_param; + if (free_param) + free_param->mRes = {}; + else + param = &mParams[NumParams - 1]; + + param->mActorName = actor_name; + } + param->incrementRef(); + } + + if (!existing) { + loadFiles(param, mTmpActorParamMgrHeap, handle, x, load_req_c); + param->setEventSignal(); + } else { + param->waitForEvent(); + } + + return param; +} + +bool ActorParamMgr::loadActorPack(res::Handle* handle, const sead::SafeString& actor_name, + u32 load_req_c) { + sead::FixedSafeString<128> path; + res::LoadRequest req; + + if (mFlags.isOn(Flag::_5)) + return false; + + path.format("Actor/Pack/%s.bactorpack", actor_name.cstr()); + req.mRequester = actor_name; + req._c = load_req_c; + req._8 = true; + req._28 = false; + return handle->requestLoad(path, &req); +} + +res::GParamList* ActorParamMgr::getDummyGParamList() const { + return static_cast<res::GParamList*>( + mResHandles[u32(ActorParam::ResourceType::GParamList)].getResourceUnchecked()); +} + } // namespace ksys::act |
