public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> retVal = new Dictionary <string, string>(); retVal.Add("Health", baseStats.Health.ToString()); retVal.Add("Mana", baseStats.Mana.ToString()); retVal.Add("Armor", baseStats.Armor.ToString()); retVal.Add("Agility", baseStats.Agility.ToString()); retVal.Add("Stamina", baseStats.Stamina.ToString()); retVal.Add("Intellect", baseStats.Intellect.ToString()); retVal.Add("Spirit", baseStats.Spirit.ToString()); retVal.Add("Spell Power", SpellPower.ToString()); retVal.Add("Spell Hit", String.Format("{0:F}%*{1} Hit Rating, {2:F}% Hit From Gear, {3} Rating To Cap", 100 * SpellHit, baseStats.HitRating, 100 * StatConversion.GetSpellHitFromRating(baseStats.HitRating), StatConversion.GetRatingFromHit(Math.Max(0, 0.17f - SpellHit)))); retVal.Add("Spell Crit", String.Format("{0:F}%*{1} Crit Rating, {2:F}% Crit From Gear, {3:F}% Crit From Intellect", 100 * SpellCrit, baseStats.CritRating, 100 * StatConversion.GetSpellCritFromRating(baseStats.CritRating), 100 * StatConversion.GetSpellCritFromIntellect(baseStats.Intellect))); retVal.Add("Spell Haste", String.Format("{0:F}%*{1} Haste Rating, {2:F}% Haste From Gear", 100 * SpellHaste, baseStats.HasteRating, 100 * StatConversion.GetSpellHasteFromRating(baseStats.HasteRating))); retVal.Add("MP5 Not Casting", String.Format("{0:F0}", ManaRegen * 5.0f)); retVal.Add("MP5 While Casting", String.Format("{0:F0}", ManaRegen5SR * 5.0f)); retVal.Add("Total Score", String.Format("{0:F2}", SubPoints[0] + SubPoints[1])); retVal.Add("Selected Rotation", SelectedRotation.Name); retVal.Add("Selected DPS", String.Format("{0:F2}", SelectedRotation.RotationData.DPS)); retVal.Add("Selected Time To OOM", String.Format(SelectedRotation.RotationData.TimeToOOM > new TimeSpan(0, 0, 0) ? "{0} m {1} s" : "Not during fight", SelectedRotation.RotationData.TimeToOOM.Minutes, SelectedRotation.RotationData.TimeToOOM.Seconds)); retVal.Add("Selected Cycle Length", String.Format("{0:F1} s", SelectedRotation.Duration)); StringBuilder sb = new StringBuilder("*"); float rotationDamage = SelectedRotation.RotationData.DPS * SelectedRotation.Duration; sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Starfire", 100 * SelectedRotation.StarfireAvgHit * SelectedRotation.StarfireCount / rotationDamage, SelectedRotation.StarfireAvgHit * SelectedRotation.StarfireCount, SelectedRotation.StarfireCount)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Moonfire", 100 * (SelectedRotation.MoonfireAvgHit) * SelectedRotation.MoonfireCasts / rotationDamage, (SelectedRotation.MoonfireAvgHit) * SelectedRotation.MoonfireCasts, SelectedRotation.MoonfireCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Insect Swarm", 100 * SelectedRotation.InsectSwarmAvgHit * SelectedRotation.InsectSwarmCasts / rotationDamage, SelectedRotation.InsectSwarmAvgHit * (SelectedRotation.InsectSwarmCasts), SelectedRotation.InsectSwarmCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Wrath", 100 * SelectedRotation.WrathAvgHit * SelectedRotation.WrathCount / rotationDamage, SelectedRotation.WrathAvgHit * SelectedRotation.WrathCount, SelectedRotation.WrathCount)); retVal.Add("Selected Spell Breakdown", sb.ToString()); retVal.Add("Burst Rotation", BurstDPSRotation.Name); retVal.Add("Burst DPS", String.Format("{0:F2}", BurstDPSRotation.RotationData.BurstDPS)); retVal.Add("Burst Time To OOM", String.Format(BurstDPSRotation.RotationData.TimeToOOM > new TimeSpan(0, 0, 0) ? "{0} m {1} s" : "Not during fight", BurstDPSRotation.RotationData.TimeToOOM.Minutes, BurstDPSRotation.RotationData.TimeToOOM.Seconds)); retVal.Add("Burst Cycle Length", String.Format("{0:F1} s", BurstDPSRotation.Duration)); sb = new StringBuilder("*"); rotationDamage = BurstDPSRotation.RotationData.DPS * BurstDPSRotation.Duration; sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Starfire", 100 * BurstDPSRotation.StarfireAvgHit * BurstDPSRotation.StarfireCount / rotationDamage, BurstDPSRotation.StarfireAvgHit * BurstDPSRotation.StarfireCount, BurstDPSRotation.StarfireCount)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Moonfire", 100 * BurstDPSRotation.MoonfireAvgHit * SelectedRotation.MoonfireCasts / rotationDamage, (BurstDPSRotation.MoonfireAvgHit) * BurstDPSRotation.MoonfireCasts, BurstDPSRotation.MoonfireCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Insect Swarm", 100 * BurstDPSRotation.InsectSwarmAvgHit * BurstDPSRotation.InsectSwarmCasts / rotationDamage, BurstDPSRotation.InsectSwarmAvgHit * BurstDPSRotation.InsectSwarmCasts, BurstDPSRotation.InsectSwarmCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Wrath", 100 * BurstDPSRotation.WrathAvgHit * BurstDPSRotation.WrathCount / rotationDamage, BurstDPSRotation.WrathAvgHit * BurstDPSRotation.WrathCount, BurstDPSRotation.WrathCount)); retVal.Add("Burst Spell Breakdown", sb.ToString()); retVal.Add("Starfire", String.Format("{0:F2} dps*{1:F2} s avg\n{2:F2} s w/NG\n{3:F2}% max non-Eclipse\n{4:F2}% max Eclipse\n{5:F2} avg hit\n{6:F0} avg mana", SelectedRotation.StarfireAvgHit / (SelectedRotation.StarfireAvgCast > 0 ? SelectedRotation.StarfireAvgCast : 1f), SelectedRotation.StarfireAvgCast, SelectedRotation.StarfireNGCastTime, 100 * SelectedRotation.StarfireNonEclipseCrit, 100 * SelectedRotation.StarfireEclipseCrit, SelectedRotation.StarfireAvgHit, SelectedRotation.StarfireManaCost)); retVal.Add("Wrath", String.Format("{0:F2} dps*{1:F2} s avg\n{2:F2} s w/NG\n{3:F2} avg hit\n{4:F0} avg mana", SelectedRotation.WrathAvgHit / (SelectedRotation.WrathAvgCast > 0 ? SelectedRotation.WrathAvgCast : 1f), SelectedRotation.WrathAvgCast, SelectedRotation.WrathNGCastTime, SelectedRotation.WrathAvgHit, SelectedRotation.WrathManaCost)); retVal.Add("Moonfire", String.Format("{0:F2} dps*{1:F2} s avg\n{2:F2} avg hit\n{3:F0} avg mana", SelectedRotation.MoonfireAvgHit / (SelectedRotation.MoonfireDuration > 0 ? SelectedRotation.MoonfireDuration : 1f), SelectedRotation.MoonfireCastTime, (SelectedRotation.MoonfireAvgHit), SelectedRotation.MoonfireManaCost)); retVal.Add("Insect Swarm", String.Format("{0:F2} dps*{1:F2} s avg\n{2:F2} avg hit\n{3:F0} avg mana", SelectedRotation.InsectSwarmAvgHit / (SelectedRotation.InsectSwarmDuration > 0 ? SelectedRotation.InsectSwarmDuration : 1f), SelectedRotation.InsectSwarmCastTime, SelectedRotation.InsectSwarmAvgHit, SelectedRotation.InsectSwarmManaCost)); retVal.Add("Starfall", String.Format("{0:F2} dps*{1:F2} avg per cast\n{2:F2} avg per star\n{3:F0} avg mana", SelectedRotation.StarfallDamage / 10.0f, SelectedRotation.StarfallDamage, SelectedRotation.StarfallDamage / (SelectedRotation.StarfallStars > 0 ? SelectedRotation.StarfallStars : 1f), StarfallMana)); retVal.Add("Treants", String.Format("{0:F2} dps*{1:F2} avg per cast\n{2:F2} avg per tree", TreantDamage / 30.0f, TreantDamage, TreantDamage / 3.0f)); return(retVal); }
public string GetStatInfo() { string info = ""; if (AttackPower != 0) { info += "Attack Power: " + AttackPower.ToString() + "\n"; } if (PhysicalHaste != 0) { info += "P. Haste: " + PhysicalHaste.ToString() + "%\n"; } if (PhysicalHitChance != 0) { info += "P. Hit Chance: " + PhysicalHitChance.ToString() + "%\n"; } if (PhysicalCritChance != 0) { info += "P. Crit Chance: " + PhysicalCritChance.ToString() + "%\n"; } if (PhysicalCritPower != 0) { info += "P. Crit Power: " + PhysicalCritPower.ToString() + "\n"; } if (PhysicalReduction != 0) { info += "P. Reduction: " + PhysicalReduction.ToString() + "%\n"; } if (PhysicalReflection != 0) { info += "P. Reflection: " + PhysicalReflection.ToString() + "%\n"; } if (PhysicalAvoidance != 0) { info += "P. Avoidance: " + PhysicalAvoidance.ToString() + "%\n"; } if (SpellPower != 0) { info += "Spell Power: " + SpellPower.ToString() + "\n"; } if (SpellHaste != 0) { info += "S. Haste: " + SpellHaste.ToString() + "%\n"; } if (SpellHitChance != 0) { info += "S. Hit Chance: " + SpellHitChance.ToString() + "%\n"; } if (SpellCritChance != 0) { info += "S. Crit Chance: " + SpellCritChance.ToString() + "%\n"; } if (SpellCritPower != 0) { info += "S. Crit Power: " + SpellCritPower.ToString() + "\n"; } if (SpellReduction != 0) { info += "S. Reduction: " + SpellReduction.ToString() + "%\n"; } if (SpellReflection != 0) { info += "S. Reflection: " + SpellReflection.ToString() + "%\n"; } if (SpellAvoidance != 0) { info += "S. Avoidance: " + SpellAvoidance.ToString() + "%\n"; } if (BonusHealth != 0) { info += "Bonus Health: " + BonusHealth.ToString() + "\n"; } if (BonusMana != 0) { info += "Bonus Mana: " + BonusMana.ToString() + "\n"; } return(info); }
public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> retVal = new Dictionary <string, string>(); // if (baseStats == null) { baseStats = new StatsMoonkin(); } if (SelectedRotation == null) { SelectedRotation = new RotationData(); } if (BurstRotation == null) { BurstRotation = new RotationData(); } // retVal.Add("Health", baseStats.Health.ToString()); retVal.Add("Mana", baseStats.Mana.ToString()); retVal.Add("Armor", baseStats.Armor.ToString()); retVal.Add("Agility", baseStats.Agility.ToString()); retVal.Add("Stamina", baseStats.Stamina.ToString()); retVal.Add("Intellect", baseStats.Intellect.ToString()); retVal.Add("Spirit", baseStats.Spirit.ToString()); retVal.Add("Spell Power", SpellPower.ToString()); float totalHitDelta = SpellHitCap - SpellHit; retVal.Add("Spell Hit", String.Format("{0:F}%*{1} Hit Rating, {2:F}% Hit From Gear" + (totalHitDelta != 0 ? ", {3} Rating {4}" : ""), 100 * SpellHit, baseStats.HitRating, 100 * StatConversion.GetSpellHitFromRating(baseStats.HitRating), StatConversion.GetRatingFromHit(Math.Abs(totalHitDelta)), totalHitDelta > 0 ? "To Cap" : "Over Cap")); retVal.Add("Spell Crit", String.Format("{0:F}%*{1} Crit Rating, {2:F}% Crit From Gear, {3:F}% Crit From Intellect", 100 * SpellCrit, baseStats.CritRating, 100 * StatConversion.GetSpellCritFromRating(baseStats.CritRating), 100 * StatConversion.GetSpellCritFromIntellect(baseStats.Intellect))); retVal.Add("Spell Haste", String.Format("{0:F}%*{1} Haste Rating, {2:F}% Haste From Gear", 100 * SpellHaste, baseStats.HasteRating, 100 * StatConversion.GetSpellHasteFromRating(baseStats.HasteRating))); retVal.Add("Mastery", String.Format("{0:F}*{1:F} Eclipse %, {2} Rating", Mastery, Mastery * 2.0f, baseStats.MasteryRating)); retVal.Add("Mana Regen", String.Format("{0:F0}", ManaRegen * 5.0f)); retVal.Add("Total Score", String.Format("{0:F2}", OverallPoints)); retVal.Add("Selected Rotation", String.Format("*{0}", SelectedRotation.Name)); retVal.Add("Selected DPS", String.Format("{0:F2}", SelectedRotation.SustainedDPS)); retVal.Add("Selected Time To OOM", String.Format(SelectedRotation.TimeToOOM > new TimeSpan(0, 0, 0) ? "{0} m {1} s" : "Not during fight", SelectedRotation.TimeToOOM.Minutes, SelectedRotation.TimeToOOM.Seconds)); retVal.Add("Selected Cycle Length", String.Format("{0:F1} s", SelectedRotation.Duration)); StringBuilder sb = new StringBuilder("*"); float rotationDamage = SelectedRotation.SustainedDPS * SelectedRotation.Duration; sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Starfire", 100 * SelectedRotation.StarfireAvgHit * SelectedRotation.StarfireCount / rotationDamage, SelectedRotation.StarfireAvgHit * SelectedRotation.StarfireCount, SelectedRotation.StarfireCount)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Moonfire", 100 * (SelectedRotation.MoonfireAvgHit) * SelectedRotation.MoonfireCasts / rotationDamage, (SelectedRotation.MoonfireAvgHit) * SelectedRotation.MoonfireCasts, SelectedRotation.MoonfireCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Insect Swarm", 100 * SelectedRotation.InsectSwarmAvgHit * SelectedRotation.InsectSwarmCasts / rotationDamage, SelectedRotation.InsectSwarmAvgHit * (SelectedRotation.InsectSwarmCasts), SelectedRotation.InsectSwarmCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Wrath", 100 * SelectedRotation.WrathAvgHit * SelectedRotation.WrathCount / rotationDamage, SelectedRotation.WrathAvgHit * SelectedRotation.WrathCount, SelectedRotation.WrathCount)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Starsurge", 100 * SelectedRotation.StarSurgeAvgHit * SelectedRotation.StarSurgeCount / rotationDamage, SelectedRotation.StarSurgeAvgHit * SelectedRotation.StarSurgeCount, SelectedRotation.StarSurgeCount)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Starfall", 100 * SelectedRotation.StarfallDamage * SelectedRotation.StarfallCasts / rotationDamage, SelectedRotation.StarfallDamage * SelectedRotation.StarfallCasts, SelectedRotation.StarfallCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Wild Mushroom", 100 * SelectedRotation.MushroomDamage * SelectedRotation.MushroomCasts / rotationDamage, SelectedRotation.MushroomDamage * SelectedRotation.MushroomCasts, SelectedRotation.MushroomCasts)); retVal.Add("Selected Spell Breakdown", sb.ToString()); retVal.Add("Burst Rotation", String.Format("*{0}", BurstRotation.Name)); retVal.Add("Burst DPS", String.Format("{0:F2}", BurstRotation.BurstDPS)); retVal.Add("Burst Time To OOM", String.Format(BurstRotation.TimeToOOM > new TimeSpan(0, 0, 0) ? "{0} m {1} s" : "Not during fight", BurstRotation.TimeToOOM.Minutes, BurstRotation.TimeToOOM.Seconds)); retVal.Add("Burst Cycle Length", String.Format("{0:F1} s", BurstRotation.Duration)); sb = new StringBuilder("*"); rotationDamage = BurstRotation.BurstDPS * BurstRotation.Duration; sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Starfire", 100 * BurstRotation.StarfireAvgHit * BurstRotation.StarfireCount / rotationDamage, BurstRotation.StarfireAvgHit * BurstRotation.StarfireCount, BurstRotation.StarfireCount)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Moonfire", 100 * (BurstRotation.MoonfireAvgHit) * BurstRotation.MoonfireCasts / rotationDamage, (BurstRotation.MoonfireAvgHit) * BurstRotation.MoonfireCasts, BurstRotation.MoonfireCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Insect Swarm", 100 * BurstRotation.InsectSwarmAvgHit * BurstRotation.InsectSwarmCasts / rotationDamage, BurstRotation.InsectSwarmAvgHit * (BurstRotation.InsectSwarmCasts), BurstRotation.InsectSwarmCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Wrath", 100 * BurstRotation.WrathAvgHit * BurstRotation.WrathCount / rotationDamage, BurstRotation.WrathAvgHit * BurstRotation.WrathCount, BurstRotation.WrathCount)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Starsurge", 100 * BurstRotation.StarSurgeAvgHit * BurstRotation.StarSurgeCount / rotationDamage, BurstRotation.StarSurgeAvgHit * BurstRotation.StarSurgeCount, BurstRotation.StarSurgeCount)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Starfall", 100 * BurstRotation.StarfallDamage * BurstRotation.StarfallCasts / rotationDamage, BurstRotation.StarfallDamage * BurstRotation.StarfallCasts, BurstRotation.StarfallCasts)); sb.AppendLine(String.Format("{0}: {1:F2}%, {2:F2} damage, {3:F0} count", "Wild Mushroom", 100 * BurstRotation.MushroomDamage * BurstRotation.MushroomCasts / rotationDamage, BurstRotation.MushroomDamage * BurstRotation.MushroomCasts, BurstRotation.MushroomCasts)); retVal.Add("Burst Spell Breakdown", sb.ToString()); retVal.Add("Nature's Grace Uptime", String.Format("{0:F2}%", SelectedRotation.NaturesGraceUptime * 100)); retVal.Add("Solar Eclipse Uptime", String.Format("{0:F2}%", SelectedRotation.SolarUptime * 100)); retVal.Add("Lunar Eclipse Uptime", String.Format("{0:F2}%", SelectedRotation.LunarUptime * 100)); retVal.Add("Starfire", String.Format("{0:F2} dps*{1:F2} s avg\n {2:F2} avg hit\n{3:F0} avg energy", SelectedRotation.StarfireAvgHit / (SelectedRotation.StarfireAvgCast > 0 ? SelectedRotation.StarfireAvgCast : 1f), SelectedRotation.StarfireAvgCast, SelectedRotation.StarfireAvgHit, SelectedRotation.StarfireAvgEnergy)); retVal.Add("Wrath", String.Format("{0:F2} dps*{1:F2} s avg\n {2:F2} avg hit\n{3:F0} avg energy", SelectedRotation.WrathAvgHit / (SelectedRotation.WrathAvgCast > 0 ? SelectedRotation.WrathAvgCast : 1f), SelectedRotation.WrathAvgCast, SelectedRotation.WrathAvgHit, SelectedRotation.WrathAvgEnergy)); retVal.Add("Starsurge", String.Format("{0:F2} dps*{1:F2} s avg\n {2:F2} avg hit\n{3:F0} avg energy", SelectedRotation.StarSurgeAvgHit / (SelectedRotation.StarSurgeAvgCast > 0 ? SelectedRotation.StarSurgeAvgCast : 1f), SelectedRotation.StarSurgeAvgCast, SelectedRotation.StarSurgeAvgHit, SelectedRotation.StarSurgeAvgEnergy)); retVal.Add("Moonfire", String.Format("{0:F2} dps*{1:F2} s avg\n{2:F2} avg hit", SelectedRotation.MoonfireAvgHit / (SelectedRotation.MoonfireDuration > 0 ? SelectedRotation.MoonfireDuration : 1f), SelectedRotation.MoonfireAvgCast, SelectedRotation.MoonfireAvgHit)); retVal.Add("Insect Swarm", String.Format("{0:F2} dps*{1:F2} s avg\n{2:F2} avg hit", SelectedRotation.InsectSwarmAvgHit / (SelectedRotation.InsectSwarmDuration > 0 ? SelectedRotation.InsectSwarmDuration : 1f), SelectedRotation.InsectSwarmAvgCast, SelectedRotation.InsectSwarmAvgHit)); retVal.Add("Starfall", String.Format("{0:F2} dps*{1:F2} avg per cast\n{2:F2} avg per star", SelectedRotation.StarfallDamage / 10.0f, SelectedRotation.StarfallDamage, SelectedRotation.StarfallDamage / (SelectedRotation.StarfallStars > 0 ? SelectedRotation.StarfallStars : 1f))); retVal.Add("Treants", String.Format("{0:F2} dps*{1:F2} avg per cast\n{2:F2} avg per tree", SelectedRotation.TreantDamage / 30.0f, SelectedRotation.TreantDamage, SelectedRotation.TreantDamage / 3.0f)); retVal.Add("Wild Mushroom", String.Format("{0:F2} dps*{1:F2} avg per cast\n{2:F2} avg per mushroom", SelectedRotation.MushroomDamage / 10.0f, SelectedRotation.MushroomDamage, SelectedRotation.MushroomDamage / 3f)); return(retVal); }