mirror of
https://github.com/zeldaret/botw
synced 2026-06-07 11:57:40 -04:00
ksys/evt: Implement ActorBindings
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user