Ejemplo n.º 1
0
        private void calculateTalents(DruidTalents druidTalents, CalculationOptionsTree calcOpts)
        {
            extraTicks += 1 * druidTalents.NaturesSplendor;

            manaCostModifier *= 1 - 0.2f * druidTalents.TreeOfLife - 0.03f * druidTalents.Moonglow;
            // 6% chance to get Omen of Clarity...
            manaCostModifier *= 1 - 0.06f * druidTalents.OmenOfClarity;

            periodicTickModifier *=
                (1 + 0.01f * druidTalents.Genesis +
                 0.05f * druidTalents.ImprovedRejuvenation +
                 0.02f * druidTalents.GiftOfNature) *
                (1 + 0.02f * druidTalents.MasterShapeshifter * druidTalents.TreeOfLife) *
                (1 + 0.06f * druidTalents.TreeOfLife);

            coefHoT *=
                (1 + 0.04f * druidTalents.EmpoweredRejuvenation) *
                (1 + 0.01f * druidTalents.Genesis +
                 0.05f * druidTalents.ImprovedRejuvenation +
                 0.02f * druidTalents.GiftOfNature) *
                (1 + 0.02f * druidTalents.MasterShapeshifter * druidTalents.TreeOfLife) *
                (1 + 0.06f * druidTalents.TreeOfLife);

            #region Glyph of Rapid Rejuvenation
            if (druidTalents.GlyphOfRapidRejuvenation)
            {
                hasteTicks = true;
            }
            #endregion
        }
Ejemplo n.º 2
0
        public TreeStats(Character character, Stats stats, KeyValuePair <double, SpecialEffect>[] hasteProcs, double treeOfLifeUptime)
        {
            CalculationOptionsTree opts = character.CalculationOptions as CalculationOptionsTree;

            bool Restoration = (opts != null) ? opts.Restoration : true;

            Haste = new HasteStats(stats, hasteProcs);

            SpellCrit = StatConversion.GetSpellCritFromIntellect(stats.Intellect) + StatConversion.GetSpellCritFromRating(stats.CritRating) + stats.SpellCrit;

            SpellPower = (float)(stats.SpellPower + Math.Max(0f, stats.Intellect - 10));
            // TODO: does nurturing instinct actually work like this?
            SpellPower += character.DruidTalents.NurturingInstinct * 0.5 * stats.Agility;
            SpellPower *= (1 + stats.BonusSpellPowerMultiplier);

            TreeOfLifeUptime = treeOfLifeUptime;
            double mastery = 8.0f + StatConversion.GetMasteryFromRating(stats.MasteryRating);

            if (Restoration)
            {
                Harmony = mastery * 0.0125f;
            }

            SpellsManaCostReduction = stats.SpellsManaCostReduction + stats.NatureSpellsManaCostReduction;
            BonusCritHealMultiplier = stats.BonusCritHealMultiplier;

            PassiveDirectHealBonus   = (Restoration ? 1.25f : 1.0f) + Harmony;
            PassivePeriodicHealBonus = (Restoration ? 1.25f : 1.0f) + opts.HarmonyPeriodicRate * Harmony + 0.02f * character.DruidTalents.Genesis;
            DirectHealMultiplier     = (1 + stats.BonusHealingDoneMultiplier) * (1.0f + character.DruidTalents.MasterShapeshifter * 0.04f) * (1 + TreeOfLifeUptime * 0.15f);
            PeriodicHealMultiplier   = DirectHealMultiplier * (1 + stats.BonusPeriodicHealingMultiplier);
            SpellsManaCostMultiplier = 1 - stats.ManaCostReductionMultiplier;

            Healed = stats.Healed + stats.HealedPerSP * SpellPower;
        }
Ejemplo n.º 3
0
        private void cmbSpellNum_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!loading)
            {
                CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
                int selIx = int.Parse(cmbSpellNum.Text) - 1; // arrays are zero-based

                loading = true;                              // disable updates while changing the spell listBox

                spellList.ClearSelected();

                if (calcOpts.availableSpells[selIx] != null)
                {
                    foreach (String s in calcOpts.availableSpells[selIx])
                    {
                        int ix = spellList.FindStringExact(s);
                        if (ix != -1)
                        {
                            spellList.SetSelected(ix, true);
                        }
                    }
                }

                loading = false;
            }
        }
