#pragma once #include "weakptr.h" /* 子弹命中逻辑 1、计算总攻击力 2、计算普通伤害 3、判断是否暴击(百分比系数),对方是否闪避(系数) 4、得到实际伤害 免伤后伤害=实际伤害*(1-免伤率) 吸血值=吸血系数*实际伤害 */ namespace MetaData { struct Player; struct Equip; } class Creature; class Obstacle; class Explosion; class Weapon; struct PlayerStats; class HeroAbility; class WeaponAbility; struct BattleDataContext { std::shared_ptr join_msg; long long battle_uuid = 0; int is_valid_battle = 0; std::string payload; int errcode = 0; std::string errmsg; std::shared_ptr hero_dto; std::shared_ptr weapon_dto1; std::shared_ptr weapon_dto2; BattleDataContext(); void GetHeroLvQuality(int& hero_lv, int& quality); void GetWeaponLvQuality(int& weapon_lv, int& quality); void ParseResult(a8::XObject& obj); void CalcBattleStat(struct PlayerStats* stats); float CalcDmg(Creature* target, IBullet* bullet); float CalcDmg(Obstacle* target, IBullet* bullet); float CalcDmg(Explosion* e); float GetHP(); float GetMaxHP(); float GetDef(); void ForceInit(long long hero_uniid, MetaData::Player* hum_meta, long long weapon1_uniid, MetaData::Equip* weapon1_meta, long long weapon2_uniid, MetaData::Equip* weapon2_meta); void Init(Creature* c); void GetSkillList(std::vector& skill_list); int GetClipVolume(Creature* c, Weapon* weapon); int GetFireRate(Creature* c, Weapon* weapon); int GetReloadTime(Creature* c, Weapon* weapon); float GetHeroTotalAtk(); float GetExtRecoverHp(); private: void Clear(); float GetTotalAtk(IBullet* bullet); float GetWeaponAtk(IBullet* bullet); bool IsCrit(IBullet* bullet); float GetCrit(IBullet* bullet); float GetCritRate(IBullet* bullet); bool IsDodge(IBullet* bullet); float GetDodge(IBullet* bullet); float GetDodgeRuduce(IBullet* bullet); std::shared_ptr GetWeaponByUniId(long long weapon_uniid); private: CreatureWeakPtr owner_; std::shared_ptr hero_ability_; std::shared_ptr weapon1_ability_; std::shared_ptr weapon2_ability_; int skill1_lv = 1; int skill2_lv = 1; int skill3_lv = 1; };