예제 #1
0
        internal int SetDamage(DamageData damageData, bool byAttack, int actionId, ActionParameter.OnDamageHitDelegate onDamageHit, bool hasEffect, Skill skill, bool energyAdd, Action onDefeat, bool noMotion, float weight, float actionWeightSum, Func <int, float, int> p)
        {
            int  randomInt = staticBattleManager.Random();
            bool critical  = false;

            if (randomInt <= damageData.CriticalRate && damageData.CriticalRate != 0)
            {
                critical = true;
            }
            if (damageData.ActionType == eActionType.ATTACK)
            {
                eDamageType damageType = damageData.DamageType;
                if ((damageType == eDamageType.ATK && IsAbnormalState(eAbnormalState.LOG_ATK_BARRIR)) ||
                    (damageType == eDamageType.MGC && IsAbnormalState(eAbnormalState.LOG_MGC_BARRIR)) ||
                    IsAbnormalState(eAbnormalState.LOG_ALL_BARRIR))
                {
                    critical = damageData.IsLogBarrierCritical;
                }
            }
            int damage = SetDamageImpl(damageData, byAttack, onDamageHit, hasEffect, skill, energyAdd, critical, onDefeat, noMotion, p);

            //boss相关代码鸽了
            if (damageData.Source != null)
            {
                if (damageData.ActionType != eActionType.DESTROY)
                {
                    if (damageData.ActionType != eActionType.ATTACK_FIELD && (skill == null || skill.IsLifeStealEnabled))
                    {
                        int lifesteal = damageData.LifeSteal;
                        if (skill != null)
                        {
                            lifesteal += skill.LifeSteal;
                        }
                        if (lifesteal >= 1)
                        {
                            float recovery_value = lifesteal * damage / (lifesteal + UnitData.level + 100);
                            if (recovery_value > 0)
                            {
                                eInhibitHealType eh = damageData.DamageType == eDamageType.MGC ? eInhibitHealType.MAGIC : eInhibitHealType.PHYSICS;
                                SetRecovery((int)recovery_value, eh, damageData.Source, false, false,
                                            false,//鸽了
                                            false, true, null);
                            }
                        }
                    }
                }
                if (IsOther ^ damageData.Source.IsOther)
                {
                    UnitCtrl source = damageData.Source;
                    if (damageData.Source.SummonType != eSummonType.NONE)
                    {
                        source = source.SummonSource;
                    }
                    //伤害统计
                    if (source != null)
                    {
                        //source.UnitDamageinfo.Setdamage(damage + 原伤害)
                    }
                }
            }
            accumulateDamage += damage;
            //log
            if (skill != null)
            {
                if (damageData.Source != null)
                {
                    if (skill.SkillId == damageData.Source.UBSkillId)
                    {
                        if (byAttack)
                        {
                            damageData.Target.PassiveUbIsMagic = damageData.DamageType == eDamageType.MGC;
                        }
                        damageData.Target.TotalDamage += damage;
                    }
                }
                if (damage >= 1)
                {
                    if (!skill.DamageedPartsList.Contains(damageData.Target))
                    {
                        skill.DamageedPartsList.Add(damageData.Target);
                    }
                }
            }
            if (damageData.Source != null)
            {
                if (damage >= 1 && DamageSealDataDictionary.ContainsKey(damageData.Source))
                {
                    Dictionary <int, AttackSealData> dic = DamageSealDataDictionary[damageData.Source];
                    foreach (AttackSealData sealData in dic.Values)
                    {
                        if (!sealData.OnlyCritical || critical)
                        {
                            sealData.AddSeal(this);
                        }
                    }
                }
                if (damage >= 1 && damageData.Source.DamageOnceOwnerSealDateDictionary.ContainsKey(damageData.Source) && skill != null)
                {
                    if (!skill.AlreadyAddAttackSelfSeal)
                    {
                        Dictionary <int, AttackSealData> dic2 = DamageOnceOwnerSealDateDictionary[damageData.Source];
                        foreach (AttackSealData sealData in dic2.Values)
                        {
                            sealData.AddSeal(damageData.Source);
                        }
                        skill.AlreadyAddAttackSelfSeal = true;
                    }
                }
            }
            if (damageData.Source == null || damage < 1 || !damageData.Source.DamageOwnerSealDataDictionary.ContainsKey(damageData.Source))
            {
                if (skill == null)
                {
                    return(damage);
                }
                skill.TotalDamage += damage;
                return(damage);
            }
            foreach (AttackSealData sealData1 in damageData.Source.DamageOwnerSealDataDictionary[damageData.Source].Values)
            {
                if (sealData1.OnlyCritical)
                {
                    if (critical)
                    {
                        sealData1.AddSeal(damageData.Source);
                    }
                }
                else
                {
                    sealData1.AddSeal(damageData.Source);
                }
            }
            if (skill != null)
            {
                skill.TotalDamage += damage;
            }
            return(damage);
        }