Ejemplo n.º 4
0
        private void ParseTalentsRejuvenation(Character character, Stats stats)
        {
            CalculationOptionsTree calcOpts = character.CalculationOptions as CalculationOptionsTree;

            HealMultiplier += 0.05f * calcOpts.ImprovedRejuvenation;
            Cost            = (int)(Cost * (1f - 0.03f * calcOpts.Moonglow));
        }
Ejemplo n.º 5
0
        public HealingTouch(Character character, Stats calculatedStats)
        {
            CalculationOptionsTree calcOpts = (CalculationOptionsTree)character.CalculationOptions;

            #region Base Values
            castTimeBeforeHaste = 3f;
            coefDH  = 1.62f;
            minHeal = 3750f;
            maxHeal = 4428f;
            #endregion

            calculateTalents(character.DruidTalents, calcOpts);

            #region Glyph of Healing Touch
            if (character.DruidTalents.GlyphOfHealingTouch)
            {
                castTimeBeforeHaste -= 1.5f;
                manaCostModifier    *= 1 - 0.25f;
                minHeal             *= 1 - 0.5f;
                maxHeal             *= 1 - 0.5f;
                coefDH *= 1 - 0.5f;
            }
            #endregion

            applyStats(calculatedStats);
        }
Ejemplo n.º 6
0
        private void ParseTalentsRegrowth(Character character, Stats stats)
        {
            CalculationOptionsTree calcOpts = character.CalculationOptions as CalculationOptionsTree;

            CritPercent += 10 * calcOpts.ImprovedRegrowth;
            Cost         = (int)(Cost * (1f - 0.03f * calcOpts.Moonglow));
        }
Ejemplo n.º 7
0
        protected void ParseTalents(Character character, Stats stats)
        {
            CritPercent = BaseCritPercent;
            CastTime    = BaseCastTime;
            Range       = BaseRange;

            _character = character;

            CalculationOptionsTree calcOpts = character.CalculationOptions as CalculationOptionsTree;

            PeriodicTicks = BasePeriodicTicks;

            HoTMultiplier  += 0.04f * calcOpts.EmpoweredRejuvenation;
            HealMultiplier += 0.02f * calcOpts.GiftOfNature;

            if (ToLAura)
            {
                Healing += stats.TreeOfLifeAura;
            }

            // The value of average healing for a tree can be debated - passive healing is generally a lot better
            // since you won't have any trouble refreshing HoTs when the buff runs out
            Healing += stats.AverageHeal * calcOpts.AverageHealingScaling;

            if (BasePeriodicTicks > 0 && calcOpts.TreeOfLife == 1)
            {
                Cost = Convert.ToInt32(Cost * 0.8f);
            }

            CastTime = BaseCastTime;
            if (CastTime < 1.5f)
            {
                CastTime = 1.5f;
            }
        }
Ejemplo n.º 8
0
        private void spellList_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!loading)
            {
                CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;

                int selIx = int.Parse(cmbSpellNum.Text) - 1; // arrays are zero-based

                if (spellList.SelectedItems.Count == 0)
                {
                    return;
                }

                String[] spells = new String[spellList.SelectedItems.Count];

                for (int i = 0; i < spells.Length; i++)
                {
                    spells[i] = spellList.SelectedItems[i].ToString();
                }

                calcOpts.availableSpells[selIx] = spells;

                Character.OnItemsChanged();
            }
        }
Ejemplo n.º 9
0
        private void calculateTalents(DruidTalents druidTalents, CalculationOptionsTree calcOpts)
        {
            manaCostModifier *= 1 - (druidTalents.Moonglow * 0.03f + druidTalents.TranquilSpirit * 0.02f);

            castTimeBeforeHaste -= 0.1f * druidTalents.Naturalist;

            extraCritPercent += 2f * druidTalents.NaturesMajesty;

            //Living Seed, 30% seed, 33% * points spend (1/3)
            extraCritModifier = 0.1f * druidTalents.LivingSeed * calcOpts.Current.LivingSeedEfficiency / 100f;

            // 6% chance to get Omen of Clarity...
            manaCostModifier *= 1 - 0.06f * druidTalents.OmenOfClarity;

            minHeal *=
                (1f + 0.02f * druidTalents.GiftOfNature) *
                (1f + 0.02f * druidTalents.MasterShapeshifter * druidTalents.TreeOfLife) *
                (1f + 0.06f * druidTalents.TreeOfLife);

            maxHeal *=
                (1f + 0.02f * druidTalents.GiftOfNature) *
                (1f + 0.02f * druidTalents.MasterShapeshifter * druidTalents.TreeOfLife) *
                (1f + 0.06f * druidTalents.TreeOfLife);

            coefDH += (0.2f * druidTalents.EmpoweredTouch);     // ET is additive from http://elitistjerks.com/f73/t37038-restoration_glyphs/p8/#post1240879

            coefDH *=
                (1f + 0.02f * druidTalents.GiftOfNature) *
                (1f + 0.02f * druidTalents.MasterShapeshifter * druidTalents.TreeOfLife) *
                (1f + 0.06f * druidTalents.TreeOfLife);
        }
