Exemplo n.º 1
0
    public void ModifyHealth(DamageValue damageData)
    {
        float damageDealt = damageData.DamageDealt(this).value;

        if (damageDealt < 0)
        {
            PlaySound(unitClass.damageTakenSound[Player.faction]);
        }

        Health = Mathf.Clamp(
            Health + damageDealt,
            0,
            unitClass.BaseHealth
            );
        StartCoroutine(AnimateHealthChange(damageDealt, damageData));

        if (Health == 0)
        {
            Kill();
        }
        if (Player != null)
        {
            Player.NotifyHealthChange();
        }
    }
Exemplo n.º 2
0
    private DamageResistance GetResistance(DamageValue damage)
    {
        List <Resistance> matchingResistances = resistances
                                                .FindAll(resistance =>
        {
            if (resistance.GetType() == typeof(DamageResistance))
            {
                DamageResistance foundResistance = resistance as DamageResistance;
                return(foundResistance.WillApplyTo(damage));
            }
            return(false);
        });

        DamageResistance chosenResistance = null;

        foreach (DamageResistance resistance in matchingResistances)
        {
            Dictionary <DamageResistanceEffect, int> priorities = DamageResistance.effectPriorities;

            if (chosenResistance == null ||
                priorities[resistance.resistanceEffect] > priorities[chosenResistance.resistanceEffect]
                )
            {
                chosenResistance = resistance;
            }
        }

        return(chosenResistance);
    }
Exemplo n.º 3
0
 public bool WillApplyTo(DamageValue damage)
 {
     if (anyDamage ||
         (shouldResistTypes && damageType == damage.type) ||
         (shouldResistTrajectories && damageTrajectory == damage.trajectory)
         )
     {
         return(true);
     }
     return(false);
 }
Exemplo n.º 4
0
        public int GetAttackDamage(Unit9 target, DamageValue damageValue = DamageValue.Minimum, float additionalPhysicalDamage = 0)
        {
            var damage = 0;

            foreach (var raw in this.GetRawAttackDamage(target, damageValue, additionalPhysicalDamage: additionalPhysicalDamage))
            {
                var amplify = target.GetDamageAmplification(this, raw.Key, false);
                var block   = target.GetDamageBlock(raw.Key);

                damage += (int)((raw.Value - block) * amplify);
            }

            return(Math.Max(damage, 0));
        }
Exemplo n.º 5
0
    private IEnumerator AnimateHealthChange(float damageDealt, DamageValue damageData)
    {
        animator.SetTrigger(damageData.type == DamageType.Heal ? "Heal" : "Hit");
        damageText.color = damageData.Color;
        damageText.text  = Mathf.Abs(damageDealt).ToString();
        damageText.gameObject.SetActive(true);

        for (float current = 0; current < 1f; current += 0.1f)
        {
            damageText.rectTransform.anchoredPosition = new Vector2(damageText.rectTransform.anchoredPosition.x, current);
            yield return(new WaitForSeconds(.03f));
        }

        damageText.gameObject.SetActive(false);
    }
Exemplo n.º 6
0
        public void HandleCommand(DamageValue <AbstractCharacter> value)
        {
            if (isCheat)
            {
                return;
            }
            if (isRetreat)
            {
                isRetreat = false;
            }
            var deltaDamage = _currentHealth - value.damageValue;

            _currentHealth = (deltaDamage > 0) ? deltaDamage : Dead();
            CustomDebug.LogMessage(CurrentHealth);
        }
Exemplo n.º 7
0
        public override string ToString()
        {
            string weaponString = base.ToString() + ", ";

            weaponString += NumberHands.ToString() + ", ";
            weaponString += AttackValue.ToString() + ", ";
            weaponString += AttackModifier.ToString() + ", ";
            weaponString += DamageValue.ToString() + ", ";
            weaponString += DamageModifier.ToString();

            foreach (string s in AllowableClasses)
            {
                weaponString += ", " + s;
            }

            return(weaponString);
        }
