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; }
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; }