diff --git a/src/tools/action_parse/main.cpp b/src/tools/action_parse/main.cpp index a5af43f9..8a42ff52 100644 --- a/src/tools/action_parse/main.cpp +++ b/src/tools/action_parse/main.cpp @@ -42,6 +42,7 @@ struct StatusEntry uint16_t id; int32_t duration; uint32_t flag; + bool canApplyMultipleTimes; std::vector< StatusModifier > modifiers; }; diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 44b6cc9f..13a95263 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -630,7 +630,7 @@ void Action::Action::handleStatusEffects() { for( auto& status : m_lutEntry.statuses.target ) { - getActionResultBuilder()->applyStatusEffect( actor, status.id, status.duration, 0, status.modifiers, status.flag, true ); + getActionResultBuilder()->applyStatusEffect( actor, status.id, status.duration, 0, status.modifiers, status.flag, status.canApplyMultipleTimes, true ); } if( actor->getStatusEffectMap().size() > 0 ) diff --git a/src/world/Action/ActionLut.h b/src/world/Action/ActionLut.h index 25865854..ecb45f0d 100644 --- a/src/world/Action/ActionLut.h +++ b/src/world/Action/ActionLut.h @@ -19,6 +19,7 @@ namespace Sapphire::World::Action uint16_t id; int32_t duration; uint32_t flag; + bool canApplyMultipleTimes; std::vector< StatusModifier > modifiers; }; diff --git a/src/world/Action/ActionResult.cpp b/src/world/Action/ActionResult.cpp index 0a0e8d68..5aff9c71 100644 --- a/src/world/Action/ActionResult.cpp +++ b/src/world/Action/ActionResult.cpp @@ -83,14 +83,14 @@ void ActionResult::applyStatusEffect( uint32_t id, int32_t duration, Entity::Cha } void ActionResult::applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param, - std::vector< StatusModifier > modifiers, uint32_t flag, bool shouldOverride ) + std::vector< StatusModifier > modifiers, uint32_t flag, bool canApplyMultipleTimes, bool shouldOverride ) { m_result.Value = static_cast< int16_t >( id ); m_result.Arg2 = param; m_result.Type = Common::ActionEffectType::CALC_RESULT_TYPE_SET_STATUS; m_bOverrideStatus = shouldOverride; - m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, source.getAsChara(), m_target, duration, modifiers, flag, 3000 ); + m_pStatus = Sapphire::StatusEffect::make_StatusEffect( id, source.getAsChara(), m_target, duration, modifiers, flag, 3000, canApplyMultipleTimes ); m_pStatus->setParam( param ); } @@ -115,7 +115,7 @@ void ActionResult::applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t 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 = Sapphire::StatusEffect::make_StatusEffect( id, m_target, m_target, duration, modifiers, flag, 3000, false ); m_pStatus->setParam( param ); } diff --git a/src/world/Action/ActionResult.h b/src/world/Action/ActionResult.h index 69dfa3c3..0b044e2b 100644 --- a/src/world/Action/ActionResult.h +++ b/src/world/Action/ActionResult.h @@ -22,7 +22,7 @@ namespace Sapphire::World::Action void comboSucceed(); void applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param, bool shouldOverride ); void applyStatusEffect( uint32_t id, int32_t duration, Entity::Chara& source, uint8_t param, - std::vector< World::Action::StatusModifier > modifiers, uint32_t flag, bool shouldOverride ); + std::vector< World::Action::StatusModifier > modifiers, uint32_t flag, bool canApplyMultipleTimes, bool shouldOverride ); void applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, bool shouldOverride ); void applyStatusEffectSelf( uint32_t id, int32_t duration, uint8_t param, std::vector< World::Action::StatusModifier > modifiers, uint32_t flag, bool shouldOverride ); diff --git a/src/world/Action/ActionResultBuilder.cpp b/src/world/Action/ActionResultBuilder.cpp index bedd3a2a..d4aeb466 100644 --- a/src/world/Action/ActionResultBuilder.cpp +++ b/src/world/Action/ActionResultBuilder.cpp @@ -89,10 +89,10 @@ void ActionResultBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t } void ActionResultBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint32_t duration, uint8_t param, - std::vector< World::Action::StatusModifier > modifiers, uint32_t flag, bool shouldOverride ) + std::vector< World::Action::StatusModifier > modifiers, uint32_t flag, bool canApplyMultipleTimes, bool shouldOverride ) { ActionResultPtr nextResult = make_ActionResult( target, 0 ); - nextResult->applyStatusEffect( statusId, duration, *m_sourceChara, param, modifiers, flag, shouldOverride ); + nextResult->applyStatusEffect( statusId, duration, *m_sourceChara, param, modifiers, flag, canApplyMultipleTimes, shouldOverride ); addResultToActor( target, nextResult ); } diff --git a/src/world/Action/ActionResultBuilder.h b/src/world/Action/ActionResultBuilder.h index 408c8ef9..f6ec2434 100644 --- a/src/world/Action/ActionResultBuilder.h +++ b/src/world/Action/ActionResultBuilder.h @@ -28,7 +28,7 @@ namespace Sapphire::World::Action void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint32_t duration, uint8_t param, bool shouldOverride = false ); void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint32_t duration, uint8_t param, - std::vector< World::Action::StatusModifier > modifiers, uint32_t flag = 0, bool shouldOverride = false ); + std::vector< World::Action::StatusModifier > modifiers, uint32_t flag = 0, bool canApplyMultipleTimes = false, bool shouldOverride = false ); void applyStatusEffectSelf( uint16_t statusId, uint32_t duration, uint8_t param, bool shouldOverride = false ); void applyStatusEffectSelf( uint16_t statusId, uint32_t duration, uint8_t param, std::vector< World::Action::StatusModifier > modifiers, uint32_t flag = 0, bool shouldOverride = false ); diff --git a/src/world/StatusEffect/StatusEffect.cpp b/src/world/StatusEffect/StatusEffect.cpp index bcbee38f..509d0345 100644 --- a/src/world/StatusEffect/StatusEffect.cpp +++ b/src/world/StatusEffect/StatusEffect.cpp @@ -23,11 +23,12 @@ using namespace Sapphire::Network::Packets; Sapphire::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, uint32_t duration,std::vector< World::Action::StatusModifier >& modifiers, - uint32_t flag, uint32_t tickRate ) : + uint32_t flag, uint32_t tickRate, bool canApplyMultipleTimes ) : StatusEffect( id, sourceActor, targetActor, duration, tickRate ) { m_statusModifiers = std::move( modifiers ); m_flag = flag; + m_canApplyMultipleTimes = canApplyMultipleTimes; } Sapphire::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, @@ -40,7 +41,8 @@ Sapphire::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::CharaPt m_startTime( 0 ), m_tickRate( tickRate ), m_lastTick( 0 ), - m_flag( 0 ) + m_flag( 0 ), + m_canApplyMultipleTimes( false ) { auto& exdData = Common::Service< Data::ExdData >::ref(); auto entry = exdData.getRow< Excel::Status >( id ); @@ -196,6 +198,11 @@ uint32_t Sapphire::StatusEffect::StatusEffect::getFlag() const return m_flag; } +bool Sapphire::StatusEffect::StatusEffect::getCanApplyMultipleTimes() const +{ + return m_canApplyMultipleTimes; +} + std::vector< World::Action::StatusModifier > Sapphire::StatusEffect::StatusEffect::getStatusModifiers() const { return m_statusModifiers; @@ -206,6 +213,11 @@ void Sapphire::StatusEffect::StatusEffect::setFlag( uint32_t flag ) m_flag = flag; } +void Sapphire::StatusEffect::StatusEffect::setCanApplyMultipleTimes( bool canApplyMultipleTimes ) +{ + m_canApplyMultipleTimes = canApplyMultipleTimes; +} + void Sapphire::StatusEffect::StatusEffect::setLastTick( uint64_t lastTick ) { m_lastTick = lastTick; diff --git a/src/world/StatusEffect/StatusEffect.h b/src/world/StatusEffect/StatusEffect.h index 2bf6865b..e7451f89 100644 --- a/src/world/StatusEffect/StatusEffect.h +++ b/src/world/StatusEffect/StatusEffect.h @@ -12,7 +12,7 @@ class StatusEffect { public: StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, - uint32_t duration, std::vector< World::Action::StatusModifier >& modifiers, uint32_t flag, uint32_t tickRate ); + uint32_t duration, std::vector< World::Action::StatusModifier >& modifiers, uint32_t flag, uint32_t tickRate, bool canApplyMultipleTimes ); StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, uint32_t duration, uint32_t tickRate ); @@ -50,6 +50,8 @@ public: uint32_t getFlag() const; + bool getCanApplyMultipleTimes() const; + std::vector< World::Action::StatusModifier > getStatusModifiers() const; void setLastTick( uint64_t lastTick ); @@ -58,6 +60,8 @@ public: void setFlag( uint32_t flag ); + void setCanApplyMultipleTimes( bool canApplyMultipleTimes ); + void registerTickEffect( Common::ParamModifier type, uint32_t param ); std::pair< Common::ParamModifier, uint32_t > getTickEffect(); @@ -82,6 +86,7 @@ private: std::vector< World::Action::StatusModifier > m_statusModifiers; std::unordered_map< Common::ParamModifier, int32_t > m_modifiers; uint8_t m_slot; + bool m_canApplyMultipleTimes; };