summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Event/evtActorBinding.h18
-rw-r--r--src/KingSystem/Event/evtActorBindings.cpp51
-rw-r--r--src/KingSystem/Event/evtActorBindings.h19
3 files changed, 84 insertions, 4 deletions
diff --git a/src/KingSystem/Event/evtActorBinding.h b/src/KingSystem/Event/evtActorBinding.h
index 17f956b9..32fa24dd 100644
--- a/src/KingSystem/Event/evtActorBinding.h
+++ b/src/KingSystem/Event/evtActorBinding.h
@@ -38,6 +38,23 @@ public:
const sead::PtrArray<const evfl::ResQuery>& getQueries() const { return mQueries; }
ActorBindings* getParent() const { return mParent; }
+ void allocActions(sead::Heap* heap) {
+ if (mNumActionsToAlloc > 0)
+ mActions.allocBuffer(mNumActionsToAlloc, heap);
+ }
+
+ void allocQueries(sead::Heap* heap) {
+ if (mNumQueriesToAlloc > 0)
+ mQueries.allocBuffer(mNumQueriesToAlloc, heap);
+ }
+
+ void finalize() {
+ if (mActions.isBufferReady())
+ mActions.freeBuffer();
+ if (mQueries.isBufferReady())
+ mQueries.freeBuffer();
+ }
+
private:
const evfl::ResActor* mResActor = nullptr;
sead::PtrArray<const evfl::ResAction> mActions;
@@ -46,6 +63,7 @@ private:
int _30 = 0;
int mNumActionsToAlloc = 0;
int mNumQueriesToAlloc = 0;
+ bool _3c = false;
};
} // namespace ksys::evt
diff --git a/src/KingSystem/Event/evtActorBindings.cpp b/src/KingSystem/Event/evtActorBindings.cpp
index 3c77be0d..a2725d1a 100644
--- a/src/KingSystem/Event/evtActorBindings.cpp
+++ b/src/KingSystem/Event/evtActorBindings.cpp
@@ -1 +1,52 @@
#include "KingSystem/Event/evtActorBindings.h"
+#include <evfl/ResActor.h>
+#include "KingSystem/Event/evtActorBinding.h"
+
+namespace ksys::evt {
+
+void ActorBindings::allocBindings(sead::Heap* heap) {
+ if (mNumActorsToAlloc != 0)
+ mBindings.allocBuffer(mNumActorsToAlloc, heap);
+}
+
+void ActorBindings::allocBindingsActions(sead::Heap* heap) {
+ for (int i = 0; i < mBindings.size(); ++i)
+ mBindings[i]->allocActions(heap);
+}
+
+void ActorBindings::allocBindingsQueries(sead::Heap* heap) {
+ for (int i = 0; i < mBindings.size(); ++i)
+ mBindings[i]->allocQueries(heap);
+}
+
+ActorBindings::~ActorBindings() {
+ for (int i = 0; i < mBindings.size(); ++i) {
+ mBindings[i]->finalize();
+ delete mBindings[i];
+ }
+ mBindings.freeBuffer();
+}
+
+ActorBinding* ActorBindings::bindActor(const evfl::ResActor* res_actor, sead::Heap* heap) {
+ if (mBindings.isBufferReady()) {
+ for (int i = 0; i < mBindings.size(); ++i) {
+ const char* name = res_actor->name.Get()->data();
+ const char* sub_name = res_actor->secondary_name.Get()->data();
+
+ if (sead::SafeString(mBindings[i]->getRes()->name.Get()->data()) != name)
+ continue;
+ if (sead::SafeString(mBindings[i]->getRes()->secondary_name.Get()->data()) != sub_name)
+ continue;
+ return mBindings[i];
+ }
+
+ auto* binding = new (heap) ActorBinding(res_actor, this);
+ mBindings.pushBack(binding);
+ return binding;
+ }
+
+ ++mNumActorsToAlloc;
+ return nullptr;
+}
+
+} // namespace ksys::evt
diff --git a/src/KingSystem/Event/evtActorBindings.h b/src/KingSystem/Event/evtActorBindings.h
index aa64dade..dcafb20d 100644
--- a/src/KingSystem/Event/evtActorBindings.h
+++ b/src/KingSystem/Event/evtActorBindings.h
@@ -2,22 +2,33 @@
#include <container/seadPtrArray.h>
+namespace evfl {
+struct ResActor;
+}
+
+namespace sead {
+class Heap;
+}
+
namespace ksys::evt {
class ActorBinding;
-// TODO
class ActorBindings {
public:
- ActorBindings();
+ ActorBindings() = default;
virtual ~ActorBindings();
- int getNumActors() const { return mNumActors; }
+ void allocBindings(sead::Heap* heap);
+ void allocBindingsActions(sead::Heap* heap);
+ void allocBindingsQueries(sead::Heap* heap);
+ ActorBinding* bindActor(const evfl::ResActor* res_actor, sead::Heap* heap);
+
int isInitialized() const { return mInitialized; }
private:
sead::PtrArray<ActorBinding> mBindings;
- int mNumActors = 0;
+ int mNumActorsToAlloc = 0;
int mInitialized = 0;
};