80 lines
2.2 KiB
C++
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);
|
|
} |