예제 #2
0
        internal int SetDamageImpl(DamageData damageData, bool byAttack, ActionParameter.OnDamageHitDelegate onDamageHit, bool hasEffect, Skill skill, bool energyAdd, bool critical, Action onDefeat, bool noMotion, Func <int, float, int> p)
        {
            if (IdleOnly)
            {
                return(0);
            }
            if (IsDivisionSourceForDamage)
            {
                if (!damageData.IsDivisionDamage)
                {
                    return(0);
                }
            }
            //boss
            if (IsAbnormalState(eAbnormalState.NO_DAMAGE_MOTION))
            {
                return(0);
            }
            if (IsAbnormalState(eAbnormalState.CONFUSION))
            {
                if (damageData.DamageType == eDamageType.ATK)
                {
                    SetMissAtk(damageData.Source, eMissLogType.DODGE_BY_NO_DAMAGE_MOTION, eDamageEffectType.NORMAL, damageData.Target, 1);
                    return(0);
                }
            }
            float damage = damageData.Damage;

            if (critical)
            {
                damage *= 2 * damageData.CriticalDamageRate;
            }
            eActionType actionType = damageData.ActionType;
            eDamageType damageType = damageData.DamageType;
            bool        uselog     = false;

            if (actionType == eActionType.ATTACK)
            {
                if ((damageType == eDamageType.ATK && IsAbnormalState(eAbnormalState.LOG_ATK_BARRIR)) ||
                    (damageType == eDamageType.MGC && IsAbnormalState(eAbnormalState.LOG_MGC_BARRIR)) ||
                    IsAbnormalState(eAbnormalState.LOG_ALL_BARRIR))
                {
                    uselog = true;
                    damage = damageData.LogBarrieryexpectedDamage;
                }
            }
            if (damageType == eDamageType.ATK && IsAbnormalState(eAbnormalState.CUT_ATK_DAMAGE))
            {
                damage *= (1 - GetAbnormalStateMainValue(eAbnormalStateCategory.CUT_ATK_DAMAGE) / 100);
            }
            if (damageType == eDamageType.MGC && IsAbnormalState(eAbnormalState.CUT_MGC_DAMAGE))
            {
                damage *= (1 - GetAbnormalStateMainValue(eAbnormalStateCategory.CUT_MGC_DAMAGE) / 100);
            }
            if (IsAbnormalState(eAbnormalState.CUT_ALL_DAMAGE))
            {
                damage *= (1 - GetAbnormalStateMainValue(eAbnormalStateCategory.CUT_ALL_DAMAGE) / 100);
            }
            if (uselog)
            {
                float m, s;
                if (damageType == eDamageType.ATK && IsAbnormalState(eAbnormalState.LOG_ATK_BARRIR))
                {
                    s = GetAbnormalStateSubValue(eAbnormalStateCategory.LOG_ATK_BARRIR);
                    m = GetAbnormalStateMainValue(eAbnormalStateCategory.LOG_ATK_BARRIR);
                    if (damage > s)
                    {
                        damage = s + m * Mathf.Log10(1 + (damage - s) / m);
                    }
                }
                if (damageType == eDamageType.MGC && IsAbnormalState(eAbnormalState.LOG_MGC_BARRIR))
                {
                    s = GetAbnormalStateSubValue(eAbnormalStateCategory.LOG_MGC_BARRIR);
                    m = GetAbnormalStateMainValue(eAbnormalStateCategory.LOG_MGC_BARRIR);
                    if (damage > s)
                    {
                        damage = s + m * Mathf.Log10(1 + (damage - s) / m);
                    }
                }
                if (IsAbnormalState(eAbnormalState.LOG_ALL_BARRIR))
                {
                    s = GetAbnormalStateSubValue(eAbnormalStateCategory.LOG_ALL_BARRIR);
                    m = GetAbnormalStateMainValue(eAbnormalStateCategory.LOG_ALL_BARRIR);
                    if (damage > s)
                    {
                        damage = s + m * Mathf.Log10(1 + (damage - s) / m);
                    }
                }
            }
            if (hasEffect)
            {
                //显示特效
            }
            if (!uselog && !damageData.IgnoreDef)
            {
                if (damageType == eDamageType.ATK)
                {
                    float def = damageData.Target.GetDefZero();
                    damage *= (1.0f - Mathf.Max(0, def - damageData.DefPenetrate) / (100.0f + def));
                }
                else if (damageType == eDamageType.MGC)
                {
                    float def = damageData.Target.GetMagicDefZero();
                    damage *= (1.0f - Mathf.Max(0, def - damageData.DefPenetrate) / (100.0f + def));
                }
            }
            damage = Mathf.Min(1000000, damage);
            if (actionState == eActionState.DIE)
            {
                string mes = UnitName + "受到" + damage + "过量伤害";
                BattleUIManager.Instance.LogMessage(mes, eLogMessageType.GET_DAMAGE, isOther);
                return(0);
            }
            if (p != null)
            {
                damage = p((int)damage, 1);
            }
            if (damageData.Source != null && actionType != eActionType.FORCE_HP_CHANGE)
            {
                //反击相关
            }
            if (skill != null)
            {
                if (actionType == eActionType.ATTACK)
                {
                    damage *= skill.AweValue;
                }
            }
            if (energyAdd)
            {
                ChargeEnergy(eSetEnergyType.BY_SET_DAMAGE, damage * skillStackValDmg, false, this, false, false, true, false);
            }
            if (damage <= 0 && actionType == eActionType.FORCE_HP_CHANGE)
            {
                //特效
                return(0);
            }
            int overRecDamage = 0;

            if (actionType != eActionType.FORCE_HP_CHANGE && actionType != eActionType.INHIBIT_HEAL)
            {
                ExecBarrier(damageData, ref damage, ref overRecDamage);
            }
            Hp -= damage - overRecDamage;
            if (Hp >= 1 && onDamageHit != null)
            {
                onDamageHit(damage);
            }
            //设置HP条
            unitUI.SetHP(Hp / BaseValues.Hp);
            Ondamage?.Invoke(byAttack, damage, critical);
            if (!HasUnDeadTime)
            {
                if (!noMotion)
                {
                    bool k = false;
                    if (skill != null)
                    {
                        k = skill.PauseStopState;
                    }
                    PlayDamageWhenIdle(true, k);
                }
                if (Hp <= 0 && !isDead && actionState <= eActionState.DAMAGE)
                {
                    SetState(eActionState.DIE, 0);
                }
            }
            return((int)damage);
        }