2019-07-25 22:46:10 +10:00
|
|
|
#include "EffectResult.h"
|
|
|
|
|
|
|
|
#include <Util/Util.h>
|
|
|
|
|
2023-02-10 12:11:11 -03:00
|
|
|
#include <Service.h>
|
|
|
|
#include <Manager/PlayerMgr.h>
|
|
|
|
|
2019-07-27 13:59:35 +10:00
|
|
|
#include "Actor/Chara.h"
|
2020-01-23 22:36:01 +09:00
|
|
|
#include "Actor/Player.h"
|
2019-07-27 13:59:35 +10:00
|
|
|
|
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 ),
|
2020-01-08 17:21:01 +09:00
|
|
|
m_param0( 0 ),
|
|
|
|
m_param1( 0 ),
|
2021-11-27 00:53:57 +01:00
|
|
|
m_type( Common::ActionEffectType::CALC_RESULT_TYPE_NONE ),
|
2020-01-08 17:21:01 +09:00
|
|
|
m_param2( 0 ),
|
2020-01-05 20:49:50 +09:00
|
|
|
m_flag( Common::ActionEffectResultFlag::None )
|
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;
|
|
|
|
}
|
|
|
|
|
2020-01-05 20:49:50 +09:00
|
|
|
void EffectResult::damage( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag )
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
2020-01-08 17:21:01 +09:00
|
|
|
m_param0 = static_cast< uint8_t >( severity );
|
2019-07-25 22:46:10 +10:00
|
|
|
m_value = amount;
|
2020-01-05 20:49:50 +09:00
|
|
|
m_flag = flag;
|
2019-07-25 22:46:10 +10:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
m_type = Common::ActionEffectType::CALC_RESULT_TYPE_DAMAGE_HP;
|
2019-07-25 22:46:10 +10:00
|
|
|
}
|
|
|
|
|
2020-01-05 20:49:50 +09:00
|
|
|
void EffectResult::heal( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag )
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
2020-01-08 17:21:01 +09:00
|
|
|
m_param1 = static_cast< uint8_t >( severity );
|
2019-07-25 22:46:10 +10:00
|
|
|
m_value = amount;
|
2020-01-05 20:49:50 +09:00
|
|
|
m_flag = flag;
|
2019-07-25 22:46:10 +10:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
m_type = Common::ActionEffectType::CALC_RESULT_TYPE_RECOVER_HP;
|
2019-07-25 22:46:10 +10:00
|
|
|
}
|
|
|
|
|
2020-01-05 20:49:50 +09:00
|
|
|
void EffectResult::restoreMP( uint32_t amount, Common::ActionEffectResultFlag flag )
|
2020-01-05 17:09:27 +09:00
|
|
|
{
|
|
|
|
m_value = amount;
|
2020-01-05 20:49:50 +09:00
|
|
|
m_flag = flag;
|
2020-01-05 17:09:27 +09:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
m_type = Common::ActionEffectType::CALC_RESULT_TYPE_RECOVER_MP;
|
2020-01-05 17:09:27 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
void EffectResult::startCombo( uint16_t actionId )
|
|
|
|
{
|
|
|
|
m_value = actionId;
|
2020-01-05 20:49:50 +09:00
|
|
|
m_flag = Common::ActionEffectResultFlag::EffectOnSource;
|
2020-01-05 17:09:27 +09:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
m_type = Common::ActionEffectType::CALC_RESULT_TYPE_COMBO;
|
2020-01-05 17:09:27 +09:00
|
|
|
}
|
|
|
|
|
2020-01-05 20:49:50 +09:00
|
|
|
void EffectResult::comboSucceed()
|
2020-01-05 17:09:27 +09:00
|
|
|
{
|
2020-01-05 20:49:50 +09:00
|
|
|
// no EffectOnSource flag on this
|
2021-11-27 00:53:57 +01:00
|
|
|
m_type = Common::ActionEffectType::CALC_RESULT_TYPE_COMBO_HIT;
|
2020-01-05 17:09:27 +09:00
|
|
|
}
|
|
|
|
|
2020-01-06 19:25:01 +09:00
|
|
|
void EffectResult::applyStatusEffect( uint16_t statusId, uint8_t param )
|
|
|
|
{
|
|
|
|
m_value = statusId;
|
2020-01-08 17:21:01 +09:00
|
|
|
m_param2 = param;
|
2020-01-06 19:25:01 +09:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
m_type = Common::ActionEffectType::CALC_RESULT_TYPE_SET_STATUS;
|
2020-01-06 19:25:01 +09:00
|
|
|
}
|
|
|
|
|
2020-01-26 21:16:41 +11:00
|
|
|
void EffectResult::mount( uint16_t mountId )
|
2020-01-23 22:36:01 +09:00
|
|
|
{
|
2020-01-26 21:16:41 +11:00
|
|
|
m_value = mountId;
|
2020-01-23 22:36:01 +09:00
|
|
|
m_param0 = 1;
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
m_type = Common::ActionEffectType::CALC_RESULT_TYPE_MOUNT;
|
2020-01-23 22:36:01 +09:00
|
|
|
}
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
Common::CalcResultParam EffectResult::buildEffectEntry() const
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
2021-11-27 00:53:57 +01:00
|
|
|
Common::CalcResultParam entry{};
|
|
|
|
|
|
|
|
// todo: that retarded shit so > u16 max numbers work
|
|
|
|
entry.Value = getValue();
|
|
|
|
entry.Arg0 = m_param0;
|
|
|
|
entry.Arg1 = m_param1;
|
|
|
|
entry.Type = m_type;
|
|
|
|
entry.Arg2 = m_param2;
|
|
|
|
entry.Flag = static_cast< uint8_t >( 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 )
|
|
|
|
{
|
2021-11-27 00:53:57 +01:00
|
|
|
case Common::ActionEffectType::CALC_RESULT_TYPE_DAMAGE_HP:
|
2019-07-27 13:59:35 +10:00
|
|
|
{
|
|
|
|
m_target->takeDamage( m_value );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
case Common::ActionEffectType::CALC_RESULT_TYPE_RECOVER_HP:
|
2019-07-27 13:59:35 +10:00
|
|
|
{
|
|
|
|
m_target->heal( m_value );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
case Common::ActionEffectType::CALC_RESULT_TYPE_RECOVER_MP:
|
2020-01-05 17:09:27 +09:00
|
|
|
{
|
|
|
|
m_target->restoreMP( m_value );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
case Common::ActionEffectType::CALC_RESULT_TYPE_MOUNT:
|
2020-01-23 22:36:01 +09:00
|
|
|
{
|
|
|
|
auto pPlayer = m_target->getAsPlayer();
|
2023-02-10 12:11:11 -03:00
|
|
|
Common::Service< World::Manager::PlayerMgr >::ref().onMountUpdate( *pPlayer, m_value );
|
2020-01-23 22:36:01 +09:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2019-07-27 13:59:35 +10:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2019-07-25 22:46:10 +10:00
|
|
|
}
|