Beispiel #1
0
 public override void UpdateSpell()
 {
     healBonus = (1f + stats.BonusHealingDoneMultiplier)
                 * (1f + PriestInformation.GetTwinDisciplines(character.PriestTalents.TwinDisciplines));
     base.UpdateSpell();
     DirectHealCalcs();
 }
Beispiel #2
0
        public override void UpdateSpell()
        {
            float shieldBonus = (1f + PriestInformation.GetImprovedPowerWordShield(character.PriestTalents.ImprovedPowerWordShield))
                                * (1f + PriestInformation.GetTwinDisciplines(character.PriestTalents.TwinDisciplines))
                                * (1f + stats.ShieldDiscipline);
            float spellPowerBonus = stats.SpellPower * BaseDirectCoefficient;

            base.UpdateSpell();
            Cooldown = BaseCooldown - PriestInformation.GetSoulWarding(character.PriestTalents.SoulWarding);

            AbsorbMinHit = AbsorbMaxHit = AbsorbAvgHit = (BaseDirectValue + spellPowerBonus) * shieldBonus;

            if (character.PriestTalents.GlyphofPowerWordShield)
            {
                DirectHealMinHit  = DirectHealMaxHit = DirectHealAvgHit = AbsorbAvgHit * 0.2f;
                DirectHealMinCrit = DirectHealMaxCrit = DirectHealAvgCrit = AbsorbAvgHit * 0.2f * CritMultiplier;
                DirectHealAvg     = DirectHealAvgHit * (1f - CritChance) + DirectHealAvgCrit * CritChance;
                HasDirectHeal     = true;
                if (stats.PriestSpec == ePriestSpec.Spec_Disc)
                {
                    DivineAegis();
                }
                else if (stats.PriestSpec == ePriestSpec.Spec_Holy)
                {
                    EchoOfLight();
                }
            }

            AbsorbAvg = AbsorbAvgHit + AbsorbAvgCrit * CritChance;
        }
Beispiel #3
0
        public override void UpdateSpell()
        {
            float td = (1f + PriestInformation.GetTwinDisciplines(character.PriestTalents.TwinDisciplines));

            healBonus = (1f + stats.BonusHealingDoneMultiplier)
                        * td;
            base.UpdateSpell();
            DirectHealCalcs();
            if (stats.PriestSpec == ePriestSpec.Spec_Disc)
            {   // Prayer of Healing has Absorbs for Hit and Crit
                float da = PriestInformation.GetDivineAegis(character.PriestTalents.DivineAegis) * (1f + stats.ShieldDiscipline);
                AbsorbMinHit   = DirectHealMinHit * da;
                AbsorbMaxHit   = DirectHealMaxHit * da;
                AbsorbAvgHit   = DirectHealAvgHit * da;
                AbsorbMinCrit *= 2;
                AbsorbMaxCrit *= 2;
                AbsorbAvgCrit *= 2;
                AbsorbAvg      = AbsorbAvgHit * (1f - CritChance) + AbsorbAvgCrit * CritChance;
            }
            if (character.PriestTalents.GlyphofPrayerofHealing)
            {
                OverTimeTicks      = 2;
                OverTimeTickPeriod = 3;
                OverTimeDuration   = OverTimeTicks * OverTimeTickPeriod;
                OverTimeHealHit    = DirectHealAvgHit * 0.2f * td;
                OverTimeHealCrit   = DirectHealAvgCrit * 0.2f * td;
                OverTimeHealAvg    = OverTimeHealHit * (1f - CritChance) + OverTimeHealCrit * CritChance;
                HasOverTimeHeal    = true;
            }
        }