Ejemplo n.º 10
0
        public override Stats GetCharacterStats(Character character, Item additionalItem)
        {
            CalculationOptionsTree calcOpts = character.CalculationOptions as CalculationOptionsTree;

            Stats statsRace = character.Race == Character.CharacterRace.NightElf ?
                              new Stats()
            {
                Health    = 3434f,
                Mana      = 2470f,
                Stamina   = 82f,
                Agility   = 75f,
                Intellect = 120f,
                Spirit    = 133f,
                BonusAgilityMultiplier   = 0.01f * calcOpts.SotF,
                BonusIntellectMultiplier = 0.01f * calcOpts.SotF,
                BonusSpiritMultiplier    = 0.01f * calcOpts.SotF,
                BonusStaminaMultiplier   = 0.01f * calcOpts.SotF,
                BonusStrengthMultiplier  = 0.01f * calcOpts.SotF,
            } :
            new Stats()
            {
                Health                   = 3434f,
                Mana                     = 2370f,
                Stamina                  = 85f,
                Agility                  = 64.5f,
                Intellect                = 115f,
                Spirit                   = 135f,
                BonusHealthMultiplier    = 0.05f,
                BonusAgilityMultiplier   = 0.01f * calcOpts.SotF,
                BonusIntellectMultiplier = 0.01f * calcOpts.SotF,
                BonusSpiritMultiplier    = 0.01f * calcOpts.SotF,
                BonusStaminaMultiplier   = 0.01f * calcOpts.SotF,
                BonusStrengthMultiplier  = 0.01f * calcOpts.SotF,
            };

            Stats statsBaseGear = GetItemStats(character, additionalItem);
            Stats statsEnchants = GetEnchantsStats(character);
            Stats statsBuffs    = GetBuffsStats(character.ActiveBuffs);

            Stats statsTotal = statsBaseGear + statsEnchants + statsBuffs + statsRace;

            statsTotal.Agility   = (float)Math.Floor((statsTotal.Agility) * (1 + statsTotal.BonusAgilityMultiplier));
            statsTotal.Stamina   = (float)Math.Floor((statsTotal.Stamina) * (1 + statsTotal.BonusStaminaMultiplier));
            statsTotal.Intellect = (float)Math.Floor((statsTotal.Intellect) * (1 + statsTotal.BonusIntellectMultiplier));
            statsTotal.Intellect = (float)Math.Round((statsTotal.Intellect) * (1 + calcOpts.HotW * 0.04f));
            statsTotal.Spirit    = (float)Math.Floor((statsTotal.Spirit) * (1 + statsTotal.BonusSpiritMultiplier));
            statsTotal.Spirit    = (float)Math.Floor((statsTotal.Spirit) * (1 + calcOpts.LivingSpirit * 0.05f));

            float lunarGuidance = (calcOpts.LunarGuidance == 3 ? 0.25f : calcOpts.LunarGuidance * 0.08f);

            statsTotal.SpellDamageRating = (float)Math.Round(statsTotal.SpellDamageRating + statsTotal.Intellect * lunarGuidance);
            statsTotal.Healing           = (float)Math.Round(statsTotal.Healing + (statsTotal.SpellDamageFromSpiritPercentage * statsTotal.Spirit) + (statsTotal.Intellect * lunarGuidance) + (calcOpts.NurturingInstinct * 0.5f * statsTotal.Agility));
            statsTotal.Mana = statsTotal.Mana + ((statsTotal.Intellect - 20f) * 15f + 20f);

            statsTotal.Health = (float)Math.Round(((statsTotal.Health + (statsTotal.Stamina * 10f)) * (character.Race == Character.CharacterRace.Tauren ? 1.05f : 1f)));
            statsTotal.Mp5   += (float)Math.Floor(statsTotal.Intellect * (calcOpts.Dreamstate > 0 ? calcOpts.Dreamstate * 0.03f + 0.01f : 0f));
            return(statsTotal);
        }
