public static Stats GetBaseStats(int level, CharacterClass characterClass, CharacterRace characterRace, DruidForm characterForm) { // Health, Mana and some other things are same for every race. lock (syncLock) { #region Cache if (level == _lastLevel && characterClass == _lastClass && characterRace == _lastRace && characterForm == _lastForm) { return(_lastStats.Clone()); } _lastLevel = level; _lastClass = characterClass; _lastRace = characterRace; _lastForm = characterForm; #endregion Stats S = new Stats(); #region Race, not class benefit // Most Level 85 Race and Class Stats come from: // http://code.google.com/p/simulationcraft/source/browse/branches/cataclysm/engine/sc_rating.cpp?r=6207 // When they were still at 80 as of Jan 01st, 2011 // From SimCraft Stats race = new Stats(); switch (characterRace) { // Alliance case CharacterRace.Human: race.Strength = 20; race.Agility = 20; race.Stamina = 20; race.Intellect = 20; race.Spirit = 20; break; case CharacterRace.Dwarf: race.Strength = 25; race.Agility = 16; race.Stamina = 21; race.Intellect = 19; race.Spirit = 19; break; case CharacterRace.NightElf: race.Strength = 16; race.Agility = 24; race.Stamina = 20; race.Intellect = 20; race.Spirit = 20; break; case CharacterRace.Gnome: race.Strength = 15; race.Agility = 22; race.Stamina = 20; race.Intellect = 24; race.Spirit = 20; break; case CharacterRace.Draenei: race.Strength = 21; race.Agility = 17; race.Stamina = 20; race.Intellect = 20; race.Spirit = 22; break; case CharacterRace.Worgen: race.Strength = 23; race.Agility = 22; race.Stamina = 20; race.Intellect = 16; race.Spirit = 19; break; // Horde case CharacterRace.Orc: race.Strength = 23; race.Agility = 17; race.Stamina = 21; race.Intellect = 17; race.Spirit = 22; break; case CharacterRace.Undead: race.Strength = 19; race.Agility = 18; race.Stamina = 20; race.Intellect = 18; race.Spirit = 25; break; case CharacterRace.Tauren: race.Strength = 25; race.Agility = 16; race.Stamina = 21; race.Intellect = 16; race.Spirit = 22; break; case CharacterRace.Troll: race.Strength = 21; race.Agility = 22; race.Stamina = 20; race.Intellect = 16; race.Spirit = 21; break; case CharacterRace.BloodElf: race.Strength = 17; race.Agility = 22; race.Stamina = 20; race.Intellect = 23; race.Spirit = 18; break; case CharacterRace.Goblin: race.Strength = 17; race.Agility = 22; race.Stamina = 20; race.Intellect = 23; race.Spirit = 20; break; default: { break; } } ; // From Chardev (85) //Class Str Agi Sta Int Spi //Druid 76 69 86 136 153 //Shaman 111 60 128 119 136 //Death Knight 171 101 154 16 44 //Hunter 60 178 119 77 88 //Mage 17 26 43 187 175 //Paladin 144 77 136 86 97 //Priest 26 34 51 188 183 //Rogue 102 186 94 26 53 //Warlock 43 51 76 161 166 //Warrior 169 103 153 17 44 #endregion #region Base Stats #region All Classes S.Miss = 0.05f; S.Block = 0.00f; S.Parry = 0.00f; #endregion switch (characterClass) { #region Death Knight case CharacterClass.DeathKnight: Stats dk = new Stats() { Strength = 171, Agility = 101, Stamina = 274, Intellect = 16, Spirit = 44, Health = 43025f, Dodge = 0.05f, Parry = 0.05f, Block = 0.00f, PhysicalCrit = 0.0049f, AttackPower = 595f, }; S.Accumulate(race); S.Accumulate(dk); break; #endregion #region Druid case CharacterClass.Druid: Stats druid = new Stats() { Strength = 76, Agility = 69, Stamina = 86, Intellect = 136, Spirit = 153, Health = 39533f, Mana = 18635f, Dodge = 0.03758f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.03192f, AttackPower = 613f, SpellCrit = 0.0185f, Mp5 = 931f, }; S.Accumulate(race); S.Accumulate(druid); switch (characterForm) { case DruidForm.Moonkin: case DruidForm.Caster: S.AttackPower = -10; S.PhysicalCrit = 0.0743f; S.Dodge = 0.0556970f; //?? break; case DruidForm.Bear: S.AttackPower = 255; S.PhysicalCrit = 0.074755f; S.Dodge = 0.0556970f; S.BonusStaminaMultiplier = 0.2f; break; case DruidForm.Cat: S.AttackPower = 235; S.PhysicalCrit = 0.074755f; S.Dodge = 0.0556970f; break; default: break; } break; #endregion #region Hunter case CharacterClass.Hunter: Stats hun = new Stats() { // Stats updated 8/19/2011 4.2 w/ Troll Hunter: Tsevon @ US-Dragonmaw w/ no spec. Strength = 60, Agility = 178, Stamina = 119, Intellect = 77, Spirit = 88, Health = 39037, Dodge = 0.03758f, Parry = 0.05f, // This assumes ALL AP from full AP += AGI * 2 // So naked Hunter has 31 AP un accounted for. // Naked troll, no gear, no spec, LW & Skinning. PhysicalCrit = 0, AttackPower = 31f, RangedAttackPower = 31f, }; S.Accumulate(race); S.Accumulate(hun); break; #endregion #region Mage case CharacterClass.Mage: Stats mag = new Stats() { Strength = 17, Agility = 26, Stamina = 43, Intellect = 187, Spirit = 175, Health = 36853f, Mana = 17138f, Dodge = 0.03758f, Parry = 0.05f, }; S.Accumulate(race); S.Accumulate(mag); break; #endregion #region Paladin case CharacterClass.Paladin: Stats pal = new Stats() { Strength = 144, Agility = 77, Stamina = 136, Intellect = 86, Spirit = 97, Health = 43285f, Mana = 23422, Dodge = 0.05f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.00652f, AttackPower = 235f, SpellCrit = 0.033355f, }; S.Accumulate(race); S.Accumulate(pal); break; #endregion #region Priest case CharacterClass.Priest: // added adjustments to the base race here because the math using the previous stats // just don't work for the in game calculations on priest tests. // also unsure how these changes would effect other modules if moved up. // adding or subracting from the priest stats don't work and throws all other class // calculations off. switch (characterRace) { case CharacterRace.Human: race.Spirit = 19; break; case CharacterRace.Gnome: race.Intellect = 23; break; case CharacterRace.Goblin: race.Spirit = 18; break; } Stats pri = new Stats() { Strength = 26, Agility = 34, Stamina = 51, Intellect = 169, Spirit = 178, Health = 43285f, Mana = 20590f, Dodge = 0.0337780f, Parry = 0.05f, PhysicalCrit = 0.027f, SpellCrit = 0.012375f, }; pri.Mp5 = pri.Mana * 0.05f; // Always 5% of base mana in regen. S.Accumulate(race); S.Accumulate(pri); break; #endregion #region Rogue case CharacterClass.Rogue: Stats rog = new Stats() { Strength = 102, Agility = 186, Stamina = 94, Intellect = 26, Spirit = 53, Health = 40529f, Dodge = 0.03758f, Parry = 0.05f, PhysicalCrit = 0.03192f, AttackPower = 613f, }; S.Accumulate(race); S.Accumulate(rog); break; #endregion #region Shaman case CharacterClass.Shaman: Stats sha = new Stats() { Strength = 111, Agility = 60, Stamina = 128, Intellect = 119, Spirit = 136, Health = 37037f, Mana = 23430f, Dodge = 0.0193f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.02910375f, AttackPower = 140f, SpellCrit = 0.022057f, SpellPower = -10, }; S.Accumulate(race); S.Accumulate(sha); break; #endregion #region Warlock case CharacterClass.Warlock: Stats warlock = new Stats() { Strength = 43, Agility = 51, Stamina = 76, Intellect = 153, Spirit = 161, Health = 38184f, Mana = 20553f, Dodge = 0.0238110f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.026219999417663f, SpellCrit = 0.017000000923872f, }; S.Accumulate(race); S.Accumulate(warlock); break; #endregion #region Warrior case CharacterClass.Warrior: Stats war = new Stats() { Strength = 169, Agility = 103, Stamina = 153, Intellect = 17, Spirit = 44, Health = 43285f, Dodge = 0.05f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.03192f, AttackPower = 613f, }; S.Accumulate(race); S.Accumulate(war); break; #endregion #region No Class default: break; #endregion } #endregion #region Racials // Resistance do not stack with other buffs. Until then I'll commenting them out if (characterRace == CharacterRace.Gnome) //CATA: changed from 5% int to 5% mana { // S.ArcaneResistance += 85f; S.BonusManaMultiplier = 0.05f; //S.BonusIntellectMultiplier = 0.05f; } else if (characterRace == CharacterRace.Human) { S.BonusSpiritMultiplier = 0.03f; // Patch 4.0.6+ changed from a 3 minute cooldown to 2 minute cooldown S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { PVPTrinket = 1 }, 0f, 120f)); } else if (characterRace == CharacterRace.NightElf) { // S.NatureResistance += 85f; S.Miss += 0.02f; } else if (characterRace == CharacterRace.Dwarf) { // S.FrostResistance += 85f; // Armor +10% for 8 Sec. S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { BaseArmorMultiplier = .1f }, 8, 120)); // TODO: Add debuff removal. Doesn't work on all bosses so not sure if we want to. } else if (characterRace == CharacterRace.Draenei) { // S.ArcaneResistance += 85f; S.SpellHit += 0.01f; S.PhysicalHit += 0.01f; // Patch 4.0.6+ changed from a scaling Health restore to a flat 20% of max health S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { HealthRestoreFromMaxHealth = 0.2f / 15f }, 15f, 180f)); } else if (characterRace == CharacterRace.Worgen) { // S.NatureResistance = 64f; // S.ShadowResistance = 64f; // Patch 4.0.6+ Darkflight changed from a 3 minute CD to a 2 minute CD S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { MovementSpeed = 0.40f }, 10f, 120f)); S.PhysicalCrit += 0.01f; S.SpellCrit += 0.01f; } else if (characterRace == CharacterRace.Tauren) { // S.NatureResistance = 85f; S.Health = (float)Math.Floor(S.Health * 1.05f); } else if (characterRace == CharacterRace.Troll) { S.SnareRootDurReduc = .15f; if (characterClass == CharacterClass.DeathKnight || characterClass == CharacterClass.Warrior || characterClass == CharacterClass.Rogue) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { PhysicalHaste = 0.2f }, 10f, 180f)); } else { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { SpellHaste = 0.2f, PhysicalHaste = 0.2f }, 10f, 180f)); } } else if (characterRace == CharacterRace.Undead) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { FearDurReduc = 1f }, .1f, 120f)); } else if (characterRace == CharacterRace.Orc) { S.StunDurReduc = 0.15f; if (characterClass == CharacterClass.Shaman) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { AttackPower = 65 + (level * 13), SpellPower = 75 + (level * 6) }, 15f, 120f)); } else if (characterClass == CharacterClass.Warlock || characterClass == CharacterClass.Mage) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { SpellPower = 75 + (level * 6) }, 15f, 120f)); } else { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { AttackPower = 65 + (level * 13) }, 15f, 120f)); } } else if (characterRace == CharacterRace.BloodElf) { // S.ArcaneResistance += 85f; if (characterClass == CharacterClass.DeathKnight || characterClass == CharacterClass.Rogue || characterClass == CharacterClass.Hunter) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { ManaorEquivRestore = .15f }, 0f, 120f)); } else if (characterClass == CharacterClass.Warrior) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { BonusRageGen = 15f }, 0f, 120f)); } else { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { ManaorEquivRestore = .06f }, 0f, 120f)); } } else if (characterRace == CharacterRace.Goblin) { S.PhysicalHaste += 0.01f; S.SpellHaste += 0.01f; // TODO: The damage of the rocket belt proc is dependent on the character's current AP and SP S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { FireDamage = 1f + (level * 2) }, 0f, 120f)); } else if (characterRace == CharacterRace.PandarenAlliance || characterRace == CharacterRace.PandarenHorde) { } #endregion _lastStats = S.Clone(); return(S); } }
public static Stats GetBaseStats(int level, CharacterClass characterClass, CharacterRace characterRace, DruidForm characterForm) { // Health, Mana and some other things are same for every race. lock (syncLock) { #region Cache if (level == _lastLevel && characterClass == _lastClass && characterRace == _lastRace && characterForm == _lastForm) { return(_lastStats.Clone()); } _lastLevel = level; _lastClass = characterClass; _lastRace = characterRace; _lastForm = characterForm; #endregion Stats S = new Stats(); #region Base Stats #region All Classes S.Miss = 0.05f; S.Block = 0.0f; S.Parry = 0.0f; #endregion switch (characterClass) { #region Death Knight case CharacterClass.DeathKnight: // Blood Elf, Draenei, Dwarf, Gnome, Human, Night Elf, Orc, Tauren, Troll, Undead S.Mana = 0; S.Health = 8121; S.Armor = 0; S.AttackPower = 220; S.PhysicalCrit = 0.0319f; S.Dodge = 0.0362500f; S.Parry = 0.05f; S.SpellPower = 0; S.SpellCrit = 0.0f; switch (characterRace) { case CharacterRace.BloodElf: S.Strength = 172; S.Agility = 114; S.Stamina = 158; S.Intellect = 39; S.Spirit = 58; break; case CharacterRace.Draenei: S.Strength = 176; S.Agility = 109; S.Stamina = 162; S.Intellect = 36; S.Spirit = 61; break; case CharacterRace.Dwarf: S.Strength = 177; S.Agility = 108; S.Stamina = 163; S.Intellect = 34; S.Spirit = 58; break; case CharacterRace.Gnome: S.Strength = 170; S.Agility = 115; S.Stamina = 159; S.Intellect = 37; // 39/1.05 = 37.14 ~37 S.Spirit = 59; break; case CharacterRace.Human: S.Strength = 175; S.Agility = 112; S.Stamina = 160; S.Intellect = 35; S.Spirit = 58; // 60/1.03 = 58.25 ~58. break; case CharacterRace.NightElf: S.Strength = 172; S.Agility = 117; S.Stamina = 159; S.Intellect = 35; S.Spirit = 59; break; case CharacterRace.Orc: S.Strength = 178; S.Agility = 109; S.Stamina = 162; S.Intellect = 32; S.Spirit = 62; break; case CharacterRace.Tauren: S.Strength = 180; S.Agility = 107; S.Stamina = 162; S.Intellect = 30; S.Spirit = 61; break; case CharacterRace.Troll: S.Strength = 176; S.Agility = 114; S.Stamina = 165; S.Intellect = 31; S.Spirit = 60; break; case CharacterRace.Undead: S.Strength = 174; S.Agility = 110; S.Stamina = 161; S.Intellect = 33; S.Spirit = 64; break; default: break; } break; #endregion #region Druid case CharacterClass.Druid: // NightElf, Tauren S.Mana = 3496; S.Health = 7417; S.Armor = 0; S.SpellPower = 0; S.SpellCrit = 0.0185f; switch (characterForm) { case DruidForm.Moonkin: case DruidForm.Caster: S.AttackPower = -10; S.PhysicalCrit = 0.0743f; S.Dodge = 0.0556970f; //?? break; case DruidForm.Bear: S.AttackPower = 220; S.PhysicalCrit = 0.05f; S.Dodge = 0.0556970f; S.BonusStaminaMultiplier = 0.25f; break; case DruidForm.Cat: S.AttackPower = 140; S.PhysicalCrit = 0.07476f; S.Dodge = 0.0556970f; break; default: break; } if (characterRace == CharacterRace.NightElf) { S.Strength = 85; S.Agility = 86; S.Stamina = 97; S.Intellect = 143; S.Spirit = 159; } else if (characterRace == CharacterRace.Tauren) { S.Strength = 94; S.Agility = 77; S.Stamina = 100; S.Intellect = 140; S.Spirit = 185; } break; #endregion #region Hunter case CharacterClass.Hunter: // Blood Elf, Draenei, Dwarf, Night Elf, Orc, Tauren, Troll S.Mana = 5046; S.Armor = 0; S.AttackPower = 140; S.RangedAttackPower = 150; S.PhysicalCrit = -0.0153f; S.Dodge = -0.0412730f; S.Parry = 0.05f; S.SpellPower = 0; S.SpellCrit = 0.0360f; switch (characterRace) { case CharacterRace.BloodElf: S.Strength = 71; S.Agility = 183; S.Stamina = 126; S.Intellect = 94; S.Spirit = 96; S.Health = 7324; break; case CharacterRace.Draenei: S.Strength = 75; S.Agility = 178; S.Stamina = 129; S.Intellect = 91; S.Spirit = 99; S.Health = 7400; break; case CharacterRace.Dwarf: S.Strength = 76; S.Agility = 177; S.Stamina = 131; S.Intellect = 89; S.Spirit = 96; S.Health = 7412; break; case CharacterRace.NightElf: S.Strength = 71; S.Agility = 184; S.Stamina = 127; S.Intellect = 90; S.Spirit = 97; S.Health = 7324; break; case CharacterRace.Orc: S.Strength = 77; S.Agility = 178; S.Stamina = 130; S.Intellect = 87; S.Spirit = 100; S.Health = 7324; break; case CharacterRace.Tauren: S.Strength = 79; S.Agility = 176; S.Stamina = 130; S.Intellect = 85; S.Spirit = 99; S.Health = 7400; break; case CharacterRace.Troll: S.Strength = 75; S.Agility = 183; S.Stamina = 129; S.Intellect = 86; S.Spirit = 98; S.Health = 7324; break; default: break; } break; #endregion #region Mage case CharacterClass.Mage: // Blood Elf, Draenei, Gnome, Human, Troll, Undead S.Mana = 3268; S.Health = 6963; S.Armor = 0; S.AttackPower = -10; S.PhysicalCrit = 0.03f; S.Dodge = 0.0361870f; S.SpellPower = 0; S.SpellCrit = 0.0091f; switch (characterRace) { case CharacterRace.BloodElf: S.Strength = 33; S.Agility = 45; S.Stamina = 57; S.Intellect = 185; S.Spirit = 173; break; case CharacterRace.Draenei: S.Strength = 37; S.Agility = 40; S.Stamina = 58; S.Intellect = 182; S.Spirit = 176; break; case CharacterRace.Gnome: S.Strength = 31; S.Agility = 46; S.Stamina = 58; S.Intellect = 184; // 193/1.05 = 183.8 ~184. S.Spirit = 174; break; case CharacterRace.Human: S.Strength = 36; S.Agility = 43; S.Stamina = 59; S.Intellect = 181; S.Spirit = 174; // 179/1.03 = 173.8 ~174 break; case CharacterRace.Troll: S.Strength = 37; S.Agility = 45; S.Stamina = 60; S.Intellect = 177; S.Spirit = 175; break; case CharacterRace.Undead: S.Strength = 35; S.Agility = 41; S.Stamina = 60; S.Intellect = 179; S.Spirit = 179; break; default: break; } break; #endregion #region Paladin case CharacterClass.Paladin: // Blood Elf, Draenei, Dwarf, Human S.Mana = 4394; S.Health = 6934; S.Armor = 0; S.AttackPower = 240; S.PhysicalCrit = 0.0327f; S.SpellPower = 0; S.SpellCrit = 0.03336f; S.Dodge = 0.0349430f; S.Parry = 0.05f; S.Block = 0.05f; S.Defense = 400.0f; switch (characterRace) { case CharacterRace.BloodElf: S.Strength = 148; S.Agility = 92; S.Stamina = 143; S.Intellect = 101; S.Spirit = 103; break; case CharacterRace.Draenei: S.Strength = 152; S.Agility = 87; S.Stamina = 143; S.Intellect = 98; S.Spirit = 107; break; case CharacterRace.Dwarf: S.Strength = 153; S.Agility = 86; S.Stamina = 146; S.Intellect = 97; S.Spirit = 104; break; case CharacterRace.Human: S.Strength = 151; S.Agility = 90; S.Stamina = 143; S.Intellect = 98; S.Spirit = 108; break; default: break; } break; #endregion #region Priest case CharacterClass.Priest: // Blood Elf, Draenei, Dwarf, Human, Night Elf, Troll, Undead S.Mana = 3863; S.Health = 6960; S.Armor = 0; S.AttackPower = -10; S.PhysicalCrit = 0.027f; S.Dodge = 0.0337780f; S.SpellPower = 0; S.SpellCrit = 0.0124f; switch (characterRace) { case CharacterRace.BloodElf: S.Strength = 40; S.Agility = 53; S.Stamina = 65; S.Intellect = 178; S.Spirit = 180; break; case CharacterRace.Draenei: S.Strength = 44; S.Agility = 48; S.Stamina = 66; S.Intellect = 175; S.Spirit = 183; break; case CharacterRace.Dwarf: S.Strength = 45; S.Agility = 47; S.Stamina = 70; S.Intellect = 176; S.Spirit = 180; break; case CharacterRace.Human: S.Strength = 43; S.Agility = 51; S.Stamina = 67; S.Intellect = 174; S.Spirit = 181; // 186/1.03 = 180.5->181 break; case CharacterRace.NightElf: S.Strength = 40; S.Agility = 56; S.Stamina = 66; S.Intellect = 174; S.Spirit = 181; break; case CharacterRace.Troll: S.Strength = 44; S.Agility = 53; S.Stamina = 68; S.Intellect = 170; S.Spirit = 182; break; case CharacterRace.Undead: S.Strength = 42; S.Agility = 49; S.Stamina = 68; S.Intellect = 172; S.Spirit = 186; break; default: break; } break; #endregion #region Rogue case CharacterClass.Rogue: // Blood Elf, Dwarf, Gnome, Human, Night Elf, Orc, Troll, Undead S.Mana = 0; S.Health = 7604; S.Armor = 0; S.AttackPower = 140; S.PhysicalCrit = -0.00295f; S.Dodge = 0.0205570f; S.Parry = 0.05f; S.SpellPower = 0; S.SpellCrit = 0f; switch (characterRace) { case CharacterRace.BloodElf: S.Strength = 110; S.Agility = 191; S.Stamina = 103; S.Intellect = 47; S.Spirit = 66; break; case CharacterRace.Dwarf: S.Strength = 115; S.Agility = 185; S.Stamina = 108; S.Intellect = 42; S.Spirit = 66; break; case CharacterRace.Gnome: S.Strength = 108; S.Agility = 192; S.Stamina = 104; S.Intellect = 46; // 48/1.05 = 45.71 ~46 S.Spirit = 67; break; case CharacterRace.Human: S.Strength = 113; S.Agility = 189; S.Stamina = 105; S.Intellect = 43; S.Spirit = 67; // 69/1.03 = 66.99 ~67 break; case CharacterRace.NightElf: S.Strength = 110; S.Agility = 194; S.Stamina = 104; S.Intellect = 43; S.Spirit = 67; break; case CharacterRace.Orc: S.Strength = 116; S.Agility = 186; S.Stamina = 107; S.Intellect = 40; S.Spirit = 70; break; case CharacterRace.Troll: S.Strength = 114; S.Agility = 191; S.Stamina = 108; S.Intellect = 39; S.Spirit = 68; break; case CharacterRace.Undead: S.Strength = 112; S.Agility = 187; S.Stamina = 105; S.Intellect = 41; S.Spirit = 72; break; default: break; } break; #endregion #region Shaman case CharacterClass.Shaman: // Draenei, Orc, Tauren, Troll S.Mana = 4396; S.Health = 6960; S.Armor = 0; S.AttackPower = 140; S.PhysicalCrit = 0.0292f; S.Dodge = 0.0206800f; S.Block = 0.05f; S.SpellPower = 0; S.SpellCrit = 0.022f; switch (characterRace) { case CharacterRace.Draenei: S.Strength = 121; S.Agility = 71; S.Stamina = 136; S.Intellect = 128; S.Spirit = 145; break; case CharacterRace.Orc: S.Strength = 123; S.Agility = 71; S.Stamina = 137; S.Intellect = 125; S.Spirit = 145; break; case CharacterRace.Tauren: S.Strength = 125; S.Agility = 70; S.Stamina = 137; S.Intellect = 124; S.Spirit = 145; break; case CharacterRace.Troll: S.Strength = 121; S.Agility = 76; S.Stamina = 137; S.Intellect = 124; S.Spirit = 144; break; default: break; } break; #endregion #region Warlock case CharacterClass.Warlock: // Blood Elf, Gnome, Human, Orc, Undead S.Mana = 3856; S.Health = 7164; S.Armor = 0; S.AttackPower = -10; S.PhysicalCrit = 0.028f; S.Dodge = 0.0238110f; S.SpellPower = 0; S.SpellCrit = 0.01701f; switch (characterRace) { case CharacterRace.BloodElf: S.Strength = 56; S.Agility = 69; S.Stamina = 87; S.Intellect = 163; S.Spirit = 165; break; case CharacterRace.Gnome: S.Strength = 54; S.Agility = 70; S.Stamina = 88; S.Intellect = 162; // 170/1.05 = 161.9 ~162 S.Spirit = 166; break; case CharacterRace.Human: S.Strength = 59; S.Agility = 67; S.Stamina = 89; S.Intellect = 159; S.Spirit = 165; // 170/1.03 = 165.05 ~165 break; case CharacterRace.Orc: S.Strength = 62; S.Agility = 64; S.Stamina = 91; S.Intellect = 156; S.Spirit = 169; break; case CharacterRace.Undead: S.Strength = 58; S.Agility = 65; S.Stamina = 90; S.Intellect = 157; S.Spirit = 171; break; default: break; } break; #endregion #region Warrior case CharacterClass.Warrior: // Draenei, Dwarf, Gnome, Human, Night Elf, Orc, Tauren, Troll, Undead S.Mana = 0f; S.Health = 8121f; S.Armor = 0f; S.AttackPower = 220f; S.PhysicalCrit = 0.03192f; // This + the base agi makes 4.88% S.Dodge = 0.03664f; S.Parry = 0.05f; S.Block = 0.05f; S.SpellPower = 0f; S.SpellCrit = 0.0f; S.Defense = 400.0f; switch (characterRace) { case CharacterRace.Draenei: S.Strength = 182; S.Agility = 110; S.Stamina = 166; S.Intellect = 37; S.Spirit = 61; break; case CharacterRace.Dwarf: S.Strength = 176; S.Agility = 109; S.Stamina = 162; S.Intellect = 35; S.Spirit = 58; break; case CharacterRace.Gnome: S.Strength = 169; S.Agility = 116; S.Stamina = 158; S.Intellect = 38; // 40/1.05 = 38.095 ~38. S.Spirit = 59; break; case CharacterRace.Human: S.Strength = 174f; S.Agility = 113f; S.Stamina = 159f; S.Intellect = 36f; S.Spirit = 58f; // 60/1.03 = 58.25 ~58 break; case CharacterRace.NightElf: S.Strength = 171; S.Agility = 118; S.Stamina = 158; S.Intellect = 36; S.Spirit = 59; break; case CharacterRace.Orc: S.Strength = 177; S.Agility = 110; S.Stamina = 161; S.Intellect = 33; S.Spirit = 62; break; case CharacterRace.Tauren: S.Strength = 179; S.Agility = 109; S.Stamina = 161; S.Intellect = 31; S.Spirit = 61; break; case CharacterRace.Troll: S.Strength = 185; S.Agility = 115; S.Stamina = 162; S.Intellect = 32; S.Spirit = 60; break; case CharacterRace.Undead: S.Strength = 183; S.Agility = 111; S.Stamina = 169; S.Intellect = 34; S.Spirit = 64; break; default: break; } break; #endregion #region No Class default: break; #endregion } #endregion #region Racials if (characterRace == CharacterRace.Gnome) { S.BonusIntellectMultiplier = 0.05f; } else if (characterRace == CharacterRace.Human) { S.BonusSpiritMultiplier = 0.03f; } else if (characterRace == CharacterRace.NightElf) { S.Miss += 0.02f; } else if (characterRace == CharacterRace.Tauren) { S.Health = S.Health * 1.05f; } else if (characterRace == CharacterRace.Troll) { if (characterClass == CharacterClass.DeathKnight || characterClass == CharacterClass.Warrior || characterClass == CharacterClass.Rogue) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { PhysicalHaste = 0.2f }, 10f, 180f)); } else { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { SpellHaste = 0.2f, PhysicalHaste = 0.2f }, 10f, 180f)); } } else if (characterRace == CharacterRace.Orc) { if (characterClass == CharacterClass.Shaman) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { AttackPower = 2 + (level * 4), SpellPower = 3 + (level * 2) }, 15f, 120f)); } else if (characterClass == CharacterClass.Warlock) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { SpellPower = 3 + (level * 2) }, 15f, 120f)); } else { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { AttackPower = 2 + (level * 4) }, 15f, 120f)); } } #endregion _lastStats = S.Clone(); return(S); } }
public static Stats GetBaseStats(int level, CharacterClass characterClass, CharacterRace characterRace, DruidForm characterForm) { // Health, Mana and some other things are same for every race. lock (syncLock) { #region Cache if (level == _lastLevel && characterClass == _lastClass && characterRace == _lastRace && characterForm == _lastForm) return _lastStats.Clone(); _lastLevel = level; _lastClass = characterClass; _lastRace = characterRace; _lastForm = characterForm; #endregion Stats S = new Stats(); #region Race, not class benefit // Most Level 85 Race and Class Stats come from: // http://code.google.com/p/simulationcraft/source/browse/branches/cataclysm/engine/sc_rating.cpp?r=6207 // When they were still at 80 as of Jan 01st, 2011 // From SimCraft Stats race = new Stats(); switch (characterRace) { // Alliance case CharacterRace.Human: race.Strength = 20; race.Agility = 20; race.Stamina = 20; race.Intellect = 20; race.Spirit = 20; break; case CharacterRace.Dwarf: race.Strength = 25; race.Agility = 16; race.Stamina = 21; race.Intellect = 19; race.Spirit = 19; break; case CharacterRace.NightElf: race.Strength = 16; race.Agility = 24; race.Stamina = 20; race.Intellect = 20; race.Spirit = 20; break; case CharacterRace.Gnome: race.Strength = 15; race.Agility = 22; race.Stamina = 20; race.Intellect = 24; race.Spirit = 20; break; case CharacterRace.Draenei: race.Strength = 21; race.Agility = 17; race.Stamina = 20; race.Intellect = 20; race.Spirit = 22; break; case CharacterRace.Worgen: race.Strength = 23; race.Agility = 22; race.Stamina = 20; race.Intellect = 16; race.Spirit = 19; break; // Horde case CharacterRace.Orc: race.Strength = 23; race.Agility = 17; race.Stamina = 21; race.Intellect = 17; race.Spirit = 22; break; case CharacterRace.Undead: race.Strength = 19; race.Agility = 18; race.Stamina = 20; race.Intellect = 18; race.Spirit = 25; break; case CharacterRace.Tauren: race.Strength = 25; race.Agility = 16; race.Stamina = 21; race.Intellect = 16; race.Spirit = 22; break; case CharacterRace.Troll: race.Strength = 21; race.Agility = 22; race.Stamina = 20; race.Intellect = 16; race.Spirit = 21; break; case CharacterRace.BloodElf: race.Strength = 17; race.Agility = 22; race.Stamina = 20; race.Intellect = 23; race.Spirit = 18; break; case CharacterRace.Goblin: race.Strength = 17; race.Agility = 22; race.Stamina = 20; race.Intellect = 23; race.Spirit = 20; break; default: { break; } }; // From Chardev (85) //Class Str Agi Sta Int Spi //Druid 76 69 86 136 153 //Shaman 111 60 128 119 136 //Death Knight 171 101 154 16 44 //Hunter 60 178 119 77 88 //Mage 17 26 43 187 175 //Paladin 144 77 136 86 97 //Priest 26 34 51 188 183 //Rogue 102 186 94 26 53 //Warlock 43 51 76 161 166 //Warrior 169 103 153 17 44 #endregion #region Base Stats #region All Classes S.Miss = 0.05f; S.Block = 0.00f; S.Parry = 0.00f; #endregion switch (characterClass) { #region Death Knight case CharacterClass.DeathKnight: Stats dk = new Stats() { Strength = 171, Agility = 101, Stamina = 274, Intellect = 16, Spirit = 44, Health = 43025f, Dodge = 0.05f, Parry = 0.05f, Block = 0.00f, PhysicalCrit = 0.0049f, AttackPower = 595f, }; S.Accumulate(race); S.Accumulate(dk); break; #endregion #region Druid case CharacterClass.Druid: Stats druid = new Stats() { Strength = 76, Agility = 69, Stamina = 86, Intellect = 136, Spirit = 153, Health = 39533f, Mana = 18635f, Dodge = 0.03758f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.03192f, AttackPower = 613f, SpellCrit = 0.0185f, Mp5 = 931f, }; S.Accumulate(race); S.Accumulate(druid); switch (characterForm) { case DruidForm.Moonkin: case DruidForm.Caster: S.AttackPower = -10; S.PhysicalCrit = 0.0743f; S.Dodge = 0.0556970f; //?? break; case DruidForm.Bear: S.AttackPower = 255; S.PhysicalCrit = 0.074755f; S.Dodge = 0.0556970f; S.BonusStaminaMultiplier = 0.2f; break; case DruidForm.Cat: S.AttackPower = 235; S.PhysicalCrit = 0.074755f; S.Dodge = 0.0556970f; break; default: break; } break; #endregion #region Hunter case CharacterClass.Hunter: Stats hun = new Stats() { // Stats updated 8/19/2011 4.2 w/ Troll Hunter: Tsevon @ US-Dragonmaw w/ no spec. Strength = 60, Agility = 178, Stamina = 119, Intellect = 77, Spirit = 88, Health = 39037, Dodge = 0.03758f, Parry = 0.05f, // This assumes ALL AP from full AP += AGI * 2 // So naked Hunter has 31 AP un accounted for. // Naked troll, no gear, no spec, LW & Skinning. PhysicalCrit = 0, AttackPower = 31f, RangedAttackPower = 31f, }; S.Accumulate(race); S.Accumulate(hun); break; #endregion #region Mage case CharacterClass.Mage: Stats mag = new Stats() { Strength = 17, Agility = 26, Stamina = 43, Intellect = 187, Spirit = 175, Health = 36853f, Mana = 17138f, Dodge = 0.03758f, Parry = 0.05f, }; S.Accumulate(race); S.Accumulate(mag); break; #endregion #region Paladin case CharacterClass.Paladin: Stats pal = new Stats() { Strength = 144, Agility = 77, Stamina = 136, Intellect = 86, Spirit = 97, Health = 43285f, Mana = 23422, Dodge = 0.05f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.00652f, AttackPower = 235f, SpellCrit = 0.033355f, }; S.Accumulate(race); S.Accumulate(pal); break; #endregion #region Priest case CharacterClass.Priest: // added adjustments to the base race here because the math using the previous stats // just don't work for the in game calculations on priest tests. // also unsure how these changes would effect other modules if moved up. // adding or subracting from the priest stats don't work and throws all other class // calculations off. switch (characterRace) { case CharacterRace.Human: race.Spirit = 19; break; case CharacterRace.Gnome: race.Intellect = 23; break; case CharacterRace.Goblin: race.Spirit = 18; break; } Stats pri = new Stats() { Strength = 26, Agility = 34, Stamina = 51, Intellect = 169, Spirit = 178, Health = 43285f, Mana = 20590f, Dodge = 0.0337780f, Parry = 0.05f, PhysicalCrit = 0.027f, SpellCrit = 0.012375f, }; pri.Mp5 = pri.Mana * 0.05f; // Always 5% of base mana in regen. S.Accumulate(race); S.Accumulate(pri); break; #endregion #region Rogue case CharacterClass.Rogue: Stats rog = new Stats() { Strength = 102, Agility = 186, Stamina = 94, Intellect = 26, Spirit = 53, Health = 40529f, Dodge = 0.03758f, Parry = 0.05f, PhysicalCrit = 0.03192f, AttackPower = 613f, }; S.Accumulate(race); S.Accumulate(rog); break; #endregion #region Shaman case CharacterClass.Shaman: Stats sha = new Stats() { Strength = 111, Agility = 60, Stamina = 128, Intellect = 119, Spirit = 136, Health = 37037f, Mana = 23430f, Dodge = 0.0193f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.02910375f, AttackPower = 140f, SpellCrit = 0.022057f, SpellPower = -10, }; S.Accumulate(race); S.Accumulate(sha); break; #endregion #region Warlock case CharacterClass.Warlock: Stats warlock = new Stats() { Strength = 43, Agility = 51, Stamina = 76, Intellect = 153, Spirit = 161, Health = 38184f, Mana = 20553f, Dodge = 0.0238110f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.026219999417663f, SpellCrit = 0.017000000923872f, }; S.Accumulate(race); S.Accumulate(warlock); break; #endregion #region Warrior case CharacterClass.Warrior: Stats war = new Stats() { Strength = 169, Agility = 103, Stamina = 153, Intellect = 17, Spirit = 44, Health = 43285f, Dodge = 0.05f, Parry = 0.05f, Block = 0.05f, PhysicalCrit = 0.03192f, AttackPower = 613f, }; S.Accumulate(race); S.Accumulate(war); break; #endregion #region No Class default: break; #endregion } #endregion #region Racials // Resistance do not stack with other buffs. Until then I'll commenting them out if (characterRace == CharacterRace.Gnome) //CATA: changed from 5% int to 5% mana { // S.ArcaneResistance += 85f; S.BonusManaMultiplier = 0.05f; //S.BonusIntellectMultiplier = 0.05f; } else if (characterRace == CharacterRace.Human) { S.BonusSpiritMultiplier = 0.03f; // Patch 4.0.6+ changed from a 3 minute cooldown to 2 minute cooldown S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { PVPTrinket = 1 }, 0f, 120f)); } else if (characterRace == CharacterRace.NightElf) { // S.NatureResistance += 85f; S.Miss += 0.02f; } else if (characterRace == CharacterRace.Dwarf) { // S.FrostResistance += 85f; // Armor +10% for 8 Sec. S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { BaseArmorMultiplier = .1f }, 8, 120)); // TODO: Add debuff removal. Doesn't work on all bosses so not sure if we want to. } else if (characterRace == CharacterRace.Draenei) { // S.ArcaneResistance += 85f; S.SpellHit += 0.01f; S.PhysicalHit += 0.01f; // Patch 4.0.6+ changed from a scaling Health restore to a flat 20% of max health S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { HealthRestoreFromMaxHealth = 0.2f / 15f }, 15f, 180f)); } else if (characterRace == CharacterRace.Worgen) { // S.NatureResistance = 64f; // S.ShadowResistance = 64f; // Patch 4.0.6+ Darkflight changed from a 3 minute CD to a 2 minute CD S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { MovementSpeed = 0.40f }, 10f, 120f)); S.PhysicalCrit += 0.01f; S.SpellCrit += 0.01f; } else if (characterRace == CharacterRace.Tauren) { // S.NatureResistance = 85f; S.Health = (float)Math.Floor(S.Health * 1.05f); } else if (characterRace == CharacterRace.Troll) { S.SnareRootDurReduc = .15f; if (characterClass == CharacterClass.DeathKnight || characterClass == CharacterClass.Warrior || characterClass == CharacterClass.Rogue) S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { PhysicalHaste = 0.2f }, 10f, 180f)); else S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { SpellHaste = 0.2f, PhysicalHaste = 0.2f }, 10f, 180f)); } else if (characterRace == CharacterRace.Undead) { S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { FearDurReduc = 1f }, .1f, 120f)); } else if (characterRace == CharacterRace.Orc) { S.StunDurReduc = 0.15f; if (characterClass == CharacterClass.Shaman) S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { AttackPower = 65 + (level * 13), SpellPower = 75 + (level * 6) }, 15f, 120f)); else if (characterClass == CharacterClass.Warlock || characterClass == CharacterClass.Mage) S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { SpellPower = 75 + (level * 6) }, 15f, 120f)); else S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { AttackPower = 65 + (level * 13) }, 15f, 120f)); } else if (characterRace == CharacterRace.BloodElf) { // S.ArcaneResistance += 85f; if (characterClass == CharacterClass.DeathKnight || characterClass == CharacterClass.Rogue || characterClass == CharacterClass.Hunter) S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { ManaorEquivRestore = .15f }, 0f, 120f)); else if (characterClass == CharacterClass.Warrior) S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { BonusRageGen = 15f }, 0f, 120f)); else S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { ManaorEquivRestore = .06f }, 0f, 120f)); } else if (characterRace == CharacterRace.Goblin) { S.PhysicalHaste += 0.01f; S.SpellHaste += 0.01f; // TODO: The damage of the rocket belt proc is dependent on the character's current AP and SP S.AddSpecialEffect(new SpecialEffect(Trigger.Use, new Stats() { FireDamage = 1f + (level * 2) }, 0f, 120f)); } else if (characterRace == CharacterRace.PandarenAlliance || characterRace == CharacterRace.PandarenHorde) { } #endregion _lastStats = S.Clone(); return S; } }