Beispiel #4
0
        //
        // PWS, Penance_BT, PROH_BT, PWS, PROH_BT, PWS, PROH_BT, GH, GH
        public override void Solve()
        {
            float graceBonus   = PriestInformation.GetGrace(character.PriestTalents.Grace) * 3;
            float borrowedTime = PriestInformation.GetBorrowedTime(character.PriestTalents.BorrowedTime);
            float renewedHope  = PriestInformation.GetRenewedHope(character.PriestTalents.RenewedHope);

            StatsPriest statsGR = new StatsPriest()
            {
                BonusHealingDoneMultiplier = graceBonus
            };

            statsGR.Accumulate(stats);

            StatsPriest statsBTGR = new StatsPriest()
            {
                SpellHaste = borrowedTime, BonusHealingDoneMultiplier = graceBonus
            };

            statsBTGR.Accumulate(stats);

            StatsPriest statsRHGR = new StatsPriest()
            {
                SpellCrit = renewedHope, BonusHealingDoneMultiplier = graceBonus
            };

            statsRHGR.Accumulate(stats);

            StatsPriest statsBTRHGR = new StatsPriest()
            {
                SpellHaste = borrowedTime, SpellCrit = renewedHope, BonusHealingDoneMultiplier = graceBonus
            };

            statsBTRHGR.Accumulate(stats);

            // BT = Borrowed Time, RH = Renewed Hope, GR = Grace
            SpellPowerWordShield pwsGR         = new SpellPowerWordShield(character, statsGR);
            SpellPenance         penanceBTGRRH = new SpellPenance(character, statsBTRHGR);
            SpellGreaterHeal     ghBTGRRH      = new SpellGreaterHeal(character, statsBTRHGR);
            SpellGreaterHeal     ghGTRH        = new SpellGreaterHeal(character, statsRHGR);
            SpellPrayerOfHealing prohBTGR      = new SpellPrayerOfHealing(character, statsBTGR, 3);

            castSequence.Add(pwsGR);
            castSequence.Add(penanceBTGRRH);
            castSequence.Add(prohBTGR);
            castSequence.Add(ghGTRH);
            castSequence.Add(pwsGR);
            castSequence.Add(prohBTGR);
            castSequence.Add(ghGTRH);
            castSequence.Add(pwsGR);
            castSequence.Add(prohBTGR);

            DoCalcs();
            if (verbose)
            {
                Name += "\n\nThree tank healing, keeping Grace up on 3 targets, using Prayer of Healing as filler.";
            }
        }
Beispiel #5
0
        public override Stats GetCharacterStats(Character character, Item additionalItem)
        {
            CalculationOptionsHealPriest calcOpts = character.CalculationOptions as CalculationOptionsHealPriest;

            StatsPriest statsTotal = new StatsPriest()
            {
                SpellHaste = PriestInformation.GetDarkness(character.PriestTalents.Darkness),
                InnerFire  = true,
                BonusIntellectMultiplier = 0.05f,   // Cloth bonus.
                PriestSpec = PriestSpec.GetPriestSpec(character.PriestTalents),
            };

            if (statsTotal.PriestSpec == ePriestSpec.Spec_Disc)
            {
                statsTotal.SpellCombatManaRegeneration = 0.5f;
                statsTotal.BonusIntellectMultiplier    = 0.15f;
            }
            else if (statsTotal.PriestSpec == ePriestSpec.Spec_Holy)
            {
                statsTotal.SpellCombatManaRegeneration = 0.5f + PriestInformation.GetHolyConcentration(character.PriestTalents.HolyConcentration);
                statsTotal.BonusHealingDoneMultiplier  = 0.15f;
            }
            else if (statsTotal.PriestSpec == ePriestSpec.Spec_ERROR)
            {
                throw new Exception("Unpossible Talent Spec!");
            }

            statsTotal.Accumulate(BaseStats.GetBaseStats(character));
            statsTotal.Accumulate(GetItemStats(character, additionalItem));
            statsTotal.Accumulate(GetBuffsStats(character, calcOpts));


            statsTotal.Stamina     = (float)Math.Floor((statsTotal.Stamina) * (1 + statsTotal.BonusStaminaMultiplier));
            statsTotal.Intellect   = (float)Math.Floor((statsTotal.Intellect) * (1 + statsTotal.BonusIntellectMultiplier));
            statsTotal.Spirit      = (float)Math.Floor((statsTotal.Spirit) * (1 + statsTotal.BonusSpiritMultiplier));
            statsTotal.SpellPower += (statsTotal.InnerFire ? PriestInformation.GetInnerFireSpellPowerBonus(character) : 0) + (statsTotal.Intellect - 10);
            statsTotal.SpellPower *= (1f + statsTotal.BonusSpellPowerMultiplier);
            statsTotal.Mana       += StatConversion.GetManaFromIntellect(statsTotal.Intellect);
            statsTotal.Mana       *= (1f + statsTotal.BonusManaMultiplier);
            statsTotal.Health     += StatConversion.GetHealthFromStamina(statsTotal.Stamina);
            statsTotal.Health      = (float)Math.Floor(statsTotal.Health * (1f + statsTotal.BonusHealthMultiplier));
            statsTotal.SpellCrit  += StatConversion.GetSpellCritFromIntellect(statsTotal.Intellect)
                                     + StatConversion.GetSpellCritFromRating(statsTotal.CritRating);
            statsTotal.SpellHaste = (1f + statsTotal.SpellHaste) * (1f + StatConversion.GetSpellHasteFromRating(statsTotal.HasteRating)) - 1f;
            statsTotal.Armor     *= (1 + (statsTotal.InnerFire ? PriestInformation.GetInnerFireArmorBonus(character) : 0));

            if (statsTotal.PriestSpec == ePriestSpec.Spec_Disc)
            {
                statsTotal.ShieldDiscipline = (PriestInformation.DisciplineMasteryBase + StatConversion.GetMasteryFromRating(statsTotal.MasteryRating)) * PriestInformation.DisciplineMasteryEffect;
            }
            else if (statsTotal.PriestSpec == ePriestSpec.Spec_Holy)
            {
                statsTotal.EchoofLight = (PriestInformation.HolyMasteryBase + StatConversion.GetMasteryFromRating(statsTotal.MasteryRating)) * PriestInformation.HolyMasteryEffect;
            }

            return(statsTotal);
        }
