private float CalculateThisDamage(ItemDamageType type, float baseDamage) { float dmg = 0; try { AttackTable MHAtkTable = AttackTables[type]; dmg = baseDamage; // Base Damage dmg *= 1f + DamageMultipliers[type]; // Global Damage Bonuses dmg *= 1f - DamageResistances[type]; // Global Damage Penalties // Work the Attack Table, note: some of these points will always be zero float dmgDrop = (1f - MHAtkTable.Miss // no damage when being missed - MHAtkTable.Dodge // no damage when being dodged - MHAtkTable.Parry // no damage when being parried - MHAtkTable.Glance // glancing handled below - MHAtkTable.Block // blocked handled below - MHAtkTable.Crit); // crits handled below float dmgGlance = dmg * MHAtkTable.Glance * 0.70f; // Partial Damage when glancing float dmgBlock = dmg * MHAtkTable.Block * 0.70f; // Partial damage when blocked float dmgCrit = dmg * MHAtkTable.Crit * (1f + DamageCritMultipliers[type]); // Bonus Damage when critting dmg *= dmgDrop; dmg += dmgGlance + dmgBlock + dmgCrit; } catch (Exception ex) { Rawr.Base.ErrorBox eb = new Rawr.Base.ErrorBox("Error calculating special proc DPS", ex.Message, "CalculateThisDamage(...)", "", ex.StackTrace); } return(dmg); }
/// <summary> /// Performs the meat and potatoes intention of this class. /// All the DPS, etc variables will be populated. /// Do not run Calculate multiple times for the same ItemDamageType without resetting. /// </summary> /// <param name="type"></param> /// <returns></returns> public float Calculate(ItemDamageType type) { float retVal = 0f; try{ foreach (SpecialEffect effect in EffectsList) { if (effect == null || effect.Stats == null || !TriggerChances.ContainsKey(effect.Trigger) || !TriggerIntervals.ContainsKey(effect.Trigger)) { } else if (effect.Stats.PhysicalDamage > 0 && type == ItemDamageType.Physical) { retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.PhysicalDamage, type); } else if (effect.Stats.ArcaneDamage > 0 && type == ItemDamageType.Arcane) { retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.ArcaneDamage, type); } else if (effect.Stats.HolyDamage > 0 && type == ItemDamageType.Holy) { retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.HolyDamage, type); } else if (effect.Stats.NatureDamage > 0 && type == ItemDamageType.Nature) { retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.NatureDamage, type); } else if (effect.Stats.ShadowDamage > 0 && type == ItemDamageType.Shadow) { retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.ShadowDamage, type); } else if (effect.Stats.FireDamage > 0 && type == ItemDamageType.Fire) { retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.FireDamage, type); } else if (effect.Stats.FrostDamage > 0 && type == ItemDamageType.Frost) { retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.FrostDamage, type); } } }catch (Exception ex) { Rawr.Base.ErrorBox eb = new Rawr.Base.ErrorBox("Error calculating special proc DPS", ex.Message, "Calculate(...)", "", ex.StackTrace); } return(retVal); }
private float CalculateTotalDamagePerSecond(SpecialEffect effect, float baseDamage, ItemDamageType type) { float totalDamage = 0f; float totalDamagePerSec = 0f; float totalNumProcs = 0f; float totalNumProcsPerSec = 0f; try { float triggerInterval = TriggerIntervals[effect.Trigger]; float triggerChance = TriggerChances[effect.Trigger]; if (TriggerChances.ContainsKey(Trigger.MainHandHit) && MainHandEffects.Contains(effect) && (!OffHandEffects.Contains(effect) || !dualWieldProcs)) { triggerInterval = TriggerIntervals[Trigger.MainHandHit]; triggerChance = TriggerChances[Trigger.MainHandHit]; if (OffHandEffects.Contains(effect)) { dualWieldProcs = true; } } else if (TriggerChances.ContainsKey(Trigger.OffHandHit) && OffHandEffects.Contains(effect)) { triggerInterval = TriggerIntervals[Trigger.OffHandHit]; triggerChance = TriggerChances[Trigger.OffHandHit]; } // Process the Effects totalNumProcsPerSec = effect.GetAverageProcsPerSecond(triggerInterval, triggerChance, Char.MainHand.Speed, FightDuration); totalNumProcs = totalNumProcsPerSec * FightDuration; totalDamage = totalNumProcs * CalculateThisDamage(type, baseDamage); totalDamagePerSec = totalDamage / FightDuration; // Set our Results into the Dictionaries TotalDamage[type] += totalDamage; TotalDamagePerSec[type] += totalDamagePerSec; TotalNumProcs[type] += totalNumProcs; TotalNumProcsPerSec[type] += totalNumProcsPerSec; } catch (Exception ex) { Rawr.Base.ErrorBox eb = new Rawr.Base.ErrorBox("Error calculating special proc DPS", ex.Message, "CalculateTotalDamagePerSecond(...)", "", ex.StackTrace); } return(totalDamagePerSec); }