mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-29 12:04:09 +00:00
200 lines
6.5 KiB
C++
200 lines
6.5 KiB
C++
#include "Library/Execute/ExecuteDirector.h"
|
|
|
|
#include "Library/Base/StringUtil.h"
|
|
#include "Library/Execute/ActorExecuteInfo.h"
|
|
#include "Library/Execute/ExecuteRequestKeeper.h"
|
|
#include "Library/Execute/ExecuteTablesImpl.h"
|
|
#include "Library/Execute/LayoutExecuteInfo.h"
|
|
#include "Library/Layout/LayoutActor.h"
|
|
#include "Library/LiveActor/LiveActor.h"
|
|
|
|
namespace al {
|
|
|
|
ExecuteDirector::ExecuteDirector(s32 count) : mRequestCount(count) {}
|
|
|
|
ExecuteDirector::~ExecuteDirector() {
|
|
for (s32 i = 0; i < mDrawTableCount; i++)
|
|
delete mDrawTables[i];
|
|
|
|
for (s32 i = 0; i < mUpdateTableCount; i++)
|
|
delete mUpdateTables[i];
|
|
}
|
|
|
|
void ExecuteDirector::init(const ExecuteSystemInitInfo& initInfo) {
|
|
mUpdateTableCount = UpdateTableSize;
|
|
mUpdateTables = new ExecuteTableHolderUpdate*[UpdateTableSize];
|
|
|
|
for (s32 i = 0; i < mUpdateTableCount; ++i) {
|
|
mUpdateTables[i] = new ExecuteTableHolderUpdate();
|
|
mUpdateTables[i]->init(UpdateTable[i].name, initInfo, UpdateTable[i].executeOrders,
|
|
UpdateTable[i].executeOrderCount);
|
|
}
|
|
|
|
mDrawTableCount = DrawTableSize;
|
|
mDrawTables = new ExecuteTableHolderDraw*[DrawTableSize];
|
|
|
|
for (s32 i = 0; i < mDrawTableCount; ++i) {
|
|
mDrawTables[i] = new ExecuteTableHolderDraw();
|
|
mDrawTables[i]->init(DrawTable[i].name, initInfo, DrawTable[i].executeOrders,
|
|
DrawTable[i].executeOrderCount);
|
|
}
|
|
|
|
mRequestKeeper = new ExecuteRequestKeeper(mRequestCount);
|
|
}
|
|
|
|
void ExecuteDirector::registerActorUpdate(LiveActor* actor, const char* listName) {
|
|
if (!actor->getExecuteInfo())
|
|
actor->initExecuteInfo(new ActorExecuteInfo(mRequestKeeper));
|
|
|
|
for (s32 i = 0; i < mUpdateTableCount; i++)
|
|
mUpdateTables[i]->tryRegisterActor(actor, listName);
|
|
}
|
|
|
|
void ExecuteDirector::registerActorDraw(LiveActor* actor, const char* listName) {
|
|
if (!actor->getExecuteInfo())
|
|
actor->initExecuteInfo(new ActorExecuteInfo(mRequestKeeper));
|
|
|
|
for (s32 i = 0; i < mDrawTableCount; i++) {
|
|
mDrawTables[i]->tryRegisterActor(actor, listName);
|
|
mDrawTables[i]->tryRegisterActorModel(actor, listName);
|
|
}
|
|
}
|
|
|
|
void ExecuteDirector::registerActorModelDraw(LiveActor* actor, const char* listName) {
|
|
if (!actor->getExecuteInfo())
|
|
actor->initExecuteInfo(new ActorExecuteInfo(mRequestKeeper));
|
|
|
|
for (s32 i = 0; i < mDrawTableCount; i++)
|
|
mDrawTables[i]->tryRegisterActorModel(actor, listName);
|
|
}
|
|
|
|
void ExecuteDirector::registerLayoutUpdate(LayoutActor* layout, const char* listName) {
|
|
if (!layout->getExecuteInfo())
|
|
layout->initExecuteInfo(new LayoutExecuteInfo());
|
|
|
|
for (s32 i = 0; i < mUpdateTableCount; i++)
|
|
mUpdateTables[i]->tryRegisterLayout(layout, listName);
|
|
}
|
|
|
|
void ExecuteDirector::registerLayoutDraw(LayoutActor* layout, const char* listName) {
|
|
if (!layout->getExecuteInfo())
|
|
layout->initExecuteInfo(new LayoutExecuteInfo());
|
|
|
|
for (s32 i = 0; i < mDrawTableCount; i++)
|
|
mDrawTables[i]->tryRegisterLayout(layout, listName);
|
|
}
|
|
|
|
void ExecuteDirector::registerUser(IUseExecutor* user, const char* listName) {
|
|
for (s32 i = 0; i < mUpdateTableCount; i++)
|
|
mUpdateTables[i]->tryRegisterUser(user, listName);
|
|
|
|
for (s32 i = 0; i < mDrawTableCount; i++)
|
|
mDrawTables[i]->tryRegisterUser(user, listName);
|
|
}
|
|
|
|
void ExecuteDirector::registerFunctor(const FunctorBase& functor, const char* listName) {
|
|
for (s32 i = 0; i < mUpdateTableCount; i++)
|
|
mUpdateTables[i]->tryRegisterFunctor(functor, listName);
|
|
|
|
for (s32 i = 0; i < mDrawTableCount; i++)
|
|
mDrawTables[i]->tryRegisterFunctor(functor, listName);
|
|
}
|
|
|
|
void ExecuteDirector::registerFunctorDraw(const FunctorBase& functor, const char* listName) {
|
|
for (s32 i = 0; i < mDrawTableCount; i++)
|
|
mDrawTables[i]->tryRegisterFunctor(functor, listName);
|
|
}
|
|
|
|
void ExecuteDirector::createExecutorListTable() {
|
|
for (s32 i = 0; i < mUpdateTableCount; i++)
|
|
mUpdateTables[i]->createExecutorListTable();
|
|
|
|
for (s32 i = 0; i < mDrawTableCount; i++)
|
|
mDrawTables[i]->createExecutorListTable();
|
|
}
|
|
|
|
// NON_MATCHING: https://decomp.me/scratch/P7VLh
|
|
void ExecuteDirector::execute(const char* tableName) const {
|
|
if (!tableName) {
|
|
mRequestKeeper->executeRequestActorMovementAllOn();
|
|
mRequestKeeper->executeRequestActorDrawAllOn();
|
|
|
|
mUpdateTables[0]->execute();
|
|
|
|
mRequestKeeper->executeRequestActorMovementAllOff();
|
|
mRequestKeeper->executeRequestActorDrawAllOff();
|
|
|
|
return;
|
|
}
|
|
|
|
bool isActorEnabled = false;
|
|
|
|
if (isEqualString(tableName, mUpdateTables[0]->getName())) {
|
|
mRequestKeeper->executeRequestActorMovementAllOn();
|
|
mRequestKeeper->executeRequestActorDrawAllOn();
|
|
isActorEnabled = true;
|
|
}
|
|
|
|
for (s32 i = 0; i < mUpdateTableCount; i++) {
|
|
if (isEqualString(tableName, mUpdateTables[i]->getName())) {
|
|
mUpdateTables[i]->execute();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (isActorEnabled) {
|
|
mRequestKeeper->executeRequestActorMovementAllOff();
|
|
mRequestKeeper->executeRequestActorDrawAllOff();
|
|
}
|
|
}
|
|
|
|
void ExecuteDirector::executeList(const char* tableName, const char* listName) const {
|
|
mRequestKeeper->executeRequestActorMovementAllOn();
|
|
mRequestKeeper->executeRequestActorDrawAllOn();
|
|
if (tableName) {
|
|
for (s32 i = 0; i < mUpdateTableCount; ++i)
|
|
if (isEqualString(tableName, mUpdateTables[i]->getName()))
|
|
mUpdateTables[i]->executeList(listName);
|
|
} else {
|
|
mUpdateTables[0]->executeList(listName);
|
|
}
|
|
mRequestKeeper->executeRequestActorMovementAllOff();
|
|
mRequestKeeper->executeRequestActorDrawAllOff();
|
|
}
|
|
|
|
void ExecuteDirector::draw(const char* tableName) const {
|
|
if (!tableName) {
|
|
mDrawTables[0]->execute();
|
|
return;
|
|
}
|
|
|
|
for (s32 i = 0; i < mDrawTableCount; ++i) {
|
|
if (isEqualString(tableName, mDrawTables[i]->getName())) {
|
|
mDrawTables[i]->execute();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void ExecuteDirector::drawList(const char* tableName, const char* listName) const {
|
|
for (s32 i = 0; i < mDrawTableCount; ++i) {
|
|
if (isEqualString(tableName, mDrawTables[i]->getName())) {
|
|
mDrawTables[i]->executeList(listName);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool ExecuteDirector::isActiveDraw(const char* tableName) const {
|
|
if (!tableName)
|
|
return mDrawTables[0]->isActive();
|
|
|
|
for (s32 i = 0; i < mDrawTableCount; ++i)
|
|
if (isEqualString(tableName, mDrawTables[i]->getName()))
|
|
return mDrawTables[i]->isActive();
|
|
|
|
return false;
|
|
}
|
|
|
|
} // namespace al
|