2019-07-25 22:46:10 +10:00
|
|
|
#include "EffectResult.h"
|
|
|
|
|
|
|
|
#include <Util/Util.h>
|
|
|
|
|
2019-07-27 13:59:35 +10:00
|
|
|
#include "Actor/Chara.h"
|
|
|
|
|
2019-07-25 22:46:10 +10:00
|
|
|
using namespace Sapphire;
|
|
|
|
using namespace Sapphire::World::Action;
|
|
|
|
|
|
|
|
|
2019-07-27 13:59:35 +10:00
|
|
|
EffectResult::EffectResult( Entity::CharaPtr target, uint64_t runAfter ) :
|
2019-07-25 22:46:10 +10:00
|
|
|
m_target( std::move( target ) ),
|
2019-07-27 13:59:35 +10:00
|
|
|
m_delayMs( runAfter ),
|
2019-07-25 22:46:10 +10:00
|
|
|
m_value( 0 ),
|
2019-07-27 13:59:35 +10:00
|
|
|
m_severity( Common::ActionHitSeverityType::NormalDamage ),
|
|
|
|
m_type( Common::ActionEffectType::Nothing ),
|
2020-01-05 17:09:27 +09:00
|
|
|
m_param( 0 ),
|
|
|
|
m_flag( 0 )
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Entity::CharaPtr EffectResult::getTarget() const
|
|
|
|
{
|
|
|
|
return m_target;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t EffectResult::getValue() const
|
|
|
|
{
|
|
|
|
return m_value;
|
|
|
|
}
|
|
|
|
|
2019-07-27 13:59:35 +10:00
|
|
|
uint64_t EffectResult::getDelay()
|
|
|
|
{
|
|
|
|
return m_delayMs;
|
|
|
|
}
|
|
|
|
|
2019-07-27 00:37:40 +10:00
|
|
|
void EffectResult::setParam( uint8_t param )
|
|
|
|
{
|
|
|
|
m_param = param;
|
|
|
|
}
|
|
|
|
|
2019-07-25 22:46:10 +10:00
|
|
|
void EffectResult::damage( uint32_t amount, Common::ActionHitSeverityType severity )
|
|
|
|
{
|
|
|
|
m_severity = severity;
|
|
|
|
m_value = amount;
|
|
|
|
|
|
|
|
m_type = Common::ActionEffectType::Damage;
|
|
|
|
}
|
|
|
|
|
2020-01-05 17:09:27 +09:00
|
|
|
void EffectResult::heal( uint32_t amount, Sapphire::Common::ActionHitSeverityType severity, bool isSelfHeal )
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
|
|
|
m_severity = severity;
|
|
|
|
m_value = amount;
|
2020-01-05 17:09:27 +09:00
|
|
|
m_flag = isSelfHeal ? 0x80 : 0; // flag == 0x80 displays healing text at source actor
|
2019-07-25 22:46:10 +10:00
|
|
|
|
|
|
|
m_type = Common::ActionEffectType::Heal;
|
|
|
|
}
|
|
|
|
|
2020-01-05 17:09:27 +09:00
|
|
|
void EffectResult::restoreMP( uint32_t amount )
|
|
|
|
{
|
|
|
|
m_value = amount;
|
|
|
|
m_flag = 0x80;
|
|
|
|
|
|
|
|
m_type = Common::ActionEffectType::MpGain;
|
|
|
|
}
|
|
|
|
|
|
|
|
void EffectResult::startCombo( uint16_t actionId )
|
|
|
|
{
|
|
|
|
m_value = actionId;
|
|
|
|
m_flag = 0x80;
|
|
|
|
|
|
|
|
m_type = Common::ActionEffectType::StartActionCombo;
|
|
|
|
}
|
|
|
|
|
|
|
|
void EffectResult::comboVisualEffect()
|
|
|
|
{
|
|
|
|
m_type = Common::ActionEffectType::ComboVisualEffect;
|
|
|
|
}
|
|
|
|
|
2019-07-25 22:46:10 +10:00
|
|
|
Common::EffectEntry EffectResult::buildEffectEntry() const
|
|
|
|
{
|
|
|
|
Common::EffectEntry entry{};
|
|
|
|
|
|
|
|
// todo: that retarded shit so > u16 max numbers work
|
|
|
|
entry.value = getValue();
|
|
|
|
entry.hitSeverity = m_severity;
|
|
|
|
entry.effectType = m_type;
|
2019-07-27 00:37:40 +10:00
|
|
|
entry.param = m_param;
|
2020-01-05 17:09:27 +09:00
|
|
|
entry.flags = m_flag;
|
2019-07-25 22:46:10 +10:00
|
|
|
|
|
|
|
return entry;
|
2019-07-27 13:59:35 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
void EffectResult::execute()
|
|
|
|
{
|
|
|
|
switch( m_type )
|
|
|
|
{
|
|
|
|
case Common::ActionEffectType::Damage:
|
|
|
|
{
|
|
|
|
m_target->takeDamage( m_value );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case Common::ActionEffectType::Heal:
|
|
|
|
{
|
|
|
|
m_target->heal( m_value );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2020-01-05 17:09:27 +09:00
|
|
|
case Common::ActionEffectType::MpGain:
|
|
|
|
{
|
|
|
|
m_target->restoreMP( m_value );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2019-07-27 13:59:35 +10:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2019-07-25 22:46:10 +10:00
|
|
|
}
|