public static int ExpectDamage(Transform attacker, Transform defender, int damageFactor, int hit, bool backStabBonus, int finalDamageFactor) { var def = defender.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "def").value; var atk = attacker.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "atk").value; int damage = ((int)(0.1f * atk * damageFactor)); //最终伤害加成 damage = (int)(damage * (1 + 0.01 * finalDamageFactor)); if (backStabBonus) { if (BackStab(attacker, defender)) { damage = damage * 50 / (def / 2 + 50); } else { damage = damage * 50 / (def + 50); } } else { damage = damage * 50 / (def + 50); } damage = damage * hit; var comboUnits = ComboDetect(attacker, defender); if (comboUnits.Count > 0) { foreach (var u in comboUnits) { var ninjaCombo = new NinjaCombo(); ninjaCombo.SetLevel(u.GetComponent <CharacterStatus>().skills["NinjaCombo"]); var comboAtk = u.GetComponent <CharacterStatus>().attributes.Find(d => d.eName == "atk").value; if (BackStab(u, defender)) { damage += ((int)(0.1f * comboAtk * ninjaCombo.damageFactor) * 50) / (def / 2 + 50); } else { damage += ((int)(0.1f * comboAtk * ninjaCombo.damageFactor) * 50) / (def + 50); } } } if (damage < 0) { damage = 0; } return(damage); }
protected override void InitSkill() { base.InitSkill(); //连续技第二个 if (originSkill != null && comboSkill == null) { int i = 0; foreach (var o in other) { if (o != null) { var buff = o.GetComponent <CharacterStatus>().Buffs.Find(b => b.GetType() == typeof(DodgeBuff)); if (buff != null) { var b = (DodgeBuff)buff; if (!b.done) { i++; } } else { i++; } } } if (i > 0) { animator.SetInteger("Skill", animID); } else { character.GetComponent <CharacterAction>().SetSkill("ChooseDirection"); animator.applyRootMotion = false; skillState = SkillState.reset; return; } } foreach (var o in other) { if (comboSkill == null) { var comboUnits = DamageSystem.ComboDetect(character, o); if (comboUnits.Count > 0) { foreach (var u in comboUnits) { var ninjaCombo = new NinjaCombo(); ninjaCombo.SetLevel(u.GetComponent <CharacterStatus>().skills["NinjaCombo"]); comboUnitsOriginDirection.Add(u, u.forward); u.forward = o.position - u.position; u.GetComponent <Animator>().SetInteger("Skill", 1); } } } } }
public override void Effect() { if (effectState == EffectState.origin) { originSkill.Effect(); } else { //结算消耗以及动作归位。 base.Effect(); if (calculateDamage) { //寻找是否有最终伤害buff FinalDamageBuff finalDamageBuff = (FinalDamageBuff)character.GetComponent <Unit>().Buffs.Find(b => b.GetType() == typeof(FinalDamageBuff)); foreach (var o in other) { //<伤害序列,伤害结果> Dictionary <int, int> damageDic = new Dictionary <int, int>(); //每Hit for (int i = 0; i < hit; i++) { int d; var doNextHit = DamageSystem.ApplyDamage(character, o, skipDodge, damageFactor, skillRate, extraCrit, extraPounce, comboSkill == null && hoverRange == 0 || comboSkill != null && comboSkill.hoverRange == 0, finalDamageBuff == null ? 0 : finalDamageBuff.Factor, out d); damageDic.Add(i, d); if (!doNextHit) { break; } } //如果有最终伤害Buff,且Duration小于0,手动撤销影响。(此处应为倍化术) if (finalDamageBuff != null && finalDamageBuff.Duration < 0) { finalDamageBuff.Undo(character); } //comboSkill是指组合技的第二个技能。这里说明是第一个技能,结合前面的条件,则这里是无连续技的技能逻辑。 if (comboSkill == null) { //寻求合击的逻辑 var comboUnits = DamageSystem.ComboDetect(character, o); if (comboUnits.Count > 0) { for (int i = 0; i < comboUnits.Count; i++) { int d; FinalDamageBuff u_finalDamageBuff = (FinalDamageBuff)comboUnits[i].GetComponent <Unit>().Buffs.Find(b => b.GetType() == typeof(FinalDamageBuff)); var ninjaCombo = new NinjaCombo(); ninjaCombo.SetLevel(comboUnits[i].GetComponent <CharacterStatus>().skills["NinjaCombo"]); DamageSystem.ApplyDamage(comboUnits[i], o, false, ninjaCombo.damageFactor, ninjaCombo.skillRate, ninjaCombo.extraCrit, ninjaCombo.extraPounce, ninjaCombo.hoverRange == 0, u_finalDamageBuff == null ? 0 : u_finalDamageBuff.Factor, out d); damageDic.Add(damageDic.Count + i, d); comboUnits[i].GetComponent <Animator>().SetInteger("Skill", 0); } } } FlyNum(damageDic, o); } } } }
public override void Effect() { if (effectState == EffectState.origin) { originSkill.Effect(); } else { base.Effect(); FinalDamageBuff finalDamageBuff = (FinalDamageBuff)character.GetComponent <Unit>().Buffs.Find(b => b.GetType() == typeof(FinalDamageBuff)); foreach (var o in other) { //<伤害序列,伤害结果> Dictionary <int, int> damageDic = new Dictionary <int, int>(); //每Hit for (int i = 0; i < hit; i++) { int d; var doNextHit = DamageSystem.ApplyDamage(character, o, damageFactor, skillRate, extraCrit, extraPounce, comboSkill == null && hoverRange == 0 || comboSkill != null && comboSkill.hoverRange == 0, finalDamageBuff == null ? 0 : finalDamageBuff.Factor, out d); damageDic.Add(i, d); if (!doNextHit) { break; } } foreach (var data in damageDic) { RoundManager.GetInstance().Invoke(i => { if (o) { if (data.Value >= 0) { UIManager.GetInstance().FlyNum(o.GetComponent <CharacterStatus>().arrowPosition / 2 + o.position + Vector3.down * 0.2f * i + Vector3.left * 0.2f * (Mathf.Pow(-1, i) > 0 ? 0 : 1), damageDic[i].ToString()); } } }, 0.2f * data.Key, data.Key); } if (finalDamageBuff != null && finalDamageBuff.Duration < 0) { finalDamageBuff.Undo(character); } //comboSkill是指组合技的第二个技能。 if (comboSkill == null) { var comboUnits = DamageSystem.ComboDetect(character, o); if (comboUnits.Count > 0) { foreach (var u in comboUnits) { int d; FinalDamageBuff u_finalDamageBuff = (FinalDamageBuff)u.GetComponent <Unit>().Buffs.Find(b => b.GetType() == typeof(FinalDamageBuff)); var ninjaCombo = new NinjaCombo(); ninjaCombo.SetLevel(u.GetComponent <CharacterStatus>().skills["NinjaCombo"]); DamageSystem.ApplyDamage(u, o, ninjaCombo.damageFactor, ninjaCombo.skillRate, ninjaCombo.extraCrit, ninjaCombo.extraPounce, ninjaCombo.hoverRange == 0, u_finalDamageBuff == null ? 0 : u_finalDamageBuff.Factor, out d); UIManager.GetInstance().FlyNum(o.GetComponent <CharacterStatus>().arrowPosition / 2 + o.position, d.ToString()); u.GetComponent <Animator>().SetInteger("Skill", 0); } } } } } }