ksys/act: Implement more ActorParamMgr functions

This commit is contained in:
Léo Lam
2020-11-11 18:10:33 +01:00
parent 68c9ffeede
commit 2abce16984
4 changed files with 104 additions and 11 deletions
@@ -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