Exemplo n.º 8
0
    private GameObject CreateDmgFormula(Vector3Int position, DamageValue damage, Unit defenderUnit)
    {
        Vector3 worldPos  = TilemapNavigator.Instance.CellToWorldPos(position);
        Vector2 canvasPos = WorldToCanvasPos(worldPos);

        GameObject formulaContainer = Instantiate(dmgFormulaPrefab);
        DmgFormula formula          = formulaContainer.GetComponent <DmgFormula>();

        formula.SetValue(damage, defenderUnit);

        RectTransform markerRect = formula.GetComponent <RectTransform>();

        markerRect.SetParent(canvasRect);
        markerRect.anchoredPosition = canvasPos;

        return(formulaContainer);
    }
Exemplo n.º 9
0
    /// <summary>
    /// 被攻击
    /// </summary>
    /// <param name="damage"></param>
    /// <param name="unit">攻击者</param>
    /// <returns></returns>
    public IDamage BeAttack(IDamage damage, Unit unit)
    {
        if (unitProperty.hp.CurrValue <= 0)
        {
            return(null);
        }
        int a = 0;
        int b = 0;
        int c = 0;

        if (!IsInvincible)
        {
            if (damage.DamageStyle == DamageStyle.PHYSICS)
            {
                a = (int)((damage.AttackDamage - this.unitProperty.defensive.CurrValue - this.unitProperty.ignoreDamage.ExtraValue) * (1 - this.unitProperty.ignoreDamage.ExtraPercent));
                b = (int)((damage.CriticalDamage - this.unitProperty.defensive.CurrValue - this.unitProperty.ignoreDamage.ExtraValue) * (1 - this.unitProperty.ignoreDamage.ExtraPercent));
            }
            else if (damage.DamageStyle == DamageStyle.MAGIC)
            {
                a = (int)((damage.AttackDamage - this.unitProperty.magicDefensive.CurrValue - this.unitProperty.ignoreDamage.ExtraValue) * (1 - this.unitProperty.ignoreDamage.ExtraPercent));
                b = (int)((damage.CriticalDamage - this.unitProperty.magicDefensive.CurrValue - this.unitProperty.ignoreDamage.ExtraValue) * (1 - this.unitProperty.ignoreDamage.ExtraPercent));
            }
            b = Mathf.Max(0, b);
            c = damage.AttachDamage;
            this.unitProperty.hp.CurrValue -= a + b + c;
        }
        var id = new DamageValue()
        {
            DamageStyle    = damage.DamageStyle,
            AttackDamage   = a,
            AttachDamage   = c,
            CriticalDamage = b,
        };

        if (unitProperty.hp.CurrValue <= 0)
        {
            ani.Play("Death");
            unitProperty.hp.CurrValue = 0;
        }
        GlobalEvent.showDamageFontEvent(id, transform.position);
        if (isPlayer)
        {
            GlobalEvent.hpChangeEvent(this.unitProperty.hp.CurrValue, this.unitProperty.hp.MaxValue);
        }
        return(id);
    }
Exemplo n.º 10
0
        public override string ToString()
        {
            string weapString = base.ToString() + ", ";

            weapString += NumberHands.ToString() + ", ";
            weapString += AttackValue.ToString() + ", ";
            weapString += AttackModifier.ToString() + ", ";
            weapString += DamageValue.ToString() + ", ";
            weapString += DamageModifier.ToString() + ", ";

            foreach (Type t in allowableClasses)
            {
                weapString += ", " + t.Name;
            }

            return(base.ToString());
        }
Exemplo n.º 11
0
    public DealtDamage CheckAgainstDamage(Unit unit, DamageValue damage, bool triggerResistance = true)
    {
        DamageResistance resistance = GetResistance(damage);

        if (resistance != null)
        {
            if (triggerResistance)
            {
                bool shouldRemove = resistance.OnTick(unit);
                if (shouldRemove)
                {
                    RemoveResistance(resistance);
                }
            }
            return(resistance.ProcessDamage(damage.DamageAfterShield(unit)));
        }

        return(new DealtDamage(damage.DamageAfterShield(unit), null));
    }
