diff --git a/data/uking_functions.csv b/data/uking_functions.csv index f44fe629..84edb306 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -75801,12 +75801,12 @@ 0x0000007100dc447c,evt::ActorBinding::getActorName,32,_ZNK4ksys3evt12ActorBinding12getActorNameEv 0x0000007100dc449c,evt::ActorBinding::getActorSubName,32,_ZNK4ksys3evt12ActorBinding15getActorSubNameEv 0x0000007100dc44bc,evt::ActorBinding::actorCreateStuff,1792,_ZNK4ksys3evt12ActorBinding18getActorCreateModeEPKNS_3act5ActorE -0x0000007100dc4bbc,evt::ActorBindings::allocActors,32, -0x0000007100dc4bdc,evt::ActorBindings::allocActorActions,108, -0x0000007100dc4c48,evt::ActorBindings::allocActorQueries,108, -0x0000007100dc4cb4,evt::ActorBindings::dtor,160, -0x0000007100dc4d54,evt::ActorBindings::dtorDelete,168, -0x0000007100dc4dfc,evt::ActorBindings::bindActor,448, +0x0000007100dc4bbc,evt::ActorBindings::allocActors,32,_ZN4ksys3evt13ActorBindings13allocBindingsEPN4sead4HeapE +0x0000007100dc4bdc,evt::ActorBindings::allocActorActions,108,_ZN4ksys3evt13ActorBindings20allocBindingsActionsEPN4sead4HeapE +0x0000007100dc4c48,evt::ActorBindings::allocActorQueries,108,_ZN4ksys3evt13ActorBindings20allocBindingsQueriesEPN4sead4HeapE +0x0000007100dc4cb4,evt::ActorBindings::dtor,160,_ZN4ksys3evt13ActorBindingsD1Ev +0x0000007100dc4d54,evt::ActorBindings::dtorDelete,168,_ZN4ksys3evt13ActorBindingsD0Ev +0x0000007100dc4dfc,evt::ActorBindings::bindActor,448,_ZN4ksys3evt13ActorBindings9bindActorEPKN4evfl8ResActorEPN4sead4HeapE 0x0000007100dc4fbc,ResourceFlowchart::ctor,216, 0x0000007100dc5094,sub_7100DC5094,312, 0x0000007100dc51cc,sub_7100DC51CC,36, 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& 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 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 +#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 +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 mBindings; - int mNumActors = 0; + int mNumActorsToAlloc = 0; int mInitialized = 0; };