diff options
| author | Léo Lam <leo@leolam.fr> | 2021-06-17 00:22:09 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2021-06-17 02:15:26 +0200 |
| commit | 1f628bb94ada5da0518bcc03efecf7599e4ed2ba (patch) | |
| tree | 48bb8dc6f287a766e018ca40384534ef4de30cb9 /src/KingSystem/Event | |
| parent | 5794d424c2bdb1a708daa64d52852cd9b0dd1ec6 (diff) | |
ksys/evt: Implement ActorBindings
Diffstat (limited to 'src/KingSystem/Event')
| -rw-r--r-- | src/KingSystem/Event/evtActorBinding.h | 18 | ||||
| -rw-r--r-- | src/KingSystem/Event/evtActorBindings.cpp | 51 | ||||
| -rw-r--r-- | src/KingSystem/Event/evtActorBindings.h | 19 |
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; }; |