Beispiel #6
0
        protected void DivineAegis()
        {
            float da = PriestInformation.GetDivineAegis(character.PriestTalents.DivineAegis) * (1f + stats.ShieldDiscipline);

            AbsorbMinCrit = DirectHealMinCrit * da;
            AbsorbMaxCrit = DirectHealMaxCrit * da;
            AbsorbAvgCrit = DirectHealAvgCrit * da;
            AbsorbAvg     = AbsorbAvgHit * (1f - CritChance) + AbsorbAvgCrit * CritChance;
            HasAbsorb     = true;
        }
Beispiel #7
0
        public override void UpdateSpell()
        {
            healBonus = (1f + stats.BonusHealingDoneMultiplier)
                        * (1f + PriestInformation.GetTwinDisciplines(character.PriestTalents.TwinDisciplines));

            base.UpdateSpell();
            Cooldown = BaseCooldown - (character.PriestTalents.GlyphofPenance ? 2f : 0f);

            float spellPowerBonus = stats.SpellPower * BaseDirectCoefficient;

            DirectHealCalcs();
        }
Beispiel #8
0
 public override void UpdateSpell()
 {
     healBonus = (1f + stats.BonusHealingDoneMultiplier)
                 * (1f + PriestInformation.GetTwinDisciplines(character.PriestTalents.TwinDisciplines));
     if (character.PriestTalents.GlyphofPrayerOfMending && Targets == 1)
     {
         healBonus *= 1.6f;
     }
     base.UpdateSpell();
     Cooldown = BaseCooldown;
     DirectHealCalcs();
 }
Beispiel #9
0
        public SpellGreaterHeal(Character character, StatsPriest stats)
        {
            Name = "Greater Heal";

            BaseDirectValue       = 9.56400012969971f * BaseScalar85;
            BaseDirectCoefficient = 0.967f;
            BaseDirectVariation   = 0.15f;

            BaseCastTime = 3.0f - PriestInformation.GetDivineFury(character.PriestTalents.DivineFury);
            BaseManaCost = 0.27f;

            SetPriestInformation(character, stats);
        }
Beispiel #10
0
        public SpellHeal(Character character, StatsPriest stats)
        {
            Name = "Heal";

            BaseDirectValue       = 3.58699989318848f * BaseScalar85;
            BaseDirectCoefficient = 0.362f;
            BaseDirectVariation   = 0.15f;

            BaseCastTime = 3.0f - PriestInformation.GetDivineFury(character.PriestTalents.DivineFury);
            BaseManaCost = 0.09f;

            SetPriestInformation(character, stats);
        }
Beispiel #11
0
        public override void UpdateSpell()
        {
            healBonus = (1f + stats.BonusHealingDoneMultiplier)
                        * (1f + PriestInformation.GetTwinDisciplines(character.PriestTalents.TwinDisciplines));

            base.UpdateSpell();
            Cooldown = BaseCooldown;
            float haste = (1f + stats.SpellHaste);

            OverTimeTickPeriod = BaseOverTimeTickPeriod / haste;
            // You get k more ticks for a hot/dot that has m ticks at 0% haste if your haste is higher than (2k-1)/2m.
            OverTimeTicks    = (float)Math.Floor(BaseOverTimeTicks * haste + 0.5f);
            OverTimeDuration = OverTimeTickPeriod * OverTimeTicks;

            DirectHealCalcs();
        }
