2023-03-09 21:54:30 +01:00
|
|
|
#include "ActionResult.h"
|
2019-07-25 22:46:10 +10:00
|
|
|
|
|
|
|
#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"
|
2023-03-10 22:34:12 +01:00
|
|
|
#include "StatusEffect/StatusEffect.h"
|
2019-07-27 13:59:35 +10:00
|
|
|
|
2019-07-25 22:46:10 +10:00
|
|
|
using namespace Sapphire;
|
2023-03-16 21:56:57 +01:00
|
|
|
using namespace Sapphire::Common;
|
2019-07-25 22:46:10 +10:00
|
|
|
using namespace Sapphire::World::Action;
|
|
|
|
|
|
|
|
|
2023-03-14 22:32:55 +01:00
|
|
|
ActionResult::ActionResult( Entity::CharaPtr target ) :
|
|
|
|
m_target( std::move( target ) )
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
2023-02-28 10:31:59 +01:00
|
|
|
m_result.Arg0 = 0;
|
|
|
|
m_result.Arg1 = 0;
|
|
|
|
m_result.Arg2 = 0;
|
|
|
|
m_result.Value = 0;
|
2023-03-16 21:56:57 +01:00
|
|
|
m_result.Flag = static_cast< uint8_t >( ActionResultFlag::None );
|
|
|
|
m_result.Type = CalcResultType::TypeNone;
|
2019-07-25 22:46:10 +10:00
|
|
|
}
|
|
|
|
|
2023-03-09 21:54:30 +01:00
|
|
|
Entity::CharaPtr ActionResult::getTarget() const
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
|
|
|
return m_target;
|
|
|
|
}
|
|
|
|
|
2023-03-16 21:56:57 +01:00
|
|
|
void ActionResult::damage( uint32_t amount, CalcResultType hitType, uint8_t hitEffect, ActionResultFlag flag )
|
2019-07-27 13:59:35 +10:00
|
|
|
{
|
2023-03-14 22:32:55 +01:00
|
|
|
m_result.Arg0 = hitEffect;
|
2023-02-28 10:31:59 +01:00
|
|
|
m_result.Value = static_cast< int16_t >( amount );
|
|
|
|
m_result.Flag = static_cast< uint8_t >( flag );
|
2023-03-14 22:32:55 +01:00
|
|
|
m_result.Type = hitType;
|
2019-07-25 22:46:10 +10:00
|
|
|
}
|
|
|
|
|
2023-03-16 21:56:57 +01:00
|
|
|
void ActionResult::heal( uint32_t amount, CalcResultType hitType, uint8_t hitEffect, ActionResultFlag flag )
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
2023-03-14 22:32:55 +01:00
|
|
|
m_result.Arg0 = hitEffect;
|
2023-02-28 10:31:59 +01:00
|
|
|
m_result.Value = static_cast< int16_t >( amount );
|
|
|
|
m_result.Flag = static_cast< uint8_t >( flag );
|
2023-03-14 22:32:55 +01:00
|
|
|
m_result.Type = hitType;
|
2019-07-25 22:46:10 +10:00
|
|
|
}
|
|
|
|
|
2023-03-16 21:56:57 +01:00
|
|
|
void ActionResult::restoreMP( uint32_t amount, ActionResultFlag flag )
|
2020-01-05 17:09:27 +09:00
|
|
|
{
|
2023-02-28 10:31:59 +01:00
|
|
|
m_result.Value = static_cast< int16_t >( amount );
|
|
|
|
m_result.Flag = static_cast< uint8_t >( flag );
|
2023-03-16 21:56:57 +01:00
|
|
|
m_result.Type = CalcResultType::TypeRecoverMp;
|
2020-01-05 17:09:27 +09:00
|
|
|
}
|
|
|
|
|
2023-03-09 21:54:30 +01:00
|
|
|
void ActionResult::startCombo( uint16_t actionId )
|
2020-01-05 17:09:27 +09:00
|
|
|
{
|
2023-02-28 10:31:59 +01:00
|
|
|
m_result.Value = static_cast< int16_t >( actionId );
|
2023-03-16 21:56:57 +01:00
|
|
|
m_result.Flag = static_cast< uint8_t >( ActionResultFlag::EffectOnSource );
|
|
|
|
m_result.Type = CalcResultType::TypeCombo;
|
2020-01-05 17:09:27 +09:00
|
|
|
}
|
|
|
|
|
2023-03-09 21:54:30 +01:00
|
|
|
void ActionResult::comboSucceed()
|
2020-01-05 17:09:27 +09:00
|
|
|
{
|
2020-01-05 20:49:50 +09:00
|
|
|
// no EffectOnSource flag on this
|
2023-03-16 21:56:57 +01:00
|
|
|
m_result.Type = CalcResultType::TypeComboHit;
|
2020-01-05 17:09:27 +09:00
|
|
|
}
|
|
|
|
|
2023-03-10 22:34:12 +01:00
|
|
|
void ActionResult::applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param, bool shouldOverride )
|
2020-01-06 19:25:01 +09:00
|
|
|
{
|
2023-03-10 22:34:12 +01:00
|
|
|
m_result.Value = static_cast< int16_t >( id );
|
2023-02-28 10:31:59 +01:00
|
|
|
m_result.Arg2 = param;
|
2023-03-16 21:56:57 +01:00
|
|
|
m_result.Type = CalcResultType::TypeSetStatus;
|
2023-03-10 22:34:12 +01:00
|
|
|
|
|
|
|
m_bOverrideStatus = shouldOverride;
|
2024-06-21 04:27:01 +02:00
|
|
|
m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, source.getAsChara(), m_target, duration, 3000 );
|
|
|
|
m_pStatus->setParam( param );
|
|
|
|
}
|
|
|
|
|
|
|
|
void ActionResult::applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param,
|
2024-06-21 10:48:32 +02:00
|
|
|
const std::vector< StatusModifier >& modifiers, uint32_t flag, bool shouldOverride )
|
2024-06-21 04:27:01 +02:00
|
|
|
{
|
|
|
|
m_result.Value = static_cast< int16_t >( id );
|
|
|
|
m_result.Arg2 = param;
|
|
|
|
m_result.Type = CalcResultType::TypeSetStatus;
|
|
|
|
|
|
|
|
m_bOverrideStatus = shouldOverride;
|
|
|
|
m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, source.getAsChara(), m_target, duration, modifiers, flag, 3000 );
|
2023-03-10 22:34:12 +01:00
|
|
|
m_pStatus->setParam( param );
|
2020-01-06 19:25:01 +09:00
|
|
|
}
|
|
|
|
|
2023-03-13 11:21:42 +01:00
|
|
|
void ActionResult::applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, bool shouldOverride )
|
|
|
|
{
|
|
|
|
m_result.Value = static_cast< int16_t >( id );
|
|
|
|
m_result.Arg2 = param;
|
2023-03-16 21:56:57 +01:00
|
|
|
m_result.Type = CalcResultType::TypeSetStatusMe;
|
|
|
|
m_result.Flag = static_cast< uint8_t >( ActionResultFlag::EffectOnSource );
|
2023-03-13 11:21:42 +01:00
|
|
|
|
|
|
|
m_bOverrideStatus = shouldOverride;
|
2024-01-16 08:41:55 +01:00
|
|
|
m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, m_target, m_target, duration, 3000 );
|
2023-03-13 11:21:42 +01:00
|
|
|
m_pStatus->setParam( param );
|
|
|
|
}
|
|
|
|
|
2024-06-21 10:48:32 +02:00
|
|
|
void ActionResult::applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, const std::vector< World::Action::StatusModifier >& modifiers,
|
2024-06-21 04:27:01 +02:00
|
|
|
uint32_t flag, bool shouldOverride )
|
|
|
|
{
|
|
|
|
m_result.Value = static_cast< int16_t >( id );
|
|
|
|
m_result.Arg2 = param;
|
|
|
|
m_result.Type = CalcResultType::TypeSetStatusMe;
|
|
|
|
m_result.Flag = static_cast< uint8_t >( Common::ActionResultFlag::EffectOnSource );
|
|
|
|
|
|
|
|
m_bOverrideStatus = shouldOverride;
|
|
|
|
m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, m_target, m_target, duration, modifiers, flag, 3000 );
|
|
|
|
m_pStatus->setParam( param );
|
|
|
|
}
|
|
|
|
|
2023-03-09 21:54:30 +01:00
|
|
|
void ActionResult::mount( uint16_t mountId )
|
2020-01-23 22:36:01 +09:00
|
|
|
{
|
2023-02-28 10:31:59 +01:00
|
|
|
m_result.Value = static_cast< int16_t >( mountId );
|
|
|
|
m_result.Arg0 = 1;
|
2023-03-16 21:56:57 +01:00
|
|
|
m_result.Type = CalcResultType::TypeMount;
|
2020-01-23 22:36:01 +09:00
|
|
|
}
|
|
|
|
|
2023-03-09 21:54:30 +01:00
|
|
|
const Common::CalcResultParam& ActionResult::getCalcResultParam() const
|
2019-07-25 22:46:10 +10:00
|
|
|
{
|
2023-02-28 10:31:59 +01:00
|
|
|
return m_result;
|
2019-07-27 13:59:35 +10:00
|
|
|
}
|
|
|
|
|
2024-06-21 04:27:01 +02:00
|
|
|
const Sapphire::StatusEffect::StatusEffectPtr ActionResult::getStatusEffect() const
|
2023-03-10 22:34:12 +01:00
|
|
|
{
|
|
|
|
return m_pStatus;
|
|
|
|
}
|
|
|
|
|
2023-03-09 21:54:30 +01:00
|
|
|
void ActionResult::execute()
|
2019-07-27 13:59:35 +10:00
|
|
|
{
|
2023-03-10 17:32:52 +01:00
|
|
|
if( !m_target )
|
|
|
|
return;
|
|
|
|
|
2023-02-28 10:31:59 +01:00
|
|
|
switch( m_result.Type )
|
2019-07-27 13:59:35 +10:00
|
|
|
{
|
2023-03-16 21:56:57 +01:00
|
|
|
case CalcResultType::TypeDamageHp:
|
|
|
|
case CalcResultType::TypeCriticalDamageHp:
|
2019-07-27 13:59:35 +10:00
|
|
|
{
|
2023-02-28 10:31:59 +01:00
|
|
|
m_target->takeDamage( m_result.Value );
|
2019-07-27 13:59:35 +10:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-03-16 21:56:57 +01:00
|
|
|
case CalcResultType::TypeRecoverHp:
|
|
|
|
case CalcResultType::TypeCriticalRecoverHp:
|
2019-07-27 13:59:35 +10:00
|
|
|
{
|
2023-02-28 10:31:59 +01:00
|
|
|
m_target->heal( m_result.Value );
|
2019-07-27 13:59:35 +10:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-03-16 21:56:57 +01:00
|
|
|
case CalcResultType::TypeRecoverMp:
|
2020-01-05 17:09:27 +09:00
|
|
|
{
|
2023-02-28 10:31:59 +01:00
|
|
|
m_target->restoreMP( m_result.Value );
|
2020-01-05 17:09:27 +09:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-03-16 21:56:57 +01:00
|
|
|
case CalcResultType::TypeSetStatus:
|
|
|
|
case CalcResultType::TypeSetStatusMe:
|
2023-03-10 22:34:12 +01:00
|
|
|
{
|
|
|
|
if( !m_bOverrideStatus )
|
2023-03-12 21:06:37 +01:00
|
|
|
m_target->addStatusEffectByIdIfNotExist( m_pStatus );
|
2023-03-10 22:34:12 +01:00
|
|
|
else
|
2023-03-12 21:06:37 +01:00
|
|
|
m_target->addStatusEffectById( m_pStatus );
|
2023-03-10 22:34:12 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-03-16 21:56:57 +01:00
|
|
|
case CalcResultType::TypeMount:
|
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;
|
|
|
|
}
|
|
|
|
|
2019-07-27 13:59:35 +10:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2019-07-25 22:46:10 +10:00
|
|
|
}
|