示例#1
0
    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);
    }
示例#2
0
 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);
                 }
             }
         }
     }
 }
示例#3
0
    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);
                }
            }
        }
    }
示例#4
0
    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);
                        }
                    }
                }
            }
        }
    }