From 7f702488368fab187abe792b5e866aaea5d82eae Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Mon, 6 Mar 2023 23:04:30 +0100 Subject: [PATCH 01/45] Check statuses to determine valid lut entry --- src/world/Action/Action.cpp | 3 ++- src/world/Action/ActionLut.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index d78ebe2e6b..c522015d6b 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -864,7 +864,8 @@ Entity::CharaPtr Action::Action::getHitChara() bool Action::Action::hasValidLutEntry() const { return m_lutEntry.potency != 0 || m_lutEntry.comboPotency != 0 || m_lutEntry.flankPotency != 0 || m_lutEntry.frontPotency != 0 || - m_lutEntry.rearPotency != 0 || m_lutEntry.curePotency != 0 || m_lutEntry.restoreMPPercentage != 0; + m_lutEntry.rearPotency != 0 || m_lutEntry.curePotency != 0 || m_lutEntry.restoreMPPercentage != 0 || + m_lutEntry.statuses.caster.size() > 0 || m_lutEntry.statuses.target.size() > 0; } Action::EffectBuilderPtr Action::Action::getEffectbuilder() diff --git a/src/world/Action/ActionLut.cpp b/src/world/Action/ActionLut.cpp index 38746ca9d9..69824c431f 100644 --- a/src/world/Action/ActionLut.cpp +++ b/src/world/Action/ActionLut.cpp @@ -15,7 +15,8 @@ bool ActionLut::validEntryExists( uint16_t actionId ) // if all of the fields are 0, it's not 'valid' due to parse error or no useful data in the tooltip return entry.potency != 0 || entry.comboPotency != 0 || entry.flankPotency != 0 || entry.frontPotency != 0 || - entry.rearPotency != 0 || entry.curePotency != 0; + entry.rearPotency != 0 || entry.curePotency != 0 || + entry.statuses.caster.size() > 0 || entry.statuses.target.size() > 0; } const ActionEntry& ActionLut::getEntry( uint16_t actionId ) From 114bd28538c7132bda8bb0b82a4f3bc2d9af9179 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Mon, 6 Mar 2023 23:05:21 +0100 Subject: [PATCH 02/45] Add duration field to statuses --- src/tools/action_parse/main.cpp | 2 ++ src/world/Action/ActionLut.h | 1 + src/world/Action/ActionLutData.h | 1 + 3 files changed, 4 insertions(+) diff --git a/src/tools/action_parse/main.cpp b/src/tools/action_parse/main.cpp index c542eae7f5..dee585cc42 100644 --- a/src/tools/action_parse/main.cpp +++ b/src/tools/action_parse/main.cpp @@ -40,6 +40,7 @@ struct StatusModifier struct StatusEntry { uint16_t id; + int32_t duration; std::vector< StatusModifier > modifiers; }; @@ -76,6 +77,7 @@ void to_json( nlohmann::ordered_json& j, const StatusEntry& statusEntry ) { j = nlohmann::ordered_json{ { "id", statusEntry.id }, + { "duration", statusEntry.duration }, { "modifiers", statusEntry.modifiers } }; } diff --git a/src/world/Action/ActionLut.h b/src/world/Action/ActionLut.h index 3ea20cdba2..bd0fbe3ff0 100644 --- a/src/world/Action/ActionLut.h +++ b/src/world/Action/ActionLut.h @@ -17,6 +17,7 @@ namespace Sapphire::World::Action struct StatusEntry { uint16_t id; + int32_t duration; std::vector< StatusModifier > modifiers; }; diff --git a/src/world/Action/ActionLutData.h b/src/world/Action/ActionLutData.h index 61225af687..99e78f0326 100644 --- a/src/world/Action/ActionLutData.h +++ b/src/world/Action/ActionLutData.h @@ -32,6 +32,7 @@ namespace Sapphire::World::Action inline void from_json( const nlohmann::json& j, StatusEntry& statusEntry ) { j.at( "id" ).get_to( statusEntry.id ); + j.at( "duration" ).get_to( statusEntry.duration ); if( j.contains( "modifiers" ) ) j.at( "modifiers" ).get_to( statusEntry.modifiers ); } From 65ad14a475607b4f8d7899e25487306b0f66f026 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Mon, 6 Mar 2023 23:08:01 +0100 Subject: [PATCH 03/45] Rename buildEffects to make more sense --- src/world/Action/Action.cpp | 4 ++-- src/world/Action/Action.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index c522015d6b..4d4355703d 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -431,7 +431,7 @@ void Action::Action::execute() if( !hasClientsideTarget() ) { - buildEffects(); + handleAction(); } else if( auto player = m_pSource->getAsPlayer() ) { @@ -501,7 +501,7 @@ std::pair< uint32_t, Common::ActionHitSeverityType > Action::Action::calcHealing return Math::CalcStats::calcActionHealing( *m_pSource, potency, wepDmg ); } -void Action::Action::buildEffects() +void Action::Action::handleAction() { snapshotAffectedActors( m_hitActors ); diff --git a/src/world/Action/Action.h b/src/world/Action/Action.h index 044681155a..49d4cff26a 100644 --- a/src/world/Action/Action.h +++ b/src/world/Action/Action.h @@ -105,7 +105,7 @@ namespace Sapphire::World::Action EffectBuilderPtr getEffectbuilder(); - void buildEffects(); + void handleAction(); /*! * @brief Adds an actor filter to this action. From 0cd43df30502b2a9d3a04f57dc949dc5763676ff Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Mon, 6 Mar 2023 23:09:03 +0100 Subject: [PATCH 04/45] Add basic generic handler for applying statuseffects --- src/world/Action/Action.cpp | 31 +++++++++++++++++++++++++++++++ src/world/Action/Action.h | 2 ++ 2 files changed, 33 insertions(+) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 4d4355703d..0da5b41f96 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -533,6 +533,8 @@ void Action::Action::handleAction() Manager::PlayerMgr::sendDebug( *player, "Hit target: pot: {} (c: {}, f: {}, r: {}), heal pot: {}, mpp: {}", m_lutEntry.potency, m_lutEntry.comboPotency, m_lutEntry.flankPotency, m_lutEntry.rearPotency, m_lutEntry.curePotency, m_lutEntry.restoreMPPercentage ); + if( m_lutEntry.statuses.caster.size() > 0 || m_lutEntry.statuses.target.size() > 0 ) + handleStatusEffects(); } // when aoe, these effects are in the target whatever is hit first @@ -600,6 +602,35 @@ void Action::Action::handleAction() // m_effectBuilder.reset(); } +void Action::Action::handleStatusEffects() +{ + // handle caster statuses + if( m_lutEntry.statuses.caster.size() > 0 ) + { + for( auto& status : m_lutEntry.statuses.caster ) + { + getEffectbuilder()->applyStatusEffect( m_pSource, status.id, 0 ); + m_pSource->addStatusEffectByIdIfNotExist( status.id, status.duration, *m_pSource, status.modifiers ); + } + } + + // handle hit actor statuses + if( m_lutEntry.statuses.target.size() > 0 && m_hitActors.size() > 0 ) + { + for( auto& actor : m_hitActors ) + { + for( auto& status : m_lutEntry.statuses.target ) + { + getEffectbuilder()->applyStatusEffect( actor, status.id, 0 ); + actor->addStatusEffectByIdIfNotExist( status.id, status.duration, *m_pSource, status.modifiers ); + } + + if( actor->getStatusEffectMap().size() > 0 ) + actor->onActionHostile( m_pSource ); + } + } +} + bool Action::Action::preCheck() { if( auto player = m_pSource->getAsPlayer() ) diff --git a/src/world/Action/Action.h b/src/world/Action/Action.h index 49d4cff26a..77a139dc8b 100644 --- a/src/world/Action/Action.h +++ b/src/world/Action/Action.h @@ -107,6 +107,8 @@ namespace Sapphire::World::Action void handleAction(); + void handleStatusEffects(); + /*! * @brief Adds an actor filter to this action. * @param filter The ptr to the ActorFilter to add From ed4104c83e08aca387838cad63fc8795b4b37eda Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Mon, 6 Mar 2023 23:11:50 +0100 Subject: [PATCH 05/45] Add more modifiers --- src/common/Common.h | 40 ++++++++++++++++++------------ src/world/Action/ActionLutData.cpp | 8 ++++++ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 72e14d21f5..f1790f5b4b 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -887,22 +887,30 @@ namespace Sapphire::Common Perception = 73, // Unique modifiers - HPPercent = 1000, - MPPercent = 1001, - TPPercent = 1002, - GPPercent = 1003, - CPPercent = 1004, - PhysicalDamagePercent = 1005, - MagicDamagePercent = 1006, - AttackPowerPercent = 1007, - DefensePercent = 1008, - AccuracyPercent = 1009, - EvasionPercent = 1010, - MagicDefensePercent = 1011, - CriticalHitPowerPercent = 1012, - CriticalHitResiliencePercent = 1013, - CriticalHitPercent = 1014, - EnmityPercent = 1015 + TickHeal = 1000, + TickDamage = 1001, + StrengthPercent = 1002, + DexterityPercent = 1003, + VitalityPercent = 1004, + IntelligencePercent = 1005, + MindPercent = 1006, + PietyPercent = 1007, + HPPercent = 1008, + MPPercent = 1009, + TPPercent = 1010, + GPPercent = 1011, + CPPercent = 1012, + PhysicalDamagePercent = 1013, + MagicDamagePercent = 1014, + AttackPowerPercent = 1015, + DefensePercent = 1016, + AccuracyPercent = 1017, + EvasionPercent = 1018, + MagicDefensePercent = 1019, + CriticalHitPowerPercent = 1020, + CriticalHitResiliencePercent = 1021, + CriticalHitPercent = 1022, + EnmityPercent = 1023 }; enum struct ActionAspect : uint8_t diff --git a/src/world/Action/ActionLutData.cpp b/src/world/Action/ActionLutData.cpp index 99ee9b738b..9e4c7bcdb5 100644 --- a/src/world/Action/ActionLutData.cpp +++ b/src/world/Action/ActionLutData.cpp @@ -85,6 +85,14 @@ std::unordered_map< std::string, Common::ParamModifier > ActionLutData::m_modifi { "Control", Common::ParamModifier::Control }, { "Gathering", Common::ParamModifier::Gathering }, { "Perception", Common::ParamModifier::Perception }, + { "TickHeal", Common::ParamModifier::TickHeal }, + { "TickDamage", Common::ParamModifier::TickDamage }, + { "StrengthPercent", Common::ParamModifier::StrengthPercent }, + { "DexterityPercent", Common::ParamModifier::DexterityPercent }, + { "VitalityPercent", Common::ParamModifier::VitalityPercent }, + { "IntelligencePercent", Common::ParamModifier::IntelligencePercent }, + { "MindPercent", Common::ParamModifier::MindPercent }, + { "PietyPercent", Common::ParamModifier::PietyPercent }, { "HPPercent", Common::ParamModifier::HPPercent }, { "MPPercent", Common::ParamModifier::MPPercent }, { "TPPercent", Common::ParamModifier::TPPercent }, From dd20478a015dfc74a8100a1f2da02091d59b06db Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Mon, 6 Mar 2023 23:06:59 +0100 Subject: [PATCH 06/45] Add basic modifier impl for Chara --- src/world/Actor/Chara.cpp | 54 +++++++++++++++++++++++++++++++++++++-- src/world/Actor/Chara.h | 12 ++++++++- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index 23f652b5d1..66f8ef46f7 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -5,7 +5,6 @@ #include #include - #include "Forwards.h" #include "Territory/Territory.h" @@ -26,6 +25,7 @@ #include "Player.h" #include "Manager/TerritoryMgr.h" #include "Manager/MgrUtil.h" +#include "Manager/PlayerMgr.h" #include "Common.h" using namespace Sapphire::Common; @@ -559,7 +559,17 @@ void Sapphire::Entity::Chara::addStatusEffectByIdIfNotExist( uint32_t id, int32_ auto effect = StatusEffect::make_StatusEffect( id, source.getAsChara(), getAsChara(), duration, 3000 ); effect->setParam( param ); addStatusEffect( effect ); +} + +void Sapphire::Entity::Chara::addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, + std::vector< World::Action::StatusModifier >& modifiers, uint16_t param ) +{ + if( hasStatusEffect( id ) ) + return; + auto effect = StatusEffect::make_StatusEffect( id, source.getAsChara(), getAsChara(), duration, modifiers, 3000 ); + effect->setParam( param ); + addStatusEffect( effect ); } int8_t Sapphire::Entity::Chara::getStatusEffectFreeSlot() @@ -644,7 +654,6 @@ void Sapphire::Entity::Chara::sendStatusEffectUpdate() { uint64_t currentTimeMs = Util::getTimeMs(); - auto statusEffectList = makeZonePacket< FFXIVIpcStatus >( getId() ); uint8_t slot = 0; for( const auto& effectIt : m_statusEffectMap ) @@ -785,6 +794,47 @@ void Sapphire::Entity::Chara::setStatValue( Common::BaseParam baseParam, uint32_ m_baseStats[ index ] = value; } +float Sapphire::Entity::Chara::getModifier( Common::ParamModifier paramModifier ) const +{ + if( m_modifiers.find( paramModifier ) == m_modifiers.end() ) + return paramModifier >= Common::ParamModifier::StrengthPercent ? 1.0f : 0; + + auto& mod = m_modifiers.at( paramModifier ); + if( paramModifier >= Common::ParamModifier::StrengthPercent ) + { + auto valPercent = 1.0f; + for( const auto val : mod ) + valPercent *= 1.0f + ( val / 100.0f ); + return valPercent; + } + else + { + return std::accumulate( mod.begin(), mod.end(), 0 ); + } +} + +void Sapphire::Entity::Chara::addModifier( Common::ParamModifier paramModifier, int32_t value ) +{ + m_modifiers[ paramModifier ].push_back( value ); + + if( auto pPlayer = this->getAsPlayer(); pPlayer ) + Common::Service< World::Manager::PlayerMgr >::ref().sendDebug( *pPlayer, "Modifier: {}, value: {}", static_cast< int32_t >( paramModifier ), getModifier( paramModifier ) ); +} + +void Sapphire::Entity::Chara::delModifier( Common::ParamModifier paramModifier, int32_t value ) +{ + assert( m_modifiers.count( paramModifier ) != 0 ); + auto& mod = m_modifiers.at( paramModifier ); + + mod.erase( std::remove( mod.begin(), mod.end(), value ), mod.end() ); + + if( mod.size() == 0 ) + m_modifiers.erase( paramModifier ); + + if( auto pPlayer = this->getAsPlayer(); pPlayer ) + Common::Service< World::Manager::PlayerMgr >::ref().sendDebug( *pPlayer, "Modifier: {}, value: {}", static_cast< int32_t >( paramModifier ), getModifier( paramModifier ) ); +} + void Sapphire::Entity::Chara::onTick() { uint32_t thisTickDmg = 0; diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index 20449f16c8..dab108a672 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -1,6 +1,7 @@ #pragma once #include +#include "Action/ActionLut.h" #include "Forwards.h" #include "GameObject.h" @@ -26,10 +27,13 @@ namespace Sapphire::Entity public: using ActorStatsArray = std::array< uint32_t, STAT_ARRAY_SIZE >; + using ActorModifiersMap = std::unordered_map< Common::ParamModifier, std::vector< int32_t > >; ActorStatsArray m_baseStats{ 0 }; ActorStatsArray m_bonusStats{ 0 }; + ActorModifiersMap m_modifiers{ 0 }; + protected: char m_name[34]; /*! Last tick time for the actor ( in ms ) */ @@ -133,9 +137,9 @@ namespace Sapphire::Entity // add a status effect by id void addStatusEffectById( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 0 ); - // add a status effect by id if it doesn't exist void addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 0 ); + void addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, std::vector< World::Action::StatusModifier >& modifiers, uint16_t param = 0 ); // remove a status effect by id void removeSingleStatusEffectFromId( uint32_t id ); @@ -159,6 +163,12 @@ namespace Sapphire::Entity void setStatValue( Common::BaseParam baseParam, uint32_t value ); + float getModifier( Common::ParamModifier paramModifier ) const; + + void addModifier( Common::ParamModifier paramModifier, int32_t value ); + + void delModifier( Common::ParamModifier paramModifier, int32_t value ); + uint32_t getHp() const; uint32_t getHpPercent() const; From c15ac9031a69369a06ff66da9f1340494be6f830 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Mon, 6 Mar 2023 23:13:45 +0100 Subject: [PATCH 07/45] Apply/remove modifiers for statuseffects --- src/world/StatusEffect/StatusEffect.cpp | 26 +++++++++++++++++++++++++ src/world/StatusEffect/StatusEffect.h | 6 +++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/world/StatusEffect/StatusEffect.cpp b/src/world/StatusEffect/StatusEffect.cpp index 1b371938c4..064c2119e3 100644 --- a/src/world/StatusEffect/StatusEffect.cpp +++ b/src/world/StatusEffect/StatusEffect.cpp @@ -17,12 +17,20 @@ using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; //using namespace Sapphire::Network::Packets::WorldPackets::Server; +Sapphire::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, + uint32_t duration, std::vector< World::Action::StatusModifier >& modifiers, uint32_t tickRate ) : + StatusEffect( id, sourceActor, targetActor, duration, tickRate ) +{ + m_modifiers = std::move( modifiers ); +} + Sapphire::StatusEffect::StatusEffect::StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, uint32_t duration, uint32_t tickRate ) : m_id( id ), m_sourceActor( sourceActor ), m_targetActor( targetActor ), m_duration( duration ), + m_modifiers( 0 ), m_startTime( 0 ), m_tickRate( tickRate ), m_lastTick( 0 ) @@ -87,6 +95,15 @@ void Sapphire::StatusEffect::StatusEffect::applyStatus() m_startTime = Util::getTimeMs(); auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + for( const auto& mod : m_modifiers ) + { + // TODO: ticks + if( mod.modifier != Common::ParamModifier::TickDamage && mod.modifier != Common::ParamModifier::TickHeal ) + m_targetActor->addModifier( mod.modifier, mod.value ); + } + + m_targetActor->calculateStats(); + // this is only right when an action is being used by the player // else you probably need to use an actorcontrol @@ -111,6 +128,15 @@ void Sapphire::StatusEffect::StatusEffect::applyStatus() void Sapphire::StatusEffect::StatusEffect::removeStatus() { auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + + for( const auto& mod : m_modifiers ) + { + if( mod.modifier != Common::ParamModifier::TickDamage && mod.modifier != Common::ParamModifier::TickHeal ) + m_targetActor->delModifier( mod.modifier, mod.value ); + } + + m_targetActor->calculateStats(); + scriptMgr.onStatusTimeOut( m_targetActor, m_id ); } diff --git a/src/world/StatusEffect/StatusEffect.h b/src/world/StatusEffect/StatusEffect.h index e6bb1c8e43..bc8e4f4717 100644 --- a/src/world/StatusEffect/StatusEffect.h +++ b/src/world/StatusEffect/StatusEffect.h @@ -2,6 +2,7 @@ #define _STATUSEFFECT_H_ #include "Forwards.h" +#include "Action/ActionLut.h" namespace Sapphire { namespace StatusEffect { @@ -10,6 +11,9 @@ namespace StatusEffect { class StatusEffect { public: + StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, + uint32_t duration, std::vector< World::Action::StatusModifier >& modifiers, uint32_t tickRate ); + StatusEffect( uint32_t id, Entity::CharaPtr sourceActor, Entity::CharaPtr targetActor, uint32_t duration, uint32_t tickRate ); @@ -58,7 +62,7 @@ class StatusEffect uint16_t m_param; std::string m_name; std::pair< uint8_t, uint32_t > m_currTickEffect; - + std::vector< World::Action::StatusModifier > m_modifiers; }; } From 5386f1334f422216ca063a9c0e7e5e833e1ab5f5 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Tue, 21 Feb 2023 20:08:55 +0100 Subject: [PATCH 08/45] Add some example statuses to lut --- data/actions/player.json | 85 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/data/actions/player.json b/data/actions/player.json index 149d05aae9..6d6dfac3b6 100644 --- a/data/actions/player.json +++ b/data/actions/player.json @@ -398,7 +398,18 @@ "restorePercentage": 0, "nextCombo": [], "statuses": { - "caster": [], + "caster": [ + { + "id": 83, + "duration": 20000, + "modifiers": [ + { + "modifier": "DefensePercent", + "value": 20 + } + ] + } + ], "target": [] } }, @@ -414,7 +425,18 @@ "nextCombo": [], "statuses": { "caster": [], - "target": [] + "target": [ + { + "id": 244, + "duration": 30000, + "modifiers": [ + { + "modifier": "TickDamage", + "value": 20 + } + ] + } + ] } }, "34": { @@ -493,7 +515,18 @@ "restorePercentage": 0, "nextCombo": [], "statuses": { - "caster": [], + "caster": [ + { + "id": 86, + "duration": 20000, + "modifiers": [ + { + "modifier": "AttackPowerPercent", + "value": 50 + } + ] + } + ], "target": [] } }, @@ -523,7 +556,18 @@ "restorePercentage": 0, "nextCombo": [], "statuses": { - "caster": [], + "caster": [ + { + "id": 87, + "duration": 20000, + "modifiers": [ + { + "modifier": "HPPercent", + "value": 20 + } + ] + } + ], "target": [] } }, @@ -2454,7 +2498,38 @@ "nextCombo": [], "statuses": { "caster": [], - "target": [] + "target": [ + { + "id": 180, + "duration": 24000, + "modifiers": [ + { + "modifier": "TickDamage", + "value": 35 + } + ] + }, + { + "id": 191, + "duration": 24000, + "modifiers": [ + { + "modifier": "HealingRecoveryPercent", + "value": -20 + } + ] + }, + { + "id": 240, + "duration": 24000, + "modifiers": [ + { + "modifier": "HeavyPercent", + "value": 40 + } + ] + } + ] } }, "169": { From b94e7f4b2fd3be30941be67694247bff0fe6a909 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Mon, 6 Mar 2023 23:57:06 +0100 Subject: [PATCH 09/45] Fix windows build error --- src/world/Actor/Chara.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index dab108a672..a5c4de9c9d 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -9,6 +9,7 @@ #include #include #include +#include namespace Sapphire::Entity { From b3098fec8732f1026033feac6e532311ca400320 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Tue, 21 Feb 2023 20:11:17 +0100 Subject: [PATCH 10/45] Don't clear tick effect --- src/world/StatusEffect/StatusEffect.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/world/StatusEffect/StatusEffect.cpp b/src/world/StatusEffect/StatusEffect.cpp index 064c2119e3..da827fe73b 100644 --- a/src/world/StatusEffect/StatusEffect.cpp +++ b/src/world/StatusEffect/StatusEffect.cpp @@ -62,9 +62,7 @@ void Sapphire::StatusEffect::StatusEffect::registerTickEffect( uint8_t type, uin std::pair< uint8_t, uint32_t > Sapphire::StatusEffect::StatusEffect::getTickEffect() { - auto thisTick = m_currTickEffect; - m_currTickEffect = std::make_pair( 0, 0 ); - return thisTick; + return m_currTickEffect; } void Sapphire::StatusEffect::StatusEffect::onTick() From b5254956363d2993cb7ce12cf43d193094dc774a Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Tue, 7 Mar 2023 19:57:14 +0100 Subject: [PATCH 11/45] Add status entry for Maim --- data/actions/player.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/data/actions/player.json b/data/actions/player.json index 6d6dfac3b6..15370c57ea 100644 --- a/data/actions/player.json +++ b/data/actions/player.json @@ -500,7 +500,18 @@ 45 ], "statuses": { - "caster": [], + "caster": [ + { + "id": 85, + "duration": 24000, + "modifiers": [ + { + "modifier": "AttackPowerPercent", + "value": 20 + } + ] + } + ], "target": [] } }, From bfaec90e00a65edffe368f9e1d89a3d3c5284e4d Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Tue, 7 Mar 2023 19:58:08 +0100 Subject: [PATCH 12/45] Apply status effects properly for self when having a target --- src/world/Action/Action.cpp | 13 ++++++++++--- src/world/Action/EffectBuilder.cpp | 4 ++-- src/world/Action/EffectBuilder.h | 2 +- src/world/Action/EffectResult.cpp | 6 ++++-- src/world/Action/EffectResult.h | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 0da5b41f96..ff610cdbb1 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -533,8 +533,6 @@ void Action::Action::handleAction() Manager::PlayerMgr::sendDebug( *player, "Hit target: pot: {} (c: {}, f: {}, r: {}), heal pot: {}, mpp: {}", m_lutEntry.potency, m_lutEntry.comboPotency, m_lutEntry.flankPotency, m_lutEntry.rearPotency, m_lutEntry.curePotency, m_lutEntry.restoreMPPercentage ); - if( m_lutEntry.statuses.caster.size() > 0 || m_lutEntry.statuses.target.size() > 0 ) - handleStatusEffects(); } // when aoe, these effects are in the target whatever is hit first @@ -595,6 +593,9 @@ void Action::Action::handleAction() } } + if( m_lutEntry.statuses.caster.size() > 0 || m_lutEntry.statuses.target.size() > 0 ) + handleStatusEffects(); + m_effectBuilder->buildAndSendPackets( m_hitActors ); // TODO: disabled, reset kills our queued actions @@ -604,12 +605,18 @@ void Action::Action::handleAction() void Action::Action::handleStatusEffects() { + if( isComboAction() && !isCorrectCombo() ) + return; + // handle caster statuses if( m_lutEntry.statuses.caster.size() > 0 ) { for( auto& status : m_lutEntry.statuses.caster ) { - getEffectbuilder()->applyStatusEffect( m_pSource, status.id, 0 ); + if( m_hitActors.size() > 0 ) + getEffectbuilder()->applyStatusEffect( m_pSource, status.id, 0, true ); + else + getEffectbuilder()->applyStatusEffect( m_pSource, status.id, 0 ); m_pSource->addStatusEffectByIdIfNotExist( status.id, status.duration, *m_pSource, status.modifiers ); } } diff --git a/src/world/Action/EffectBuilder.cpp b/src/world/Action/EffectBuilder.cpp index 1770e8c686..dd5bae9eb2 100644 --- a/src/world/Action/EffectBuilder.cpp +++ b/src/world/Action/EffectBuilder.cpp @@ -93,10 +93,10 @@ void EffectBuilder::comboSucceed( Entity::CharaPtr& target ) addResultToActor( target, nextResult ); } -void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint8_t param ) +void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint8_t param, bool forSelf ) { EffectResultPtr nextResult = make_EffectResult( target, 0 ); - nextResult->applyStatusEffect( statusId, param ); + nextResult->applyStatusEffect( statusId, param, forSelf ); addResultToActor( target, nextResult ); } diff --git a/src/world/Action/EffectBuilder.h b/src/world/Action/EffectBuilder.h index 705690a814..c0711cf2c8 100644 --- a/src/world/Action/EffectBuilder.h +++ b/src/world/Action/EffectBuilder.h @@ -25,7 +25,7 @@ namespace Sapphire::World::Action void comboSucceed( Entity::CharaPtr& target ); - void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint8_t param ); + void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint8_t param, bool forSelf = false ); void mount( Entity::CharaPtr& target, uint16_t mountId ); diff --git a/src/world/Action/EffectResult.cpp b/src/world/Action/EffectResult.cpp index 8ef9d68f62..9de97df307 100644 --- a/src/world/Action/EffectResult.cpp +++ b/src/world/Action/EffectResult.cpp @@ -70,11 +70,13 @@ void EffectResult::comboSucceed() m_result.Type = Common::ActionEffectType::CALC_RESULT_TYPE_COMBO_HIT; } -void EffectResult::applyStatusEffect( uint16_t statusId, uint8_t param ) +void EffectResult::applyStatusEffect( uint16_t statusId, uint8_t param, bool forSelf ) { m_result.Value = static_cast< int16_t >( statusId ); m_result.Arg2 = param; - m_result.Type = Common::ActionEffectType::CALC_RESULT_TYPE_SET_STATUS; + if( forSelf ) + m_result.Flag = static_cast< uint8_t >( Common::ActionEffectResultFlag::EffectOnSource ); + m_result.Type = forSelf ? Common::ActionEffectType::CALC_RESULT_TYPE_SET_STATUS_ME : Common::ActionEffectType::CALC_RESULT_TYPE_SET_STATUS; } void EffectResult::mount( uint16_t mountId ) diff --git a/src/world/Action/EffectResult.h b/src/world/Action/EffectResult.h index 38ca2b7a26..48d43c718a 100644 --- a/src/world/Action/EffectResult.h +++ b/src/world/Action/EffectResult.h @@ -19,7 +19,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, uint8_t param ); + void applyStatusEffect( uint16_t statusId, uint8_t param, bool forSelf ); void mount( uint16_t mountId ); Entity::CharaPtr getTarget() const; From 7ad9f9687e8a435f83ef8c01545430a9f7bc0ace Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Tue, 7 Mar 2023 19:59:11 +0100 Subject: [PATCH 13/45] Fix hasStatusEffect to prevent duplicates --- src/world/Actor/Chara.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index 66f8ef46f7..bb383efb1d 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -698,7 +698,13 @@ void Sapphire::Entity::Chara::updateStatusEffects() bool Sapphire::Entity::Chara::hasStatusEffect( uint32_t id ) { - return m_statusEffectMap.find( id ) != m_statusEffectMap.end(); + for( const auto& [ key, val ] : m_statusEffectMap ) + { + if( val->getId() == id ) + return true; + } + + return false; } int64_t Sapphire::Entity::Chara::getLastUpdateTime() const From 51b7740a6fde785bc3eeab466e8f400c38607f95 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Tue, 7 Mar 2023 20:00:32 +0100 Subject: [PATCH 14/45] Basic dot/hot ticks implemented --- src/world/Actor/Chara.cpp | 4 ++-- src/world/StatusEffect/StatusEffect.cpp | 8 ++++++-- src/world/StatusEffect/StatusEffect.h | 6 +++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index bb383efb1d..60936608ef 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -851,13 +851,13 @@ void Sapphire::Entity::Chara::onTick() auto thisEffect = effectIt.second->getTickEffect(); switch( thisEffect.first ) { - case 1: + case Common::ParamModifier::TickDamage: { thisTickDmg += thisEffect.second; break; } - case 2: + case Common::ParamModifier::TickHeal: { thisTickHeal += thisEffect.second; break; diff --git a/src/world/StatusEffect/StatusEffect.cpp b/src/world/StatusEffect/StatusEffect.cpp index da827fe73b..b31a082949 100644 --- a/src/world/StatusEffect/StatusEffect.cpp +++ b/src/world/StatusEffect/StatusEffect.cpp @@ -55,12 +55,12 @@ Sapphire::StatusEffect::StatusEffect::~StatusEffect() { } -void Sapphire::StatusEffect::StatusEffect::registerTickEffect( uint8_t type, uint32_t param ) +void Sapphire::StatusEffect::StatusEffect::registerTickEffect( ParamModifier type, uint32_t param ) { m_currTickEffect = std::make_pair( type, param ); } -std::pair< uint8_t, uint32_t > Sapphire::StatusEffect::StatusEffect::getTickEffect() +std::pair< ParamModifier, uint32_t > Sapphire::StatusEffect::StatusEffect::getTickEffect() { return m_currTickEffect; } @@ -98,6 +98,10 @@ void Sapphire::StatusEffect::StatusEffect::applyStatus() // TODO: ticks if( mod.modifier != Common::ParamModifier::TickDamage && mod.modifier != Common::ParamModifier::TickHeal ) m_targetActor->addModifier( mod.modifier, mod.value ); + else if( mod.modifier == Common::ParamModifier::TickDamage ) + registerTickEffect( mod.modifier, mod.value ); + else if( mod.modifier == Common::ParamModifier::TickHeal ) + registerTickEffect( mod.modifier, mod.value ); } m_targetActor->calculateStats(); diff --git a/src/world/StatusEffect/StatusEffect.h b/src/world/StatusEffect/StatusEffect.h index bc8e4f4717..f18ecbcfe5 100644 --- a/src/world/StatusEffect/StatusEffect.h +++ b/src/world/StatusEffect/StatusEffect.h @@ -45,9 +45,9 @@ class StatusEffect void setParam( uint16_t param ); - void registerTickEffect( uint8_t type, uint32_t param ); + void registerTickEffect( Common::ParamModifier type, uint32_t param ); - std::pair< uint8_t, uint32_t > getTickEffect(); + std::pair< Common::ParamModifier, uint32_t > getTickEffect(); const std::string& getName() const; @@ -61,7 +61,7 @@ class StatusEffect uint64_t m_lastTick; uint16_t m_param; std::string m_name; - std::pair< uint8_t, uint32_t > m_currTickEffect; + std::pair< Common::ParamModifier, uint32_t > m_currTickEffect; std::vector< World::Action::StatusModifier > m_modifiers; }; From 78acb58d8f5b580c78bf8a8d3e9d837efedb30b1 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Tue, 7 Mar 2023 20:03:43 +0100 Subject: [PATCH 15/45] Update HP on tick effects --- src/world/Actor/Chara.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index 60936608ef..a135f1e910 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -865,12 +865,18 @@ void Sapphire::Entity::Chara::onTick() } } + // TODO: don't really like how this is handled + // TODO: calculate actual damage from potency if( thisTickDmg != 0 ) { takeDamage( thisTickDmg ); server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeActorControl( getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::CALC_RESULT_TYPE_DAMAGE_HP ), thisTickDmg ) ); + if( isPlayer() ) + server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeHudParam( *getAsPlayer() ) ); + else if( isBattleNpc() ) + server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeHudParam( *getAsBNpc() ) ); } if( thisTickHeal != 0 ) @@ -879,5 +885,9 @@ void Sapphire::Entity::Chara::onTick() server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeActorControl( getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::CALC_RESULT_TYPE_RECOVER_HP ), thisTickHeal ) ); + if( isPlayer() ) + server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeHudParam( *getAsPlayer() ) ); + else if( isBattleNpc() ) + server().queueForPlayers( getInRangePlayerIds( isPlayer() ), makeHudParam( *getAsBNpc() ) ); } } \ No newline at end of file From 6fce046225d4ff11117227b19b89adea321a8d57 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Tue, 7 Mar 2023 23:05:18 +0100 Subject: [PATCH 16/45] Apply effect to correct target --- src/world/Action/Action.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index ff610cdbb1..ae213bb7d4 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -614,7 +614,7 @@ void Action::Action::handleStatusEffects() for( auto& status : m_lutEntry.statuses.caster ) { if( m_hitActors.size() > 0 ) - getEffectbuilder()->applyStatusEffect( m_pSource, status.id, 0, true ); + getEffectbuilder()->applyStatusEffect( m_hitActors[ 0 ], status.id, 0, true ); else getEffectbuilder()->applyStatusEffect( m_pSource, status.id, 0 ); m_pSource->addStatusEffectByIdIfNotExist( status.id, status.duration, *m_pSource, status.modifiers ); From 6cbf94d9c20e4b38fd478edf69c679802d0d1b60 Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Wed, 8 Mar 2023 00:34:36 +0100 Subject: [PATCH 17/45] Add method to simplify applying statuses to self --- src/world/Action/Action.cpp | 13 +++++++++---- src/world/Action/Action.h | 2 ++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index ae213bb7d4..1b4faff62e 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -501,6 +501,14 @@ std::pair< uint32_t, Common::ActionHitSeverityType > Action::Action::calcHealing return Math::CalcStats::calcActionHealing( *m_pSource, potency, wepDmg ); } +void Action::Action::applyStatusEffectSelf( uint16_t statusId, uint8_t param ) +{ + if( m_hitActors.size() > 0 ) + getEffectbuilder()->applyStatusEffect( m_hitActors[ 0 ], statusId, param, true ); + else + getEffectbuilder()->applyStatusEffect( m_pSource, statusId, param ); +} + void Action::Action::handleAction() { snapshotAffectedActors( m_hitActors ); @@ -613,10 +621,7 @@ void Action::Action::handleStatusEffects() { for( auto& status : m_lutEntry.statuses.caster ) { - if( m_hitActors.size() > 0 ) - getEffectbuilder()->applyStatusEffect( m_hitActors[ 0 ], status.id, 0, true ); - else - getEffectbuilder()->applyStatusEffect( m_pSource, status.id, 0 ); + applyStatusEffectSelf( status.id ); m_pSource->addStatusEffectByIdIfNotExist( status.id, status.duration, *m_pSource, status.modifiers ); } } diff --git a/src/world/Action/Action.h b/src/world/Action/Action.h index 77a139dc8b..f6f18304f7 100644 --- a/src/world/Action/Action.h +++ b/src/world/Action/Action.h @@ -105,6 +105,8 @@ namespace Sapphire::World::Action EffectBuilderPtr getEffectbuilder(); + void applyStatusEffectSelf( uint16_t statusId, uint8_t param = 0 ); + void handleAction(); void handleStatusEffects(); From aaad18bf7b444730bea2189fe6b3a82e8d320d6b Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Wed, 8 Mar 2023 18:07:15 +0100 Subject: [PATCH 18/45] Add job actions for warrior --- src/world/Action/Action.cpp | 16 +++++++++ src/world/Action/Action.h | 2 ++ src/world/Action/Job/Warrior.cpp | 61 ++++++++++++++++++++++++++++++++ src/world/Action/Job/Warrior.h | 20 +++++++++++ src/world/CMakeLists.txt | 1 + 5 files changed, 100 insertions(+) create mode 100644 src/world/Action/Job/Warrior.cpp create mode 100644 src/world/Action/Job/Warrior.h diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 1b4faff62e..e2ff4b2737 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -31,6 +31,8 @@ #include #include "WorldServer.h" +#include "Job/Warrior.h" + using namespace Sapphire; using namespace Sapphire::Common; using namespace Sapphire::Network; @@ -604,6 +606,8 @@ void Action::Action::handleAction() if( m_lutEntry.statuses.caster.size() > 0 || m_lutEntry.statuses.target.size() > 0 ) handleStatusEffects(); + handleJobAction(); + m_effectBuilder->buildAndSendPackets( m_hitActors ); // TODO: disabled, reset kills our queued actions @@ -643,6 +647,18 @@ void Action::Action::handleStatusEffects() } } +void Action::Action::handleJobAction() +{ + switch( m_pSource->getClass() ) + { + case ClassJob::Warrior: + { + Warrior::onAction( *m_pSource->getAsPlayer(), *this ); + break; + } + } +} + bool Action::Action::preCheck() { if( auto player = m_pSource->getAsPlayer() ) diff --git a/src/world/Action/Action.h b/src/world/Action/Action.h index f6f18304f7..081be92efd 100644 --- a/src/world/Action/Action.h +++ b/src/world/Action/Action.h @@ -111,6 +111,8 @@ namespace Sapphire::World::Action void handleStatusEffects(); + void handleJobAction(); + /*! * @brief Adds an actor filter to this action. * @param filter The ptr to the ActorFilter to add diff --git a/src/world/Action/Job/Warrior.cpp b/src/world/Action/Job/Warrior.cpp new file mode 100644 index 0000000000..0e8434ad25 --- /dev/null +++ b/src/world/Action/Job/Warrior.cpp @@ -0,0 +1,61 @@ +#include "Warrior.h" + +#include +#include +#include + +using namespace Sapphire; +using namespace Sapphire::World::Action; + +void Warrior::onAction( Entity::Player& player, Action& action ) +{ + switch( action.getId() ) + { + case Maim: + case StormsEye: + case StormsPath: + case SkullSunder: + case ButchersBlock: + { + if( action.isComboAction() && !action.isCorrectCombo() ) + break; + + if( player.hasStatusEffect( Defiance ) ) + handleWrath( player, action ); + break; + } + } +} + +void Warrior::handleWrath( Entity::Player& player, Action& action ) +{ + auto effectToApply = Wrath; + auto asChara = player.getAsChara(); + + if( player.hasStatusEffect( Wrath ) ) + { + player.replaceSingleStatusEffectById( Wrath ); + effectToApply = WrathII; + } + else if( player.hasStatusEffect( WrathII ) ) + { + player.replaceSingleStatusEffectById( WrathII ); + effectToApply = WrathIII; + } + else if( player.hasStatusEffect( WrathIII ) ) + { + player.replaceSingleStatusEffectById( WrathIII ); + effectToApply = WrathIV; + } + else if( player.hasStatusEffect( WrathIV ) ) + { + player.replaceSingleStatusEffectById( WrathIV ); + effectToApply = Infuriated; + } + + if( !player.hasStatusEffect( Infuriated ) ) + { + action.applyStatusEffectSelf( effectToApply ); + player.addStatusEffectByIdIfNotExist( effectToApply, 30000, *asChara ); + } +} \ No newline at end of file diff --git a/src/world/Action/Job/Warrior.h b/src/world/Action/Job/Warrior.h new file mode 100644 index 0000000000..4947433101 --- /dev/null +++ b/src/world/Action/Job/Warrior.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include "ForwardsZone.h" +#include +#include +#include +#include + +namespace Sapphire::World::Action +{ + class Warrior + { + public: + static void onAction( Entity::Player& player, Action& action ); + + private: + static void handleWrath( Entity::Player& player, Action& action ); + }; +} \ No newline at end of file diff --git a/src/world/CMakeLists.txt b/src/world/CMakeLists.txt index 632151e24b..9ba8c3aa24 100644 --- a/src/world/CMakeLists.txt +++ b/src/world/CMakeLists.txt @@ -7,6 +7,7 @@ file( GLOB SERVER_SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp Actor/*.cpp Action/*.cpp + Action/Job/*.cpp ContentFinder/*.cpp DebugCommand/*.cpp Event/*.cpp From b56aab72e594b4143e14cea805d04740bcc96efe Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Wed, 8 Mar 2023 18:09:10 +0100 Subject: [PATCH 19/45] Add some actions and statuses for war --- data/actions/player.json | 7 ++- src/scripts/action/war/ActionInnerBeast.cpp | 45 +++++++++++++++++++ src/scripts/action/war/ActionUnchained.cpp | 31 +++++++++++++ .../statuseffect/StatusEffectDefiance.cpp | 22 +++++++++ .../statuseffect/StatusEffectUnchained.cpp | 23 ++++++++++ 5 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/scripts/action/war/ActionInnerBeast.cpp create mode 100644 src/scripts/action/war/ActionUnchained.cpp create mode 100644 src/scripts/statuseffect/StatusEffectDefiance.cpp create mode 100644 src/scripts/statuseffect/StatusEffectUnchained.cpp diff --git a/data/actions/player.json b/data/actions/player.json index 15370c57ea..4764e4b895 100644 --- a/data/actions/player.json +++ b/data/actions/player.json @@ -758,7 +758,12 @@ "restorePercentage": 0, "nextCombo": [], "statuses": { - "caster": [], + "caster": [ + { + "id": 97, + "duration": 30000 + } + ], "target": [] } }, diff --git a/src/scripts/action/war/ActionInnerBeast.cpp b/src/scripts/action/war/ActionInnerBeast.cpp new file mode 100644 index 0000000000..f53ba491ec --- /dev/null +++ b/src/scripts/action/war/ActionInnerBeast.cpp @@ -0,0 +1,45 @@ +#include