Ejemplo n.º 11
0
        private void ParseTalentsHT(Character character, Stats stats)
        {
            CalculationOptionsTree calcOpts = character.CalculationOptions as CalculationOptionsTree;

            BaseCastTime -= 0.1f * calcOpts.Naturalist;
            Cost          = (int)(Cost * (1f - 0.02f * calcOpts.TranquilSpirit) * (1f - 0.03f * calcOpts.Moonglow));
            // TODO: See if the T6 4-piece bonus applies here or if it needs to be modeled in a different way
            DirectHealingBonusMultiplier += 0.1f * calcOpts.EmpoweredTouch + stats.BonusHealingTouchMultiplier;
        }
Ejemplo n.º 12
0
        public override ICalculationOptionBase DeserializeDataObject(string xml)
        {
            System.Xml.Serialization.XmlSerializer serializer =
                new System.Xml.Serialization.XmlSerializer(typeof(CalculationOptionsTree));
            System.IO.StringReader reader   = new System.IO.StringReader(xml);
            CalculationOptionsTree calcOpts = serializer.Deserialize(reader) as CalculationOptionsTree;

            return(calcOpts);
        }
Ejemplo n.º 13
0
 private void upDownTargetHealth_ValueChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         calcOpts.TargetHealth = (float)upDownTargetHealth.Value;
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 14
0
 private void cmbLength_ValueChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         calcOpts.FightLength = (float)cmbLength.Value;
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 15
0
 private void upDownSurvScalingBelow_ValueChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         calcOpts.SurvScalingBelow = (float)upDownSurvScalingBelow.Value;
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 16
0
 private void upDownInnervate_ValueChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         calcOpts.InnervateDelay = (float)upDownInnervate.Value;
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 17
0
 private void cmbManaTime_ValueChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         calcOpts.ManaPotDelay = (float)cmbManaTime.Value;
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 18
0
 public TreeSolver(Character character, CharacterCalculationsTree calc)
 {
     this.character = character;
     this.calc = calc;
     this.opts = (CalculationOptionsTree)character.CalculationOptions;
     if (opts == null)
         opts = new CalculationOptionsTree();
     
     compute();
 }
Ejemplo n.º 19
0
        private void cmbNumCyclesPerRotation_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!loading)
            {
                CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;

                calcOpts.NumCyclesPerRotation = int.Parse(cmbNumCyclesPerRotation.Text);

                Character.OnItemsChanged();
            }
        }
Ejemplo n.º 20
0
        private void shattAldor_CheckedChanged(object sender, EventArgs e)
        {
            if (!loading && shattAldor.Checked)
            {
                CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;

                calcOpts.ShattrathFaction = "Aldor";

                Character.OnItemsChanged();
            }
        }
Ejemplo n.º 21
0
        private void upDownAvgHeal_ValueChanged(object sender, EventArgs e)
        {
            if (!loading)
            {
                CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;

                calcOpts.AverageHealingScaling = (float)upDownAvgHeal.Value;

                Character.OnItemsChanged();
            }
        }
Ejemplo n.º 22
0
        private void upDownMaxCycleDuration_ValueChanged(object sender, EventArgs e)
        {
            if (!loading)
            {
                CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;

                calcOpts.MaxCycleDuration = (float)upDownMaxCycleDuration.Value;

                Character.OnItemsChanged();
            }
        }
Ejemplo n.º 23
0
        private void chkInnervate_CheckedChanged(object sender, EventArgs e)
        {
            if (!loading)
            {
                CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;

                calcOpts.InnervateSelf = chkInnervate.Checked;

                Character.OnItemsChanged();
            }
        }
Ejemplo n.º 24
0
 public void LoadCalculationOptions()
 {
     _loadingCalculationOptions = true;
     if (Character.CalculationOptions == null)
     {
         Character.CalculationOptions = new CalculationOptionsTree();
     }
     calcOpts = Character.CalculationOptions as CalculationOptionsTree;
     // Model Specific Code
     //
     _loadingCalculationOptions = false;
 }
