1#include "Library/Nerve/NerveKeeper.h"
2
3#include "Library/Nerve/Nerve.h"
4#include "Library/Nerve/NerveStateCtrl.h"
5
6namespace al {
7NerveKeeper::NerveKeeper(IUseNerve* parent, const Nerve* nerve, s32 maxStates)
8 : mParent(parent), mNextNerve(nerve) {
9 if (maxStates > 0)
10 mStateCtrl = new NerveStateCtrl(maxStates);
11}
12
13void NerveKeeper::initNerveAction(NerveActionCtrl* actionCtrl) {
14 mActionCtrl = actionCtrl;
15}
16
17void NerveKeeper::setNerve(const Nerve* nextNerve) {
18 if (mStep >= 0 && mCurrentNerve != nullptr)
19 mCurrentNerve->executeOnEnd(keeper: this);
20
21 mNextNerve = nextNerve;
22 mStep = -1;
23}
24
25void NerveKeeper::tryChangeNerve() {
26 if (mNextNerve) {
27 if (mStateCtrl) {
28 mStateCtrl->tryEndCurrentState();
29 mStateCtrl->startState(nerve: mNextNerve);
30 }
31 mCurrentNerve = mNextNerve;
32 mNextNerve = nullptr;
33 mStep = 0;
34 }
35}
36
37void NerveKeeper::update() {
38 tryChangeNerve();
39 mCurrentNerve->execute(keeper: this);
40 mStep++;
41 tryChangeNerve();
42}
43
44const Nerve* NerveKeeper::getCurrentNerve() const {
45 return mNextNerve ? mNextNerve : mCurrentNerve;
46}
47
48} // namespace al
49