From aa92bf882c41b292a9ee11b6ec5ba8593b4b4fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sun, 8 Nov 2020 13:55:12 +0100 Subject: ksys/act: Implement more ActorParam functions --- src/KingSystem/ActorSystem/actActorParam.cpp | 78 +++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) (limited to 'src/KingSystem/ActorSystem/actActorParam.cpp') diff --git a/src/KingSystem/ActorSystem/actActorParam.cpp b/src/KingSystem/ActorSystem/actActorParam.cpp index bfe08fed..bcc3a045 100644 --- a/src/KingSystem/ActorSystem/actActorParam.cpp +++ b/src/KingSystem/ActorSystem/actActorParam.cpp @@ -1,4 +1,5 @@ #include "KingSystem/ActorSystem/actActorParam.h" +#include #include namespace ksys::act { @@ -34,7 +35,7 @@ void ActorParam::deleteData() { deleteResHandles(); mActorName = ""; - _168 = 0; + mRefCount = 0; _a = 0; mRes = {}; mEvent.resetSignal(); @@ -49,4 +50,79 @@ bool ActorParam::isDummyParam(res::ActorLink::Users::User user) const { return mRes.mActorLink->getUsers().getUserName(user) == "Dummy"; } +void ActorParam::allocResHandles(sead::Heap* heap, u32 buffer_idx, s32 count) { + SEAD_ASSERT(buffer_idx == 0 || buffer_idx == 1); + mHandles[buffer_idx].allocBufferAssert(count, heap); + mNumHandles[buffer_idx] = 0; +} + +s32 ActorParam::incrementRef() { + auto lock = sead::makeScopedLock(mCS); + return ++mRefCount; +} + +s32 ActorParam::decrementRef() { + auto lock = sead::makeScopedLock(mCS); + + if (mActorName.isEmpty()) + return 0; + + if (--mRefCount == 0) + deleteData(); + + return mRefCount; +} + +void ActorParam::setEventSignal() { + mEvent.setSignal(); +} + +void ActorParam::waitForEvent() { + mEvent.wait(); +} + +bool ActorParam::isSignalSet() const { + return mEvent.isSignalSet(); +} + +res::Handle* ActorParam::allocHandle() { + const auto idx = mNumHandles[mActiveBufferIdx]; + ++mNumHandles[mActiveBufferIdx]; + return &mHandles[mActiveBufferIdx][idx]; +} + +void ActorParam::freeLastHandle() { + --mNumHandles[mActiveBufferIdx]; +} + +void ActorParam::setResource(ResourceType type, ParamIO* param_io) { + const auto idx = u32(type); + mRes.mArray[idx] = param_io; + param_io->setIndex(idx); +} + +bool ActorParam::setPriority(const sead::SafeString& priority) { + if (priority == "PlayerBefore") { + mPriority = Priority::PlayerBefore; + return true; + } + + if (priority == "Player") { + mPriority = Priority::Player; + return true; + } + + if (priority == "PlayerAfter") { + mPriority = Priority::PlayerAfter; + return true; + } + + if (priority == "AllAfter") { + mPriority = Priority::AllAfter; + return true; + } + + return false; +} + } // namespace ksys::act -- cgit v1.2.3