コード例 #1
0
        /// <summary>
        /// Gets the total Stats of the Character
        /// </summary>
        /// <param name="character">The Character to get the total Stats of</param>
        /// <param name="additionalItem">An additional item to grant the Character the stats of (as if it were worn)</param>
        /// <returns>The total stats for the Character</returns>
        public override Stats GetCharacterStats(Character character, Item additionalItem)
        {
            CalculationOptionsBear calcOpts = character.CalculationOptions as CalculationOptionsBear ?? new CalculationOptionsBear();

            DruidTalents talents = character.DruidTalents;

            bool hasCritBuff = false;
            foreach (Buff buff in character.ActiveBuffs) {
                if (buff.Group == "Critical Strike Chance") {
                    hasCritBuff = true;
                    break;
                }
            }

            StatsBear statsTotal = new StatsBear()
            {
                BonusAttackPowerMultiplier = 0.25f,
                BonusBleedDamageMultiplier = (character.ActiveBuffsContains("Mangle") || character.ActiveBuffsContains("Trauma") ? 0f : 0.3f),

                Dodge = 0.02f * talents.FeralSwiftness + 0.03f * talents.NaturalReaction,
                FurySwipesChance = 0.05f * talents.FurySwipes,
                BonusEnrageDamageMultiplier = 0.05f * talents.KingOfTheJungle,
                HasteOnFeralCharge = 0.15f * talents.Stampede,
                BaseArmorMultiplier = 2.2f * (1f + 0.10f * talents.ThickHide / 3f) * (1f + 0.26f * talents.ThickHide) - 1f,
                CritChanceReduction = 0.02f * talents.ThickHide,
                PhysicalCrit = (hasCritBuff ? 0f : 0.05f * talents.LeaderOfThePack) + (talents.Pulverize > 0 ? 0.09f: 0f),
                SpellCrit = (hasCritBuff ? 0f : 0.05f * talents.LeaderOfThePack),
                BonusPulverizeDuration = 4f * talents.EndlessCarnage,
                DamageTakenReductionMultiplier = 0.09f * talents.NaturalReaction,
                BonusMaulDamageMultiplier = 0.04f * talents.RendAndTear,
                
                BonusStaminaMultiplier = (1f + 0.02f * talents.HeartOfTheWild) * (Character.ValidateArmorSpecialization(character, ItemType.Leather) ? 1.05f : 1f) - 1f,
                BonusPhysicalDamageMultiplier = 0.04f * talents.MasterShapeshifter,
                BonusMangleDamageMultiplier = talents.GlyphOfMangle ? 0.1f : 0f,
                BonusLacerateCritChance = talents.GlyphOfLacerate ? 0.05f : 0f,
                BonusFaerieFireStacks = talents.FeralAggression,
                BerserkDuration = (talents.GlyphOfBerserk ? 10f : 0f),
            };

            #region Set Bonuses
            int PvPCount;
            character.SetBonusCount.TryGetValue("Gladiator's Sanctuary", out PvPCount);
            if (PvPCount >= 2)
            {
                statsTotal.Agility += 70f;
                statsTotal.Resilience += 400f;
            }
            if (PvPCount >= 4)
            {
                // the 15% movement speed is only outdoors which most dungeons are not
                statsTotal.Agility += 90f;
            }
            int T11Count;
            character.SetBonusCount.TryGetValue("Stormrider's Battlegarb", out T11Count);
            if (T11Count >= 2) {
                //statsTotal.BonusDamageMultiplierRakeTick = (1f + statsTotal.BonusDamageMultiplierRakeTick) * (1f + 0.10f) - 1f;
                statsTotal.BonusDamageMultiplierLacerate = (1f + statsTotal.BonusDamageMultiplierLacerate) * (1f + 0.10f) - 1f;
            }
            if (T11Count >= 4)
            {
                /*statsBuffs.AddSpecialEffect(new SpecialEffect(Trigger.MangleCatHit,
                    new Stats() { BonusAttackPowerMultiplier = 0.01f, },
                    30, 0, 1f, 3));*/
                statsTotal.BonusSurvivalInstinctsDurationMultiplier = 0.5f;
            }
            int T12Count;
            character.SetBonusCount.TryGetValue("Obsidian Arborweave Battlegarb", out T12Count);
            if (T12Count >= 2)
            {
                statsTotal.BonusMangleDamageMultiplier = (1f + statsTotal.BonusMangleDamageMultiplier) * (1f + 0.10f) - 1f;
                statsTotal.BonusMaulDamageMultiplier = (1f + statsTotal.BonusMaulDamageMultiplier) * (1f + 0.10f) - 1f;
            }
            if (T12Count >= 4)
            {
                statsTotal.AddSpecialEffect(SpecialEffect4T12);
            }
            
            int T13Count;
            character.SetBonusCount.TryGetValue("Deep Earth Battlegarb", out T13Count);
            if (T13Count >= 2)
            {
                statsTotal.Tier_13_2_piece = true;
            }
            if (T13Count >= 4)
            {
                statsTotal.Tier_13_4_piece = (10f + 25f)/2;
            }
            #endregion

            // Leader of the Pack self-heal
            statsTotal.AddSpecialEffect(LeaderOfThePackSpecialEffect);

            // Survival Instincts
            SpecialEffect SurvivalInstinctsSpecialEffect = new SpecialEffect(Trigger.Use, new Stats() { DamageTakenReductionMultiplier = 0.50f, }, 12f * (1f + statsTotal.BonusSurvivalInstinctsDurationMultiplier), 180f, 1f);
            statsTotal.AddSpecialEffect(SurvivalInstinctsSpecialEffect);

            // Barkskin
            SpecialEffect BarkskinSpecialEffect = new SpecialEffect(Trigger.Use, new Stats() { DamageTakenReductionMultiplier = 0.20f, CritChanceReduction = (talents.GlyphOfBarkskin ? 0.25f : 0f), }, 12f, 60f, 1f);
            statsTotal.AddSpecialEffect(BarkskinSpecialEffect);

            // Frenzied Regeneration
            SpecialEffect FrenziedRegenerationSpecialEffect = new SpecialEffect(Trigger.Use, new Stats() { BonusHealthMultiplier = 0.15f, HealthRestoreFromMaxHealth = (talents.GlyphOfFrenziedRegeneration ? 0f : (0.015f * (1f + statsTotal.Tier_13_4_piece))), HealingReceivedMultiplier = (talents.GlyphOfFrenziedRegeneration ? (0.30f * (1f + statsTotal.Tier_13_4_piece)) : 0f) }, 20f, 180f, 1f);
            statsTotal.AddSpecialEffect(FrenziedRegenerationSpecialEffect);

            // Berserk
            StatsBear tempBear = new StatsBear();
            tempBear.AddSpecialEffect(new SpecialEffect(Trigger.LacerateTick, new StatsBear() { MangleCooldownReduction = 6f, MangleCostReduction = 1f }, float.PositiveInfinity, 0, 0.5f));
            SpecialEffect BerserkSpecialEffect = new SpecialEffect(Trigger.Use, tempBear, 15f + statsTotal.BerserkDuration, 180f, 1f);
            statsTotal.AddSpecialEffect(BerserkSpecialEffect);

            // Enrage
            SpecialEffect EnrageSpecialEffect = new SpecialEffect(Trigger.Use, new StatsBear() { BonusDamageMultiplier = (0.05f * talents.KingOfTheJungle) }, 10f, 60f, 1f);
            statsTotal.AddSpecialEffect(EnrageSpecialEffect);

            statsTotal.Accumulate(BaseStats.GetBaseStats(character.Level, character.Class, character.Race, BaseStats.DruidForm.Bear));
            statsTotal.Accumulate(GetItemStats(character, additionalItem));
            statsTotal.Accumulate(GetBuffsStats(character, calcOpts));

            statsTotal.Stamina = (float)Math.Floor(statsTotal.Stamina * (1f + statsTotal.BonusStaminaMultiplier));
            statsTotal.Strength = (float)Math.Floor(statsTotal.Strength * (1f + statsTotal.BonusStrengthMultiplier));
            statsTotal.Agility = (float)Math.Floor(statsTotal.Agility * (1f + statsTotal.BonusAgilityMultiplier));
            statsTotal.AttackPower += (float)Math.Floor(statsTotal.Strength);
            statsTotal.AttackPower += (float)Math.Floor(statsTotal.Agility - 20f) * 2f + 20f;
            statsTotal.AttackPower = (float)Math.Floor(statsTotal.AttackPower * (1f + statsTotal.BonusAttackPowerMultiplier));
            statsTotal.Health += ((statsTotal.Stamina - 20f) * 14f) + 20f;
            statsTotal.Health *= (1f + statsTotal.BonusHealthMultiplier);
            statsTotal.Armor *= 1f + statsTotal.BaseArmorMultiplier;
            statsTotal.Armor += statsTotal.BonusArmor;
            statsTotal.Armor = (float)Math.Floor(statsTotal.Armor * (1f + statsTotal.BonusArmorMultiplier));
            statsTotal.NatureResistance += statsTotal.NatureResistanceBuff;
            statsTotal.FireResistance += statsTotal.FireResistanceBuff;
            statsTotal.FrostResistance += statsTotal.FrostResistanceBuff;
            statsTotal.ShadowResistance += statsTotal.ShadowResistanceBuff;
            statsTotal.ArcaneResistance += statsTotal.ArcaneResistanceBuff;

            AccumulateProcs(character, statsTotal);

            return statsTotal;
        }