Beispiel #12
0
        public override void UpdateSpell()
        {
            healBonus = (1f + stats.BonusHealingDoneMultiplier)
                        * (1f + PriestInformation.GetTwinDisciplines(character.PriestTalents.TwinDisciplines))
                        * (1f + PriestInformation.GetImprovedRenew(character.PriestTalents.ImprovedRenew))
                        * (character.PriestTalents.GlyphofRenew ? 1.1f : 1.0f);

            base.UpdateSpell();

            float spellPowerBonus = stats.SpellPower * BaseOverTimeCoefficient;

            OverTimeHealHit  = (BaseOverTimeValue + spellPowerBonus) * healBonus;
            OverTimeHealCrit = OverTimeHealHit * CritMultiplier;
            OverTimeHealAvg  = OverTimeHealHit * (1f - CritChance) + OverTimeHealCrit * CritChance;
            float haste = (1f + stats.SpellHaste);

            OverTimeTickPeriod = BaseOverTimeTickPeriod / haste;
            // You get k more ticks for a hot/dot that has m ticks at 0% haste if your haste is higher than (2k-1)/2m.
            OverTimeTicks    = (float)Math.Floor(BaseOverTimeTicks * haste + 0.5f);
            OverTimeDuration = OverTimeTickPeriod * OverTimeTicks;
            HasOverTimeHeal  = true;

            if (character.PriestTalents.DivineAegis > 0)
            {
                float da = PriestInformation.GetDivineAegis(character.PriestTalents.DivineAegis) * (1f + stats.ShieldDiscipline);
                AbsorbMinCrit = AbsorbMaxCrit = AbsorbAvgCrit = OverTimeHealCrit * da;
                AbsorbAvg     = AbsorbAvgHit * (1f - CritChance) + AbsorbAvgCrit * CritChance;
                HasAbsorb     = true;
            }

            if (character.PriestTalents.DivineTouch > 0)
            {
                DirectHealMinHit  = DirectHealMaxHit = DirectHealAvgHit = OverTimeHealHit * OverTimeTicks;
                DirectHealMinCrit = DirectHealMaxCrit = DirectHealAvgCrit = OverTimeHealCrit * OverTimeTicks;
                DirectHealAvg     = DirectHealAvgHit * (1f - CritChance) + DirectHealAvgCrit * CritChance;
                HasDirectHeal     = true;
                if (stats.PriestSpec == ePriestSpec.Spec_Disc)
                {
                    DivineAegis();
                }
                else if (stats.PriestSpec == ePriestSpec.Spec_Holy)
                {
                    EchoOfLight();
                }
            }
        }
Beispiel #13
0
        public override void UpdateSpell()
        {
            healBonus = (1f + stats.BonusHealingDoneMultiplier)
                        * (1f + PriestInformation.GetTwinDisciplines(character.PriestTalents.TwinDisciplines));

            base.UpdateSpell();
            Cooldown = BaseCooldown;

            float spellPowerBonus = stats.SpellPower * BaseOverTimeCoefficient;

            OverTimeHealHit  = (BaseOverTimeValue + spellPowerBonus) * healBonus;
            OverTimeHealCrit = OverTimeHealHit * CritMultiplier;
            OverTimeHealAvg  = OverTimeHealHit * (1f - CritChance) + OverTimeHealCrit * CritChance;
            float haste = (1f + stats.SpellHaste);

            OverTimeTickPeriod = BaseOverTimeTickPeriod / haste;
            // You get k more ticks for a hot/dot that has m ticks at 0% haste if your haste is higher than (2k-1)/2m.
            OverTimeTicks    = (float)Math.Floor(BaseOverTimeTicks * haste + 0.5f);
            OverTimeDuration = OverTimeTickPeriod * OverTimeTicks;
            HasOverTimeHeal  = true;
        }
Beispiel #14
0
        // PWS
        // ProH_BT
        public override void Solve()
        {
            float borrowedTime = PriestInformation.GetBorrowedTime(character.PriestTalents.BorrowedTime);

            StatsPriest statsBT = new StatsPriest()
            {
                SpellHaste = borrowedTime
            };

            statsBT.Accumulate(stats);

            castSequence.Clear();

            castSequence.Add(new SpellPowerWordShield(character, stats));
            castSequence.Add(new SpellPrayerOfHealing(character, statsBT));

            DoCalcs();

            if (verbose)
            {
                Name += "\nCasting Power Word: Shield and then Prayer of Healing, repeat.";
            }
        }
