예제 #1
0
        // TODO: Check if we get the correct CR table
        internal static void UpdateCritChance(this Unit unit)
        {
            var chr = unit as Character;

            if (chr != null)
            {
                // Crit chance from crit rating
                var critChance = chr.GetCombatRating(CombatRating.MeleeCritChance) /
                                 GameTables.GetCRTable(CombatRating.MeleeCritChance)[chr.Level - 1];

                var rangedCritChance = chr.GetCombatRating(CombatRating.RangedCritChance) /
                                       GameTables.GetCRTable(CombatRating.RangedCritChance)[chr.Level - 1];

                // Crit chance from agility
                rangedCritChance += ((Character)unit).Archetype.Class.CalculateRangedCritChance(unit.Level, unit.Agility);
                rangedCritChance += unit.IntMods[(int)StatModifierInt.RangedCritChance];

                critChance += ((Character)unit).Archetype.Class.CalculateMeleeCritChance(unit.Level, unit.Agility);
                critChance += unit.GetCritMod(DamageSchool.Physical);

                chr.CritChanceMeleePct   = critChance;
                chr.CritChanceRangedPct  = rangedCritChance;
                chr.CritChanceOffHandPct = critChance;
            }
        }
예제 #2
0
 internal static void UpdateExpertise(this Unit unit)
 {
     if (unit is Character)
     {
         var chr       = unit as Character;
         var expertise = (uint)chr.IntMods[(int)StatModifierInt.Expertise];
         expertise    += (uint)(chr.GetCombatRating(CombatRating.Expertise) / GameTables.GetCRTable(CombatRating.Expertise)[chr.Level - 1]);
         chr.Expertise = expertise;
     }
 }
예제 #3
0
        internal static void UpdateExpertise(this Unit unit)
        {
            if (!(unit is Character))
            {
                return;
            }
            Character character = unit as Character;
            uint      num       = (uint)character.IntMods[23] +
                                  (uint)((double)character.GetCombatRating(CombatRating.Expertise) /
                                         (double)GameTables.GetCRTable(CombatRating.Expertise)[character.Level - 1]);

            character.Expertise = num;
        }
예제 #4
0
        internal static void UpdateSpellCritChance(this Character chr)
        {
            chr.UpdateCritChance();
            for (var school = DamageSchool.Physical + 1; school < DamageSchool.Count; school++)
            {
                var chance = chr.GetCombatRating(CombatRating.SpellCritChance) /
                             GameTables.GetCRTable(CombatRating.SpellCritChance)[chr.Level - 1];
                chance += chr.Archetype.Class.CalculateMagicCritChance(chr.Level, chr.Intellect);
                chance += chr.GetCritMod(school);

                chr.SetCritChance(school, chance);
            }
        }
예제 #5
0
        internal static void UpdateRangedHitChance(this Unit unit)
        {
            float hitChance;

            hitChance = unit.IntMods[(int)StatModifierInt.HitChance];
            if (unit is Character)
            {
                var chr = unit as Character;

                hitChance += chr.GetCombatRating(CombatRating.RangedHitChance) /
                             GameTables.GetCRTable(CombatRating.RangedHitChance)[chr.Level - 1];
                chr.HitChance = hitChance;
            }
        }
예제 #6
0
        /// <summary>
        /// Increases the defense skill according to your defense rating
        /// Updates Dodge and Parry chances
        /// </summary>
        /// <param name="unit"></param>
        internal static void UpdateDefense(this Unit unit)
        {
            var chr = unit as Character;

            if (chr != null)
            {
                var defense = chr.GetCombatRating(CombatRating.DefenseSkill) /
                              GameTables.GetCRTable(CombatRating.DefenseSkill)[chr.Level - 1];

                //chr.Defense = chr.Skills[SkillId.Defense].ActualValue + defense;
                chr.Defense = (uint)defense;
                UpdateDodgeChance(unit);
                UpdateParryChance(unit);
            }
        }
예제 #7
0
        internal static void UpdateDodgeChance(this Unit unit)
        {
            var chr = unit as Character;

            if (chr != null)
            {
                float dodgeChance = 0;
                if (chr.Agility == 0)
                {
                    return;                     // too early
                }
                dodgeChance += (chr.GetCombatRating(CombatRating.Dodge) / GameTables.GetCRTable(CombatRating.Dodge)[chr.Level - 1]);
                dodgeChance += ((Character)unit).Archetype.Class.CalculateDodge(unit.Level, unit.Agility,
                                                                                unit.BaseStats[(int)StatType.Agility],
                                                                                (int)chr.Skills.GetValue(SkillId.Defense),
                                                                                chr.GetCombatRating(CombatRating.Dodge),
                                                                                chr.GetCombatRating(CombatRating.DefenseSkill)
                                                                                );
                dodgeChance    += unit.IntMods[(int)StatModifierInt.DodgeChance];
                chr.DodgeChance = dodgeChance;
            }
        }
예제 #8
0
        internal static void UpdateBlockChance(this Unit unit)
        {
            var chr = unit as Character;

            if (chr == null)
            {
                return;
            }

            var inv = chr.Inventory;

            if (inv == null)
            {
                // called too early
                return;
            }

            var shield      = inv[InventorySlot.OffHand];
            var blockValue  = 0;
            var blockChance = 0f;

            if (shield != null && shield.Template.InventorySlotType == InventorySlotType.Shield)
            {
                blockChance = chr.IntMods[(int)StatModifierInt.BlockChance];

                blockValue = 5 + (int)shield.Template.BlockValue + (int)blockChance;

                // + block from block rating
                blockChance += chr.GetCombatRating(CombatRating.Block) / GameTables.GetCRTable(CombatRating.Block)[chr.Level - 1];
            }

            blockValue += chr.Strength / 2 - 10;
            blockValue  = GetMultiMod(chr.FloatMods[(int)StatModifierFloat.BlockValue], blockValue);

            chr.BlockValue  = (uint)blockValue;
            chr.BlockChance = blockChance;
        }
예제 #9
0
        private static void WriteTable(CombatRating rating, StreamWriter writer)
        {
            var table = GameTables.GetCRTable(rating);

            WriteTable(table, writer);
        }