// 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); }