Beispiel #15
0
        public virtual void UpdateSpell()
        {
            HasDirectDamage = false; HasDirectHeal = false; HasAbsorb = false; HasOverTimeDamage = false; HasOverTimeHeal = false;

            float hc = 1f / (1f + stats.SpellHaste);

            IsInstant = BaseCastTime == 0f;
            if (IsInstant)
            {
                CastTime = 0f;
            }
            else
            {
                CastTime = Math.Max(1f, BaseCastTime * hc);
            }
            GlobalCooldown = Math.Max(1f, BaseGlobalCooldown * hc);
            CritChance     = stats.SpellCrit;
            CritMultiplier = 1.5f * (1f + stats.BonusCritHealMultiplier);
            ManaCost       = BaseManaCost * BaseStats.GetBaseStats(character).Mana; // priestInformation.BaseMana;
            if (IsInstant)
            {
                ManaCost *= PriestInformation.GetMentalAgility(character.PriestTalents.MentalAgility);
            }
        }
Beispiel #16
0
        private float CalcShadowfiend(float mana)
        {   // 3% mana every hit, 15s dura
            // FIXME: 2s swing timer = 7.5 ~ 8 swings = 8*3 = 24% mana. Assume hasted by haste.
            float casts = (float)Math.Floor((bossOptions.BerserkTimer - 30f) / (60f * 5f - PriestInformation.GetVeiledShadows(character.PriestTalents.VeiledShadows))) + 1f;

            return(mana * (0.03f * 8f) * casts / bossOptions.BerserkTimer * (1f + calcOpts.Shadowfiend / 100f));
        }
Beispiel #17
0
 private float CalcRapture(float mana)
 {
     return(mana * PriestInformation.GetRapture(character.PriestTalents.Rapture) / calcOpts.Rapture);
 }
