From e84f77ca202501ede2f1127b8ff22e1f0799c34e Mon Sep 17 00:00:00 2001 From: collett Date: Fri, 17 Jan 2020 18:37:09 +0900 Subject: [PATCH] Implement thin air. --- src/common/Common.h | 2 ++ src/world/Action/ActionLutData.cpp | 7 +++++-- src/world/Action/EffectBuilder.cpp | 2 +- src/world/Action/EffectBuilder.h | 2 +- src/world/Action/EffectResult.cpp | 5 +++-- src/world/Action/EffectResult.h | 4 ++-- src/world/StatusEffect/StatusEffect.cpp | 22 ++++++++++++++++++++++ 7 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 56e861ac..818bcf0f 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -624,6 +624,7 @@ namespace Sapphire::Common TpGain = 13, GpGain = 14, ApplyStatusEffect = 15, + //ApplyStatusEffect2 = 16, // thin air uses this one but works fine with 15 wtf? StatusNoEffect = 21, /*! * @brief Tells the client that it should show combo indicators on actions. @@ -1040,6 +1041,7 @@ namespace Sapphire::Common MPRestore = 11, Haste = 12, InstantCast = 13, + NoCostCast = 14, }; enum class ActionTypeFilter : int32_t diff --git a/src/world/Action/ActionLutData.cpp b/src/world/Action/ActionLutData.cpp index 89777d64..10b1569a 100644 --- a/src/world/Action/ActionLutData.cpp +++ b/src/world/Action/ActionLutData.cpp @@ -1812,8 +1812,8 @@ ActionLut::Lut ActionLut::m_actionLut = { 3571, { 400, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 5 } }, //Thin Air, シンエアー - //applies to self: Thin Air, シンエアー, duration 12000, param 0 - { 7430, { 0, 0, 0, 0, 0, 1217, 12000, 0, 0, 0, 0, 0 } }, + //applies to self: Thin Air, シンエアー, duration 12000, param 65436 + { 7430, { 0, 0, 0, 0, 0, 1217, 12000, 65436, 0, 0, 0, 0 } }, //Tetragrammaton, テトラグラマトン //has heal: potency 700 @@ -3514,4 +3514,7 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Swiftcast, 迅速魔: InstantCast, 1 casts { 167, { 13, 1, 0, 0, 0 } }, + //Thin Air, シンエアー: NoCostCast, primary costs + { 1217, { 14, 1, 0, 0, 0 } }, + }; diff --git a/src/world/Action/EffectBuilder.cpp b/src/world/Action/EffectBuilder.cpp index 35eea3d1..057a1540 100644 --- a/src/world/Action/EffectBuilder.cpp +++ b/src/world/Action/EffectBuilder.cpp @@ -77,7 +77,7 @@ void EffectBuilder::comboSucceed( Entity::CharaPtr& target ) moveToResultList( target, nextResult ); } -void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, uint16_t statusId, uint32_t duration, uint8_t param, uint64_t resultDelayMs ) +void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, uint16_t statusId, uint32_t duration, uint16_t param, uint64_t resultDelayMs ) { EffectResultPtr nextResult = make_EffectResult( target, source, Common::Util::getTimeMs() + resultDelayMs ); nextResult->applyStatusEffect( statusId, duration, param ); diff --git a/src/world/Action/EffectBuilder.h b/src/world/Action/EffectBuilder.h index a545a975..059b6d02 100644 --- a/src/world/Action/EffectBuilder.h +++ b/src/world/Action/EffectBuilder.h @@ -26,7 +26,7 @@ namespace Sapphire::World::Action void comboSucceed( Entity::CharaPtr& target ); - void applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, uint16_t statusId, uint32_t duration, uint8_t param, uint64_t resultDelayMs = 500 ); + void applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, uint16_t statusId, uint32_t duration, uint16_t param, uint64_t resultDelayMs = 500 ); void applyStatusEffect( Entity::CharaPtr& target, Entity::CharaPtr& source, StatusEffect::StatusEffectPtr pStatusEffect, uint64_t resultDelayMs = 500 ); void statusNoEffect( Entity::CharaPtr& target, uint16_t statusId ); diff --git a/src/world/Action/EffectResult.cpp b/src/world/Action/EffectResult.cpp index 78134a56..249cb935 100644 --- a/src/world/Action/EffectResult.cpp +++ b/src/world/Action/EffectResult.cpp @@ -84,7 +84,7 @@ void EffectResult::comboSucceed() m_type = Common::ActionEffectType::ComboSucceed; } -void EffectResult::applyStatusEffect( uint16_t statusId, uint32_t duration, uint8_t param ) +void EffectResult::applyStatusEffect( uint16_t statusId, uint32_t duration, uint16_t param ) { m_value = statusId; m_statusDuration = duration; @@ -118,7 +118,7 @@ Common::EffectEntry EffectResult::buildEffectEntry() const entry.param0 = m_param0; entry.param1 = m_param1; entry.effectType = m_type; - entry.param2 = m_param2; + entry.param2 = static_cast< uint8_t >( m_param2 ); entry.flags = static_cast< uint8_t >( m_flag ); return entry; @@ -147,6 +147,7 @@ void EffectResult::execute() } case Common::ActionEffectType::ApplyStatusEffect: + //case Common::ActionEffectType::ApplyStatusEffect2: { uint64_t lastTickOverride = 0; //remove same effect from the same source (refreshing old buff) diff --git a/src/world/Action/EffectResult.h b/src/world/Action/EffectResult.h index 2f5c886b..7b65c754 100644 --- a/src/world/Action/EffectResult.h +++ b/src/world/Action/EffectResult.h @@ -22,7 +22,7 @@ namespace Sapphire::World::Action void restoreMP( uint32_t amount, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); void startCombo( uint16_t actionId ); void comboSucceed(); - void applyStatusEffect( uint16_t statusId, uint32_t duration, uint8_t param ); + void applyStatusEffect( uint16_t statusId, uint32_t duration, uint16_t param ); void applyStatusEffect( StatusEffect::StatusEffectPtr pStatusEffect ); void statusNoEffect( uint16_t statusId ); @@ -47,7 +47,7 @@ namespace Sapphire::World::Action uint8_t m_param0; uint8_t m_param1; - uint8_t m_param2; + uint16_t m_param2; uint32_t m_value; uint32_t m_statusDuration; diff --git a/src/world/StatusEffect/StatusEffect.cpp b/src/world/StatusEffect/StatusEffect.cpp index 0ebb4060..2d70d49e 100644 --- a/src/world/StatusEffect/StatusEffect.cpp +++ b/src/world/StatusEffect/StatusEffect.cpp @@ -297,6 +297,28 @@ void Sapphire::StatusEffect::StatusEffect::onBeforeActionStart( Sapphire::World: } break; } + + case Common::StatusEffectType::NoCostCast: + { + // value1: cost type, 0 = all costs, 1 = primary, 2 = secondary + // value2-4: affected action ids, or all actions if value2 is 0 + if( m_effectEntry.effectValue2 != 0 ) + { + if( action->getId() != m_effectEntry.effectValue2 && + action->getId() != m_effectEntry.effectValue3 && + action->getId() != m_effectEntry.effectValue4 ) + return; + } + + if( m_effectEntry.effectValue1 == 0 || m_effectEntry.effectValue1 == 1 ) + action->setPrimaryCost( Common::ActionPrimaryCostType::None, 0 ); + + // secondary cost not implemented yet + //if( m_effectEntry.effectValue1 == 0 || m_effectEntry.effectValue1 == 2 ) + // action->setSecondaryCost(); + + break; + } } }