Example #1
0
 private void Start()
 {
     damage  = GetComponent <DamageResource>();
     stamina = GetComponent <StaminaResource>();
     health  = GetComponent <HealthResource>();
     player  = GameObject.FindGameObjectWithTag("Player");
 }
Example #2
0
        /// <summary>
        /// 伤害阶段(伤害计算函数)
        /// </summary>
        /// <param name="OrgDamage">初始伤害值</param>
        /// <param name="damageResource">直接伤害/间接伤害</param>
        /// <param name="damageType">伤害类型</param>
        /// <param name="elementType">伤害所属元素类型</param>
        /// <param name="source">发起伤害角色</param>
        /// <param name="target">承受伤害角色</param>
        public void TakeDamage(float OrgDamage, DamageResource damageResource, DamageType damageType, ElementType elementType, FightHero source, FightHero target)
        {
            float           damage          = OrgDamage;
            List <BuffCode> source_bufflist = new List <BuffCode>();
            List <BuffCode> target_bufflist = new List <BuffCode>();

            source_bufflist.AddRange(source.BuffDict.Keys);
            target_bufflist.AddRange(target.BuffDict.Keys);
            //直接伤害前被动执行
            if (damageResource == DamageResource.DirectDamage)
            {
                source.Hero_Card.Prossive_skill_function(FightPhase.BeforeDemage, source, target);
                target.Hero_Card.Prossive_skill_function(FightPhase.BeforeHit, target, source);
            }
            //buff伤害阶段前执行
            string data = string.Format("{0}|{1}|{2}|{3}", damage.ToString(), damageResource.ToString(), damageType.ToString(), elementType.ToString());

            foreach (BuffCode key in source_bufflist)
            {
                if (source.BuffDict.ContainsKey(key))
                {
                    source.BuffDict[key].DamagePhase(FightPhase.BeforeDemage, target, source, data);
                }
            }
            foreach (BuffCode key in target_bufflist)
            {
                if (target.BuffDict.ContainsKey(key))
                {
                    target.BuffDict[key].HitPhase(FightPhase.BeforeHit, source, target, data);
                }
            }
            //判断目标是否无敌
            if (target.IsInvincible)
            {
                return;
            }
            //判断目标是否闪避
            Random r = new Random();
            float  i = r.Next(1, 100) / 100f;

            if (i < target.Dodge)
            {
                return;
            }
            //真实伤害
            if (damageType == DamageType.Real)
            {
                damage = OrgDamage;
            }
            //元素伤害
            if (damageType == DamageType.Element && elementType != ElementType.Chaos)
            {
                float sourceAttribute        = source.GetAttributeByEnum(elementType);
                float targetAttribute        = target.GetAttributeByEnum(elementType);
                float sourceAttributeDamage  = source.GetAttributeDamageByEnum(elementType);
                float targetAttributeDamage  = target.GetAttributeDamageByEnum(elementType);
                float sourceAttributeDefense = source.GetAttributeDefenseByEnum(elementType);
                float targetAttributeDefense = target.GetAttributeDefenseByEnum(elementType);
                damage = ((1 - source.Pass_through) * (OrgDamage + source.Increase_Damage) * ((sourceAttribute / 150) * (sourceAttribute / 150) + 0.4f) * ((1000 - targetAttribute - target.Defense) / (1000 + targetAttribute + target.Defense)) * sourceAttributeDamage * source.All_Element_Damage / targetAttributeDefense / target.All_Element_Defense
                          + source.Pass_through * (OrgDamage + source.Increase_Damage) * ((sourceAttribute / 150) * (sourceAttribute / 150) + 0.4f) * ((1000 - targetAttribute - target.Defense) / (1000 + targetAttribute + target.Defense)) * sourceAttributeDamage * source.All_Element_Damage / targetAttributeDefense / target.All_Element_Defense
                          - target.Parry) * source.Final_Damage / target.Final_Defense;
            }
            //普通伤害
            if (damageType == DamageType.Normal || elementType == ElementType.Chaos)
            {
                damage = (OrgDamage + source.Increase_Damage - source.Parry) * source.Final_Damage / target.Final_Defense;
            }
            //判断伤害是否暴击
            float i1 = r.Next(1, 100) / 100f;

            if (i1 < source.Crit && damageType != DamageType.Real)
            {
                damage *= source.Crit_Damage;
            }
            //向上取整
            if (damage % 1 != 0)
            {
                damage = (int)damage + 1;
            }
            //扣除护盾抵挡,并设置剩余护盾值
            damage -= target.Shield;
            if (damage <= 0)
            {
                target.Shield = -damage;
                damage        = 0;
            }
            else
            {
                target.Shield = 0;
            }
            //直接伤害
            if (damageResource == DamageResource.DirectDamage)
            {
                //直接伤害时被动执行
                source.Hero_Card.Prossive_skill_function(FightPhase.InDemage, source, target);
                target.Hero_Card.Prossive_skill_function(FightPhase.InHit, target, source);
                //buff伤害阶段时执行
                data = string.Format("{0}|{1}|{2}|{3}", damage.ToString(), damageResource.ToString(), damageType.ToString(), elementType.ToString());
                foreach (BuffCode key in source_bufflist)
                {
                    if (source.BuffDict.ContainsKey(key))
                    {
                        source.BuffDict[key].DamagePhase(FightPhase.InDemage, target, source, data);
                    }
                }
                foreach (BuffCode key in target_bufflist)
                {
                    if (target.BuffDict.ContainsKey(key))
                    {
                        target.BuffDict[key].HitPhase(FightPhase.InHit, source, target, data);
                    }
                }
                target.Hp -= damage;
                target.DamageCaculation.Clear();
                target.DamageCaculation.Add(elementType, damage);
                Console.WriteLine("扣血:" + damage);
                Console.WriteLine("剩余血量" + target.Hp);
                source.Hero_Card.Prossive_skill_function(FightPhase.AfterDemage, source, target);
                target.Hero_Card.Prossive_skill_function(FightPhase.AfterHit, target, source);
                foreach (BuffCode key in source_bufflist)
                {
                    if (source.BuffDict.ContainsKey(key))
                    {
                        source.BuffDict[key].DamagePhase(FightPhase.AfterDemage, target, source, data);
                    }
                }
                foreach (BuffCode key in target_bufflist)
                {
                    if (target.BuffDict.ContainsKey(key))
                    {
                        target.BuffDict[key].HitPhase(FightPhase.AfterHit, source, target, data);
                    }
                }
            }
            //间接伤害
            if (damageResource == DamageResource.CollateralDamage)
            {
                target.Hp -= damage;
            }

            //吸血
            if (source.SuckBlood > 0 && damage > 0)
            {
                AddHp(damage * source.SuckBlood, source, source);
            }
        }