Пример #1
0
        public void AddSpellContribution(Dictionary <string, SpellContribution> dict, float count, float dotUptime, float effectSpellPower, float effectMastery, float effectCrit, float effectManaAdeptMultiplier, float averageMana)
        {
            SpellContribution contrib;

            if (!dict.TryGetValue(Name, out contrib))
            {
                contrib = new SpellContribution()
                {
                    Name = Name
                };
                dict[Name] = contrib;
            }
            float igniteContribution = 0;
            float critBonus          = CritBonus;

            if (IgniteDamage > 0)
            {
                igniteContribution = (IgniteDamage + effectSpellPower * IgniteDamagePerSpellPower + effectMastery * IgniteDamagePerMastery + effectCrit * IgniteDamagePerCrit) * count;
                SpellContribution igniteContrib;
                if (!dict.TryGetValue("Ignite", out igniteContrib))
                {
                    igniteContrib = new SpellContribution()
                    {
                        Name = "Ignite"
                    };
                    dict["Ignite"] = igniteContrib;
                }
                igniteContrib.Damage += igniteContribution;
            }
            contrib.Hits  += (HitProcs - CritProcs) * count;
            contrib.Crits += CritProcs * count;
            float damage = (AverageDamage + effectSpellPower * DamagePerSpellPower + effectMastery * DamagePerMastery + effectCrit * DamagePerCrit) * count - igniteContribution;

            if (castingState.Solver.Specialization == Specialization.Arcane)
            {
                double manaAdeptBonus  = castingState.ManaAdeptBonus + 0.015f * effectMastery;
                float  spellMultiplier = (float)(1 + averageMana / castingState.BaseStats.Mana * manaAdeptBonus * effectManaAdeptMultiplier);
                damage *= spellMultiplier;
            }
            contrib.Damage += damage;
            if (dotUptime > 0)
            {
                float tickDamage = dotUptime * (DotAverageDamage + effectSpellPower * DotDamagePerSpellPower + effectMastery * DotDamagePerMastery + effectCrit * DotDamagePerCrit) * count;
                contrib.Damage += tickDamage;
                // dotUptime = DotProcs / (DotDuration / DotTickInterval)
                contrib.Ticks      += dotUptime * (DotDuration / DotTickInterval) * count;
                contrib.TickDamage += tickDamage;
            }
            else
            {
                if (DotTickInterval > 0)
                {
                    contrib.Ticks += DotProcs * count;
                    float dotFactor  = DotProcs / (DotDuration / DotTickInterval) * SpellModifier * DotDamageModifier * PartialResistFactor * HitRate * (1 + (CritBonus - 1) * Math.Max(0, CritRate));
                    float tickDamage = dotFactor * (BasePeriodicDamage + (RawSpellDamage + effectSpellPower) * DotDamageCoefficient) * count;
                    contrib.TickDamage += tickDamage;
                    damage             -= tickDamage;
                }
            }
            // damage = baseDamage * (1 + (CritBonus - 1) * CritRate)
            float baseDamage = damage / (1 + (critBonus - 1) * CritRate);

            contrib.HitDamage  += baseDamage * (1 - CritRate);
            contrib.CritDamage += baseDamage * CritRate * critBonus;
            contrib.Range       = Range;
        }
Пример #2
0
        public void AddSpellContribution(Dictionary <string, SpellContribution> dict, float duration, float dotUptime, float effectSpellPower)
        {
            SpellContribution contrib;

            if (!dict.TryGetValue(Name, out contrib))
            {
                contrib = new SpellContribution()
                {
                    Name = Name
                };
                dict[Name] = contrib;
            }
            float igniteContribution = 0;
            float critBonus          = CritBonus;

            if (IgniteDamage > 0)
            {
                igniteContribution = (IgniteDamage + effectSpellPower * IgniteDamagePerSpellPower) / CastTime * duration;
                SpellContribution igniteContrib;
                if (!dict.TryGetValue("Ignite", out igniteContrib))
                {
                    igniteContrib = new SpellContribution()
                    {
                        Name = "Ignite"
                    };
                    dict["Ignite"] = igniteContrib;
                }
                igniteContrib.Damage += igniteContribution;
                critBonus            /= (1 + castingState.Solver.IgniteFactor);
            }
            contrib.Hits  += (HitProcs - CritProcs) * duration / CastTime;
            contrib.Crits += CritProcs * duration / CastTime;
            float damage = (AverageDamage + effectSpellPower * DamagePerSpellPower) / CastTime * duration - igniteContribution;

            contrib.Damage += damage;
            if (dotUptime > 0)
            {
                float tickDamage = dotUptime * (DotAverageDamage + effectSpellPower * DotDamagePerSpellPower) / CastTime * duration;
                contrib.Damage += tickDamage;
                // dotUptime = DotProcs / (DotDuration / DotTickInterval)
                contrib.Ticks      += dotUptime * (DotDuration / DotTickInterval) * duration / CastTime;
                contrib.TickDamage += tickDamage;
            }
            else
            {
                if (DotTickInterval > 0)
                {
                    contrib.Ticks += DotProcs * duration / CastTime;
                    float dotFactor  = DotProcs / (DotDuration / DotTickInterval) * SpellModifier * DotDamageModifier * PartialResistFactor;
                    float tickDamage = dotFactor * (BasePeriodicDamage + (RawSpellDamage + effectSpellPower) * DotDamageCoefficient) / CastTime * duration;
                    contrib.TickDamage += tickDamage;
                    damage             -= tickDamage;
                }
            }
            // damage = baseDamage * (1 + (CritBonus - 1) * CritRate)
            float baseDamage = damage / (1 + (critBonus - 1) * CritRate);

            contrib.HitDamage  += baseDamage * (1 - CritRate);
            contrib.CritDamage += baseDamage * CritRate * critBonus;
            contrib.Range       = Range;
        }