summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actActorParamMgr.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-11-11 18:10:33 +0100
committerLéo Lam <leo@leolam.fr>2020-11-11 19:17:31 +0100
commit2abce1698486062e77084ceb71d4ab9e81566ca4 (patch)
treef7b5c33a6813f9f5bbde05993624e4d01a0c9d32 /src/KingSystem/ActorSystem/actActorParamMgr.cpp
parent68c9ffeede3ea0b2aaede17e908e43568daf467c (diff)
ksys/act: Implement more ActorParamMgr functions
Diffstat (limited to 'src/KingSystem/ActorSystem/actActorParamMgr.cpp')
-rw-r--r--src/KingSystem/ActorSystem/actActorParamMgr.cpp75
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