Beispiel #18
0
        public override Dictionary <string, string> GetCharacterDisplayCalculationValues()
        {
            Dictionary <string, string> dictValues = new Dictionary <string, string>();
            Buff   activeBuff;
            string s;
            Stats  baseStats = BaseStats.GetBaseStats(Character);

            #region General
            dictValues["Health"]     = BasicStats.Health.ToString("0");
            dictValues["Mana"]       = BasicStats.Mana.ToString("0");
            dictValues["Item Level"] = String.Format("{0}*Lowest: {1}\nHighest: {2}", Character.AvgWornItemLevel.ToString("0"), Character.MinWornItemLevel.ToString("0"), Character.MaxWornItemLevel.ToString("0"));
            dictValues["Speed"]      = String.Format("{0}%*{0}% Run speed",
                                                     ((1f + BasicStats.MovementSpeed) * 100f).ToString("0"));
            #endregion
            #region Attributes
            dictValues["Strength"]  = BasicStats.Strength.ToString();
            dictValues["Agility"]   = BasicStats.Agility.ToString();
            dictValues["Stamina"]   = BasicStats.Stamina.ToString();
            dictValues["Intellect"] = BasicStats.Intellect.ToString();
            dictValues["Spirit"]    = BasicStats.Spirit.ToString();
            #endregion
            #region Spell
            #region Spell Power
            s = String.Empty;
            float intPower = BasicStats.Intellect - 10;
            if (BasicStats.InnerFire)
            {
                s += String.Format("\n{0} from Inner Fire", PriestInformation.GetInnerFireSpellPowerBonus(Character));
            }
            activeBuff = GetActiveBuffsByGroup("Spell Power");
            if (activeBuff != null)
            {
                s += makeActiveBuffTextPercent(activeBuff, activeBuff.Stats.BonusSpellPowerMultiplier);
            }
            dictValues["Spell Power"] = String.Format("{0}*{1} from {2} Intellect{3}",
                                                      BasicStats.SpellPower.ToString("0"),
                                                      intPower.ToString("0"),
                                                      BasicStats.Intellect.ToString("0"),
                                                      s
                                                      );
            #endregion
            #region Haste
            s = String.Empty;
            if (Character.PriestTalents.Darkness > 0)
            {
                s += String.Format("\n{0}% from {1} points in Darkness", Character.PriestTalents.Darkness, Character.PriestTalents.Darkness);
            }
            activeBuff = GetActiveBuffsByGroup("Spell Haste");
            if (activeBuff != null)
            {
                s += makeActiveBuffTextPercent(activeBuff, activeBuff.Stats.SpellHaste);
            }
            activeBuff = GetActiveBuffsByGroup("Dark Intent");
            if (activeBuff != null)
            {
                s += makeActiveBuffTextPercent(activeBuff, activeBuff.Stats.SpellHaste);
            }
            dictValues["Haste"] = String.Format("{0}%*{1}% from {2} Haste Rating{3}",
                                                (BasicStats.SpellHaste * 100f).ToString("0.00"),
                                                (StatConversion.GetSpellHasteFromRating(BasicStats.HasteRating) * 100f).ToString("0.00"), BasicStats.HasteRating.ToString("0"),
                                                s
                                                );
            #endregion
            dictValues["Hit"]         = (BasicStats.SpellHit * 100f).ToString("0.00");
            dictValues["Penetration"] = BasicStats.SpellPenetration.ToString("0");
            #region Mana Regen
            float manaRegen = StatConversion.GetSpiritRegenSec(BasicStats.Spirit, BasicStats.Intellect) * 5f;
            s          = String.Format("\n{0} Mana per 5 sec from Base Mana Regeneration", (baseStats.Mana * 0.05f).ToString("0"));
            activeBuff = GetActiveBuffsByGroup("Mana Regeneration");
            if (activeBuff != null)
            {
                s += makeActiveBuffText(activeBuff, activeBuff.Stats.Mp5);
            }
            dictValues["Mana Regen"] = String.Format("{0}*{1} from Spirit based regen{2}",
                                                     (manaRegen + BasicStats.Mp5).ToString("0"),
                                                     manaRegen.ToString("0"),
                                                     s
                                                     );
            dictValues["Combat Regen"] = String.Format("{0}*{1} from Spirit based regen{2}",
                                                       (manaRegen * BasicStats.SpellCombatManaRegeneration + BasicStats.Mp5).ToString("0"),
                                                       (manaRegen * BasicStats.SpellCombatManaRegeneration).ToString("0"),
                                                       s
                                                       );
            #endregion
            #region Crit
            s          = String.Empty;
            activeBuff = GetActiveBuffsByGroup("Critical Strike Chance");
            if (activeBuff != null)
            {
                s += makeActiveBuffTextPercent(activeBuff, activeBuff.Stats.SpellCrit);
            }
            activeBuff = GetActiveBuffsByGroup("Focus Magic, Spell Critical Strike Chance");
            if (activeBuff != null)
            {
                s += makeActiveBuffTextPercent(activeBuff, activeBuff.Stats.SpellCrit);
            }
            dictValues["Crit Chance"] = String.Format("{0}%*{1}% from {2} Crit Rating\n{3}% from {4} Intellect\n{5}% from Priest base{6}",
                                                      (BasicStats.SpellCrit * 100f).ToString("0.00"),
                                                      (StatConversion.GetSpellCritFromRating(BasicStats.CritRating) * 100f).ToString("0.00"), BasicStats.CritRating.ToString("0"),
                                                      (StatConversion.GetSpellCritFromIntellect(BasicStats.Intellect) * 100f).ToString("0.00"), BasicStats.Intellect.ToString("0"),
                                                      (baseStats.SpellCrit * 100f).ToString("0.00"),
                                                      s
                                                      );
            #endregion
            #region Mastery
            s = string.Empty;
            float masteryBase = 0, masteryBonus = 0;
            if (BasicStats.PriestSpec == ePriestSpec.Spec_Disc)
            {
                masteryBase  = PriestInformation.DisciplineMasteryBase;
                masteryBonus = PriestInformation.DisciplineMasteryEffect * 100f;
                s           += String.Format("\n\nEach point of mastery increases the potency of Absorbs by an additional {0}%.", masteryBonus.ToString("0.00"));
            }
            else if (BasicStats.PriestSpec == ePriestSpec.Spec_Holy)
            {
                masteryBase  = PriestInformation.HolyMasteryBase;
                masteryBonus = PriestInformation.HolyMasteryEffect * 100f;
                s           += String.Format("\n\nEach point of mastery provides an additional {0}% healing over 6 sec.", masteryBonus.ToString("0.00"));
            }
            dictValues["Mastery"] = String.Format("{0}%*{1}% from {2} Mastery Rating\n{3}% from {4} Base Mastery{5}",
                                                  ((StatConversion.GetMasteryFromRating(BasicStats.MasteryRating) + masteryBase) * masteryBonus).ToString("0.00"),
                                                  (StatConversion.GetMasteryFromRating(BasicStats.MasteryRating) * masteryBonus).ToString("0.00"), BasicStats.MasteryRating.ToString("0"),
                                                  (masteryBase * masteryBonus).ToString("0.00"), masteryBase.ToString("0"),
                                                  s
                                                  );
            #endregion
            #endregion
            #region Defense
            dictValues["Armor"] = String.Format("{0}*{1}% physical damage reduction from same level target",
                                                BasicStats.Armor.ToString("0"),
                                                (StatConversion.GetDamageReductionFromArmor(Character.Level, BasicStats.Armor) * 100f).ToString("0.00"));
            dictValues["Dodge"]      = String.Format("{0}%", (BasicStats.Dodge * 100f).ToString("0.00"));
            dictValues["Resilience"] = String.Format("{0}*{1}% damage reduction on attacks from other players\n{2}% damage reduction from spells",
                                                     BasicStats.Resilience.ToString("0"),
                                                     (StatConversion.GetDamageReductionFromResilience(BasicStats.Resilience) * 100f).ToString("0.00"),
                                                     (Character.PriestTalents.InnerSanctum * 2f).ToString("0"));
            #endregion
            #region Resistance
            string   resistTxt   = "{0}*PvP\n{1}\n\nBoss\n{2}";
            string[] resistList  = { "Arcane", "Fire", "Frost", "Nature", "Shadow" };
            float[]  resistances = { BasicStats.ArcaneResistance + BasicStats.ArcaneResistanceBuff,
                                     BasicStats.FireResistance + BasicStats.FireResistanceBuff,
                                     BasicStats.FrostResistance + BasicStats.FrostResistanceBuff,
                                     BasicStats.NatureResistance + BasicStats.NatureResistanceBuff,
                                     BasicStats.ShadowResistance + BasicStats.ShadowResistanceBuff };

            for (int x = 0; x < resistList.Length; x++)
            {
                dictValues[resistList[x]] = String.Format(resistTxt,
                                                          resistances[x].ToString("0"),
                                                          StatConversion.GetResistanceTableString(Character.Level, Character.Level, resistances[x], 0f),
                                                          StatConversion.GetResistanceTableString(Character.Level + 3, Character.Level, resistances[x], 0f)
                                                          );
            }
            #endregion
            #region Model
            CalculationOptionsHealPriest calcOpts = Character.CalculationOptions as CalculationOptionsHealPriest;
            if (calcOpts != null)
            {
                PriestSolver solver = PriestModels.GetModel(this, calcOpts, true);
                solver.Solve();
                List <string> reqs = solver.MeetsRequirements();
                string        disp;
                if (reqs.Count > 0)
                {
                    disp = String.Format("{0}\n\n{1}", solver.Name, String.Join("\n", reqs));
                }
                else
                {
                    disp = solver.Name;
                }
                dictValues["Role"]       = disp;
                dictValues["Burst Goal"] = this.BurstGoal.ToString("0");
                dictValues["Sust. Goal"] = this.SustainGoal.ToString("0");
                dictValues["Mana Goal"]  = this.ManaGoal.ToString("0");
                dictValues["Burst"]      = this.BurstPoints.ToString("0");
                dictValues["Sustained"]  = this.SustainPoints.ToString("0");
                dictValues["Mana "]      = this.ManaPoints.ToString("0");
            }
            #endregion
            #region Holy Spells
            SpellHeal spellHeal = new SpellHeal(Character, BasicStats);
            dictValues["Heal"] = String.Format("{0}*{1}", spellHeal.HPS().ToString("0"), spellHeal.ToString());
            SpellGreaterHeal spellGreaterHeal = new SpellGreaterHeal(Character, BasicStats);
            dictValues["Greater Heal"] = String.Format("{0}*{1}", spellGreaterHeal.HPS().ToString("0"), spellGreaterHeal.ToString());
            SpellFlashHeal spellFlashHeal = new SpellFlashHeal(Character, BasicStats);
            dictValues["Flash Heal"] = String.Format("{0}*{1}", spellFlashHeal.HPS().ToString("0"), spellFlashHeal.ToString());
            SpellBindingHeal spellBindingHeal = new SpellBindingHeal(Character, BasicStats);
            dictValues["Binding Heal"] = String.Format("{0}*{1}", spellBindingHeal.HPS().ToString("0"), spellBindingHeal.ToString());
            SpellRenew spellRenew = new SpellRenew(Character, BasicStats);
            dictValues["Renew"] = String.Format("{0}*{1}", spellRenew.HPS().ToString("0"), spellRenew.ToString());
            if (Character.PriestTalents.Lightwell > 0)
            {
                SpellLightwell spellLW = new SpellLightwell(Character, BasicStats);
                dictValues["Lightwell"] = String.Format("{0}*{1}", spellLW.HPS().ToString("0"), spellLW.ToString());
            }
            else
            {
                dictValues["Lightwell"] = "N/A*You do not have the talent required.";
            }
            SpellPrayerOfHealing spellProH = new SpellPrayerOfHealing(Character, BasicStats);
            dictValues["ProH"] = String.Format("{0}*{1}", spellProH.HPS().ToString("0"), spellProH.ToString());
            SpellHolyNova spellHolyNova = new SpellHolyNova(Character, BasicStats);
            dictValues["Holy Nova"] = String.Format("NYI*{1}", spellHolyNova.HPS().ToString("0"), spellHolyNova.ToString());
            if (Character.PriestTalents.CircleOfHealing > 0)
            {
                SpellCircleOfHealing spellCoH = new SpellCircleOfHealing(Character, BasicStats);
                dictValues["CoH"] = String.Format("{0}*{1}", spellCoH.HPS().ToString("0"), spellCoH.ToString());
            }
            else
            {
                dictValues["CoH"] = "N/A*You do not have the talent required.";
            }
            if (BasicStats.PriestSpec == ePriestSpec.Spec_Disc)
            {
                SpellPenance spellPenance = new SpellPenance(Character, BasicStats);
                dictValues["Penance"] = String.Format("{0}*{1}", spellPenance.HPS().ToString("0"), spellPenance.ToString());
            }
            else
            {
                dictValues["Penance"] = "N/A*You do not have the correct Talent specialization.";
            }
            if (Character.PriestTalents.Revelations > 0)
            {
                SpellSerenity spellSerenity = new SpellSerenity(Character, BasicStats);
                dictValues["HW Serenity"] = String.Format("{0}*{1}", spellSerenity.HPS().ToString("0"), spellSerenity.ToString());
                SpellSanctuary spellSanctuary = new SpellSanctuary(Character, BasicStats);
                dictValues["HW Sanctuary"] = String.Format("{0}*{1}", spellSanctuary.HPS().ToString("0"), spellSanctuary.ToString());
            }
            else
            {
                dictValues["HW Serenity"]  = "N/A*You do not have the talent required.";
                dictValues["HW Sanctuary"] = "N/A*You do not have the talent required.";
            }
            SpellPrayerOfMending spellProM = new SpellPrayerOfMending(Character, BasicStats, 1);
            dictValues["ProM"]        = String.Format("{0}*{1}", spellProM.HPS().ToString("0"), spellProM.ToString());
            spellProM                 = new SpellPrayerOfMending(Character, BasicStats);
            dictValues["ProM 5 Hits"] = String.Format("{0}*{1}", spellProM.HPS().ToString("0"), spellProM.ToString());
            SpellPowerWordShield spellPWS = new SpellPowerWordShield(Character, BasicStats);
            dictValues["PWS"] = String.Format("{0}*{1}", spellPWS.HPS().ToString("0"), spellPWS.ToString());
            SpellDivineHymn spellDivineHymn = new SpellDivineHymn(Character, BasicStats);
            dictValues["Divine Hymn"] = String.Format("{0}*{1}", spellDivineHymn.HPS().ToString("0"), spellDivineHymn.ToString());
            if (Character.Race == CharacterRace.Draenei)
            {
                SpellGiftOfTheNaaru spellGoat = new SpellGiftOfTheNaaru(Character, BasicStats);
                dictValues["Gift of the Naaru"] = String.Format("{0}*{1}", spellGoat.HPS().ToString("0"), spellGoat.ToString());
            }
            else
            {
                dictValues["Gift of the Naaru"] = "N/A*You are not a spacegoat!";
            }
            SpellResurrection spellResurrection = new SpellResurrection(Character, BasicStats);
            dictValues["Resurrection"] = String.Format("{0}*{1}", spellResurrection.CastTime.ToString("0.00"), spellResurrection.ToString());
            #endregion
            #region Shadow Spells
            #endregion
            return(dictValues);
        }