public static float GetEffectiveTargetArmor(int AttackerLevel, float TargetArmor, float ArmorIgnoreDebuffs, float ArmorIgnoreBuffs, float ArmorPenetrationRating) { float ArmorConstant = 400 + 85 * AttackerLevel + 4.5f * 85 * (AttackerLevel - 59); TargetArmor *= (1f - ArmorIgnoreDebuffs) * (1f - ArmorIgnoreBuffs); float ArPCap = Math.Min((TargetArmor + ArmorConstant) / 3f, TargetArmor); float Amount = StatConversion.GetArmorPenetrationFromRating(ArmorPenetrationRating); TargetArmor -= ArPCap * Math.Min(1.0f, Amount); return(TargetArmor); }
public static float BonusArmorPenetrationPercentage(Character character, Stats stats) { return(StatConversion.GetArmorPenetrationFromRating(stats.ArmorPenetrationRating, CharacterClass.Warrior)); //return ((stats.ArmorPenetrationRating * ProtWarr.ArPToArmorPenetration) / 100.0f); }
public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> dictValues = new Dictionary <string, string>(); string format = ""; int LevelDif = combatFactors.levelDif; // Base Stats dictValues.Add("Health and Stamina", string.Format("{0:##,##0} : {1:##,##0}*" + "{2:00,000} : Base Health" + "\r\n{3:00,000} : Stam Bonus", AverageStats.Health, AverageStats.Stamina, BaseHealth, StatConversion.GetHealthFromStamina(AverageStats.Stamina))); dictValues.Add("Armor", string.Format("{0}*Increases Attack Power by {1}", Armor, TeethBonus)); #region Strength { int formIter = 1; string theFormat = ""; float[] passiveContrsVals = new float[] { combatFactors.Char.WarriorTalents.StrengthOfArms * 0.02f, (combatFactors.FuryStance ? combatFactors.Char.WarriorTalents.ImprovedBerserkerStance * 0.04f : 0f), BuffsStats.Strength, BuffsStats.BonusStrengthMultiplier, }; string[] passiveContrs = new string[] { "Strength of Arms", "Improved Berserker Stance", "Buffs : Simple", "Buffs : Multi", }; theFormat += "{0:0.#}*"; // Averaged % and Averaged Rating theFormat += "The Pane shows Averaged Values"; theFormat += "\r\n"; theFormat += "\r\n= Your Passive Contributions ="; theFormat += "\r\n{" + formIter.ToString() + ":00.#%} : " + passiveContrs[0]; formIter++; theFormat += "\r\n{" + formIter.ToString() + ":00.#%} : " + passiveContrs[1]; formIter++; theFormat += "\r\n{" + formIter.ToString() + ":0.#} : " + passiveContrs[2]; formIter++; theFormat += "\r\n{" + formIter.ToString() + ":00.#%} : " + passiveContrs[3]; formIter++; theFormat += "\r\n"; theFormat += "\r\n= UnProc'd ="; theFormat += "\r\nValue: {" + formIter.ToString() + ":0.#}"; formIter++; theFormat += "\r\nIncreases Attack Power by {" + formIter.ToString() + ":0.#}"; formIter++; theFormat += "\r\n"; theFormat += "\r\n= Proc'd ="; theFormat += "\r\nValue: {" + formIter.ToString() + ":0.#}"; formIter++; theFormat += "\r\nIncreases Attack Power by {" + formIter.ToString() + ":0.#}"; formIter++; dictValues.Add("Strength", string.Format(theFormat, // Averaged Stats AverageStats.Strength, // Passive Contributions passiveContrsVals[0], passiveContrsVals[1], passiveContrsVals[2], passiveContrsVals[3], // UnProc'd Stats BuffedStats.Strength, BuffedStats.Strength * 2f, // Proc'd Stats MaximumStats.Strength, MaximumStats.Strength * 2f )); } #endregion dictValues.Add("Attack Power", string.Format("{0}*" + "Increases White DPS by {1:0.0}\r\n" + "\r\n" + "Buffed: {2:0}\r\n" + "Proc'd: {3:0}\r\n", (int)AverageStats.AttackPower, AverageStats.AttackPower / 14f, BuffedStats.AttackPower, MaximumStats.AttackPower)); #region Agility { int formIter = 1; string theFormat = ""; float[] passiveContrsVals = new float[] { BuffsStats.Agility, BuffsStats.BonusAgilityMultiplier, }; string[] passiveContrs = new string[] { "Buffs : Simple", "Buffs : Multi" }; theFormat += "{0:0.#}*"; // Averaged % and Averaged Rating theFormat += "The Pane shows Averaged Values"; theFormat += "\r\n"; theFormat += "\r\n= Your Passive Contributions ="; theFormat += "\r\n{" + formIter.ToString() + ":0.#} : " + passiveContrs[0]; formIter++; theFormat += "\r\n{" + formIter.ToString() + ":00.#%} : " + passiveContrs[1]; formIter++; theFormat += "\r\n"; theFormat += "\r\n= UnProc'd ="; theFormat += "\r\nIncreases Crit by {" + formIter.ToString() + ":0.#%}"; formIter++; theFormat += "\r\nIncreases Armor by {" + formIter.ToString() + ":0.#}"; formIter++; theFormat += "\r\n"; theFormat += "\r\n= Proc'd ="; theFormat += "\r\nIncreases Crit by {" + formIter.ToString() + ":0.#%}"; formIter++; theFormat += "\r\nIncreases Armor by {" + formIter.ToString() + ":0.#}"; formIter++; dictValues.Add("Agility", string.Format(theFormat, // Averaged Stats AverageStats.Agility, // Passive Contributions passiveContrsVals[0], passiveContrsVals[1], // UnProc'd Stats StatConversion.GetCritFromAgility(BuffedStats.Agility, CharacterClass.Warrior), StatConversion.GetArmorFromAgility(BuffedStats.Agility), // Proc'd Stats StatConversion.GetCritFromAgility(MaximumStats.Agility, CharacterClass.Warrior), StatConversion.GetArmorFromAgility(MaximumStats.Agility) )); } #endregion #region Crit { // sub to add neg number as pos, for overcapping to compensate // for boss level on yellows (or whites, I dont remember which) // Whites clip crit cap with glances, dodges, parries, misses float WhCritCap = 1f;// +StatConversion.NPC_LEVEL_CRIT_MOD[LevelDif]; //float YwCritCap = 1f + StatConversion.NPC_LEVEL_CRIT_MOD[LevelDif]; if (combatFactors.useOH) { WhCritCap -= (Whites.OHAtkTable.Glance + Whites.OHAtkTable.AnyNotLand); // YwCritCap -= (new AttackTable(combatFactors.Char, BuffedStats, combatFactors, combatFactors.CalcOpts, FW, false, false, false)).AnyNotLand; } else { WhCritCap -= (Whites.MHAtkTable.Glance + Whites.MHAtkTable.AnyNotLand); // Yellows clip crit cap with dodges, parries, misses // YwCritCap -= (new AttackTable(combatFactors.Char, BuffedStats, combatFactors, combatFactors.CalcOpts, FW, true, false, false)).AnyNotLand; } float useRamp = 0f; if (combatFactors.Char.WarriorTalents.Rampage > 0f) { useRamp = 0.05f; } float[] passiveContrsVals = new float[] { 0.03192f, AgilityCritBonus, StatConversion.GetCritFromRating(BuffedStats.CritRating + BuffedStats.DeathbringerProc), combatFactors.Char.WarriorTalents.Cruelty * 0.01f, (combatFactors.FuryStance ? 0.03f : 0f), (combatFactors.FuryStance ? AverageStats.BonusWarrior_T9_2P_Crit : 0f), BonusCritPercPoleAxeSpec, BuffsStats.PhysicalCrit + useRamp, }; float passiveContrsTtlVal = passiveContrsVals[0] + passiveContrsVals[1] + passiveContrsVals[2] + passiveContrsVals[3] + passiveContrsVals[4] + passiveContrsVals[5] + passiveContrsVals[6] + passiveContrsVals[7]; string[] passiveContrs = new string[] { "Base Crit", "From Agility", "From Crit Rating", "Cruelty", "Berserker Stance", "T9 2P Set Bonus", "Poleaxe Specialization", "Buffs" }; //float WhUnProcdCrit = StatConversion.GetCritFromRating(BuffedStats.CritRating + BuffedStats.DeathbringerProc); float WhProcdCrit = StatConversion.GetCritFromRating(MaximumStats.CritRating + MaximumStats.DeathbringerProc - BuffedStats.CritRating - BuffedStats.DeathbringerProc); bool isWhUnProcdOverCap = passiveContrsTtlVal > WhCritCap; bool isWhProcdOverCap = passiveContrsTtlVal + WhProcdCrit > WhCritCap; float amountWhUnProcdOverCap = Math.Abs(StatConversion.GetRatingFromCrit(WhCritCap - passiveContrsTtlVal)); float amountWhProcdOverCap = Math.Abs(StatConversion.GetRatingFromCrit(WhCritCap - (passiveContrsTtlVal + WhProcdCrit))); float YwUnProcdCrit = StatConversion.GetCritFromRating(BuffedStats.CritRating + BuffedStats.DeathbringerProc); float YwProcdCrit = StatConversion.GetCritFromRating(MaximumStats.CritRating + MaximumStats.DeathbringerProc); //bool isYwUnProcdOverCap = passiveContrsTtlVal + YwUnProcdCrit > YwCritCap; //bool isYwProcdOverCap = passiveContrsTtlVal + YwProcdCrit > YwCritCap; //float amountYwUnProcdOverCap = Math.Abs(StatConversion.GetRatingFromCrit(YwCritCap - (passiveContrsTtlVal + YwUnProcdCrit))); //float amountYwProcdOverCap = Math.Abs(StatConversion.GetRatingFromCrit(YwCritCap - (passiveContrsTtlVal + YwProcdCrit))); string theFormat = GenFormattedString(passiveContrs, true, isWhUnProcdOverCap, isWhProcdOverCap //isYwUnProcdOverCap, isYwProcdOverCap ); dictValues.Add("Crit", string.Format(theFormat, // Averaged Stats CritPercent, AverageStats.CritRating, // Passive Contributions passiveContrsVals[0], passiveContrsVals[1], passiveContrsVals[2], passiveContrsVals[3], passiveContrsVals[4], passiveContrsVals[5], passiveContrsVals[6], passiveContrsVals[7], // UnProc'd Stats BuffedStats.CritRating + BuffedStats.DeathbringerProc, Math.Min(WhCritCap, passiveContrsTtlVal), amountWhUnProcdOverCap, //Math.Min(YwCritCap, passiveContrsTtlVal + YwUnProcdCrit), amountYwUnProcdOverCap, // Proc'd Stats MaximumStats.CritRating + MaximumStats.DeathbringerProc, Math.Min(WhCritCap, passiveContrsTtlVal + WhProcdCrit), amountWhProcdOverCap //Math.Min(YwCritCap, passiveContrsTtlVal + YwProcdCrit), amountYwProcdOverCap )); } #endregion #region Armor Penetration { float ArPCap = 1.00f; float[] passiveContrsVals = new float[] { (!combatFactors.FuryStance ? 0.10f : 0f), (!combatFactors.FuryStance ? AverageStats.BonusWarrior_T9_2P_ArP : 0f), ArmorPenetrationMaceSpec }; float passiveContrsTtlVal = passiveContrsVals[0] + passiveContrsVals[1] + passiveContrsVals[2]; string[] passiveContrs = new string[] { "Battle Stance", "T9 2P Set Bonus", "Mace Specialization" }; float UnProcdArP = StatConversion.GetArmorPenetrationFromRating(BuffedStats.ArmorPenetrationRating); float ProcdArP = StatConversion.GetArmorPenetrationFromRating(MaximumStats.ArmorPenetrationRating); bool isUnProcdOverCap = passiveContrsTtlVal + UnProcdArP > ArPCap; bool isProcdOverCap = passiveContrsTtlVal + ProcdArP > ArPCap; float amountUnProcdOverCap = Math.Abs(StatConversion.GetRatingFromArmorPenetration(ArPCap - (passiveContrsTtlVal + UnProcdArP))); float amountProcdOverCap = Math.Abs(StatConversion.GetRatingFromArmorPenetration(ArPCap - (passiveContrsTtlVal + ProcdArP))); string theFormat = GenFormattedString(passiveContrs, true, isUnProcdOverCap, isProcdOverCap); dictValues.Add("Armor Penetration", string.Format(theFormat, // Averaged Stats ArmorPenetration, AverageStats.ArmorPenetrationRating, // Passive Contributions passiveContrsVals[0], passiveContrsVals[1], passiveContrsVals[2], // UnProc'd Stats BuffedStats.ArmorPenetrationRating, Math.Min(ArPCap, passiveContrsTtlVal + UnProcdArP), amountUnProcdOverCap, // Proc'd Stats MaximumStats.ArmorPenetrationRating, Math.Min(ArPCap, passiveContrsTtlVal + ProcdArP), amountProcdOverCap )); } #endregion #region Haste { // Haste has no cap? Shouldn't there be a 100% cap or something? // We should also state the before/after effects of haste on white swings // Maybe a good point to show how much swing time is lost to Slams too? float heroism = 0f; if (BuffsStats._rawSpecialEffectData != null) { foreach (SpecialEffect effect in BuffsStats._rawSpecialEffectData) { if (effect != null && effect.Stats.PhysicalHaste > 0) { heroism = effect.GetAverageStats().PhysicalHaste; } } } float[] passiveContrsVals = new float[] { combatFactors.Char.WarriorTalents.BloodFrenzy * 0.05f, BuffsStats.PhysicalHaste, heroism, }; float passiveContrsTtlVal = (1f + passiveContrsVals[0]) * (1f + passiveContrsVals[1]) * (1f + passiveContrsVals[2]) - 1f; string[] passiveContrs = new string[] { "Blood Frenzy", "Buffs", "Heroism (Averaged)" }; float UnProcdHaste = StatConversion.GetHasteFromRating(BuffedStats.HasteRating, CharacterClass.Warrior); float ProcdHaste = StatConversion.GetHasteFromRating(MaximumStats.HasteRating, CharacterClass.Warrior); string theFormat = GenFormattedString(passiveContrs); dictValues.Add("Haste", string.Format(theFormat, // Averaged Stats HastePercent, AverageStats.HasteRating, // Passive Contributions passiveContrsVals[0], passiveContrsVals[1], passiveContrsVals[2], // UnProc'd Stats BuffedStats.HasteRating, (1f + passiveContrsTtlVal) * (1f + UnProcdHaste) - 1f, // Proc'd Stats MaximumStats.HasteRating, (1f + passiveContrsTtlVal) * (1f + ProcdHaste) - 1f )); } #endregion #region Hit { // old float HitPercent = StatConversion.GetHitFromRating(HitRating); float HitPercBonus = AverageStats.PhysicalHit; // Hit Soft Cap ratings check, how far from it float capA1 = StatConversion.WHITE_MISS_CHANCE_CAP[LevelDif]; float convcapA1 = (float)Math.Ceiling(StatConversion.GetRatingFromHit(capA1)); float sec2lastNumA1 = (convcapA1 - StatConversion.GetRatingFromHit(HitPercent) - StatConversion.GetRatingFromHit(HitPercBonus)) * -1; //float lastNumA1 = StatConversion.GetRatingFromExpertise((convcapA1 - Math.Min(MhExpertise, (OhExpertise != 0 ? OhExpertise : MhExpertise))) * -1); // Hit Hard Cap ratings check, how far from it float capA2 = StatConversion.WHITE_MISS_CHANCE_CAP_DW[LevelDif]; float convcapA2 = (float)Math.Ceiling(StatConversion.GetRatingFromHit(capA2)); float sec2lastNumA2 = (convcapA2 - StatConversion.GetRatingFromHit(HitPercent) - StatConversion.GetRatingFromHit(HitPercBonus)) * -1; //float lastNumA2 = StatConversion.GetRatingFromExpertise((sec2lastNumA2 - Math.Min(MhExpertise, (OhExpertise != 0 ? OhExpertise : MhExpertise))) * -1); dictValues.Add("Hit", string.Format("{0:00.00%} : {1}*" + "{2:0.00%} : From Other Bonuses" + "\r\n{3:0.00%} : Total Hit % Bonus" + "\r\n\r\nWhite Two-Hander Cap: " + (sec2lastNumA1 > 0 ? "You can free {4:0} Rating" : "You need {4:0} more Rating") + "\r\nWhite Dual Wield Cap: " + (sec2lastNumA2 > 0 ? "You can free {5:0} Rating" : "You need {5:0} more Rating"), StatConversion.GetHitFromRating(AverageStats.HitRating), AverageStats.HitRating, HitPercBonus, HitPercent + HitPercBonus, (sec2lastNumA1 > 0 ? sec2lastNumA1 : sec2lastNumA1 * -1), (sec2lastNumA2 > 0 ? sec2lastNumA2 : sec2lastNumA2 * -1) )); } #endregion #region Expertise { // Dodge Cap ratings check, how far from it, uses lesser of MH and OH // Also factors in Weapon Mastery float capB1 = StatConversion.YELLOW_DODGE_CHANCE_CAP[LevelDif] - WeapMastPerc; float convcapB1 = (float)Math.Ceiling(StatConversion.GetExpertiseFromDodgeParryReduc(capB1)); float sec2lastNumB1 = (convcapB1 - Math.Min(MhExpertise, (OhExpertise != 0 ? OhExpertise : MhExpertise))) * -1; float lastNumB1 = StatConversion.GetRatingFromExpertise((convcapB1 - WeapMastPerc - Math.Min(MhExpertise, (OhExpertise != 0 ? OhExpertise : MhExpertise))) * -1); // Parry Cap ratings check, how far from it, uses lesser of MH and OH float capB2 = StatConversion.YELLOW_PARRY_CHANCE_CAP[LevelDif]; float convcapB2 = (float)Math.Ceiling(StatConversion.GetExpertiseFromDodgeParryReduc(capB2)); float sec2lastNumB2 = (convcapB2 - Math.Min(MhExpertise, (OhExpertise != 0 ? OhExpertise : MhExpertise))) * -1; float lastNumB2 = StatConversion.GetRatingFromExpertise((convcapB2 - Math.Min(MhExpertise, (OhExpertise != 0 ? OhExpertise : MhExpertise))) * -1); dictValues.Add("Expertise", string.Format("{0:00.00%} : {1:00.00} : {2}*" + "Following includes Racial bonus and Strength of Arms" + "\r\n{3:00.00%} Weapon Mastery (Dodge Only)" + "\r\n{4:00.00%} : {5:00.00} : MH" + "\r\n{6:00.00%} : {7:00.00} : OH" + "\r\n\r\n" + "Dodge Cap: " + (lastNumB1 > 0 ? "You can free {8:0} Expertise ({9:0} Rating)" : "You need {8:0} more Expertise ({9:0} Rating)") + "\r\n" + "Parry Cap: " + (lastNumB2 > 0 ? "You can free {10:0} Expertise ({11:0} Rating)" : "You need {10:0} more Expertise ({11:0} Rating)"), StatConversion.GetDodgeParryReducFromExpertise(Expertise), Expertise, AverageStats.ExpertiseRating, WeapMastPerc, StatConversion.GetDodgeParryReducFromExpertise(MhExpertise), MhExpertise, StatConversion.GetDodgeParryReducFromExpertise(OhExpertise), OhExpertise, (sec2lastNumB1 > 0 ? sec2lastNumB1 : sec2lastNumB1 * -1), (lastNumB1 > 0 ? lastNumB1 : lastNumB1 * -1), (sec2lastNumB2 > 0 ? sec2lastNumB2 : sec2lastNumB2 * -1), (lastNumB2 > 0 ? lastNumB2 : lastNumB2 * -1) )); } #endregion dictValues.Add("Description", string.Format("DPS : PerHit : #ActsD")); // DPS Abilities format = "{0:0000} : {1:00000} : {2:000.00}"; if (TotalDPS < 0f) { TotalDPS = 0f; } foreach (Rawr.DPSWarr.Rotation.AbilWrapper aw in Rot.GetAbilityList()) { if (!aw.ability.Name.Equals("Invalid")) { dictValues.Add(aw.ability.Name, string.Format(format, aw.allDPS, aw.ability.DamageOnUse, aw.allNumActivates) + aw.ability.GenTooltip(aw.allNumActivates, aw.allDPS / TotalDPS)); } } // DPS General dictValues.Add("White DPS", string.Format("{0:0000} : {1:00000}", WhiteDPS, WhiteDmg) + Whites.GenTooltip(WhiteDPSMH, WhiteDPSOH, TotalDPS)); dictValues.Add("Deep Wounds", string.Format("{0:0000}*{1:00.0%} of DPS", Rot.DW.TickSize, Rot.DW.TickSize / TotalDPS)); dictValues.Add("Special DMG Procs", string.Format("{0:0000}*{1:00.0%} of DPS", SpecProcDPS, SpecProcDPS / TotalDPS)); dictValues.Add("Total DPS", string.Format("{0:#,##0} : {1:#,###,##0}*" + Rot.GCDUsage, TotalDPS, TotalDPS * Duration)); // Rage format = "{0:0000}"; dictValues.Add("Total Generated Rage", string.Format("{0:00} = {1:0} + {2:0}", WhiteRage + OtherRage, WhiteRage, OtherRage)); dictValues.Add("Needed Rage for Abilities", string.Format(format, NeedyRage)); dictValues.Add("Available Free Rage", string.Format(format, FreeRage)); #if (!RAWR3 && DEBUG) dictValues.Add("Calculation Time", string.Format("{0}", calculationTime)); #endif return(dictValues); }
public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> dictValues = new Dictionary <string, string>(); dictValues.Add("Health", BasicStats.Health.ToString("F0", CultureInfo.InvariantCulture)); dictValues.Add("Mana", BasicStats.Mana.ToString("F0", CultureInfo.InvariantCulture)); dictValues.Add("Attack Power", BasicStats.AttackPower.ToString("F0", CultureInfo.InvariantCulture)); dictValues.Add("Agility", BasicStats.Agility.ToString("F0", CultureInfo.InvariantCulture)); dictValues.Add("Strength", BasicStats.Strength.ToString("F0", CultureInfo.InvariantCulture)); dictValues.Add("Intellect", BasicStats.Intellect.ToString("F0", CultureInfo.InvariantCulture)); dictValues.Add("White Hit", WhiteHit.ToString("F2", CultureInfo.InvariantCulture) + "%"); if (YellowHit < 100f && TotalExpertiseMH < 26) { float ratingRequired = (float)Math.Ceiling(4f * StatConversion.GetRatingFromExpertise(100f - YellowHit)); dictValues.Add("Yellow Hit", String.Format("{0}% (Under Cap)*You need {1} more expertise to cap specials (WF,SS)", YellowHit.ToString("F2", CultureInfo.InvariantCulture), ratingRequired.ToString("F0", CultureInfo.InvariantCulture))); } else { if (ParriedAttacks > 0) { float ratingRequired = (float)Math.Ceiling(4f * StatConversion.GetRatingFromExpertise(100f - YellowHit)); dictValues.Add("Yellow Hit", String.Format("{0}%*Being in front of boss allows your attacks to be parried\r\nYou would need {1} more expertise to cap specials (WF,SS)", YellowHit.ToString("F2", CultureInfo.InvariantCulture), ratingRequired.ToString("F0", CultureInfo.InvariantCulture))); } else { dictValues.Add("Yellow Hit", YellowHit.ToString("F2", CultureInfo.InvariantCulture) + "%"); } } if (OverSpellHitCap > 0.38f) // only warn if more than .38% over cap (equivalent to 10 hit rating) { dictValues.Add("Spell Hit", String.Format("{0}% (Over Cap)*Over Spell Hit Cap by {1}%", SpellHit.ToString("F2", CultureInfo.InvariantCulture), OverSpellHitCap.ToString("F2", CultureInfo.InvariantCulture))); } else { if (SpellHit < 100f) { float ratingRequired = (float)Math.Ceiling(StatConversion.GetRatingFromHit(1f - SpellHit / 100f)); dictValues.Add("Spell Hit", String.Format("{0}% (Under Cap)*You need {1} more hit rating to cap spells (ES, LB etc)", SpellHit.ToString("F2", CultureInfo.InvariantCulture), ratingRequired.ToString("F0", CultureInfo.InvariantCulture))); } else { dictValues.Add("Spell Hit", SpellHit.ToString("F2", CultureInfo.InvariantCulture) + "%"); } } if (OverMeleeCritCap > 0.21f) // only warn if more than .21% over cap (equivalent to 10 crit rating) { dictValues.Add("Melee Crit", String.Format("{0} (Over Cap)*Crit Rating {1} (+{2}% crit chance)\r\nOver Soft Cap by {3}%", MeleeCrit.ToString("F2", CultureInfo.InvariantCulture) + "%", BasicStats.CritRating.ToString("F0", CultureInfo.InvariantCulture), (StatConversion.GetCritFromRating(BasicStats.CritRating) * 100f).ToString("F2", CultureInfo.InvariantCulture), OverMeleeCritCap.ToString("F2", CultureInfo.InvariantCulture))); } else { dictValues.Add("Melee Crit", String.Format("{0}*Crit Rating {1} (+{2}% crit chance)", MeleeCrit.ToString("F2", CultureInfo.InvariantCulture) + "%", BasicStats.CritRating.ToString("F0", CultureInfo.InvariantCulture), (StatConversion.GetCritFromRating(BasicStats.CritRating) * 100f).ToString("F2", CultureInfo.InvariantCulture))); } dictValues.Add("Spell Crit", String.Format("{0}*Crit Rating {1} (+{2}% crit chance)", SpellCrit.ToString("F2", CultureInfo.InvariantCulture) + "%", BasicStats.CritRating.ToString("F0", CultureInfo.InvariantCulture), (StatConversion.GetSpellCritFromRating(BasicStats.CritRating) * 100f).ToString("F2", CultureInfo.InvariantCulture))); dictValues.Add("Spellpower", BasicStats.SpellPower.ToString("F0", CultureInfo.InvariantCulture)); dictValues.Add("Total Expertise", getExpertiseString()); dictValues.Add("Haste Rating", String.Format("{0}*{1}% Melee Haste\r\n{2}% Spell Haste", BasicStats.HasteRating.ToString("F0", CultureInfo.InvariantCulture), (StatConversion.GetHasteFromRating(BasicStats.HasteRating, CharacterClass.Shaman) * 100f).ToString("F2", CultureInfo.InvariantCulture), (StatConversion.GetSpellHasteFromRating(BasicStats.HasteRating, CharacterClass.Shaman) * 100f).ToString("F2", CultureInfo.InvariantCulture))); dictValues.Add("Hit Rating", String.Format("{0}*{1}% Melee Hit\r\n{2}% Spell Hit", BasicStats.HitRating.ToString("F0", CultureInfo.InvariantCulture), (StatConversion.GetHitFromRating(BasicStats.HitRating) * 100f).ToString("F2", CultureInfo.InvariantCulture), (StatConversion.GetSpellHitFromRating(BasicStats.HitRating) * 100f).ToString("F2", CultureInfo.InvariantCulture))); dictValues.Add("Armour Pen Rating", String.Format("{0}*{1}% Armour Penetration", BasicStats.ArmorPenetrationRating.ToString("F0", CultureInfo.InvariantCulture), (StatConversion.GetArmorPenetrationFromRating(BasicStats.ArmorPenetrationRating) * 100f).ToString("F2", CultureInfo.InvariantCulture))); float spellMiss = 100 - SpellHit; dictValues.Add("Avoided Attacks", String.Format("{0}%*{1}% Boss Dodged\r\n{2}% Boss Parried\r\n{3}% Spell Misses\r\n{4}% White Misses", AvoidedAttacks.ToString("F2", CultureInfo.InvariantCulture), DodgedAttacks.ToString("F2", CultureInfo.InvariantCulture), ParriedAttacks.ToString("F2", CultureInfo.InvariantCulture), spellMiss.ToString("F2", CultureInfo.InvariantCulture), MissedAttacks.ToString("F2", CultureInfo.InvariantCulture))); dictValues.Add("Avg MH Speed", AvMHSpeed.ToString("F2", CultureInfo.InvariantCulture)); dictValues.Add("Avg OH Speed", AvOHSpeed.ToString("F2", CultureInfo.InvariantCulture)); dictValues.Add("Armor Mitigation", ArmorMitigation.ToString("F2", CultureInfo.InvariantCulture) + "%*Amount of physical damage lost due to boss armor"); dictValues.Add("ED Uptime", String.Format("{0}%*{1}% ED Bonus Crit", EDUptime.ToString("F2", CultureInfo.InvariantCulture), EDBonusCrit.ToString("F2", CultureInfo.InvariantCulture))); dictValues.Add("Flurry Uptime", FlurryUptime.ToString("F2", CultureInfo.InvariantCulture) + "%"); dictValues.Add("Avg Time to 5 Stack", String.Format("{0} sec*{1} PPM", SecondsTo5Stack.ToString("F2", CultureInfo.InvariantCulture), _MWPPM.ToString("F2", CultureInfo.InvariantCulture))); dictValues.Add("MH Enchant Uptime", MHEnchantUptime.ToString("F2", CultureInfo.InvariantCulture) + "%"); dictValues.Add("OH Enchant Uptime", OHEnchantUptime.ToString("F2", CultureInfo.InvariantCulture) + "%"); dictValues.Add("Trinket 1 Uptime", Trinket1Uptime.ToString("F2", CultureInfo.InvariantCulture) + "%"); dictValues.Add("Trinket 2 Uptime", Trinket2Uptime.ToString("F2", CultureInfo.InvariantCulture) + "%"); dictValues.Add("Fire Totem Uptime", FireTotemUptime.ToString("F2", CultureInfo.InvariantCulture) + "%"); dictValues.Add("Tier 10 2 pc Uptime", T10_2Uptime.ToString("F2", CultureInfo.InvariantCulture) + "%"); dictValues.Add("Tier 10 4 pc Uptime", T10_4Uptime.ToString("F2", CultureInfo.InvariantCulture) + "%"); dictValues.Add("DPS Points", DPSPoints.ToString("F2", CultureInfo.InvariantCulture)); dictValues.Add("Survivability Points", SurvivabilityPoints.ToString("F2", CultureInfo.InvariantCulture)); dictValues.Add("Overall Points", OverallPoints.ToString("F2", CultureInfo.InvariantCulture)); dictValues.Add("White Damage", dpsOutputFormat(SwingDamage, DPSPoints, true)); dictValues.Add("Windfury Attack", dpsOutputFormat(WindfuryAttack, DPSPoints, true)); dictValues.Add("Flametongue Attack", dpsOutputFormat(FlameTongueAttack, DPSPoints, false)); dictValues.Add("Lightning Bolt", dpsOutputFormat(LightningBolt, DPSPoints, false)); dictValues.Add("Earth Shock", dpsOutputFormat(EarthShock, DPSPoints, false)); dictValues.Add("Flame Shock", dpsOutputFormat(FlameShock, DPSPoints, false)); dictValues.Add("Searing/Magma Totem", dpsOutputFormat(SearingMagma, DPSPoints, false)); dictValues.Add("Stormstrike", dpsOutputFormat(Stormstrike, DPSPoints, true)); dictValues.Add("Spirit Wolf", dpsOutputFormat(SpiritWolf, DPSPoints, true)); dictValues.Add("Fire Nova", dpsOutputFormat(FireNova, DPSPoints, false)); dictValues.Add("Fire Elemental", FireElemental.getDPSOutput()); dictValues.Add("Lightning Shield", dpsOutputFormat(LightningShield, DPSPoints, false)); dictValues.Add("Lava Lash", dpsOutputFormat(LavaLash, DPSPoints, true)); dictValues.Add("Total DPS", DPSPoints.ToString("F2", CultureInfo.InvariantCulture)); dictValues.Add("Enhance Version", _version); dictValues.Add("Status", String.Format("Enhance Model : DPS Points {0}, Survivability Points {1}, Overall Points {2}", DPSPoints.ToString("F2", CultureInfo.InvariantCulture), SurvivabilityPoints.ToString("F2", CultureInfo.InvariantCulture), OverallPoints.ToString("F2", CultureInfo.InvariantCulture))); return(dictValues); }
public override Dictionary <string, string> GetCharacterDisplayCalculationValues() { Dictionary <string, string> dictValues = new Dictionary <string, string>(); //string format = ""; CalcOpts = character.CalculationOptions as CalculationOptionsHunter; // Basic Stats dictValues.Add("Health and Stamina", string.Format("{0:##,##0} : {1:##,##0}*{2:00,000} : Base Health" + "\r\n{3:00,000} : Stam Bonus", BasicStats.Health, BasicStats.Stamina, BaseHealth, StatConversion.GetHealthFromStamina(BasicStats.Stamina))); dictValues.Add("Mana", BasicStats.Mana.ToString("F0")); dictValues.Add("Armor", BasicStats.Armor.ToString("F0")); dictValues.Add("Agility", BasicStats.Agility.ToString("F0")); dictValues.Add("Ranged Attack Power", string.Format("{0:0000}*Includes:" + "\r\n{1:0000} : Base" + "\r\n{2:0000} : Agility" + "\r\n{3:0000} : Gear" + "\r\nProcs were averaged out and added", apTotal, apFromBase, apFromAGI, apFromGear)); dictValues.Add("Intellect", BasicStats.Intellect.ToString("F0")); // old float HitPercent = StatConversion.GetHitFromRating(BasicStats.HitRating); float HitPercBonus = BasicStats.PhysicalHit - HitPercent; // Hit Soft Cap ratings check, how far from it #if RAWR3 || SILVERLIGHT float capA1 = StatConversion.WHITE_MISS_CHANCE_CAP[BossOpts.Level - character.Level]; #else float capA1 = StatConversion.WHITE_MISS_CHANCE_CAP[CalcOpts.TargetLevel - character.Level]; #endif float convcapA1 = (float)Math.Ceiling(StatConversion.GetRatingFromHit(capA1)); float sec2lastNumA1 = (convcapA1 - StatConversion.GetRatingFromHit(HitPercent) - StatConversion.GetRatingFromHit(HitPercBonus)) * -1; dictValues.Add("Hit", string.Format("{0:00.00%} : {1}*" + "{2:0.00%} : From Other Bonuses" + Environment.NewLine + "{3:0.00%} : Total Hit % Bonus" + Environment.NewLine + Environment.NewLine + "Ranged Cap: " + (sec2lastNumA1 > 0 ? "You can free {4:0} Rating" : "You need {4:0} more Rating"), StatConversion.GetHitFromRating(BasicStats.HitRating), BasicStats.HitRating, HitPercBonus, HitPercent + HitPercBonus, (sec2lastNumA1 > 0 ? sec2lastNumA1 : sec2lastNumA1 * -1) )); dictValues.Add("Crit", string.Format("{0:00.00%} : {1}*Includes:" + "\r\n{2:00.00%} : Base Crit" + "\r\n{3:00.00%} : Agility" + "\r\n{4:00.00%} : Rating" + "\r\n{5:00.00%} : Racial" + "\r\n{6:00.00%} : Proc Effects" + "\r\n{7:00.00%} : Lethal Shots" + "\r\n{8:00.00%} : Killer Instincts" + "\r\n{9:00.00%} : Master Marksman" + "\r\n{10:00.00%} : Master Tactician" + "\r\n{11:00.00%} : Buffs & Debuffs" + "\r\n{12:00.00%} : Level Adjustment" + "\r\n\r\nNote that individual Shots will handle their own crit caps", critRateOverall, BasicStats.CritRating, critBase, critFromAgi, critFromRating, critFromRacial, critFromProcRating, critFromLethalShots, critFromKillerInstincts, critFromMasterMarksman, critFromMasterTactician, critFromBuffs, critFromDepression * -1f)); dictValues.Add("Armor Penetration", string.Format("{0:00.00%} : {1}" + "*Enemy's Damage Reduction from armor: {2:00.00%}", StatConversion.GetArmorPenetrationFromRating(BasicStats.ArmorPenetrationRating), BasicStats.ArmorPenetrationRating, damageReductionFromArmor)); dictValues.Add("Haste", string.Format("{0:00.00%} : {1:0}*Includes:" + "\r\n{2:00.00%} : Base" + "\r\n{3:00.00%} : Rating" + "\r\n{4:00.00%} : Serpent's Swiftness" + "\r\n{5:00.00%} : Buffs" + "\r\n{6:00.00%} : Rapid Fire" + "\r\n{7:00.00%} : Proc Effects", BasicStats.PhysicalHaste, BasicStats.HasteRating, hasteFromBase, hasteFromRating, hasteFromTalentsStatic, hasteFromRangedBuffs, hasteFromRapidFire, hasteFromProcs)); dictValues.Add("Attack Speed", BaseAttackSpeed.ToString("F2")); // Pet Stats dictValues.Add("Pet Attack Power", pet.PetStats.AttackPower.ToString("F0") + string.Format("*Full Pet Stats:\r\n" + "Strength: {0:0.0}\r\n" + "Agility: {1:0.0}\r\n" + "Hit: {2:0.00%}\r\n" + "PhysCrit: {3:0.00%}\r\n" + "PhysHaste: {4:0.00%}\r\n", pet.PetStats.Strength, pet.PetStats.Agility, pet.PetStats.PhysicalHit, pet.PetStats.PhysicalCrit, pet.PetStats.PhysicalHaste)); dictValues.Add("Pet Hit %", petHitTotal.ToString("P2")); dictValues.Add("Pet Dodge %", petTargetDodge.ToString("P2")); dictValues.Add("Pet Melee Crit %", petCritTotalMelee.ToString("P2") + "*includes:\n" + petCritFromBase.ToString("P2") + " from base\n" + petCritFromAgility.ToString("P2") + " from agility\n" + petCritFromSpidersBite.ToString("P2") + " from Spider's Bite\n" + petCritFromFerocity.ToString("P2") + " from Ferocity\n" + petCritFromGear.ToString("P2") + " from gear\n" + petCritFromBuffs.ToString("P2") + " from buffs\n" + petCritFromTargetDebuffs.ToString("P2") + " from target debuffs\n" + petCritFromDepression.ToString("P2") + " from depression"); dictValues.Add("Pet Specials Crit %", petCritTotalSpecials.ToString("P2") + "*includes:\n" + petCritTotalMelee.ToString("P2") + " from melee crit\n" + petCritFromCobraStrikes.ToString("P2") + " from Cobra Strikes"); dictValues.Add("Pet White DPS", petWhiteDPS.ToString("F2")); dictValues.Add("Pet Kill Command DPS", petKillCommandDPS.ToString("F2")); dictValues.Add("Pet Specials DPS", petSpecialDPS.ToString("F2") /*+ * string.Format("Breakout:\r\n" + "Furious Howl: Use {0} DPS {1:0.00}" + "Bite: Use {2} DPS {3:0.00}", + pet.priorityRotation.getSkillFrequency(PetAttacks.FuriousHowl), 0f, + pet.priorityRotation.getSkillFrequency(PetAttacks.Bite), pet.priorityRotation.dps - petWhiteDPS)*/); // Shot Stats dictValues.Add("Aimed Shot", aimedShot.GenTooltip()); dictValues.Add("Arcane Shot", arcaneShot.GenTooltip()); dictValues.Add("Multi Shot", multiShot.GenTooltip()); dictValues.Add("Silencing Shot", silencingShot.GenTooltip()); dictValues.Add("Steady Shot", steadyShot.GenTooltip()); dictValues.Add("Kill Shot", killShot.GenTooltip()); dictValues.Add("Explosive Shot", explosiveShot.GenTooltip()); dictValues.Add("Black Arrow", blackArrow.GenTooltip()); dictValues.Add("Volley", volley.GenTooltip()); dictValues.Add("Chimera Shot", chimeraShot.GenTooltip()); //dictValues.Add("Rapid Fire", rapidFire.GenTooltip()); //dictValues.Add("Readiness", readiness.GenTooltip()); //dictValues.Add("Bestial Wrath", bestialWrath.GenTooltip()); // Sting Stats dictValues.Add("Serpent Sting", serpentSting.GenTooltip()); dictValues.Add("Scorpid Sting", scorpidSting.GenTooltip()); dictValues.Add("Viper Sting", viperSting.GenTooltip()); // Trap Stats dictValues.Add("Immolation Trap", immolationTrap.GenTooltip()); dictValues.Add("Explosive Trap", explosiveTrap.GenTooltip()); dictValues.Add("Freezing Trap", freezingTrap.GenTooltip()); dictValues.Add("Frost Trap", frostTrap.GenTooltip()); // Mana dictValues.Add("Mana Usage Per Second", manaUsageTotal.ToString("F2") + "*includes:\n" + manaUsageRotation.ToString("F2") + " from shot rotation\n" + manaUsageKillCommand.ToString("F2") + " from Kill Command"); dictValues.Add("Mana Regen Per Second", manaRegenTotal.ToString("F2") + "*includes:\n" + (manaRegenGearBuffs + manaRegenConstantViper + manaRegenViper + manaRegenRoarOfRecovery + manaRegenRapidRecuperation + manaRegenChimeraViperProc + manaRegenInvigoration + manaRegenHuntingParty + manaRegenTargetDebuffs + manaRegenFromPots > 0f ? (manaRegenGearBuffs != 0 ? manaRegenGearBuffs.ToString("F2") + " from Gear and Buffs\n" : "") + (manaRegenConstantViper != 0 ? manaRegenConstantViper.ToString("F2") + " from Constant Aspect of the Viper\n" : "") + (manaRegenViper != 0 ? manaRegenViper.ToString("F2") + " from Aspect of the Viper\n" : "") + (manaRegenRoarOfRecovery != 0 ? manaRegenRoarOfRecovery.ToString("F2") + " from Roar of Recovery\n" : "") + (manaRegenRapidRecuperation != 0 ? manaRegenRapidRecuperation.ToString("F2") + " from Rapid Recuperation\n" : "") + (manaRegenChimeraViperProc != 0 ? manaRegenChimeraViperProc.ToString("F2") + " from Chimera Viper String Proc\n" : "") + (manaRegenInvigoration != 0 ? manaRegenInvigoration.ToString("F2") + " from Invigoration\n" : "") + (manaRegenHuntingParty != 0 ? manaRegenHuntingParty.ToString("F2") + " from Hunting Party\n" : "") + (manaRegenTargetDebuffs != 0 ? manaRegenTargetDebuffs.ToString("F2") + " from Target Debuffs\n" : "") + (manaRegenFromPots != 0 ? manaRegenFromPots.ToString("F2") + " from Pots" : "") : "Nothing to add") ); dictValues.Add("Normal Change", manaChangeDuringNormal.ToString("F2")); dictValues.Add("Change during Viper", manaChangeDuringViper.ToString("F2")); dictValues.Add("Time to OOM", manaTimeToOOM.ToString("F2")); dictValues.Add("Time to Full", manaTimeToFull.ToString("F2")); dictValues.Add("Viper Damage Penalty", aspectViperPenalty.ToString("P2")); dictValues.Add("Viper Uptime", aspectUptimeViper.ToString("P2")); dictValues.Add("No Mana Damage Penalty", NoManaDPSDownTimePerc.ToString("P2")); // Hunter DPS dictValues.Add("Autoshot DPS", AutoshotDPS.ToString("F2")); dictValues.Add("Priority Rotation DPS", CustomDPS.ToString("F2")); dictValues.Add("Wild Quiver DPS", WildQuiverDPS.ToString("F2")); dictValues.Add("Kill Shot low HP gain", killShotSub20FinalGain.ToString("F2") + "*" + "Kill Shot freq: " + killShot.Freq.ToString("F2") + " -> " + killShot.start_freq.ToString("F2") + "\n" + "Steady Shot freq: " + steadyShot.Freq.ToString("F2") + " -> " + killShotSub20NewSteadyFreq.ToString("F2") + "\n" + "Kill Shot DPS: " + killShot.DPS.ToString("F2") + " -> " + killShotSub20NewDPS.ToString("F2") + "\n" + "Steady Shot DPS: " + steadyShot.DPS.ToString("F2") + " -> " + killShotSub20NewSteadyDPS.ToString("F2") + "\n" + "DPS Gain when switched: " + killShotSub20Gain.ToString("F2") + "\n" + "Time spent sub-20%: " + killShotSub20TimeSpent.ToString("P2")); dictValues.Add("Aspect Loss", aspectBeastLostDPS.ToString("F2") + "*" + "Hawk Uptime: " + aspectUptimeHawk.ToString("P2") + "\n" + "Viper Uptime: " + aspectUptimeViper.ToString("P2") + "\n" + "Beast Uptime: " + aspectUptimeBeast.ToString("P2")); dictValues.Add("Piercing Shots DPS", PiercingShotsDPS.ToString("F2") + "*" + "Steady Shot: " + PiercingShotsDPSSteadyShot.ToString("F2") + "\n" + "Aimed Shot: " + PiercingShotsDPSAimedShot.ToString("F2") + "\n" + "Chimera Shot: " + PiercingShotsDPSChimeraShot.ToString("F2") + "\n"); dictValues.Add("Special DMG Procs DPS", SpecProcDPS.ToString("F2")); // Combined DPS string zod = (BonusAttackProcsDPS != 0 ? string.Format("*Includes:\r\nZod's Proc: {0:0.0}", BonusAttackProcsDPS) : ""); dictValues.Add("Hunter DPS", HunterDpsPoints.ToString("F2") + zod); dictValues.Add("Pet DPS", PetDpsPoints.ToString("F2")); dictValues.Add("Total DPS", OverallPoints.ToString("F2")); return(dictValues); }
public static float BonusArmorPenetrationPercentage(Character character, Stats stats) { return(StatConversion.GetArmorPenetrationFromRating(stats.ArmorPenetrationRating, CharacterClass.Paladin)); }
public EnhSim(Character character, CalculationOptionsEnhance calcOpts) { _character = character; _calcOpts = calcOpts; CalculationsEnhance ce = new CalculationsEnhance(); CharacterCalculationsEnhance calcs = ce.GetCharacterCalculations(character, null) as CharacterCalculationsEnhance; Stats stats = calcs.EnhSimStats; if (_character.ActiveBuffsContains("Master of Anatomy")) { stats.CritRating += 40; } CombatStats cs = new CombatStats(character, stats, _calcOpts); getSpecialsNames(character, stats); StringBuilder sb = new StringBuilder(); sb.AppendLine(); sb.AppendLine("##########################################"); sb.AppendLine("### Rawr.Enhance Data Export to EnhSim ###"); sb.AppendLine("##########################################"); sb.AppendLine(); sb.AppendLine("config_source rawr"); sb.AppendLine(); float MHSpeed = character.MainHand == null ? 3.0f : character.MainHand.Item.Speed; float wdpsMH = character.MainHand == null ? 46.3f : character.MainHand.Item.DPS; float OHSpeed = character.OffHand == null ? 3.0f : character.OffHand.Item.Speed; float wdpsOH = character.OffHand == null ? 46.3f : character.OffHand.Item.DPS; sb.AppendLine("race " + character.Race.ToString().ToLower()); sb.AppendLine("mh_speed " + MHSpeed.ToString("F1", CultureInfo.InvariantCulture)); sb.AppendLine("oh_speed " + OHSpeed.ToString("F1", CultureInfo.InvariantCulture)); sb.AppendLine("mh_dps " + wdpsMH.ToString("F1", CultureInfo.InvariantCulture)); sb.AppendLine("oh_dps " + wdpsOH.ToString("F1", CultureInfo.InvariantCulture)); float chanceCrit = cs.ExportMeleeCritMH * 100f; sb.AppendLine("mh_crit " + chanceCrit.ToString("F2", CultureInfo.InvariantCulture)); chanceCrit = cs.ExportMeleeCritOH * 100f; sb.AppendLine("oh_crit " + chanceCrit.ToString("F2", CultureInfo.InvariantCulture)); float hitBonus = StatConversion.GetHitFromRating(stats.HitRating) * 100f; sb.AppendLine("mh_hit " + hitBonus.ToString("F2", CultureInfo.InvariantCulture)); sb.AppendLine("oh_hit " + hitBonus.ToString("F2", CultureInfo.InvariantCulture)); sb.AppendLine("mh_expertise_rating " + stats.ExpertiseRating.ToString("F0", CultureInfo.InvariantCulture)); sb.AppendLine("oh_expertise_rating " + stats.ExpertiseRating.ToString("F0", CultureInfo.InvariantCulture)); sb.AppendLine("ap " + stats.AttackPower.ToString("F0", CultureInfo.InvariantCulture)); float hasteBonus = StatConversion.GetHasteFromRating(stats.HasteRating, CharacterClass.Shaman) * 100f; sb.AppendLine("melee_haste " + hasteBonus.ToString("F2", CultureInfo.InvariantCulture)); float armourPenBonus = StatConversion.GetArmorPenetrationFromRating(stats.ArmorPenetrationRating) * 100f; sb.AppendLine("armor_penetration " + armourPenBonus.ToString("F2", CultureInfo.InvariantCulture)); sb.AppendLine("str " + stats.Strength.ToString("F0", CultureInfo.InvariantCulture)); sb.AppendLine("agi " + stats.Agility.ToString("F0", CultureInfo.InvariantCulture)); sb.AppendLine("int " + stats.Intellect.ToString("F0", CultureInfo.InvariantCulture)); sb.AppendLine("spi " + stats.Spirit.ToString("F0", CultureInfo.InvariantCulture)); sb.AppendLine("spellpower " + stats.SpellPower.ToString("F0", CultureInfo.InvariantCulture)); float chanceSpellCrit = cs.DisplaySpellCrit * 100f; sb.AppendLine("spell_crit " + chanceSpellCrit.ToString("F2", CultureInfo.InvariantCulture)); hitBonus = StatConversion.GetSpellHitFromRating(stats.HitRating) * 100f; sb.AppendLine("spell_hit " + hitBonus.ToString("F2", CultureInfo.InvariantCulture)); hasteBonus = StatConversion.GetSpellHasteFromRating(stats.HasteRating) * 100f; sb.AppendLine("spell_haste " + hasteBonus.ToString("F2", CultureInfo.InvariantCulture)); sb.AppendLine("max_mana " + stats.Mana.ToString()); sb.AppendLine("mp5 " + stats.Mp5.ToString()); sb.AppendLine(); sb.AppendLine("mh_imbue " + _calcOpts.MainhandImbue.ToString().ToLower()); sb.AppendLine("oh_imbue " + _calcOpts.OffhandImbue.ToString().ToLower()); sb.AppendLine(); sb.AppendLine("mh_enchant " + _mhEnchant); String weaponType = "-"; if (character.MainHand != null) { if (character.MainHand.Type == ItemType.OneHandAxe || character.MainHand.Type == ItemType.TwoHandAxe) { weaponType = "axe"; } if (character.MainHand.Type == ItemType.FistWeapon) { weaponType = "fist"; } } sb.AppendLine("mh_weapon " + weaponType); sb.AppendLine("oh_enchant " + _ohEnchant); weaponType = "-"; if (character.OffHand != null) { if (character.OffHand.Type == ItemType.OneHandAxe) { weaponType = "axe"; } if (character.OffHand.Type == ItemType.FistWeapon) { weaponType = "fist"; } } sb.AppendLine("oh_weapon " + weaponType); sb.AppendLine(); sb.AppendLine("trinket1 " + _trinket1name); sb.AppendLine("trinket2 " + _trinket2name); sb.AppendLine(); sb.AppendLine("totem " + _totemname); sb.AppendLine(getSetBonuses(character)); sb.AppendLine("metagem " + _metagem); sb.AppendLine(); string handEnchant = character.HandsEnchant == null ? string.Empty : character.HandsEnchant.Name; if (handEnchant == "Hyperspeed Accelerators") { sb.AppendLine("gloves_enchant hyperspeed_accelerators"); } else if (handEnchant == "Hand-Mounted Pyro Rocket") { sb.AppendLine("gloves_enchant hand_mounted_pyro_rocket"); } else { sb.AppendLine("gloves_enchant -"); } string backEnchant = character.BackEnchant == null ? string.Empty : character.BackEnchant.Name; if (backEnchant == "Lightweave Embroidery") { sb.AppendLine("cloak_enchant lightweave_embroidery"); } else if (backEnchant == "Swordguard Embroidery") { sb.AppendLine("cloak_enchant swordguard_embroidery"); } else { sb.AppendLine("cloak_enchant -"); } if (character.Finger1.Id == 50401 || character.Finger2.Id == 50401 || character.Finger1.Id == 50402 || character.Finger2.Id == 50402) { sb.AppendLine("ring_proc ashen_verdict"); } else { sb.AppendLine("ring_proc -"); } addGlyphs(character, sb); sb.AppendLine(); sb.AppendLine("glyph_minor1 -"); sb.AppendLine("glyph_minor2 -"); sb.AppendLine("glyph_minor3 -"); sb.AppendLine(); sb.AppendLine("necrotic_touch " + (character.MainHand.Id == 50035 ? "1" : "0")); sb.AppendLine("necrotic_touch_heroic " + (character.MainHand.Id == 50692 ? "1" : "0")); sb.AppendLine("mixology " + (character.PrimaryProfession == Profession.Alchemy || character.SecondaryProfession == Profession.Alchemy ? "1" : "0")); // addPriorities(_calcOpts, sb); addManaConfigs(character, sb); sb.AppendLine(); sb.AppendLine("#############"); sb.AppendLine("## Talents ##"); sb.AppendLine("#############"); sb.AppendLine(); sb.AppendLine("ancestral_knowledge " + character.ShamanTalents.AncestralKnowledge + "/5"); sb.AppendLine("improved_shields " + character.ShamanTalents.ImprovedShields + "/3"); sb.AppendLine("mental_dexterity " + character.ShamanTalents.MentalDexterity + "/3"); sb.AppendLine("shamanistic_focus " + character.ShamanTalents.ShamanisticFocus + "/1"); sb.AppendLine("flurry " + character.ShamanTalents.Flurry + "/5"); sb.AppendLine("elemental_weapons " + character.ShamanTalents.ElementalWeapons + "/3"); sb.AppendLine("unleashed_rage " + character.ShamanTalents.UnleashedRage + "/3"); sb.AppendLine("weapon_mastery " + character.ShamanTalents.WeaponMastery + "/3"); sb.AppendLine("dual_wield_specialization " + character.ShamanTalents.DualWieldSpecialization + "/3"); sb.AppendLine("mental_quickness " + character.ShamanTalents.MentalQuickness + "/3"); sb.AppendLine("improved_stormstrike " + character.ShamanTalents.ImprovedStormstrike + "/2"); sb.AppendLine("static_shock " + character.ShamanTalents.StaticShock + "/3"); sb.AppendLine("maelstrom_weapon " + character.ShamanTalents.MaelstromWeapon + "/5"); sb.AppendLine("convection " + character.ShamanTalents.Convection + "/5"); sb.AppendLine("concussion " + character.ShamanTalents.Concussion + "/5"); sb.AppendLine("call_of_flame " + character.ShamanTalents.CallOfFlame + "/3"); sb.AppendLine("elemental_devastation " + character.ShamanTalents.ElementalDevastation + "/3"); sb.AppendLine("reverberation " + character.ShamanTalents.Reverberation + "/5"); sb.AppendLine("elemental_focus " + character.ShamanTalents.ElementalFocus + "/1"); sb.AppendLine("elemental_fury " + character.ShamanTalents.ElementalFury + "/5"); sb.AppendLine("improved_fire_nova " + character.ShamanTalents.ImprovedFireNova + "/2"); sb.AppendLine("call_of_thunder " + character.ShamanTalents.CallOfThunder + "/1"); sb.AppendLine("unrelenting_storm " + character.ShamanTalents.UnrelentingStorm + "/3"); sb.AppendLine("elemental_precision " + character.ShamanTalents.ElementalPrecision + "/3"); sb.AppendLine("lightning_mastery " + character.ShamanTalents.LightningMastery + "/5"); sb.AppendLine("elemental_oath " + character.ShamanTalents.ElementalOath + "/2"); sb.AppendLine("lightning_overload " + character.ShamanTalents.LightningOverload + "/5"); sb.AppendLine("lava_flows " + character.ShamanTalents.LavaFlows + "/3"); sb.AppendLine("storm_earth_and_fire " + character.ShamanTalents.StormEarthAndFire + "/3"); sb.AppendLine("shamanism " + character.ShamanTalents.Shamanism + "/5"); sb.AppendLine(); addBuffs(character, sb); // add extras sb.AppendLine(); sb.AppendLine("combat_length " + _calcOpts.FightLength.ToString("F2", CultureInfo.InvariantCulture)); _configText = sb.ToString(); }