/// <summary> /// Calculates the dodge amount for the class at a specific level and Agility. /// TODO: Find the constant that can be used to get 1 agi = X % dodge (diminishing returns) /// http://wowwiki.com/Dodge /// </summary> /// <param name="level">the player's level</param> /// <param name="agility">the player's Agility</param> /// <returns>the total dodge amount</returns> public virtual float CalculateDodge(int level, int agility, int baseAgility, int defenseSkill, int dodgeRating, int defenseRating) { var dodge = GameTables.BaseDodge[(int)Id] + agility * GameTables.BaseMeleeCritChance[(int)Id - 1]; dodge += GameTables.GetUnModifiedClassMeleeCritChanceValue(level, Id) / GameTables.CritAgiMod[(int)Id]; return(dodge); // Diminished dodge (by level) prototype /* * //Not correct because CritAgiMod is scales per level * var baseDodge = baseAgility / (1f / (GameTables.BaseMeleeCritChance[(int)Id] * GameTables.CritAgiMod[(int)Id - 1])) + (defenseSkill - level * 5) * 0.04f; * var dodgeFromGearAgi = (agility - baseAgility) / GameTables.BaseMeleeCritChance[(int)Id - 1] * GameTables.CritAgiMod[(int)Id]; * var dodgeFromRating = dodgeRating / GameTables.GetCRTable(CombatRating.Dodge)[level - 1]; * var dodgeFromDef = defenseRating / GameTables.GetCRTable(CombatRating.DefenseSkill)[level - 1] * 0.04f; * * var preDiminishedDodge = dodgeFromDef + dodgeFromGearAgi + dodgeFromRating; * var diminishedDodge = (preDiminishedDodge * GameTables.StatCap[(int)Id]) / * (preDiminishedDodge + * GameTables.DiminisherConstant[(int)Id] * GameTables.StatCap[(int)Id]); * dodge += baseDodge + diminishedDodge; * //return dodge; * * var aAgi = agility - baseAgility; */ }
/// <summary> /// TODO: Ranged Crit Chance /// http://www.wowwiki.com/Formulas:Critical_hit_chance /// http://www.wowwiki.com/Formulas:Agility /// </summary> public float CalculateRangedCritChance(int level, int agility) { var baseCrit = GameTables.BaseMeleeCritChance[((int)Id) - 1] * 100; var critFromAgi = agility / (GameTables.GetClassMeleeCritChanceValue(level, Id)); var crit = baseCrit + critFromAgi; return(crit > 5 ? crit : 5); // Naked crit is always at least 5% }
/// <summary> /// Calculates the magic critical chance for the class at a specific level, base Intellect and added Intellect. /// </summary> /// <param name="level">the player's level</param> /// <returns>the total magic critical chance</returns> public virtual float CalculateMagicCritChance(int level, int intellect) { //if(level == 80) //{ // return (float) (((intellect / 166.6667) + classConstant) + (critRating/45.91)); //} //return (intellect/80f); var critBase = GameTables.BaseSpellCritChance[(int)Id - 1] * 100; var critMod = GameTables.GetClassSpellCritChanceValue(level, Id); return(critBase + intellect / critMod); }
/// <summary> /// Calculates the parry chance from parry rating. /// </summary> /// <param name="level"></param> /// <param name="parryRating"></param> /// <param name="str">Strength, used for DKs</param> /// <returns></returns> public virtual float CalculateParry(int level, int parryRating, int str) { return(parryRating / GameTables.GetCRTable(CombatRating.Parry)[level - 1]); }