1#pragma once
2
3#include "Library/Nerve/NerveStateBase.h"
4
5namespace al {
6class SensorMsg;
7class HitSensor;
8class LiveActor;
9class WaterSurfaceFinder;
10} // namespace al
11
12struct EnemyStateSwoonInitParam {
13 EnemyStateSwoonInitParam(const char* startAnimName, const char* loopAnimName,
14 const char* endAnimName, const char* trampledAnimName,
15 const char* startFallAnimName, const char* startLandAnimName)
16 : startAnimName(startAnimName), loopAnimName(loopAnimName), endAnimName(endAnimName),
17 trampledAnimName(trampledAnimName), startFallAnimName(startFallAnimName),
18 startLandAnimName(startLandAnimName) {}
19
20 const char* startAnimName = "SwoonStart";
21 const char* loopAnimName = "Swoon";
22 const char* endAnimName = "SwoonEnd";
23 const char* trampledAnimName = "SwoonTrampled";
24 const char* startFallAnimName = "SwoonStartFall";
25 const char* startLandAnimName = "SwoonStartLand";
26 const char* endSignAnimName = nullptr;
27 const char* nearWaterStartAnimName = nullptr;
28 const char* nearWaterLoopAnimName = nullptr;
29 const char* nearWaterEndAnimName = nullptr;
30 const char* nearWaterStartLandAnimName = nullptr;
31 const char* nearWaterTrampledAnimName = nullptr;
32 const char* hitReactionAnimName = nullptr;
33 const char* hitReactionLandAnimName = nullptr;
34 bool hasSubActors = false;
35 bool hasStartLandAnimation = true;
36 bool hasLockOnDelay = false;
37 bool isCancelLoopOnProhibitedArea = false;
38 s32 swoonDuration = 600;
39 s32 endSignDelay = 60;
40};
41
42static_assert(sizeof(EnemyStateSwoonInitParam) == 0x80, "EnemyStateSwoonInitParam Size");
43
44class EnemyStateSwoon : public al::ActorStateBase {
45public:
46 EnemyStateSwoon(al::LiveActor* actor, const char* startAnimName, const char* loopAnimName,
47 const char* endAnimName, bool hasSubActors, bool hasStartLandAnimation);
48
49 void appear() override;
50 void control() override;
51
52 bool tryReceiveMsgAttack(const al::SensorMsg* message);
53 bool tryReceiveMsgStartHack(const al::SensorMsg* message);
54 bool tryReceiveMsgEndSwoon(const al::SensorMsg* message);
55 bool tryReceiveMsgPressDown(const al::SensorMsg* message);
56 bool tryReceiveMsgObjHipDropAll(const al::SensorMsg* message);
57 bool tryReceiveMsgTrample(const al::SensorMsg* message);
58 bool tryReceiveMsgTrample(const al::SensorMsg*, const al::HitSensor* other,
59 const al::HitSensor* self);
60 bool tryReceiveMsgTrampleReflect(const al::SensorMsg* message);
61 bool tryReceiveMsgTrampleReflect(const al::SensorMsg*, const al::HitSensor* other,
62 const al::HitSensor* self);
63 bool tryReceiveMsgObjHipDropReflect(const al::SensorMsg* message);
64 bool tryReceiveMsgObjLeapFrog(const al::SensorMsg*, const al::HitSensor* other,
65 const al::HitSensor* self);
66 bool tryReceiveMsgEnableLockOn(const al::SensorMsg* message);
67 bool tryReceiveMsgStartLockOn(const al::SensorMsg* message);
68
69 bool requestTrampled();
70 void initParams(s32 swoonDuration, const char* trampledAnimName);
71 void initParams(const EnemyStateSwoonInitParam& initParam);
72 const char* getSwoonStartAnimName() const;
73 const char* getSwoonStartLandAnimName() const;
74 bool isOnGroundOrWaterSurface() const;
75 bool tryStartHitReactionLand();
76 const char* getSwoonLoopAnimName() const;
77 bool isPlayingActionIncorrect() const;
78 const char* getSwoonEndAnimName() const;
79 const char* getSwoonTrampledAnimName() const;
80
81 void exeSwoonStart();
82 void exeSwoonStartFall();
83 void exeSwoonStartLand();
84 void exeSwoonLoop();
85 void exeSwoonEndSign();
86 void exeSwoonEnd();
87 void exeSwoonTrampled();
88
89 void enableLockOnDelay(bool hasLockOnDelay) { mHasLockOnDelay = hasLockOnDelay; }
90
91private:
92 s32 mSwoonDuration = 600;
93 s32 _24 = 0; // A delay counter
94 const char* mStartAnimName = nullptr;
95 const char* mLoopAnimName = nullptr;
96 const char* mEndAnimName = nullptr;
97 const char* mTrampledAnimName = "SwoonTrampled";
98 const char* mStartFallAnimName = "SwoonStartFall";
99 const char* mStartLandAnimName = "SwoonStartLand";
100 const char* mEndSignAnimName = nullptr;
101 const char* mNearWaterStartAnimName = nullptr;
102 const char* mNearWaterLoopAnimName = nullptr;
103 const char* mNearWaterEndAnimName = nullptr;
104 const char* mNearWaterStartLandAnimName = nullptr;
105 const char* mNearWaterTrampledAnimName = nullptr;
106 const char* mHitReactionAnimName = nullptr;
107 const char* mHitReactionLandAnimName = nullptr;
108 bool mIsLockOn = false;
109 bool mHasSubActors = false;
110 bool mHasStartLandAnimation = false;
111 bool mHasLockOnDelay = false;
112 s32 mEndSignDelay = 60;
113 al::WaterSurfaceFinder* mWaterSurfaceFinder = nullptr;
114 bool mIsAppearItem = false;
115 bool mIsCancelLoopOnProhibitedArea = false;
116};
117