Exemplo n.º 12
0
    public void SetValue(DamageValue damage, Unit unit)
    {
        DealtDamage damageDealt = damage.DamageDealt(unit, false);

        baseDamageText.gameObject.SetActive(false);
        extraDamageText.gameObject.SetActive(false);

        if (
            damageDealt.resistanceEffect == DamageResistanceEffect.CancelDamage ||
            damageDealt.resistanceEffect == DamageResistanceEffect.SetDamageToFixedAmount
            )
        {
            ShowBaseDamage(damageDealt.value);
        }
        else
        {
            ShowBaseDamage(damage.baseFlatDmg);
            ShowExtraDamage(damage.extraFlatDamage);
        }
    }
Exemplo n.º 13
0
 public int CalculateAttackDamage(DamageValue damageValue)
 {
     //add in damage buffs here
     return(damageValue.baseValue);
 }
Exemplo n.º 14
0
        internal Damage GetRawAttackDamage(
            Unit9 target,
            DamageValue damageValue        = DamageValue.Minimum,
            float physCritMultiplier       = 1f,
            float additionalPhysicalDamage = 0)
        {
            var damage = new Damage();

            var multipliedPhysDamage = 0f;

            switch (damageValue)
            {
            case DamageValue.Minimum:
                multipliedPhysDamage += this.BaseUnit.MinimumDamage;
                break;

            case DamageValue.Average:
                multipliedPhysDamage += this.BaseUnit.DamageAverage;
                break;

            case DamageValue.Maximum:
                multipliedPhysDamage += this.BaseUnit.MaximumDamage;
                break;
            }

            if (this.IsIllusion && !this.CanUseAbilities)
            {
                //todo improve illusion damage ?
                multipliedPhysDamage *= 0.25f;
            }
            else
            {
                multipliedPhysDamage += this.BaseUnit.BonusDamage;
            }

            if (multipliedPhysDamage <= 0)
            {
                return(damage);
            }

            foreach (var passive in this.passiveDamageAbilities)
            {
                if (!passive.IsValid)
                {
                    continue;
                }

                foreach (var passiveDamage in passive.GetRawDamage(target))
                {
                    if (passive.MultipliedByCrit && passiveDamage.Key == DamageType.Physical)
                    {
                        multipliedPhysDamage += passiveDamage.Value;
                    }
                    else
                    {
                        damage[passiveDamage.Key] += passiveDamage.Value;
                    }
                }
            }

            damage[DamageType.Physical] += (multipliedPhysDamage * physCritMultiplier) + additionalPhysicalDamage;
            damage[DamageType.Physical] *= DamageExtensions.GetMeleeDamageMultiplier(this, target);

            return(damage);
        }
Exemplo n.º 15
0
 void OnTriggerEnter2D(Collider2D collider)
 {
     ++m_DamageCount;
     DamageValue.AddScore(1);
     m_DamageRewardAtThisFrame += -0.2f;
 }
