1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-28 15:17:46 +00:00
sapphire/src/world/Action/EffectResult.cpp

124 lines
3.2 KiB
C++
Raw Normal View History

2019-07-25 22:46:10 +10:00
#include "EffectResult.h"
#include <Util/Util.h>
#include <Service.h>
#include <Manager/PlayerMgr.h>
#include "Actor/Chara.h"
2020-01-23 22:36:01 +09:00
#include "Actor/Player.h"
2019-07-25 22:46:10 +10:00
using namespace Sapphire;
using namespace Sapphire::World::Action;
EffectResult::EffectResult( Entity::CharaPtr target, uint64_t runAfter ) :
2019-07-25 22:46:10 +10:00
m_target( std::move( target ) ),
m_delayMs( runAfter )
2019-07-25 22:46:10 +10:00
{
m_result.Arg0 = 0;
m_result.Arg1 = 0;
m_result.Arg2 = 0;
m_result.Value = 0;
m_result.Flag = static_cast< uint8_t >( Common::ActionEffectResultFlag::None );
m_result.Type = Common::ActionEffectType::CALC_RESULT_TYPE_NONE;
2019-07-25 22:46:10 +10:00
}
Entity::CharaPtr EffectResult::getTarget() const
{
return m_target;
}
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
{
m_result.Arg0 = static_cast< uint8_t >( severity );
m_result.Value = static_cast< int16_t >( amount );
m_result.Flag = static_cast< uint8_t >( flag );
m_result.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
{
m_result.Arg1 = static_cast< uint8_t >( severity );
m_result.Value = static_cast< int16_t >( amount );
m_result.Flag = static_cast< uint8_t >( flag );
m_result.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_result.Value = static_cast< int16_t >( amount );
m_result.Flag = static_cast< uint8_t >( flag );
m_result.Type = Common::ActionEffectType::CALC_RESULT_TYPE_RECOVER_MP;
2020-01-05 17:09:27 +09:00
}
void EffectResult::startCombo( uint16_t actionId )
{
m_result.Value = static_cast< int16_t >( actionId );
m_result.Flag = static_cast< uint8_t >( Common::ActionEffectResultFlag::EffectOnSource );
m_result.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
m_result.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_result.Value = static_cast< int16_t >( statusId );
m_result.Arg2 = param;
m_result.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
{
m_result.Value = static_cast< int16_t >( mountId );
m_result.Arg0 = 1;
m_result.Type = Common::ActionEffectType::CALC_RESULT_TYPE_MOUNT;
2020-01-23 22:36:01 +09:00
}
const Common::CalcResultParam& EffectResult::getCalcResultParam() const
2019-07-25 22:46:10 +10:00
{
return m_result;
}
void EffectResult::execute()
{
switch( m_result.Type )
{
case Common::ActionEffectType::CALC_RESULT_TYPE_DAMAGE_HP:
{
m_target->takeDamage( m_result.Value );
break;
}
case Common::ActionEffectType::CALC_RESULT_TYPE_RECOVER_HP:
{
m_target->heal( m_result.Value );
break;
}
case Common::ActionEffectType::CALC_RESULT_TYPE_RECOVER_MP:
2020-01-05 17:09:27 +09:00
{
m_target->restoreMP( m_result.Value );
2020-01-05 17:09:27 +09:00
break;
}
case Common::ActionEffectType::CALC_RESULT_TYPE_MOUNT:
2020-01-23 22:36:01 +09:00
{
auto pPlayer = m_target->getAsPlayer();
2023-03-06 10:12:29 +01:00
pPlayer->setMount( m_result.Value );
2020-01-23 22:36:01 +09:00
break;
}
default:
break;
}
2019-07-25 22:46:10 +10:00
}