summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-08-20 01:26:10 +0200
committerLéo Lam <leo@leolam.fr>2020-08-20 01:26:10 +0200
commit0dc07525309ecc1d522fa4f18ecb09993b035f2b (patch)
tree46a42e8fd745dc443c979e99a14559eb70dae583 /src
parent6989d0f7f833179130f43f5b7d6cf4c00cd52ece (diff)
ksys/act: Implement ActorLinkConstDataAccess
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/ActorSystem/actActor.h2
-rw-r--r--src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp33
-rw-r--r--src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h15
3 files changed, 50 insertions, 0 deletions
diff --git a/src/KingSystem/ActorSystem/actActor.h b/src/KingSystem/ActorSystem/actActor.h
index cc51e126..39f41064 100644
--- a/src/KingSystem/ActorSystem/actActor.h
+++ b/src/KingSystem/ActorSystem/actActor.h
@@ -11,6 +11,8 @@ public:
Actor(); // FIXME
~Actor() override;
+ SEAD_RTTI_OVERRIDE(Actor, BaseProc)
+
void emitBasicSigOn();
void emitBasicSigOff();
};
diff --git a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp
index e69de29b..476482ce 100644
--- a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp
+++ b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp
@@ -0,0 +1,33 @@
+#include "KingSystem/ActorSystem/actActorLinkConstDataAccess.h"
+#include "KingSystem/ActorSystem/actBaseProc.h"
+
+namespace ksys::act {
+
+ActorLinkConstDataAccess::~ActorLinkConstDataAccess() {
+ if (mAcquired)
+ acquire(nullptr);
+}
+
+bool ActorLinkConstDataAccess::acquire(BaseProc* proc) {
+ if (mProc) {
+ if (mAcquired)
+ mProc->release();
+
+ mAcquired = false;
+ mProc = nullptr;
+ }
+
+ if (proc)
+ return proc->acquire(*this);
+ return false;
+}
+
+bool ActorLinkConstDataAccess::hasProc(BaseProc* proc) const {
+ return mProc == proc;
+}
+
+void ActorLinkConstDataAccess::debugLog(s32, const sead::SafeString&) {
+ // Intentionally left empty.
+}
+
+} // namespace ksys::act
diff --git a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h
index 628138b1..ff4258ec 100644
--- a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h
+++ b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h
@@ -1,5 +1,8 @@
#pragma once
+#include <basis/seadTypes.h>
+#include <prim/seadSafeString.h>
+
namespace ksys {
namespace act {
@@ -9,9 +12,21 @@ class BaseProc;
/// Provides read-only access to actor data for safe, multi-threaded access.
class ActorLinkConstDataAccess {
public:
+ ActorLinkConstDataAccess() = default;
+ explicit ActorLinkConstDataAccess(BaseProc* proc) { acquire(proc); }
+ /// Destructor that automatically releases any acquired BaseProc.
~ActorLinkConstDataAccess();
+ /// Acquire a BaseProc. This increments its reference count.
+ /// If an actor was already acquired, it is released.
+ bool acquire(BaseProc* proc);
+
+ /// Checks whether the acquired BaseProc is `proc`.
+ bool hasProc(BaseProc* proc) const;
+
private:
+ void debugLog(s32, const sead::SafeString& method_name);
+
bool mAcquired = false;
BaseProc* mProc = nullptr;
};