Exemplo n.º 16
0
    public override void ResultExpr(float[] param)
    {
        base.ResultExpr(param);
        if (param == null || param.Length < 5)
        {
            return;
        }
        Actor target = ActorManager.Singleton.Lookup(TargetID);

        if (null == target)
        {
            return;
        }
        Actor source = ActorManager.Singleton.Lookup(SourceID);

        if (null == source)
        {
            return;
        }
        //物理、魔法加成
        float phyAdd = 0, magAdd = 0;
        //攻击力倍数的修正
        float modifyValue = 0;
        //伤害修正
        float           damageModify = 1;
        SkillResultInfo info         = GameTable.SkillResultTableAsset.Lookup(SkillResultID);

        if (null != info)
        {
            if (info.MinComboCount > 0)
            {
                if (source.Combo != null && source.Combo.TotalComboNumber >= info.MinComboCount)
                {
                    phyAdd = info.PhyAttackAdd;
                    magAdd = info.MagAttackAdd;
                }
            }
            if (source.Combo != null)
            {
                int comboNumber = source.Combo.TotalComboNumber;
                if (comboNumber > 44)
                {
                    comboNumber = 44;
                }
                modifyValue = (int)(1.0f / 15.0f * comboNumber) * info.AttackModify;
            }
            if (info.ComboNum > 0)
            {
                damageModify = DamageModify;
            }
            if (info.IsWeakenComboTime)
            {
                target.OnWeakenComboTime(info.WeakenComboTime);
            }
        }
        {//结算
            switch ((ENDamageType)param[0])
            {
                #region enDamageFixed
            case ENDamageType.enDamageFixed:    //固定伤害
            {
                float damage = 0.0f;
                if (param[1] != 0)
                {        //固定伤害
                    damage = param[1];
                }
                if (param[2] != 0)
                {        //百分比上下浮动
                    //目标的伤害系数
                    float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam);
                    damage *= (woundParam != 0 ? woundParam : 1);
                    damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]);
                }
                DamageValue = damage;
            }
            break;

                #endregion
                #region enPhyDamageTimes
            case ENDamageType.enPhyDamageTimes:    //物理攻击倍数伤害
            {
                float srcAttackValue = source.Props.GetProperty_Float(ENProperty.phyattack);
                if (param[1] != 0)
                {        //物理攻击力的倍数
                    srcAttackValue *= (param[1] + modifyValue);
                }
                srcAttackValue += phyAdd;
                float damage = srcAttackValue - target.Props.GetProperty_Float(ENProperty.phydefend);
                float min    = GameTable.WorldParamTableAsset.Lookup((int)ENWorldParamIndex.enPhyAttackMinValue).FloatTypeValue;
                if (damage < srcAttackValue * min)
                {        //伤害最低为物理攻击*物理攻击力的最小值
                    damage = srcAttackValue * min;
                }
                else
                {
                    if (param[2] != 0)
                    {        //百分比上下浮动
                        //目标的伤害系数
                        float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam);
                        damage *= (woundParam != 0 ? woundParam : 1);
                        damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]);
                    }
                }
                DamageValue   = damage;
                m_attackValue = source.Props.GetProperty_Float(ENProperty.phyattack);
            }
            break;

                #endregion
                #region enMagDamageTimes
            case ENDamageType.enMagDamageTimes:    //魔法攻击倍数伤害
            {
                float srcAttackValue = source.Props.GetProperty_Float(ENProperty.magattack);
                if (param[1] != 0)
                {        //魔法攻击力的倍数
                    srcAttackValue *= (param[1] + modifyValue);
                }
                srcAttackValue += magAdd;
                float damage = srcAttackValue - target.Props.GetProperty_Float(ENProperty.magdefend);
                float min    = GameTable.WorldParamTableAsset.Lookup((int)ENWorldParamIndex.enMagAttackMinValue).FloatTypeValue;
                if (damage < srcAttackValue * min)
                {        //伤害最低为魔法攻击的10%
                    damage = srcAttackValue * min;
                }
                else
                {
                    if (param[2] != 0)
                    {        //百分比上下浮动
                        //目标的伤害系数
                        float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam);
                        damage *= (woundParam != 0 ? woundParam : 1);
                        damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]);
                    }
                }
                DamageValue   = damage;
                m_attackValue = source.Props.GetProperty_Float(ENProperty.magattack);
            }
            break;

                #endregion
                #region enDamagePercent
            case ENDamageType.enDamagePercent:
            {
                float percent = param[1];
                if (percent > 0 && percent < 1)
                {
                    float damage = target.MaxHP * percent;
                    float random = param[2];
                    if (random != 0)
                    {        //百分比上下浮动
                        //目标的伤害系数
                        float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam);
                        damage *= (woundParam != 0 ? woundParam : 1);
                        damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]);
                    }
                    DamageValue = damage;
                }
            }
            break;

                #endregion
                #region enDamageSunder
            case ENDamageType.enDamageSunder:
            {
                float srcAttackValue = source.Props.GetProperty_Float(ENProperty.phyattack);
                srcAttackValue += phyAdd;
                float damage = srcAttackValue - target.Props.GetProperty_Float(ENProperty.phydefend) * param[1];
                if (damage < srcAttackValue * 0.1f)
                {        //伤害最低为物理攻击的10%
                    damage = srcAttackValue * 0.1f;
                }
                else
                {
                    if (param[2] != 0)
                    {        //百分比上下浮动
                        //目标的伤害系数
                        float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam);
                        damage *= (woundParam != 0 ? woundParam : 1);
                        damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]);
                    }
                }
                DamageValue   = damage;
                m_attackValue = source.Props.GetProperty_Float(ENProperty.phyattack);
            }
            break;

                #endregion
                #region enDistancePhyDamageTimes
            case ENDamageType.enPhyDamageDistance:
            {
                SkillInfo skillInfo = GameTable.SkillTableAsset.Lookup(SkillID);
                if (skillInfo == null)
                {
                    return;
                }
                float range = 0;
                float d     = ActorTargetManager.GetTargetDistance(source.RealPos, target.RealPos);
                if (d < param[1])
                {
                    range = param[1];
                }
                else if (d > param[2])
                {
                    range = param[2];
                }
                else
                {
                    range = d;
                }
                float attackValue = source.Props.GetProperty_Float(ENProperty.phyattack);
                float defend      = target.Props.GetProperty_Float(ENProperty.phydefend);
                DamageValue = attackValue * (range / skillInfo.AttackDistance) * param[3] - defend;
                float min = GameTable.WorldParamTableAsset.Lookup((int)ENWorldParamIndex.enPhyAttackMinValue).FloatTypeValue;
                if (DamageValue < attackValue * min)
                {
                    DamageValue = attackValue * min;
                }
            }
            break;

                #endregion
                #region enDistanceMagDamageTimes
            case ENDamageType.enMagDamageDistance:
            {
                SkillInfo skillInfo = GameTable.SkillTableAsset.Lookup(SkillID);
                if (skillInfo == null)
                {
                    return;
                }
                float range = 0;
                float d     = ActorTargetManager.GetTargetDistance(source.RealPos, target.RealPos);
                if (d < param[1])
                {
                    range = param[1];
                }
                else if (d > param[2])
                {
                    range = param[2];
                }
                else
                {
                    range = d;
                }
                float attackValue = source.Props.GetProperty_Float(ENProperty.magattack);
                float defend      = target.Props.GetProperty_Float(ENProperty.magdefend);
                DamageValue = attackValue * (range / skillInfo.AttackDistance) * param[3] - defend;
                float min = GameTable.WorldParamTableAsset.Lookup((int)ENWorldParamIndex.enMagAttackMinValue).FloatTypeValue;
                if (DamageValue < attackValue * min)
                {
                    DamageValue = attackValue * min;
                }
            }
            break;

                #endregion
            default:
                break;
            }
            DamageResultType = (ENDamageResultType)param[4];
            if (DamageValue != 0)
            {
                DamageValue *= damageModify;
                if (UnityEngine.Random.Range(0.0f, 1f) < source.Props.GetProperty_Float(ENProperty.crit))
                {//暴击
                    m_isCrit     = true;
                    DamageValue *= (source.Props.GetProperty_Float(ENProperty.critParam));
                }
            }
            else
            {
                Debug.LogWarning("damage result is error, damage is " + DamageValue.ToString()
                                 + ", source actor id is " + source.ID.ToString());
            }
        }
    }