Dawn/src/dawnrose/scene/components/entity/EntityAttackBase.cpp

80 lines
2.2 KiB
C++

// Copyright (c) 2023 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#include "EntityAttackBase.hpp"
using namespace Dawn;
EntityAttackBase::EntityAttackBase(SceneItem* item) :
SceneItemComponent(item),
interrupted(false),
state(ENTITY_ATTACK_STATE_NOTHING)
{
}
void EntityAttackBase::interrupt() {
if(!this->isInterruptable()) return;
interrupted = true;
onAttackInterrupted.invoke();
this->attackTime = -1;
}
void EntityAttackBase::attack() {
if(!this->canAttack()) return;
if(this->isAttacking()) return;
interrupted = false;
attackTime = 0;
state = ENTITY_ATTACK_STATE_RAMP_UP;
onAttackRampUpStart.invoke();
}
bool_t EntityAttackBase::isAttacking() {
return attackTime >= 0;
}
void EntityAttackBase::onStart() {
useEvent([&](float_t delta) {
if(!this->isAttacking()) return;
this->attackTime += delta;
switch(state) {
case ENTITY_ATTACK_STATE_RAMP_UP: {
if(this->attackTime >= this->getAttackRampUpDuration()) {
state = ENTITY_ATTACK_STATE_ACTIVE;
onAttackRampUpEnd.invoke();
onAttackActiveStart.invoke();
}
} break;
case ENTITY_ATTACK_STATE_ACTIVE: {
if(this->attackTime >= this->getAttackRampUpDuration() + this->getAttackActiveDuration()) {
state = ENTITY_ATTACK_STATE_RAMP_DOWN;
onAttackActiveEnd.invoke();
onAttackRampDownStart.invoke();
}
} break;
case ENTITY_ATTACK_STATE_RAMP_DOWN: {
if(this->attackTime >= this->getAttackRampUpDuration() + this->getAttackActiveDuration() + this->getAttackRampDownDuration()) {
state = ENTITY_ATTACK_STATE_COOLDOWN;
onAttackRampDownEnd.invoke();
onAttackCooldownStart.invoke();
}
} break;
case ENTITY_ATTACK_STATE_COOLDOWN: {
if(this->attackTime >= this->getAttackRampUpDuration() + this->getAttackActiveDuration() + this->getAttackRampDownDuration() + this->getAttackCooldownDuration()) {
state = ENTITY_ATTACK_STATE_NOTHING;
onAttackCooldownEnd.invoke();
this->attackTime = -1;
}
} break;
default:
assertUnreachable();
break;
}
}, getScene()->eventSceneUpdate);
}