public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> dictValues = new Dictionary <string, string>(); int armorCap = (int)Math.Ceiling((1402.5f * TargetLevel) - 66502.5f); float levelDifference = 0.2f * (TargetLevel - 70); dictValues.Add("Health", BasicStats.Health.ToString()); dictValues.Add("Armor", BasicStats.Armor.ToString()); dictValues.Add("Stamina", BasicStats.Stamina.ToString()); dictValues.Add("Agility", BasicStats.Agility.ToString()); dictValues.Add("Defense", Defense.ToString()); dictValues.Add("Miss", Miss.ToString() + "%"); dictValues.Add("Dodge", Dodge.ToString() + "%"); dictValues.Add("Parry", Parry.ToString() + "%"); dictValues.Add("Block", Block.ToString() + "%"); dictValues.Add("Block Value", BlockValue.ToString() + "%"); dictValues.Add("Avoidance", Avoidance.ToString() + "%"); dictValues.Add("Mitigation", Mitigation.ToString()); dictValues.Add("Spell Damage", _basicStats.SpellDamageRating.ToString()); dictValues.Add("Total Mitigation", TotalMitigation.ToString() + "%"); if (CritAvoidance == (5f + levelDifference)) { dictValues.Add("Chance to be Crit", ((5f + levelDifference) - CritAvoidance).ToString() + "%*Exactly enough defense rating/resilience to be uncrittable by bosses."); } else if (CritAvoidance < (5f + levelDifference)) { dictValues.Add("Chance to be Crit", ((5f + levelDifference) - CritAvoidance).ToString() + string.Format("%*CRITTABLE! Short by {0} defense rating or {1} resilience to be uncrittable by bosses.", Math.Ceiling(((5f + levelDifference) - CritAvoidance) * 60f), Math.Ceiling(((5f + levelDifference) - CritAvoidance) * 39.423f))); } else { dictValues.Add("Chance to be Crit", ((5f + levelDifference) - CritAvoidance).ToString() + string.Format("%*Uncrittable by bosses. {0} defense rating or {1} resilience over the crit cap.", Math.Floor(((5f + levelDifference) - CritAvoidance) * -60f), Math.Floor(((5f + levelDifference) - CritAvoidance) * -39.423f))); } dictValues.Add("Overall Points", OverallPoints.ToString()); dictValues.Add("Mitigation Points", MitigationPoints.ToString()); dictValues.Add("Survival Points", SurvivalPoints.ToString()); dictValues.Add("Overall", Math.Round(OverallTPS) + " tps"); dictValues.Add("Holy Shield", Math.Round(HolyShieldTPS) + " tps"); dictValues.Add("Seal of Right", Math.Round(SoRTPS) + " tps"); dictValues.Add("Judgement of Right", Math.Round(JoRTPS) + " tps"); dictValues.Add("Consecrate", Math.Round(ConsecrateTPS) + " tps"); dictValues.Add("Misc", Math.Round(MiscTPS) + " tps"); return(dictValues); }
public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> dictValues = new Dictionary <string, string>(); int levelDifference = TargetLevel - CharacterLevel; float baseMiss = StatConversion.WHITE_MISS_CHANCE_CAP[levelDifference] - BasicStats.PhysicalHit; float baseDodge = StatConversion.WHITE_DODGE_CHANCE_CAP[levelDifference] - StatConversion.GetDodgeParryReducFromExpertise(BasicStats.Expertise); float baseParry = StatConversion.WHITE_PARRY_CHANCE_CAP[levelDifference] - StatConversion.GetDodgeParryReducFromExpertise(BasicStats.Expertise); float capMiss = (float)Math.Ceiling(baseMiss * StatConversion.RATING_PER_PHYSICALHIT); float capDodge = (float)Math.Ceiling(baseDodge * 400f * StatConversion.RATING_PER_EXPERTISE); float capParry = (float)Math.Ceiling(baseParry * 400f * StatConversion.RATING_PER_EXPERTISE); string tipMiss = string.Empty; if (BasicStats.HitRating > capMiss) { tipMiss = string.Format("*Over the cap by {0} Hit Rating", BasicStats.HitRating - capMiss); } else if (BasicStats.HitRating < capMiss) { tipMiss = string.Format("*Under the cap by {0} Hit Rating", capMiss - BasicStats.HitRating); } else { tipMiss = "*Exactly at the cap"; } string tipDodgeParry = string.Empty; if (BasicStats.ExpertiseRating > capDodge) { tipDodgeParry = string.Format("*Over the dodge cap by {0} Expertise Rating\r\n", BasicStats.ExpertiseRating - capDodge); } else if (BasicStats.ExpertiseRating < capDodge) { tipDodgeParry = string.Format("*Under the dodge cap by {0} Expertise Rating\r\n", capDodge - BasicStats.ExpertiseRating); } else { tipDodgeParry = "*Exactly at the dodge cap"; } if (BasicStats.ExpertiseRating > capParry) { tipDodgeParry += string.Format("Over the parry cap by {0} Expertise Rating", BasicStats.ExpertiseRating - capParry); } else if (BasicStats.ExpertiseRating < capParry) { tipDodgeParry += string.Format("Under the parry cap by {0} Expertise Rating", capParry - BasicStats.ExpertiseRating); } else { tipDodgeParry += "Exactly at the parry cap"; } int armorCap = (int)Math.Ceiling(6502.5f * TargetLevel - 474502.5f); float levelDifferenceAvoidance = 0.002f * levelDifference; float targetCritReduction = StatConversion.NPC_LEVEL_CRIT_MOD[levelDifference]; /*int defToCap = 0, resToCap = 0; * if (CritReduction < targetCritReduction) * { * //while (((float)Math.Floor((BasicStats.DefenseRating + defToCap) / (123f / 52f)) * 0.04f) * //+ BasicStats.Resilience / (2050f / 52f) + BasicStats.CritChanceReduction < targetCritReduction) * // defToCap++; * //while (((float)Math.Floor(BasicStats.DefenseRating / (123f / 52f)) * 0.04f) * //+ (BasicStats.Resilience + resToCap) / (2050f / 52f) + BasicStats.CritChanceReduction < targetCritReduction) * // resToCap++; * while (((float)Math.Floor(StatConversion.GetDefenseFromRating(BasicStats.DefenseRating + defToCap)) * 0.0004f) + StatConversion.GetCritReductionFromResilience(BasicStats.Resilience) + BasicStats.CritChanceReduction < targetCritReduction) + defToCap++; + while (((float)Math.Floor(StatConversion.GetDefenseFromRating(BasicStats.DefenseRating)) * 0.0004f) + StatConversion.GetCritReductionFromResilience(BasicStats.Resilience + resToCap) + BasicStats.CritChanceReduction < targetCritReduction) + resToCap++; + } + else if (CritReduction > targetCritReduction) + { + //while (((float)Math.Floor((BasicStats.DefenseRating + defToCap) / (123f / 52f)) * 0.04f) + //+ BasicStats.Resilience / (2050f / 52f) + BasicStats.CritChanceReduction > targetCritReduction) + // defToCap--; + //while (((float)Math.Floor(BasicStats.DefenseRating / (123f / 52f)) * 0.04f) + //+ (BasicStats.Resilience + resToCap) / (2050f / 52f) + BasicStats.CritChanceReduction > targetCritReduction) + // resToCap--; + + while (((float)Math.Floor(StatConversion.GetDefenseFromRating(BasicStats.DefenseRating + defToCap)) * 0.0004f) + StatConversion.GetCritReductionFromResilience(BasicStats.Resilience) + BasicStats.CritChanceReduction > targetCritReduction) + defToCap--; + while (((float)Math.Floor(StatConversion.GetDefenseFromRating(BasicStats.DefenseRating)) * 0.0004f) + StatConversion.GetCritReductionFromResilience(BasicStats.Resilience + resToCap) + BasicStats.CritChanceReduction > targetCritReduction) + resToCap--; + defToCap++; + resToCap++; + }*/ // Changed to not just give a resist rating, but a breakdown of the resulting resist values in the tooltip string tipResist = string.Empty; tipResist = StatConversion.GetResistanceTableString(TargetLevel, CharacterLevel, BasicStats.NatureResistance, 0); dictValues.Add("Nature Resist", BasicStats.NatureResistance.ToString() + "*" + tipResist); tipResist = StatConversion.GetResistanceTableString(TargetLevel, CharacterLevel, BasicStats.ArcaneResistance, 0); dictValues.Add("Arcane Resist", BasicStats.ArcaneResistance.ToString() + "*" + tipResist); tipResist = StatConversion.GetResistanceTableString(TargetLevel, CharacterLevel, BasicStats.FrostResistance, 0); dictValues.Add("Frost Resist", BasicStats.FrostResistance.ToString() + "*" + tipResist); tipResist = StatConversion.GetResistanceTableString(TargetLevel, CharacterLevel, BasicStats.FireResistance, 0); dictValues.Add("Fire Resist", BasicStats.FireResistance.ToString() + "*" + tipResist); tipResist = StatConversion.GetResistanceTableString(TargetLevel, CharacterLevel, BasicStats.ShadowResistance, 0); dictValues.Add("Shadow Resist", BasicStats.ShadowResistance.ToString() + "*" + tipResist); dictValues.Add("Health", BasicStats.Health.ToString()); dictValues.Add("Agility", BasicStats.Agility.ToString()); dictValues.Add("Armor", BasicStats.Armor.ToString()); dictValues.Add("Stamina", BasicStats.Stamina.ToString()); dictValues.Add("Dodge Rating", BasicStats.DodgeRating.ToString()); dictValues.Add("Mastery", string.Format("{0}*{1} Mastery Rating", StatConversion.GetMasteryFromRating(BasicStats.MasteryRating) + 8f, BasicStats.MasteryRating.ToString())); dictValues.Add("Resilience", BasicStats.Resilience.ToString()); dictValues.Add("Dodge", Dodge.ToString("0.000%")); dictValues.Add("Miss", Miss.ToString("0.000%")); if (BasicStats.Armor == armorCap) { dictValues.Add("Armor Damage Reduction", DamageReductionFromArmor.ToString("0.000%") + string.Format("*Exactly at the armor cap against level {0} mobs.", TargetLevel)); } else if (BasicStats.Armor > armorCap) { dictValues.Add("Armor Damage Reduction", DamageReductionFromArmor.ToString("0.000%") + string.Format("*Over the armor cap by {0} armor.", BasicStats.Armor - armorCap)); } else { dictValues.Add("Armor Damage Reduction", DamageReductionFromArmor.ToString("0.000%") + string.Format("*Short of the armor cap by {0} armor.", armorCap - BasicStats.Armor)); } dictValues.Add("Total Damage Reduction", TotalConstantDamageReduction.ToString("0.000%")); dictValues.Add("Avoidance PreDR", AvoidancePreDR.ToString("0.000%")); dictValues.Add("Avoidance PostDR", AvoidancePostDR.ToString("0.000%")); dictValues.Add("Total Mitigation", TotalMitigation.ToString("0.000%")); dictValues.Add("Damage Taken", DamageTaken.ToString("0.000%")); dictValues.Add("Savage Defense", string.Format( "{0} ~ {1}*{0} chance to absorb incoming hit\r\n{1} absorbed per hit\r\n{2} of incoming damage absorbed", SavageDefenseChance.ToString("0.000%"), SavageDefenseValue, SavageDefensePercent.ToString("0.000%"))); dictValues.Add("Chance to be Crit", ((0.05f + levelDifferenceAvoidance) - CritReduction).ToString("0.000%")); dictValues.Add("Overall Points", OverallPoints.ToString()); dictValues.Add("Mitigation Points", MitigationPoints.ToString()); dictValues.Add("Survival Points", string.Format("{0}*{1} Before Soft Cap", SurvivabilityPoints.ToString(), SurvivalPointsRaw.ToString())); dictValues.Add("Threat Points", ThreatPoints.ToString()); dictValues["Nature Survival"] = NatureSurvivalPoints.ToString(); dictValues["Frost Survival"] = FrostSurvivalPoints.ToString(); dictValues["Fire Survival"] = FireSurvivalPoints.ToString(); dictValues["Shadow Survival"] = ShadowSurvivalPoints.ToString(); dictValues["Arcane Survival"] = ArcaneSurvivalPoints.ToString(); dictValues["Strength"] = BasicStats.Strength.ToString(); dictValues["Attack Power"] = string.Format("{0}*{1} with Vengeance", (BasicStats.AttackPower - AverageVengeanceAP), BasicStats.AttackPower); dictValues["Average Vengeance AP"] = AverageVengeanceAP.ToString("N1"); dictValues["Crit Rating"] = BasicStats.CritRating.ToString(); dictValues["Hit Rating"] = BasicStats.HitRating.ToString() + tipMiss; dictValues["Expertise Rating"] = BasicStats.ExpertiseRating.ToString() + tipDodgeParry; dictValues["Haste Rating"] = string.Format("{0}*{1}sec Attack Speed", BasicStats.HasteRating, AttackSpeed.ToString("0.000")); //dictValues["Armor Penetration Rating"] = BasicStats.ArmorPenetrationRating.ToString(); dictValues["Avoided Attacks"] = String.Format("{0}*{1} Missed\r\n{2} Dodged\r\n{3} Parried", AvoidedAttacks.ToString("0.000%"), MissedAttacks.ToString("0.000%"), DodgedAttacks.ToString("0.000%"), ParriedAttacks.ToString("0.000%")); dictValues["Highest DPS Rotation"] = HighestDPSRotation.Name; dictValues["Highest TPS Rotation"] = HighestTPSRotation.Name; dictValues["Swipe Rotation"] = ""; dictValues["Custom Rotation"] = ""; //string rotationFormat = "{0} DPS, {1} TPS*{2}"; //dictValues["Highest DPS Rotation"] = String.Format(rotationFormat, Math.Round(HighestDPSRotation.DPS), Math.Round(HighestDPSRotation.TPS), GetRotationTooltip(HighestDPSRotation.Name)); //dictValues["Highest TPS Rotation"] = String.Format(rotationFormat, Math.Round(HighestTPSRotation.DPS), Math.Round(HighestTPSRotation.TPS), GetRotationTooltip(HighestTPSRotation.Name)); //dictValues["Swipe Rotation"] = String.Format(rotationFormat, Math.Round(SwipeRotation.DPS), Math.Round(SwipeRotation.TPS), GetRotationTooltip(SwipeRotation.Name)); //dictValues["Custom Rotation"] = String.Format(rotationFormat, Math.Round(CustomRotation.DPS), Math.Round(CustomRotation.TPS), GetRotationTooltip(CustomRotation.Name)); dictValues["Melee"] = Abilities.MeleeStats.ToString(); dictValues["Maul"] = Abilities.MaulStats.ToString(); dictValues["Mangle"] = Abilities.MangleStats.ToString(); dictValues["Lacerate"] = Abilities.LacerateStats.ToString(); dictValues["Pulverize"] = Abilities.PulverizeStats.ToString(); dictValues["Swipe"] = Abilities.SwipeStats.ToString(); dictValues["Thrash"] = Abilities.ThrashStats.ToString(); dictValues["Faerie Fire"] = Abilities.FaerieFireStats.ToString(); dictValues["Thorns"] = Abilities.ThornsStats.ToString(); //string attackFormat = "{0} Dmg, {1} Threat*Per Hit: {0} Damage, {1} Threat\r\nPer Average Swing: {2} Damage, {3} Threat"; //string attackFormatWithRage = attackFormat + "\r\nThreat Per Rage: {4}\r\nDamage Per Rage: {5}"; //dictValues["Melee"] = String.Format(attackFormat, MeleeDamageRaw, MeleeThreatRaw, MeleeDamageAverage, MeleeThreatAverage); //dictValues["Maul"] = String.Format(attackFormatWithRage, MaulDamageRaw, MaulThreatRaw, MaulDamageAverage, MaulThreatAverage, MaulTPR, MaulDPR); //dictValues["Mangle"] = String.Format(attackFormatWithRage, MangleDamageRaw, MangleThreatRaw, MangleDamageAverage, MangleThreatAverage, MangleTPR, MangleDPR); //dictValues["Swipe"] = String.Format(attackFormatWithRage, SwipeDamageRaw, SwipeThreatRaw, SwipeDamageAverage, SwipeThreatAverage, SwipeTPR, SwipeDPR); //dictValues["Faerie Fire"] = String.Format(attackFormat, FaerieFireDamageRaw, FaerieFireThreatRaw, FaerieFireDamageAverage, FaerieFireThreatAverage); //dictValues["Lacerate"] = String.Format(attackFormatWithRage, LacerateDamageRaw, LacerateThreatRaw, LacerateDamageAverage, LacerateThreatAverage, LacerateTPR, LacerateDPR); //dictValues["Lacerate DoT Tick"] = String.Format(attackFormat, LacerateDotDamageRaw, LacerateDotThreatRaw, LacerateDotDamageAverage, LacerateDotThreatAverage).Replace("Swing", "Tick"); return(dictValues); }
public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> dict = new Dictionary <string, string>(); dict["Miss"] = Miss.ToString("P2") + "*" + SEStats.Miss.ToString("P2") + " after special effects"; dict["Dodge"] = Dodge.ToString("P2") + " : " + BasicStats.DodgeRating.ToString("F0") + "*" + SEStats.DodgeRating.ToString("F0") + " Rating - " + SEStats.Dodge.ToString("P2") + " after special effects"; dict["Parry"] = Parry.ToString("P2") + " : " + BasicStats.ParryRating.ToString("F0") + "*" + SEStats.ParryRating.ToString("F0") + " Rating - " + SEStats.Parry.ToString("P2") + " after special effects"; dict["Armor Damage Reduction"] = ArmorDamageReduction.ToString("P2"); dict["Magic Damage Reduction"] = MagicDamageReduction.ToString("P2") + string.Format("*Arcane: {0:0}\r\n", BasicStats.ArcaneResistance) + string.Format("Fire: {0:0}\r\n", BasicStats.FireResistance) + string.Format("Frost: {0:0}\r\n", BasicStats.FrostResistance) + string.Format("Nature: {0:0}\r\n", BasicStats.NatureResistance) + string.Format("Shadow: {0:0}", BasicStats.ShadowResistance); dict["Total Avoidance"] = (Miss + Parry + Dodge).ToString("P2"); // Another duplicate math location. dict["Health"] = BasicStats.Health.ToString("F0") + "*" + SEStats.Health.ToString("F0") + " after special effects"; dict["Armor"] = BasicStats.Armor.ToString("F0") + "*" + SEStats.Armor.ToString("F0") + " after special effects"; dict["Strength"] = BasicStats.Strength.ToString("F0") + "*" + SEStats.Strength.ToString("F0") + " after special effects"; dict["Agility"] = BasicStats.Agility.ToString("F0") + "*" + SEStats.Agility.ToString("F0") + " after special effects"; dict["Stamina"] = BasicStats.Stamina.ToString("F0") + "*" + SEStats.Stamina.ToString("F0") + " after special effects"; dict["Hit Rating"] = BasicStats.HitRating.ToString("F0") + "*" + SEStats.HitRating.ToString("F0") + " after special effects"; dict["Haste Rating"] = BasicStats.HasteRating.ToString("F0") + "*" + SEStats.HasteRating.ToString("F0") + " after special effects"; dict["Crit Rating"] = BasicStats.CritRating.ToString("F0") + "*" + SEStats.CritRating.ToString("F0") + " after special effects"; dict["Physical Crit"] = BasicStats.PhysicalCrit.ToString("P2") + "*" + SEStats.PhysicalCrit.ToString("F0") + " after special effects"; dict["Expertise"] = Expertise.ToString("F0") + "*" + SEStats.Expertise.ToString("F0") + " after special effects"; dict["Attack Power"] = BasicStats.AttackPower.ToString("F0") + "*" + SEStats.AttackPower.ToString("F0") + " after special effects including Vengeance"; dict["Mastery"] = BasicStats.Mastery.ToString("F2") + String.Format(" ({0:0.00} %)*", (BasicStats.Mastery * 6.25f)) + BasicStats.MasteryRating.ToString("F0") + " Rating - " + SEStats.MasteryRating.ToString("F0") + " after special effects"; dict["DPS"] = DPS.ToString("F0") + "* At Max Vengeance"; dict["Rotation Time"] = String.Format("{0:0.00} sec", RotationTime); dict["Total Threat"] = TotalThreat.ToString("F0"); #region Ability Costs dict["Blood"] = Blood.ToString("F0"); dict["Frost"] = Frost.ToString("F0"); dict["Unholy"] = Unholy.ToString("F0"); dict["Death"] = Death.ToString("F0"); dict["Runic Power"] = RP.ToString("F0"); dict["RE Runes"] = FreeRERunes.ToString("F0"); #endregion dict["Overall Points"] = OverallPoints.ToString("F1"); dict["Mitigation Points"] = String.Format("{0:0.0}*" + "{1:000000.0} Crit Mitigation" + "\r\n{2:000000.0} Avoidance Mitigation" + "\r\n{3:000000.0} Armor Mitigation" + "\r\n{4:000000.0} Damage Taken Mitigation" + "\r\n{5:000000.0} Impedence Mitigation" + "\r\n{6:000000.0} Health Restoration Mitigation", Mitigation, CritMitigation, AvoidanceMitigation, ArmorMitigation, DamageTakenMitigation, ImpedenceMitigation, HealsMitigation); dict["Survival Points"] = String.Format("{0:0.0}*" + "{1:000000.0} Physical Survival" + "\r\n{2:000000.0} Bleed Survival" + "\r\n{3:000000.0} Magic Survival", Survivability, PhysicalSurvival, BleedSurvival, MagicSurvival); dict["Burst Points"] = String.Format("{0:0.0}", Burst * BurstWeight); // Modified Burst dict["Recovery Points"] = String.Format("{0:0.0}", Recovery * RecoveryWeight); // Modified Burst dict["Threat Points"] = String.Format("{0:0.0}", Threat * ThreatWeight); // Modified Threat dict["Target Miss"] = (TargetMiss).ToString("P1"); dict["Target Dodge"] = (TargetDodge).ToString("P1"); dict["Target Parry"] = (TargetParry).ToString("P1"); dict["DTPS"] = DTPS.ToString("F2"); dict["HPS"] = HPS.ToString("F2"); dict["DPS Avoided"] = AvoidanceMitigation.ToString("F0"); dict["DPS Reduced By Armor"] = ArmorMitigation.ToString("F0"); dict["Death Strike"] = TotalDShealed.ToString("F0") + "*" + DSCount.ToString("F0") + " Death Strikes Healing for " + DSHeal.ToString("F0") + " avg " + DSOverHeal.ToString("F0") + " avg Overheal"; dict["Blood Shield"] = TotalBShield.ToString("F0") + "*" + BShield.ToString("F0") + " average shield size"; return(dict); }
public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> dictValues = new Dictionary <string, string>(); int armorCap = (int)Math.Ceiling((1402.5f * TargetLevel) - 66502.5f); float levelDifference = 0.2f * (TargetLevel - 70); float targetCritReduction = 5f + levelDifference; float currentCritReduction = ((float)Math.Floor( (BasicStats.DefenseRating * WarriorConversions.DefenseRatingToDefense + BasicStats.Defense)) * WarriorConversions.DefenseToCritReduction) + (BasicStats.Resilience * WarriorConversions.ResilienceRatingToCritReduction); int defToCap = 0, resToCap = 0; if (currentCritReduction < targetCritReduction) { while ((((float)Math.Floor( ((BasicStats.DefenseRating + defToCap) * WarriorConversions.DefenseRatingToDefense + BasicStats.Defense)) * WarriorConversions.DefenseToCritReduction) + (BasicStats.Resilience * WarriorConversions.ResilienceRatingToCritReduction)) < targetCritReduction) { defToCap++; } while ((((float)Math.Floor( (BasicStats.DefenseRating * WarriorConversions.DefenseRatingToDefense + BasicStats.Defense)) * WarriorConversions.DefenseToCritReduction) + ((BasicStats.Resilience + resToCap) * WarriorConversions.ResilienceRatingToCritReduction)) < targetCritReduction) { resToCap++; } } else if (currentCritReduction > targetCritReduction) { while ((((float)Math.Floor( ((BasicStats.DefenseRating + defToCap) * WarriorConversions.DefenseRatingToDefense + BasicStats.Defense)) * WarriorConversions.DefenseToCritReduction) + (BasicStats.Resilience * WarriorConversions.ResilienceRatingToCritReduction)) > targetCritReduction) { defToCap--; } while ((((float)Math.Floor( (BasicStats.DefenseRating * WarriorConversions.DefenseRatingToDefense + BasicStats.Defense)) * WarriorConversions.DefenseToCritReduction) + ((BasicStats.Resilience + resToCap) * WarriorConversions.ResilienceRatingToCritReduction)) > targetCritReduction) { resToCap--; } defToCap++; resToCap++; } dictValues.Add("Health", BasicStats.Health.ToString()); dictValues.Add("Strength", BasicStats.Strength.ToString()); dictValues.Add("Agility", BasicStats.Agility.ToString()); dictValues.Add("Stamina", BasicStats.Stamina.ToString()); dictValues.Add("Armor", BasicStats.Armor.ToString()); dictValues.Add("Defense", Defense.ToString() + string.Format("*Defense Rating {0}", BasicStats.DefenseRating)); dictValues.Add("Dodge", Dodge.ToString() + string.Format("%*Dodge Rating {0}", BasicStats.DodgeRating)); dictValues.Add("Parry", Parry.ToString() + string.Format("%*Parry Rating {0}", BasicStats.ParryRating)); if (BlockOverCap > 0f) { dictValues.Add("Block", (Block + BlockOverCap).ToString() + string.Format("%*Block Rating {0}. Over the crush cap by {1}% block", BasicStats.BlockRating, BlockOverCap)); } else { dictValues.Add("Block", Block.ToString() + string.Format("%*Block Rating {0}", BasicStats.BlockRating)); } dictValues.Add("Miss", Miss.ToString() + "%"); dictValues.Add("Resilience", BasicStats.Resilience.ToString() + string.Format(@"*Reduces periodic damage and chance to be critically hit by {0}%. Reduces the effect of mana-drains and the damage of critical strikes by {1}%.", BasicStats.Resilience * WarriorConversions.ResilienceRatingToCritReduction, BasicStats.Resilience * WarriorConversions.ResilienceRatingToCritReduction * 2)); dictValues.Add("Block Value", BlockValue.ToString()); #region Offensive Stats dictValues["Attack Power"] = BasicStats.AttackPower.ToString(); dictValues["Hit"] = (BasicStats.HitRating * WarriorConversions.HitRatingToHit + BasicStats.Hit).ToString() + string.Format("%*Hit Rating {0}", BasicStats.HitRating); dictValues["Expertise"] = (Math.Round(BasicStats.ExpertiseRating * WarriorConversions.ExpertiseRatingToExpertise + BasicStats.Expertise)).ToString() + string.Format(@"*Expertise Rating {0} Reduces chance to be dodged or parried by {1}%.", BasicStats.ExpertiseRating, Math.Round((BasicStats.ExpertiseRating * WarriorConversions.ExpertiseRatingToExpertise + BasicStats.Expertise) * WarriorConversions.ExpertiseToDodgeParryReduction)); dictValues["Haste"] = (BasicStats.HasteRating * WarriorConversions.HasteRatingToHaste).ToString() + string.Format("%*Haste Rating {0}", BasicStats.HasteRating); dictValues["Armor Penetration"] = BasicStats.ArmorPenetration.ToString(); dictValues["Crit"] = Crit.ToString() + string.Format("%*Crit Rating {0}", BasicStats.CritRating); dictValues["Weapon Damage"] = BasicStats.WeaponDamage.ToString(); dictValues.Add("Missed Attacks", AvoidedAttacks.ToString() + string.Format(@"%*Out of 100 attacks: Attacks Missed: {0}% Attacks Dodged: {1}% Attacks Parried: {2}%", MissedAttacks, DodgedAttacks, ParriedAttacks)); dictValues.Add("Limited Threat", (LimitedThreat / ThreatScale).ToString() + string.Format(@"*White TPS: {0} Shield Slam TPS: {1} Revenge TPS: {2} Devastate TPS: {3} Windfury TPS: {4}", WhiteThreat, ShieldSlamThreat, RevengeThreat, DevastateThreat, WindfuryThreat)); dictValues.Add("Unlimited Threat", (UnlimitedThreat / ThreatScale).ToString() + string.Format(@"*Heroic Strike TPS: {0} Shield Slam TPS: {1} Revenge TPS: {2} Devastate TPS: {3} Windfury TPS: {4}", HeroicStrikeThreat, ShieldSlamThreat, RevengeThreat, DevastateThreat, WindfuryThreat)); #endregion dictValues["Nature Resist"] = (BasicStats.NatureResistance + BasicStats.AllResist).ToString(); dictValues["Arcane Resist"] = (BasicStats.ArcaneResistance + BasicStats.AllResist).ToString(); dictValues["Frost Resist"] = (BasicStats.FrostResistance + BasicStats.AllResist).ToString(); dictValues["Fire Resist"] = (BasicStats.FireResistance + BasicStats.AllResist).ToString(); dictValues["Shadow Resist"] = (BasicStats.ShadowResistance + BasicStats.AllResist).ToString(); if (BasicStats.Armor == armorCap) { dictValues.Add("Mitigation", Mitigation.ToString() + string.Format("%*Exactly at the armor cap against level {0} mobs.", TargetLevel)); } else if (BasicStats.Armor > armorCap) { dictValues.Add("Mitigation", Mitigation.ToString() + string.Format("%*Over the armor cap by {0} armor.", BasicStats.Armor - armorCap)); } else { dictValues.Add("Mitigation", Mitigation.ToString() + string.Format("%*Short of the armor cap by {0} armor.", armorCap - BasicStats.Armor)); } dictValues.Add("Avoidance", DodgePlusMissPlusParry.ToString() + "%"); dictValues.Add("Avoidance + Block", DodgePlusMissPlusParryPlusBlock.ToString() + "%"); dictValues.Add("Total Mitigation", TotalMitigation.ToString() + "%"); dictValues.Add("Damage Taken", DamageTaken.ToString() + "%"); if (defToCap == 0 && resToCap == 0) { dictValues.Add("Chance to be Crit", ((5f + levelDifference) - CritReduction).ToString() + "%*Exactly enough defense rating/resilience to be uncrittable by bosses."); } else if (defToCap + resToCap > 0) { dictValues.Add("Chance to be Crit", ((5f + levelDifference) - CritReduction).ToString() + string.Format("%*CRITTABLE! Short by {0} defense rating ({1} defense) or {2} resilience to be uncrittable by bosses.", defToCap, defToCap * WarriorConversions.DefenseRatingToDefense, resToCap)); } else { dictValues.Add("Chance to be Crit", ((5f + levelDifference) - CritReduction).ToString() + string.Format("%*Uncrittable by bosses. {0} defense rating ({1} defense) or {2} resilience over the crit cap.", -defToCap, -defToCap * WarriorConversions.DefenseRatingToDefense, -resToCap)); } dictValues.Add("Chance Crushed", CrushChance.ToString() + "%"); dictValues.Add("Overall Points", OverallPoints.ToString()); dictValues.Add("Mitigation Points", MitigationPoints.ToString()); dictValues.Add("Survival Points", SurvivalPoints.ToString()); dictValues.Add("Threat Points", ThreatPoints.ToString()); dictValues["Nature Survival"] = NatureSurvivalPoints.ToString(); dictValues["Frost Survival"] = FrostSurvivalPoints.ToString(); dictValues["Fire Survival"] = FireSurvivalPoints.ToString(); dictValues["Shadow Survival"] = ShadowSurvivalPoints.ToString(); dictValues["Arcane Survival"] = ArcaneSurvivalPoints.ToString(); return(dictValues); }
public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> dict = new Dictionary <string, string>(); dict["Miss"] = Miss.ToString("F2") + "%"; dict["Dodge"] = Dodge.ToString("F2") + "%"; dict["Parry"] = Parry.ToString("F2") + "%"; dict["Armor Damage Reduction"] = (ArmorDamageReduction * 100.0f).ToString("F2") + "%"; dict["Magic Damage Reduction"] = (MagicDamageReduction * 100.0f).ToString("F2") + "%" + string.Format("*Arcane: {0:0}\n", BasicStats.ArcaneResistance) + string.Format("Fire: {0:0}\n", BasicStats.FireResistance) + string.Format("Frost: {0:0}\n", BasicStats.FrostResistance) + string.Format("Nature: {0:0}\n", BasicStats.NatureResistance) + string.Format("Shadow: {0:0}", BasicStats.ShadowResistance); dict["Total Avoidance"] = (Miss + Parry + Dodge).ToString("F2") + "%"; // Another duplicate math location. dict["Burst Time"] = String.Format("{0:0.0} sec", BurstTime); dict["Reaction Time"] = String.Format("{0:0.0} sec", ReactionTime); dict["Health"] = BasicStats.Health.ToString("F0"); dict["Armor"] = BasicStats.Armor.ToString("F0"); dict["Strength"] = BasicStats.Strength.ToString("F0"); dict["Agility"] = BasicStats.Agility.ToString("F0"); dict["Stamina"] = BasicStats.Stamina.ToString("F0"); dict["Hit Rating"] = BasicStats.HitRating.ToString("F0"); dict["Haste Rating"] = BasicStats.HasteRating.ToString("F0"); dict["Crit Rating"] = BasicStats.CritRating.ToString("F0"); dict["Physical Crit"] = (BasicStats.PhysicalCrit * 100f).ToString("F2"); dict["Expertise"] = Expertise.ToString("F0"); dict["Attack Power"] = BasicStats.AttackPower.ToString("F0"); dict["Armor Penetration"] = (BasicStats.ArmorPenetration * 100f).ToString("F2") + "%"; dict["Armor Penetration Rating"] = BasicStats.ArmorPenetrationRating.ToString("F0"); dict["DPS"] = DPS.ToString("F0"); dict["Rotation Time"] = String.Format("{0:0.00} sec", (RotationTime / 1000)); dict["Total Threat"] = TotalThreat.ToString("F0"); #region Rune Strike Limit dict["RS Limited"] = ""; if (RSLimit == (int)RSState.Good) { dict["RS Limited"] = "none"; } else { if (1 == (RSLimit & (int)RSState.TimeStarved)) { dict["RS Limited"] += "Swing Starved "; } if (1 == (RSLimit & (int)RSState.RPStarved)) { dict["RS Limited"] += "RP Starved "; } } #endregion #region Ability Costs dict["Blood"] = Blood.ToString("F0"); dict["Frost"] = Frost.ToString("F0"); dict["Unholy"] = Unholy.ToString("F0"); dict["Death"] = Death.ToString("F0"); dict["Runic Power"] = RP.ToString("F0"); #endregion dict["Overall Points"] = OverallPoints.ToString("F1"); dict["Mitigation Points"] = String.Format("{0:0.0}", (Mitigation * MitigationWeight)); // Modified Mitigation. dict["Survival Points"] = String.Format("{0:0.0}", (Survival * SurvivalWeight)) + string.Format("*Physical:{0:0.0}\n", (PhysicalSurvival * SurvivalWeight)) + string.Format("Bleed:{0:0.0}\n", (BleedSurvival * SurvivalWeight)) + string.Format("Magic:{0:0.0}", (MagicSurvival * SurvivalWeight)); // Modified Survival dict["Threat Points"] = String.Format("{0:0.0}", (Threat * ThreatWeight)); // Modified Threat dict["Crit"] = Crit.ToString("F2"); dict["Defense"] = Defense.ToString("F0"); dict["Resilience"] = Resilience.ToString("F0"); dict["Defense Rating"] = DefenseRating.ToString("F0"); dict["Defense Rating needed"] = DefenseRatingNeeded.ToString("F0"); dict["Target Miss"] = (TargetMiss * 100.0f).ToString("F1") + "%"; dict["Target Dodge"] = (TargetDodge * 100.0f).ToString("F1") + "%"; dict["Target Parry"] = (TargetParry * 100.0f).ToString("F1") + "%"; return(dict); }