public void OnMagicDamage(IMonster source, double damage, int element) { var damValue = damage * (1 - FormulaBook.GetMagDefRate(RealMag)); var dam = new HitDamage((int)damValue, (int)damValue, element, DamageTypes.Magic); lastDamagerId = source == null ? 0 : source.Id; CheckMagicDamage(dam); HpBar.OnDamage(dam); }
public static HitDamage GetDamage(LiveMonster src, LiveMonster dest) { HitDamage damage; double attrRateOn = 1; //属性相克的伤害修正 bool isCrt = false; if (dest.Avatar.MonsterConfig.AttrDef != null) { attrRateOn -= dest.Avatar.MonsterConfig.AttrDef[src.AttackType]; } if (src.RealCrt > 0)//存在暴击率 { if (MathTool.GetRandom(100) < src.RealCrt * GameConstants.CrtToRate) { attrRateOn *= (GameConstants.DefaultCrtDamage + src.CrtDamAddRate); isCrt = true; } } var realAttackType = MonsterBook.HasTag(src.CardId, "mattack") ? src.Attr : src.AttackType; if (realAttackType == 0) //物理攻击 { var damValue = Math.Max(1, (int)(src.RealAtk * (1 - FormulaBook.GetPhyDefRate(dest.RealDef)) * attrRateOn)); //至少有1点伤害 var noDefDamValue = (int)(src.RealAtk * attrRateOn); damage = new HitDamage(damValue, noDefDamValue, 0, DamageTypes.Physical); } else { var damValue = (int)(src.RealAtk * (1 + src.RealMag * GameConstants.MagToRate) * (1 - FormulaBook.GetMagDefRate(dest.RealMag)) * attrRateOn); damage = new HitDamage(damValue, damValue, realAttackType, DamageTypes.Magic); dest.CheckMagicDamage(damage); } damage.IsCrt = isCrt; bool nodef = false; //无视防御 if (!src.BuffManager.HasBuff(BuffEffectTypes.NoSkill)) { src.SkillManager.CheckDamage(src, dest, true, damage, ref nodef); } if (!dest.BuffManager.HasBuff(BuffEffectTypes.NoSkill)) { dest.SkillManager.CheckDamage(src, dest, false, damage, ref nodef); } damage.SetDamage(DamageTypes.All, damage.Value); return(damage); }