diff --git a/server/gameserver/attrhelper.cc b/server/gameserver/attrhelper.cc new file mode 100644 index 00000000..fd34ae6c --- /dev/null +++ b/server/gameserver/attrhelper.cc @@ -0,0 +1,25 @@ +#include "precompile.h" + +#include "attrhelper.h" + +float* AttrHelper::GetAttrAbsPtr(std::array& attr, int attr_id) +{ + if (!IsValidHumanAttr(attr_id)) { + return nullptr; + } + return &attr[attr_id]; +} + + +float* AttrHelper::GetAttrRatePtr(std::array& attr, int attr_id) +{ + if (!IsValidHumanAttr(attr_id)) { + return nullptr; + } + return &attr[attr_id]; +} + +bool AttrHelper::ParseAttr(std::shared_ptr xobj, std::array& attr) +{ + return true; +} diff --git a/server/gameserver/attrhelper.h b/server/gameserver/attrhelper.h new file mode 100644 index 00000000..2295d72e --- /dev/null +++ b/server/gameserver/attrhelper.h @@ -0,0 +1,12 @@ +#pragma once + +class AttrHelper +{ + public: + + static float* GetAttrAbsPtr(std::array& attr, int attr_id); + static float* GetAttrRatePtr(std::array& attr, int attr_id); + + static bool ParseAttr(std::shared_ptr xobj, std::array& attr); + +}; diff --git a/server/gameserver/battledatacontext.cc b/server/gameserver/battledatacontext.cc index e3f9c1ec..2225c0a3 100644 --- a/server/gameserver/battledatacontext.cc +++ b/server/gameserver/battledatacontext.cc @@ -11,6 +11,8 @@ #include "bullet.h" #include "app.h" +#include "attrhelper.h" + class HeroAbility { public: @@ -77,9 +79,50 @@ private: void DtoInit() { + std::array base_attr_abs = {0}; + std::array base_attr_rate = {0}; + + std::array pro_attr_abs = {0}; + std::array pro_attr_rate = {0}; + + std::array skill_attr_abs = {0}; + std::array skill_attr_rate = {0}; + + std::array chip_attr_abs = {0}; + std::array chip_attr_rate = {0}; + + { + std::shared_ptr attr_base_xobj = hero_dto->At("attr_base"); + if (attr_base_xobj && attr_base_xobj->IsArray()) { + AttrHelper::ParseAttr(attr_base_xobj, base_attr_abs); + base_attr_rate = base_attr_abs; + } + } + { + std::shared_ptr attr_pro_xobj = hero_dto->At("attr_pro"); + if (attr_pro_xobj && attr_pro_xobj->IsArray()) { + AttrHelper::ParseAttr(attr_pro_xobj, pro_attr_abs); + pro_attr_rate = pro_attr_abs; + } + } + { + std::shared_ptr attr_skill_xobj = hero_dto->At("attr_skill"); + if (attr_skill_xobj && attr_skill_xobj->IsArray()) { + AttrHelper::ParseAttr(attr_skill_xobj, skill_attr_abs); + skill_attr_rate = skill_attr_abs; + } + } + { + std::shared_ptr attr_chip_xobj = hero_dto->At("attr_chip"); + if (attr_chip_xobj && attr_chip_xobj->IsArray()) { + AttrHelper::ParseAttr(attr_chip_xobj, chip_attr_abs); + chip_attr_rate = chip_attr_abs; + } + } } + private: float hp_ = 0.0f; @@ -101,17 +144,17 @@ public: float GetAtk() { - return weapon_meta->i->atk(); + return atk_; } float GetCritAtk() { - return weapon_meta->i->critical(); + return crit_atk_; } float GetCritAtkRatio() { - return weapon_meta->i->cri_damage(); + return crit_atk_ratio_; } void Init() @@ -127,11 +170,43 @@ private: void DefaultInit() { - + atk_ = weapon_meta->i->atk(); + crit_atk_ = weapon_meta->i->critical(); + crit_atk_ratio_ = weapon_meta->i->cri_damage(); } void DtoInit() { + std::array base_attr_abs = {0}; + std::array base_attr_rate = {0}; + + std::array pro_attr_abs = {0}; + std::array pro_attr_rate = {0}; + + std::array chip_attr_abs = {0}; + std::array chip_attr_rate = {0}; + + { + std::shared_ptr attr_base_xobj = weapon_dto->At("attr_base"); + if (attr_base_xobj && attr_base_xobj->IsArray()) { + AttrHelper::ParseAttr(attr_base_xobj, base_attr_abs); + base_attr_rate = base_attr_abs; + } + } + { + std::shared_ptr attr_pro_xobj = weapon_dto->At("attr_pro"); + if (attr_pro_xobj && attr_pro_xobj->IsArray()) { + AttrHelper::ParseAttr(attr_pro_xobj, pro_attr_abs); + pro_attr_rate = pro_attr_abs; + } + } + { + std::shared_ptr attr_chip_xobj = weapon_dto->At("attr_chip"); + if (attr_chip_xobj && attr_chip_xobj->IsArray()) { + AttrHelper::ParseAttr(attr_chip_xobj, chip_attr_abs); + chip_attr_rate = chip_attr_abs; + } + } }