1#include "Enemy/EnemyStateDamageCap.h"
2
3#include "Library/LiveActor/ActorActionFunction.h"
4#include "Library/LiveActor/ActorFlagFunction.h"
5#include "Library/Nerve/NerveSetupUtil.h"
6#include "Library/Nerve/NerveUtil.h"
7
8#include "Enemy/EnemyCap.h"
9#include "Util/SensorMsgFunction.h"
10
11namespace {
12NERVE_IMPL(EnemyStateDamageCap, Wait);
13NERVE_IMPL(EnemyStateDamageCap, DamageCap);
14
15NERVES_MAKE_STRUCT(EnemyStateDamageCap, Wait, DamageCap);
16} // namespace
17
18EnemyStateDamageCap::EnemyStateDamageCap(al::LiveActor* actor)
19 : al::ActorStateBase("キャプチャ敵の帽子反応ステート", actor) {
20 initNerve(nerve: &NrvEnemyStateDamageCap.Wait, stateCount: 0);
21}
22
23void EnemyStateDamageCap::kill() {
24 al::setNerve(user: this, nerve: &NrvEnemyStateDamageCap.Wait);
25 al::NerveStateBase::kill();
26}
27
28void EnemyStateDamageCap::createEnemyCap(const al::ActorInitInfo& info, const char* name) {
29 mEnemyCap = rs::tryCreateEnemyCap(mActor, info, name);
30}
31
32bool EnemyStateDamageCap::tryReceiveMsgCapBlow(const al::SensorMsg* msg, al::HitSensor* other,
33 al::HitSensor* self) {
34 if (!isCapOn() || !rs::isMsgCapAttack(msg))
35 return false;
36 rs::requestHitReactionToAttacker(msg, self, other);
37 mEnemyCap->startBlowDown(source: other);
38 al::setNerve(user: this, nerve: &NrvEnemyStateDamageCap.Wait);
39 return true;
40}
41
42bool EnemyStateDamageCap::isCapOn() const {
43 return mEnemyCap && al::isAlive(actor: mEnemyCap) && !mEnemyCap->isBlowDown();
44}
45
46void EnemyStateDamageCap::blowCap(al::HitSensor* source) {
47 if (isCapOn())
48 mEnemyCap->startBlowDown(source);
49}
50
51void EnemyStateDamageCap::resetCap() {
52 if (mEnemyCap)
53 mEnemyCap->appear();
54}
55
56void EnemyStateDamageCap::makeActorDeadCap() {
57 if (mEnemyCap)
58 mEnemyCap->makeActorDead();
59}
60
61void EnemyStateDamageCap::exeWait() {}
62
63void EnemyStateDamageCap::exeDamageCap() {
64 if (al::isFirstStep(user: this))
65 al::startAction(actor: mActor, actionName: "DamageCap");
66 if (al::isActionEnd(actor: mActor))
67 kill();
68}
69