From 5b225de6f77d023e33c552a696e9f15d78bf908c Mon Sep 17 00:00:00 2001 From: Lucy <44952533+Skyliegirl33@users.noreply.github.com> Date: Sat, 28 Jan 2023 00:07:06 +0100 Subject: [PATCH] Map out modifiers for lut and handle deserializing --- src/common/Common.h | 3 +- src/tools/action_parse/main.cpp | 16 ++++- src/world/Action/ActionLut.cpp | 1 + src/world/Action/ActionLut.h | 9 ++- src/world/Action/ActionLutData.cpp | 94 ++++++++++++++++++++++++++++++ src/world/Action/ActionLutData.h | 19 ++++++ 6 files changed, 137 insertions(+), 5 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index f33943e6..cd92a773 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -891,8 +891,7 @@ namespace Sapphire::Common CriticalHitPowerPercent = 1012, CriticalHitResiliencePercent = 1013, CriticalHitPercent = 1014, - EnmityPercent = 1015, - EnmityReductionPercent = 1016, + EnmityPercent = 1015 }; enum struct ActionAspect : uint8_t diff --git a/src/tools/action_parse/main.cpp b/src/tools/action_parse/main.cpp index 35e91953..c542eae7 100644 --- a/src/tools/action_parse/main.cpp +++ b/src/tools/action_parse/main.cpp @@ -31,10 +31,16 @@ Sapphire::Data::ExdData g_exdDataGen; std::string datLocation( "C:\\Data\\Dev\\ffxiv3.01\\game\\sqpack" ); //const std::string datLocation( "/mnt/c/Program Files (x86)/Steam/steamapps/common/FINAL FANTASY XIV Online/game/sqpack" ); +struct StatusModifier +{ + Common::ParamModifier modifier; + int32_t value; +}; + struct StatusEntry { uint16_t id; - std::unordered_map< std::string, uint16_t > modifiers; + std::vector< StatusModifier > modifiers; }; struct StatusEffect @@ -58,6 +64,14 @@ struct ActionEntry StatusEffect statuses; }; +void to_json( nlohmann::ordered_json& j, const StatusModifier& statusModifier) +{ + j = nlohmann::ordered_json{ + { "modifier", statusModifier.modifier }, + { "value", statusModifier.value } + }; +} + void to_json( nlohmann::ordered_json& j, const StatusEntry& statusEntry ) { j = nlohmann::ordered_json{ diff --git a/src/world/Action/ActionLut.cpp b/src/world/Action/ActionLut.cpp index 16598e8e..38746ca9 100644 --- a/src/world/Action/ActionLut.cpp +++ b/src/world/Action/ActionLut.cpp @@ -1,6 +1,7 @@ #include #include "ActionLut.h" +using namespace Sapphire; using namespace Sapphire::World::Action; bool ActionLut::validEntryExists( uint16_t actionId ) diff --git a/src/world/Action/ActionLut.h b/src/world/Action/ActionLut.h index 626021b7..3ea20cdb 100644 --- a/src/world/Action/ActionLut.h +++ b/src/world/Action/ActionLut.h @@ -4,15 +4,20 @@ #include #include #include +#include "Common.h" namespace Sapphire::World::Action { - using StatusModifier = std::unordered_map< std::string, uint16_t >; + struct StatusModifier + { + Common::ParamModifier modifier; + int32_t value; + }; struct StatusEntry { uint16_t id; - StatusModifier modifiers; + std::vector< StatusModifier > modifiers; }; struct StatusEffect diff --git a/src/world/Action/ActionLutData.cpp b/src/world/Action/ActionLutData.cpp index e310eb57..99ee9b73 100644 --- a/src/world/Action/ActionLutData.cpp +++ b/src/world/Action/ActionLutData.cpp @@ -4,11 +4,105 @@ #include #include +using namespace Sapphire; using namespace Sapphire::World::Action; namespace fs = std::filesystem; ActionLut::Lut ActionLut::m_actionLut; +std::unordered_map< std::string, Common::ParamModifier > ActionLutData::m_modifierStringMap = +{ + { "Strength", Common::ParamModifier::Strength }, + { "Dexterity", Common::ParamModifier::Dexterity }, + { "Vitality", Common::ParamModifier::Vitality }, + { "Intelligence", Common::ParamModifier::Intelligence }, + { "Mind", Common::ParamModifier::Mind }, + { "Piety", Common::ParamModifier::Piety }, + { "HP", Common::ParamModifier::HP }, + { "MP", Common::ParamModifier::MP }, + { "TP", Common::ParamModifier::TP }, + { "GP", Common::ParamModifier::GP }, + { "CP", Common::ParamModifier::CP }, + { "PhysicalDamage", Common::ParamModifier::PhysicalDamage }, + { "MagicDamage", Common::ParamModifier::MagicDamage }, + { "Delay", Common::ParamModifier::Delay }, + { "AdditionalEffect", Common::ParamModifier::AdditionalEffect }, + { "AttackSpeed", Common::ParamModifier::AttackSpeed }, + { "BlockRate", Common::ParamModifier::BlockRate }, + { "BlockStrength", Common::ParamModifier::BlockStrength }, + { "Parry", Common::ParamModifier::Parry }, + { "AttackPower", Common::ParamModifier::AttackPower }, + { "Defense", Common::ParamModifier::Defense }, + { "Accuracy", Common::ParamModifier::Accuracy }, + { "Evasion", Common::ParamModifier::Evasion }, + { "MagicDefense", Common::ParamModifier::MagicDefense }, + { "CriticalHitPower", Common::ParamModifier::CriticalHitPower }, + { "CriticalHitResilience", Common::ParamModifier::CriticalHitResilience }, + { "CriticalHit", Common::ParamModifier::CriticalHit }, + { "CriticalHitEvasion", Common::ParamModifier::CriticalHitEvasion }, + { "SlashingResistance", Common::ParamModifier::SlashingResistance }, + { "PiercingResistance", Common::ParamModifier::PiercingResistance }, + { "BluntResistance", Common::ParamModifier::BluntResistance }, + { "ProjectileResistance", Common::ParamModifier::ProjectileResistance }, + { "AttackMagicPotency", Common::ParamModifier::AttackMagicPotency }, + { "HealingMagicPotency", Common::ParamModifier::HealingMagicPotency }, + { "EnhancementMagicPotency", Common::ParamModifier::EnhancementMagicPotency }, + { "ElementalBonus", Common::ParamModifier::ElementalBonus }, + { "FireResistance", Common::ParamModifier::FireResistance }, + { "IceResistance", Common::ParamModifier::IceResistance }, + { "WindResistance", Common::ParamModifier::WindResistance }, + { "EarthResistance", Common::ParamModifier::EarthResistance }, + { "LightningResistance", Common::ParamModifier::LightningResistance }, + { "WaterResistance", Common::ParamModifier::WaterResistance }, + { "MagicResistance", Common::ParamModifier::MagicResistance }, + { "Determination", Common::ParamModifier::Determination }, + { "SkillSpeed", Common::ParamModifier::SkillSpeed }, + { "SpellSpeed", Common::ParamModifier::SpellSpeed }, + { "Haste", Common::ParamModifier::Haste }, + { "Morale", Common::ParamModifier::Morale }, + { "Enmity", Common::ParamModifier::Enmity }, + { "EnmityReduction", Common::ParamModifier::EnmityReduction }, + { "CarefulDesynthesis", Common::ParamModifier::CarefulDesynthesis }, + { "EXPBonus", Common::ParamModifier::EXPBonus }, + { "Regen", Common::ParamModifier::Regen }, + { "Refresh", Common::ParamModifier::Refresh }, + { "MainAttribute", Common::ParamModifier::MainAttribute }, + { "SecondaryAttribute", Common::ParamModifier::SecondaryAttribute }, + { "SlowResistance", Common::ParamModifier::SlowResistance }, + { "PetrificationResistance", Common::ParamModifier::PetrificationResistance }, + { "ParalysisResistance", Common::ParamModifier::ParalysisResistance }, + { "SilenceResistance", Common::ParamModifier::SilenceResistance }, + { "BlindResistance", Common::ParamModifier::BlindResistance }, + { "PoisonResistance", Common::ParamModifier::PoisonResistance }, + { "StunResistance", Common::ParamModifier::StunResistance }, + { "SleepResistance", Common::ParamModifier::SleepResistance }, + { "BindResistance", Common::ParamModifier::BindResistance }, + { "HeavyResistance", Common::ParamModifier::HeavyResistance }, + { "DoomResistance", Common::ParamModifier::DoomResistance }, + { "ReducedDurabilityLoss", Common::ParamModifier::ReducedDurabilityLoss }, + { "IncreasedSpiritbondGain", Common::ParamModifier::IncreasedSpiritbondGain }, + { "Craftsmanship", Common::ParamModifier::Craftsmanship }, + { "Control", Common::ParamModifier::Control }, + { "Gathering", Common::ParamModifier::Gathering }, + { "Perception", Common::ParamModifier::Perception }, + { "HPPercent", Common::ParamModifier::HPPercent }, + { "MPPercent", Common::ParamModifier::MPPercent }, + { "TPPercent", Common::ParamModifier::TPPercent }, + { "GPPercent", Common::ParamModifier::GPPercent }, + { "CPPercent", Common::ParamModifier::CPPercent }, + { "PhysicalDamagePercent", Common::ParamModifier::PhysicalDamagePercent }, + { "MagicDamagePercent", Common::ParamModifier::MagicDamagePercent }, + { "AttackPowerPercent", Common::ParamModifier::AttackPowerPercent }, + { "DefensePercent", Common::ParamModifier::DefensePercent }, + { "AccuracyPercent", Common::ParamModifier::AccuracyPercent }, + { "EvasionPercent", Common::ParamModifier::EvasionPercent }, + { "MagicDefensePercent", Common::ParamModifier::MagicDefensePercent }, + { "CriticalHitPowerPercent", Common::ParamModifier::CriticalHitPowerPercent }, + { "CriticalHitResiliencePercent", Common::ParamModifier::CriticalHitResiliencePercent }, + { "CriticalHitPercent", Common::ParamModifier::CriticalHitPercent }, + { "EnmityPercent", Common::ParamModifier::EnmityPercent } +}; + bool ActionLutData::cacheActions() { std::fstream f; diff --git a/src/world/Action/ActionLutData.h b/src/world/Action/ActionLutData.h index 38ea1a75..58b0460e 100644 --- a/src/world/Action/ActionLutData.h +++ b/src/world/Action/ActionLutData.h @@ -1,4 +1,5 @@ #include "ActionLut.h" +#include "Common.h" #include namespace Sapphire::World::Action @@ -8,8 +9,26 @@ namespace Sapphire::World::Action public: static bool cacheActions(); static bool reloadActions(); + + static std::unordered_map< std::string, Common::ParamModifier > m_modifierStringMap; }; + inline void from_json( const nlohmann::json& j, StatusModifier& statusModifier ) + { + auto stringKey = j.at( "modifier" ).get< std::string >(); + j.at( "value" ).get_to( statusModifier.value ); + + auto enumKey = ActionLutData::m_modifierStringMap.find( stringKey ); + if( enumKey != ActionLutData::m_modifierStringMap.end() ) + { + statusModifier.modifier = enumKey->second; + } + else + { + statusModifier.modifier = Common::ParamModifier::None; + } + } + inline void from_json( const nlohmann::json& j, StatusEntry& statusEntry ) { j.at( "id" ).get_to( statusEntry.id );