1#include "Library/LiveActor/LiveActorFunction.h"
2
3#include "Library/Base/StringUtil.h"
4#include "Library/LiveActor/ActorActionFunction.h"
5#include "Library/LiveActor/ActorClippingFunction.h"
6#include "Library/LiveActor/ActorCollisionFunction.h"
7#include "Library/LiveActor/ActorFlagFunction.h"
8#include "Library/LiveActor/ActorModelFunction.h"
9#include "Library/LiveActor/LiveActor.h"
10#include "Library/LiveActor/LiveActorInfo.h"
11#include "Library/LiveActor/LiveActorKeeper.h"
12
13namespace alSubActorFunction {
14
15void trySyncAlive(al::SubActorKeeper* subActorKeeper) {
16 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
17 if (subActorKeeper->getActorInfo(index: i)->syncType.isSet(e: al::SubActorSync::cAppear))
18 subActorKeeper->getActorInfo(index: i)->subActor->makeActorAlive();
19}
20
21void trySyncDead(al::SubActorKeeper* subActorKeeper) {
22 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
23 if (subActorKeeper->getActorInfo(index: i)->syncType.isSet(e: al::SubActorSync::cAppear))
24 subActorKeeper->getActorInfo(index: i)->subActor->makeActorDead();
25}
26
27void trySyncClippingStart(al::SubActorKeeper* subActorKeeper) {
28 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++) {
29 const al::SubActorInfo* info = subActorKeeper->getActorInfo(index: i);
30
31 if (info->syncType.isSet(e: al::SubActorSync::cClipping) && al::isAlive(actor: info->subActor) &&
32 !al::isClipped(info->subActor)) {
33 info->subActor->startClipped();
34 }
35 }
36}
37
38void trySyncClippingEnd(al::SubActorKeeper* subActorKeeper) {
39 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++) {
40 const al::SubActorInfo* info = subActorKeeper->getActorInfo(index: i);
41
42 if (info->syncType.isSet(e: al::SubActorSync::cClipping) && al::isAlive(actor: info->subActor) &&
43 al::isClipped(info->subActor)) {
44 info->subActor->endClipped();
45 }
46 }
47}
48
49void trySyncShowModel(al::SubActorKeeper* subActorKeeper) {
50 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
51 if (subActorKeeper->getActorInfo(index: i)->syncType.isSet(e: al::SubActorSync::cHide))
52 al::showModelIfHide(actor: subActorKeeper->getActorInfo(index: i)->subActor);
53}
54
55void trySyncHideModel(al::SubActorKeeper* subActorKeeper) {
56 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
57 if (subActorKeeper->getActorInfo(index: i)->syncType.isSet(e: al::SubActorSync::cHide))
58 al::hideModelIfShow(actor: subActorKeeper->getActorInfo(index: i)->subActor);
59}
60
61void trySyncModelAlphaMask(al::SubActorKeeper* subActorKeeper, f32 alpha) {
62 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++) {
63 const al::SubActorInfo* info = subActorKeeper->getActorInfo(index: i);
64
65 if (info->syncType.isSet(e: al::SubActorSync::cAlphaMask) && al::isExistModel(actor: info->subActor))
66 al::setModelAlphaMask(actor: info->subActor, alpha);
67 }
68}
69
70al::LiveActor* findSubActor(const al::SubActorKeeper* subActorKeeper, const char* subActorName) {
71 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++) {
72 const al::SubActorInfo* info = subActorKeeper->getActorInfo(index: i);
73
74 if (al::isEqualString(str1: info->subActor->getName(), str2: subActorName))
75 return info->subActor;
76 }
77 return nullptr;
78}
79
80} // namespace alSubActorFunction
81
82namespace al {
83inline SubActorInfo* getSubActorInfo(const LiveActor* actor, s32 index) {
84 return actor->getSubActorKeeper()->getActorInfo(index);
85}
86
87inline SubActorInfo* getSubActorInfo(const LiveActor* actor, const LiveActor* subActor) {
88 for (s32 i = 0; i < getSubActorNum(actor); i++) {
89 SubActorInfo* info = getSubActorInfo(actor, index: i);
90 if (info->subActor == subActor)
91 return info;
92 }
93 return nullptr;
94}
95
96bool isExistSubActorKeeper(const LiveActor* actor) {
97 return actor->getSubActorKeeper() != nullptr;
98}
99
100LiveActor* getSubActor(const LiveActor* actor, const char* subActorName) {
101 if (isExistSubActorKeeper(actor))
102 return alSubActorFunction::findSubActor(subActorKeeper: actor->getSubActorKeeper(), subActorName);
103 return nullptr;
104}
105
106LiveActor* tryGetSubActor(const LiveActor* actor, const char* subActorName) {
107 return getSubActor(actor, subActorName);
108}
109
110LiveActor* getSubActor(const LiveActor* actor, s32 index) {
111 return getSubActorInfo(actor, index)->subActor;
112}
113
114s32 getSubActorNum(const LiveActor* actor) {
115 return actor->getSubActorKeeper()->getCurActorCount();
116}
117
118void offSyncClippingSubActor(LiveActor* actor, const LiveActor* subActor) {
119 SubActorInfo* info = getSubActorInfo(actor, subActor);
120 __asm("");
121 info->syncType.unset(e: SubActorSync::cClipping);
122 return;
123}
124
125void offSyncClippingSubActor(LiveActor* actor, const char* subActorName) {
126 offSyncClippingSubActor(actor, subActor: getSubActor(actor, subActorName));
127}
128
129void offSyncClippingSubActorAll(LiveActor* actor) {
130 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
131 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
132 subActorKeeper->getActorInfo(index: i)->syncType.unset(e: SubActorSync::cClipping);
133}
134
135void onSyncClippingSubActor(LiveActor* actor, const LiveActor* subActor) {
136 getSubActorInfo(actor, subActor)->syncType.set(SubActorSync::cClipping);
137}
138
139void onSyncClippingSubActor(LiveActor* actor, const char* subActorName) {
140 onSyncClippingSubActor(actor, subActor: getSubActor(actor, subActorName));
141}
142
143void onSyncClippingSubActorAll(LiveActor* actor) {
144 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
145 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
146 subActorKeeper->getActorInfo(index: i)->syncType.set(SubActorSync::cClipping);
147}
148
149void offSyncAppearSubActor(LiveActor* actor, const LiveActor* subActor) {
150 SubActorInfo* info = getSubActorInfo(actor, subActor);
151 __asm("");
152 info->syncType.unset(e: SubActorSync::cAppear);
153}
154
155void offSyncAppearSubActor(LiveActor* actor, const char* subActorName) {
156 offSyncAppearSubActor(actor, subActor: getSubActor(actor, subActorName));
157}
158
159void offSyncAppearSubActorAll(LiveActor* actor) {
160 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
161 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
162 subActorKeeper->getActorInfo(index: i)->syncType.unset(e: SubActorSync::cAppear);
163}
164
165void onSyncAppearSubActor(LiveActor* actor, const LiveActor* subActor) {
166 getSubActorInfo(actor, subActor)->syncType.set(SubActorSync::cAppear);
167}
168
169void onSyncAppearSubActor(LiveActor* actor, const char* subActorName) {
170 onSyncAppearSubActor(actor, subActor: getSubActor(actor, subActorName));
171}
172
173void onSyncAppearSubActorAll(LiveActor* actor) {
174 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
175 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
176 subActorKeeper->getActorInfo(index: i)->syncType.set(SubActorSync::cAppear);
177}
178
179void offSyncHideSubActor(LiveActor* actor, const LiveActor* subActor) {
180 SubActorInfo* info = getSubActorInfo(actor, subActor);
181 __asm("");
182 info->syncType.unset(e: SubActorSync::cHide);
183}
184
185void offSyncHideSubActor(LiveActor* actor, const char* subActorName) {
186 offSyncHideSubActor(actor, subActor: getSubActor(actor, subActorName));
187}
188
189void offSyncHideSubActorAll(LiveActor* actor) {
190 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
191 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
192 subActorKeeper->getActorInfo(index: i)->syncType.unset(e: SubActorSync::cHide);
193}
194
195void onSyncHideSubActor(LiveActor* actor, const LiveActor* subActor) {
196 getSubActorInfo(actor, subActor)->syncType.set(SubActorSync::cHide);
197}
198
199void onSyncHideSubActor(LiveActor* actor, const char* subActorName) {
200 onSyncHideSubActor(actor, subActor: getSubActor(actor, subActorName));
201}
202
203void onSyncHideSubActorAll(LiveActor* actor) {
204 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
205 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
206 subActorKeeper->getActorInfo(index: i)->syncType.set(SubActorSync::cHide);
207}
208
209bool isSyncHideSubActor(const LiveActor* actor, const LiveActor* subActor) {
210 return getSubActorInfo(actor, subActor)->syncType.isSet(e: SubActorSync::cHide);
211}
212
213void offSyncAlphaMaskSubActor(LiveActor* actor, const LiveActor* subActor) {
214 SubActorInfo* info = getSubActorInfo(actor, subActor);
215 __asm("");
216 info->syncType.unset(e: SubActorSync::cAlphaMask);
217}
218
219void offSyncAlphaMaskSubActor(LiveActor* actor, const char* subActorName) {
220 offSyncAlphaMaskSubActor(actor, subActor: getSubActor(actor, subActorName));
221}
222
223void offSyncAlphaMaskSubActorAll(LiveActor* actor) {
224 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
225 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
226 subActorKeeper->getActorInfo(index: i)->syncType.unset(e: SubActorSync::cAlphaMask);
227}
228
229void onSyncAlphaMaskSubActor(LiveActor* actor, const LiveActor* subActor) {
230 getSubActorInfo(actor, subActor)->syncType.set(SubActorSync::cAlphaMask);
231}
232
233void onSyncAlphaMaskSubActor(LiveActor* actor, const char* subActorName) {
234 onSyncAlphaMaskSubActor(actor, subActor: getSubActor(actor, subActorName));
235}
236
237void onSyncAlphaMaskSubActorAll(LiveActor* actor) {
238 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
239 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
240 subActorKeeper->getActorInfo(index: i)->syncType.set(SubActorSync::cAlphaMask);
241}
242
243bool isSyncAlphaMaskSubActor(const LiveActor* actor, const LiveActor* subActor) {
244 return getSubActorInfo(actor, subActor)->syncType.isSet(e: SubActorSync::cAlphaMask);
245}
246
247void startActionSubActor(const LiveActor* actor, const char* subActorName, const char* action) {
248 startAction(actor: getSubActor(actor, subActorName), actionName: action);
249}
250
251bool isActionEndSubActor(const LiveActor* actor, const char* subActorName) {
252 return isActionEnd(actor: getSubActor(actor, subActorName));
253}
254
255bool isActionPlayingSubActor(const LiveActor* actor, const char* subActorName, const char* action) {
256 return isActionPlaying(actor: getSubActor(actor, subActorName), actionName: action);
257}
258
259bool isActionOneTimeSubActor(const LiveActor* actor, const char* subActorName) {
260 return isActionOneTime(actor: getSubActor(actor, subActorName));
261}
262
263bool isActionOneTimeSubActor(const LiveActor* actor, const char* subActorName, const char* action) {
264 return isActionOneTime(actor: getSubActor(actor, subActorName), actionName: action);
265}
266
267bool tryStartActionSubActorAll(const LiveActor* actor, const char* action) {
268 bool isAnyStartAction = false;
269 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
270 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++)
271 isAnyStartAction |= tryStartAction(actor: subActorKeeper->getActorInfo(index: i)->subActor, actionName: action);
272 return isAnyStartAction;
273}
274
275void makeActorDeadSubActorAll(const LiveActor* actor) {
276 const SubActorKeeper* subActorKeeper = actor->getSubActorKeeper();
277 for (s32 i = 0; i < subActorKeeper->getCurActorCount(); i++) {
278 SubActorInfo* info = subActorKeeper->getActorInfo(index: i);
279 info->subActor->makeActorDead();
280 if (isExistSubActorKeeper(actor: info->subActor))
281 makeActorDeadSubActorAll(actor: info->subActor);
282 }
283}
284
285void tryValidateCollisionPartsSubActorAll(LiveActor* actor) {
286 s32 count = getSubActorNum(actor);
287 for (s32 i = 0; i < count; i++) {
288 LiveActor* subActor = getSubActor(actor, index: i);
289 if (isExistCollisionParts(subActor))
290 validateCollisionParts(subActor);
291 }
292}
293
294void tryInvalidateCollisionPartsSubActorAll(LiveActor* actor) {
295 s32 count = getSubActorNum(actor);
296 for (s32 i = 0; i < count; i++) {
297 LiveActor* subActor = getSubActor(actor, index: i);
298 if (isExistCollisionParts(subActor))
299 invalidateCollisionParts(subActor);
300 }
301}
302
303} // namespace al
304