Ejemplo n.º 25
0
 private void cmbImprovedRegrowth_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         try
         {
             calcOpts.ImprovedRegrowth = int.Parse(cmbImprovedRegrowth.Text);
         }
         catch { }
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 26
0
 private void cmbManaAmt_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         try
         {
             calcOpts.ManaPotAmt = float.Parse(cmbManaAmt.Text);
         }
         catch { }
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 27
0
 private void cmbGiftOfNature_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         try
         {
             calcOpts.GiftOfNature = int.Parse(cmbGiftOfNature.Text);
         }
         catch { }
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 28
0
 private void cmbLivingSpirit_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         try
         {
             calcOpts.LivingSpirit = int.Parse(cmbLivingSpirit.Text);
         }
         catch { }
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 29
0
 private void cmbSurvivalOfTheFittest_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         try
         {
             calcOpts.SotF = int.Parse(cmbSurvivalOfTheFittest.Text);
         }
         catch { }
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 30
0
 private void cmbHeartOfTheWild_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         try
         {
             calcOpts.HotW = int.Parse(cmbHeartOfTheWild.Text);
         }
         catch { }
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 31
0
 private void cmbEmpoweredTouch_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (!loading)
     {
         CalculationOptionsTree calcOpts = Character.CalculationOptions as CalculationOptionsTree;
         try
         {
             calcOpts.EmpoweredTouch = int.Parse(cmbEmpoweredTouch.Text);
         }
         catch { }
         Character.OnItemsChanged();
     }
 }
Ejemplo n.º 32
0
        public Stats GetBuffsStats(Character character, CalculationOptionsTree calcOpts)
        {
            List<Buff> removedBuffs = new List<Buff>();
            List<Buff> addedBuffs = new List<Buff>();

            Stats statsBuffs = GetBuffsStats(character.ActiveBuffs, character.SetBonusCount);

            foreach (Buff b in removedBuffs)
            {
                character.ActiveBuffsAdd(b);
            }
            foreach (Buff b in addedBuffs)
            {
                character.ActiveBuffs.Remove(b);
            }

            return statsBuffs;
        }
Ejemplo n.º 33
0
        public override Stats GetCharacterStats(Character character, Item additionalItem)
        {
            CalculationOptionsTree opts = character.CalculationOptions as CalculationOptionsTree;
            if (opts == null)
                opts = new CalculationOptionsTree();

            Stats stats = new Stats();
            Stats statsBase = BaseStats.GetBaseStats(character.Level, character.Class, character.Race);
            stats.Accumulate(statsBase);
            stats.BaseAgility = statsBase.Agility;

            // Get the gear/enchants/buffs stats loaded in
            stats.Accumulate(GetItemStats(character, additionalItem));
            stats.Accumulate(GetBuffsStats(character, opts));

            // Talented bonus multipliers
            Stats statsTalents = new Stats()
            {
                BonusIntellectMultiplier = (1 + 0.02f * character.DruidTalents.HeartOfTheWild) * (Character.ValidateArmorSpecialization(character, ItemType.Leather) ? 1.05f : 1f) - 1f,
                BonusManaMultiplier = 0.05f * character.DruidTalents.Furor,
                ManaCostReductionMultiplier = character.DruidTalents.Moonglow * 0.03f,
                SpellCrit = 0.02f * character.DruidTalents.NaturesMajesty
            };

            stats.Accumulate(statsTalents);

            FinalizeStats(stats, stats);

            // Derived stats: Health, mana pool, armor
            stats.Health = (float)Math.Round(stats.Health + StatConversion.GetHealthFromStamina(stats.Stamina));
            stats.Health = (float)Math.Floor(stats.Health * (1f + stats.BonusHealthMultiplier));
            stats.Mana = (float)Math.Round(stats.Mana + StatConversion.GetManaFromIntellect(stats.Intellect));
            stats.Mana = (float)Math.Floor(stats.Mana * (1f + stats.BonusManaMultiplier));

            // Armor
            stats.Armor = stats.Armor * (1f + stats.BaseArmorMultiplier);
            stats.BonusArmor = stats.BonusArmor * (1f + stats.BonusArmorMultiplier);
            stats.Armor += stats.BonusArmor;
            stats.Armor = (float)Math.Round(stats.Armor);

            int T13Count;
            character.SetBonusCount.TryGetValue("Deep Earth Vestments", out T13Count);

            if (character.DruidTalents.NaturesGrace > 0)
                stats.AddSpecialEffect(NaturesGrace[character.DruidTalents.NaturesGrace]);

            if (character.DruidTalents.TreeOfLife > 0)
                stats.AddSpecialEffect(TreeOfLife[character.DruidTalents.NaturalShapeshifter]);

            if (T13Count >= 2)
                stats.AddSpecialEffect(T13InnervateManaCostReduction);

            return stats;
        }
 public void LoadCalculationOptions()
 {
     _loadingCalculationOptions = true;
     if (Character.CalculationOptions == null) Character.CalculationOptions = new CalculationOptionsTree();
     calcOpts = Character.CalculationOptions as CalculationOptionsTree;
     // Model Specific Code
     //
     _loadingCalculationOptions = false;
 }