| 1 | #pragma once |
| 2 | |
| 3 | #include "Library/Nerve/NerveStateBase.h" |
| 4 | |
| 5 | namespace al { |
| 6 | class SensorMsg; |
| 7 | class HitSensor; |
| 8 | class LiveActor; |
| 9 | class WaterSurfaceFinder; |
| 10 | } // namespace al |
| 11 | |
| 12 | struct 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 | |
| 42 | static_assert(sizeof(EnemyStateSwoonInitParam) == 0x80, "EnemyStateSwoonInitParam Size" ); |
| 43 | |
| 44 | class EnemyStateSwoon : public al::ActorStateBase { |
| 45 | public: |
| 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 | |
| 91 | private: |
| 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 | |