1#include "Library/Execute/ExecuteDirector.h"
2
3#include "Library/Base/StringUtil.h"
4#include "Library/Execute/ActorExecuteInfo.h"
5#include "Library/Execute/ExecuteRequestKeeper.h"
6#include "Library/Execute/ExecuteTablesImpl.h"
7#include "Library/Execute/LayoutExecuteInfo.h"
8#include "Library/Layout/LayoutActor.h"
9#include "Library/LiveActor/LiveActor.h"
10
11namespace al {
12
13ExecuteDirector::ExecuteDirector(s32 count) : mRequestCount(count) {}
14
15ExecuteDirector::~ExecuteDirector() {
16 for (s32 i = 0; i < mDrawTableCount; i++)
17 delete mDrawTables[i];
18
19 for (s32 i = 0; i < mUpdateTableCount; i++)
20 delete mUpdateTables[i];
21}
22
23void ExecuteDirector::init(const ExecuteSystemInitInfo& initInfo) {
24 mUpdateTableCount = UpdateTableSize;
25 mUpdateTables = new ExecuteTableHolderUpdate*[UpdateTableSize];
26
27 for (s32 i = 0; i < mUpdateTableCount; ++i) {
28 mUpdateTables[i] = new ExecuteTableHolderUpdate();
29 mUpdateTables[i]->init(name: UpdateTable[i].name, initInfo, orders: UpdateTable[i].executeOrders,
30 orderCount: UpdateTable[i].executeOrderCount);
31 }
32
33 mDrawTableCount = DrawTableSize;
34 mDrawTables = new ExecuteTableHolderDraw*[DrawTableSize];
35
36 for (s32 i = 0; i < mDrawTableCount; ++i) {
37 mDrawTables[i] = new ExecuteTableHolderDraw();
38 mDrawTables[i]->init(name: DrawTable[i].name, initInfo, orders: DrawTable[i].executeOrders,
39 orderCount: DrawTable[i].executeOrderCount);
40 }
41
42 mRequestKeeper = new ExecuteRequestKeeper(mRequestCount);
43}
44
45void ExecuteDirector::registerActorUpdate(LiveActor* actor, const char* listName) {
46 if (!actor->getExecuteInfo())
47 actor->initExecuteInfo(executeInfo: new ActorExecuteInfo(mRequestKeeper));
48
49 for (s32 i = 0; i < mUpdateTableCount; i++)
50 mUpdateTables[i]->tryRegisterActor(actor, listName);
51}
52
53void ExecuteDirector::registerActorDraw(LiveActor* actor, const char* listName) {
54 if (!actor->getExecuteInfo())
55 actor->initExecuteInfo(executeInfo: new ActorExecuteInfo(mRequestKeeper));
56
57 for (s32 i = 0; i < mDrawTableCount; i++) {
58 mDrawTables[i]->tryRegisterActor(actor, listName);
59 mDrawTables[i]->tryRegisterActorModel(actor, listName);
60 }
61}
62
63void ExecuteDirector::registerActorModelDraw(LiveActor* actor, const char* listName) {
64 if (!actor->getExecuteInfo())
65 actor->initExecuteInfo(executeInfo: new ActorExecuteInfo(mRequestKeeper));
66
67 for (s32 i = 0; i < mDrawTableCount; i++)
68 mDrawTables[i]->tryRegisterActorModel(actor, listName);
69}
70
71void ExecuteDirector::registerLayoutUpdate(LayoutActor* layout, const char* listName) {
72 if (!layout->getExecuteInfo())
73 layout->initExecuteInfo(new LayoutExecuteInfo());
74
75 for (s32 i = 0; i < mUpdateTableCount; i++)
76 mUpdateTables[i]->tryRegisterLayout(layout, listName);
77}
78
79void ExecuteDirector::registerLayoutDraw(LayoutActor* layout, const char* listName) {
80 if (!layout->getExecuteInfo())
81 layout->initExecuteInfo(new LayoutExecuteInfo());
82
83 for (s32 i = 0; i < mDrawTableCount; i++)
84 mDrawTables[i]->tryRegisterLayout(layout, listName);
85}
86
87void ExecuteDirector::registerUser(IUseExecutor* user, const char* listName) {
88 for (s32 i = 0; i < mUpdateTableCount; i++)
89 mUpdateTables[i]->tryRegisterUser(user, listName);
90
91 for (s32 i = 0; i < mDrawTableCount; i++)
92 mDrawTables[i]->tryRegisterUser(user, listName);
93}
94
95void ExecuteDirector::registerFunctor(const FunctorBase& functor, const char* listName) {
96 for (s32 i = 0; i < mUpdateTableCount; i++)
97 mUpdateTables[i]->tryRegisterFunctor(functor, listName);
98
99 for (s32 i = 0; i < mDrawTableCount; i++)
100 mDrawTables[i]->tryRegisterFunctor(functor, listName);
101}
102
103void ExecuteDirector::registerFunctorDraw(const FunctorBase& functor, const char* listName) {
104 for (s32 i = 0; i < mDrawTableCount; i++)
105 mDrawTables[i]->tryRegisterFunctor(functor, listName);
106}
107
108void ExecuteDirector::createExecutorListTable() {
109 for (s32 i = 0; i < mUpdateTableCount; i++)
110 mUpdateTables[i]->createExecutorListTable();
111
112 for (s32 i = 0; i < mDrawTableCount; i++)
113 mDrawTables[i]->createExecutorListTable();
114}
115
116// NON_MATCHING
117void ExecuteDirector::execute(const char* tableName) const {
118 if (!tableName) {
119 mRequestKeeper->executeRequestActorMovementAllOn();
120 mRequestKeeper->executeRequestActorDrawAllOn();
121
122 mUpdateTables[0]->execute();
123
124 mRequestKeeper->executeRequestActorMovementAllOff();
125 mRequestKeeper->executeRequestActorDrawAllOff();
126
127 return;
128 }
129
130 bool isActorEnabled = false;
131
132 if (isEqualString(str1: tableName, str2: mUpdateTables[0]->getName())) {
133 mRequestKeeper->executeRequestActorMovementAllOn();
134 mRequestKeeper->executeRequestActorDrawAllOn();
135 isActorEnabled = true;
136 }
137
138 for (s32 i = 0; i < mUpdateTableCount; i++) {
139 if (isEqualString(str1: tableName, str2: mUpdateTables[i]->getName())) {
140 mUpdateTables[i]->execute();
141 break;
142 }
143 }
144
145 if (isActorEnabled) {
146 mRequestKeeper->executeRequestActorMovementAllOff();
147 mRequestKeeper->executeRequestActorDrawAllOff();
148 }
149}
150
151void ExecuteDirector::executeList(const char* tableName, const char* listName) const {
152 mRequestKeeper->executeRequestActorMovementAllOn();
153 mRequestKeeper->executeRequestActorDrawAllOn();
154 if (tableName) {
155 for (s32 i = 0; i < mUpdateTableCount; ++i)
156 if (isEqualString(str1: tableName, str2: mUpdateTables[i]->getName()))
157 mUpdateTables[i]->executeList(listName);
158 } else {
159 mUpdateTables[0]->executeList(listName);
160 }
161 mRequestKeeper->executeRequestActorMovementAllOff();
162 mRequestKeeper->executeRequestActorDrawAllOff();
163}
164
165void ExecuteDirector::draw(const char* tableName) const {
166 if (!tableName) {
167 mDrawTables[0]->execute();
168 return;
169 }
170
171 for (s32 i = 0; i < mDrawTableCount; ++i) {
172 if (isEqualString(str1: tableName, str2: mDrawTables[i]->getName())) {
173 mDrawTables[i]->execute();
174 return;
175 }
176 }
177}
178
179void ExecuteDirector::drawList(const char* tableName, const char* listName) const {
180 for (s32 i = 0; i < mDrawTableCount; ++i) {
181 if (isEqualString(str1: tableName, str2: mDrawTables[i]->getName())) {
182 mDrawTables[i]->executeList(listName);
183 return;
184 }
185 }
186}
187
188bool ExecuteDirector::isActiveDraw(const char* tableName) const {
189 if (!tableName)
190 return mDrawTables[0]->isActive();
191
192 for (s32 i = 0; i < mDrawTableCount; ++i)
193 if (isEqualString(str1: tableName, str2: mDrawTables[i]->getName()))
194 return mDrawTables[i]->isActive();
195
196 return false;
197}
198
199} // namespace al
200