using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; namespace YLBattle { /// /// 战斗公式 /// public class BattleFomula { /// /// buff治疗公式 /// /// 目标对象 /// 治疗值 public static float buffCure(float cure) { return cure; } /// /// 治疗量计算 /// /// 技能适配器 /// 技能id1 /// 技能等级 /// 施法者 /// 目标 /// 实际治疗 public static float Cure(ISkillAdapter ada, string skillID, int level, LogicFighter caster, LogicFighter target) { int dianshu = int.Parse(ada.GetSkillProperty(skillID, ESkillProperty.ESKILL_PROPERTY_parmValue, level)); string proValue = ada.GetSkillProperty(skillID, ESkillProperty.ESKILL_PROPERTY_proValue, level); if (proValue.IndexOf('F') != -1) { proValue = proValue.Substring(0, proValue.IndexOf('F')); } int bili = int.Parse(proValue); float maxHp = target.GetProperty(EBattleProperty.HPMAX); float result = dianshu + maxHp * bili / 100; LogHelper.Log(String.Format(target.ID() + " 恢复血量:skillID:{0},CastarPlayerTID:{1},PlayerLevel:{2}:目标MAXHP:{3},增加血量值{4}", skillID, caster.TID(), caster.Level, maxHp, (int)result)); return result; } /// /// 物理(普攻)伤害 /// /// 目标 /// 伤害值 /// 公式伤害 public static float PhyDamage(LogicFighter caster, LogicFighter target, int dianshu, float phypower, bool iscritical = false, string skillid = "") { //Debug.LogError(caster.ID() + " attack....." + skillID); //2017-09-19版,公式 //角色属性:战斗力、生命值、能量值、物理攻击、法术强度、护甲、魔抗、攻速、暴击 //A*100/(D+100)+a*100/(d+100)=对敌方造成的伤害(战斗公式) //A=己方物理攻击 D=敌方护甲 a=己方法术强度 d=敌方魔抗 //己方物理攻击*100/(敌方护甲+100)+己方法术强度*100/(敌方魔抗+100)=伤害 float casterWulishanghai = dianshu + phypower; float casterFashu = caster.GetProperty(EBattleProperty.MAGICSTRENGTH);///己方法术强度 float targethujia = target.GetProperty(EBattleProperty.DEFENSE);//敌方护甲 float targetMokang = target.GetProperty(EBattleProperty.MAGICFORCE);//敌方魔抗 float result = casterWulishanghai * 100 / (targethujia + 100) + casterFashu * 100 / (targetMokang + 100); //Debug.Log(String.Format(target.ID() + " 受到物理伤害:skillID:{0},PlayerTID:{1},PlayerLevel:{2}:({3}+{4}) * 100 / ({5} + 100) + {6} * 100 / ({7} + 100)={8}", // skillid, caster.TID(), caster.Level, dianshu, phypower, targethujia, casterFashu, targetMokang, (int)result)); if (iscritical) { result = BattleFomula.CritticalDmage(result); } return result; } /// /// 魔法伤害 /// /// 目标 /// 伤害值 /// 公式伤害 public static float MagicDamage(LogicFighter caster, LogicFighter target, int dianshu, float magpower, bool iscritical = false, string skillid = "") { //2017-09-19版,公式 //角色属性:战斗力、生命值、能量值、物理攻击、法术强度、护甲、魔抗、攻速、暴击 //A*100/(D+100)+a*100/(d+100)=对敌方造成的伤害(战斗公式) //A=己方物理攻击 D=敌方护甲 a=己方法术强度 d=敌方魔抗 //己方物理攻击*100/(敌方护甲+100)+己方法术强度*100/(敌方魔抗+100)=伤害 float casterWulishanghai = caster.GetProperty(EBattleProperty.ATTACK);///己方物理攻击 float casterFashu = dianshu + magpower;///己方法术强度 float targethujia = target.GetProperty(EBattleProperty.DEFENSE);//敌方护甲 float targetMokang = target.GetProperty(EBattleProperty.MAGICFORCE);//敌方魔抗 float result = casterWulishanghai * 100 / (targethujia + 100) + casterFashu * 100 / (targetMokang + 100); // Debug.Log(String.Format(target.ID() + " 受到魔法伤害:skillID:{0},PTID:{1},playerLevl:{2}: {3} * 100 / ( {4} + 100) + ({5}+{6}) * 100 / ( {7} + 100))={8}", //skillid, caster.TID(), caster.Level, casterWulishanghai, targethujia, dianshu, magpower, targetMokang, (int)result)); if (iscritical) { result = BattleFomula.CritticalDmage(result); } return result * (iscritical ? 2 : 1); } /// /// 魔法暴击伤害公式 /// /// 伤害值 /// 换算暴击后数值 public static float CritticalDmage(float damage) { //2017-11-08 暴击倍率=2 产生暴击率则伤害翻倍 return damage * BattleConst.BattleCriticalDamageRate; } /// /// 暴击伤害 /// /// 施法者 /// 伤害值 /// 是否暴击 public static bool CriticalRate(LogicFighter caster) { /* * ****暴击倍率默认为【2】 * random 40 >30暴率率。。。。。100=100*2 */ int rateResult = UnityEngine.Random.Range(1, 100); float critical = caster.GetProperty(EBattleProperty.CRITICALPROB); return rateResult <= critical; } } }