1#pragma once
2
3#include <basis/seadTypes.h>
4#include <math/seadQuat.h>
5#include <math/seadVector.h>
6
7#include "Library/LiveActor/LiveActor.h"
8
9namespace al {
10struct ActorInitInfo;
11class HitSensor;
12class SensorMsg;
13class CollisionPartsFilterSpecialPurpose;
14class CameraPoserSubjective;
15class CameraTicket;
16class NerveKeeper;
17} // namespace al
18
19class EnemyStateSwoon;
20class TestFilterGlasses;
21class IUsePlayerHack;
22class PlayerPushReceiver;
23class CapTargetInfo;
24class HackerStateNormalMove;
25class PlayerHackStartShaderCtrl;
26
27class Megane : public al::LiveActor {
28public:
29 Megane(const char* name);
30
31 void init(const al::ActorInitInfo& initInfo) override;
32 bool receiveMsg(const al::SensorMsg* message, al::HitSensor* other,
33 al::HitSensor* self) override;
34 void attackSensor(al::HitSensor* self, al::HitSensor* other) override;
35 void updateCollider() override;
36 void control() override;
37
38 void notifyKillSwitch();
39 bool isNerveDieOrRebirth() const;
40 bool isNormalNerveWithWaitHack() const;
41 bool isNormalNerveWithoutWaitHack() const;
42 bool tryReceiveMsgKillByShineGet(const al::SensorMsg* message);
43 void prepareHack(al::HitSensor* self, al::HitSensor* other);
44 void endCameraSubjective();
45 bool isHack() const;
46 bool isEnableTrample(al::HitSensor* self, al::HitSensor* other) const;
47 void updateMovement();
48 bool tryShiftFall();
49 void updateRunAwayDirection();
50 void shiftWaitOrRunAway();
51 bool isTriggerStare() const;
52 bool isTriggerSubjective() const;
53 void startCameraSubjective();
54 void faceToCameraFront();
55 void tryToggleSpectaclesNerve();
56 void shiftHackNerveOnGround();
57 void putOnSpectaclesForce();
58 bool isWearingGlasses() const;
59 void updateDither();
60 void recordWallNormal();
61
62 void exeWait();
63 void exeFind();
64 void exeRunAway();
65 void exeFall();
66 void exeLand();
67 void exeTrampled();
68 void exeWaitHack();
69 void exeHackStart();
70 void exeHack();
71 void exeHackSlow();
72 void exeHackSubjective();
73 void exeHackFall();
74 void exeHackLand();
75 void exeDie();
76 void exeRebirth();
77 void exeAppear();
78 void exeSpectaclesOff();
79 void exeSpectaclesOn();
80
81private:
82 sead::Quatf mStartingQuat = {0.0f, 0.0f, 0.0f, 1.0f};
83 sead::Vector3f mStartingPos = {0.0f, 0.0f, 0.0f};
84 CapTargetInfo* mCapTargetInfo = nullptr;
85 IUsePlayerHack* mPlayerHack = nullptr;
86 EnemyStateSwoon* mStateSwoon = nullptr;
87 HackerStateNormalMove* mHackerState = nullptr;
88 HackerStateNormalMove* mHackerStateSpectacles = nullptr;
89 PlayerPushReceiver* mPlayerPushReceiver = nullptr;
90 PlayerHackStartShaderCtrl* mPlayerHackStartShaderCtrl = nullptr;
91 TestFilterGlasses* mTestFilterGlasses = nullptr;
92
93 s32 mSpectaclesOnCounter = 0;
94 s32 mWaitDelay = 0;
95 bool mIsHack = false;
96 al::CollisionPartsFilterSpecialPurpose* mCollisionPartsFilterMoveLimit = nullptr;
97 al::CameraPoserSubjective* mCameraPoserSubjective = nullptr;
98 al::CameraTicket* mCameraTicket = nullptr;
99 f32 mModelAlphaMask = 1.0f;
100
101 sead::Vector3f mPlayerPos = {0.0f, 0.0f, 0.0f};
102 sead::Vector3f mWallNormal = {0.0f, 0.0f, 0.0f};
103 u32 mRunAwayWallTime = 0;
104 al::HitSensor* mCapReceiverSensor = nullptr;
105 bool mIsHackTutorialVisible = false;
106 al::NerveKeeper* mSpectaclesNerveKeeper = nullptr;
107};
108