1#include "Library/Layout/LayoutActionFunction.h"
2
3#include "Library/Base/StringUtil.h"
4#include "Library/Layout/IUseLayoutAction.h"
5#include "Library/Layout/LayoutActionKeeper.h"
6#include "Library/Layout/LayoutActor.h"
7#include "Library/Layout/LayoutPaneGroup.h"
8#include "Library/Math/MathUtil.h"
9#include "Library/Nerve/NerveUtil.h"
10
11namespace al {
12
13inline LayoutPaneGroup* getLayoutPaneGroup(const IUseLayoutAction* layout, const char* paneName) {
14 return layout->getLayoutActionKeeper()->getLayoutPaneGroup(groupName: paneName);
15}
16
17void startAction(IUseLayoutAction* layout, const char* actionName, const char* paneName) {
18 layout->getLayoutActionKeeper()->startAction(actionName, groupName: paneName);
19}
20
21s32 startActionAtRandomFrame(IUseLayoutAction* layout, const char* actionName,
22 const char* paneName) {
23 startAction(layout, actionName, paneName);
24 LayoutPaneGroup* paneGroup = getLayoutPaneGroup(layout, paneName);
25 f32 animFrameMax = paneGroup->getAnimFrameMax(animName: actionName);
26 f32 randomFrame = getRandom(min: 0.0f, max: animFrameMax);
27 paneGroup->setAnimFrame((s32)randomFrame);
28 return randomFrame;
29}
30
31void startFreezeAction(IUseLayoutAction* layout, const char* actionName, f32 frame,
32 const char* paneName) {
33 startAction(layout, actionName, paneName);
34 LayoutPaneGroup* paneGroup = getLayoutPaneGroup(layout, paneName);
35 paneGroup->setAnimFrame(frame);
36 paneGroup->setAnimFrameRate(0.0f);
37}
38
39void startFreezeActionEnd(IUseLayoutAction* layout, const char* actionName, const char* paneName) {
40 f32 animFrameEnd = getActionFrameMax(layout, actionName, paneName);
41 startFreezeAction(layout, actionName, frame: animFrameEnd, paneName);
42}
43
44f32 getActionFrameMax(const IUseLayoutAction* layout, const char* actionName,
45 const char* paneName) {
46 return getLayoutPaneGroup(layout, paneName)->getAnimFrameMax(animName: actionName);
47}
48
49void startFreezeGaugeAction(IUseLayoutAction* layout, f32 value, f32 minFrame, f32 maxFrame,
50 const char* actionName, const char* paneName) {
51 f32 frame =
52 calcRate01(value, minFrame, maxFrame) * getActionFrameMax(layout, actionName, paneName);
53 startFreezeAction(layout, actionName, frame, paneName);
54}
55
56bool tryStartAction(IUseLayoutAction* layout, const char* actionName, const char* paneName) {
57 if (!isExistAction(layout, actionName, paneName))
58 return false;
59
60 startAction(layout, actionName, paneName);
61 return true;
62}
63
64bool isExistAction(const IUseLayoutAction* layout, const char* actionName, const char* paneName) {
65 return isExistAction(layout, paneName) &&
66 getLayoutPaneGroup(layout, paneName)->isAnimExist(animName: actionName);
67}
68
69bool isActionEnd(const IUseLayoutAction* layout, const char* paneName) {
70 LayoutPaneGroup* paneGroup = getLayoutPaneGroup(layout, paneName);
71 if (paneGroup && paneGroup->isAnimPlaying() && paneGroup->isAnimOneTime())
72 return paneGroup->isAnimEnd();
73 return true;
74}
75
76bool isExistAction(const IUseLayoutAction* layout, const char* paneName) {
77 return layout->getLayoutActionKeeper()->getLayoutPaneGroup(groupName: paneName) != nullptr;
78}
79
80bool isActionOneTime(const IUseLayoutAction* layout, const char* actionName, const char* paneName) {
81 return getLayoutPaneGroup(layout, paneName)->isAnimOneTime(animName: actionName);
82}
83
84f32 getActionFrame(const IUseLayoutAction* layout, const char* paneName) {
85 return getLayoutPaneGroup(layout, paneName)->getAnimFrame();
86}
87
88void setActionFrame(IUseLayoutAction* layout, f32 frame, const char* paneName) {
89 getLayoutPaneGroup(layout, paneName)->setAnimFrame(frame);
90}
91
92f32 getActionFrameRate(const IUseLayoutAction* layout, const char* paneName) {
93 return getLayoutPaneGroup(layout, paneName)->getAnimFrameRate();
94}
95
96void setActionFrameRate(IUseLayoutAction* layout, f32 frameRate, const char* paneName) {
97 getLayoutPaneGroup(layout, paneName)->setAnimFrameRate(frameRate);
98}
99
100const char* getActionName(const IUseLayoutAction* layout, const char* paneName) {
101 return getLayoutPaneGroup(layout, paneName)->getPlayingAnimName();
102}
103
104bool isActionPlaying(const IUseLayoutAction* layout, const char* actionName, const char* paneName) {
105 return isEqualString(str1: getLayoutPaneGroup(layout, paneName)->getPlayingAnimName(), str2: actionName);
106}
107
108bool isAnyActionPlaying(const IUseLayoutAction* layout, const char* paneName) {
109 return getLayoutPaneGroup(layout, paneName)->isAnimPlaying();
110}
111
112void setNerveAtActionEnd(LayoutActor* layout, const Nerve* nerve) {
113 if (isActionEnd(layout, paneName: nullptr))
114 setNerve(user: layout, nerve);
115}
116
117} // namespace al
118