OdysseyDecomp/lib/al/Library/Execute/ExecuteDirector.cpp

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