diff --git a/RatingBuster/CoAClassSpecData.lua b/RatingBuster/CoAClassSpecData.lua new file mode 100644 index 0000000..5057aeb --- /dev/null +++ b/RatingBuster/CoAClassSpecData.lua @@ -0,0 +1,143 @@ +-- CoAClassSpecData.lua — GENERATED by coa-db/tools/gen_coa_class_spec_lua.py +-- Source of truth: coa-db/data/class_spec_meta.json (class.file_string tokens + wiki specs). +-- Do not hand-edit; regenerate from coa-db. Neutral stat keys; each addon maps them. +-- Keyed by the in-game class token (2nd return of UnitClass), e.g. Templar=MONK. +CoAClassSpec = { + ["BARBARIAN"] = { name="Barbarian", classId=12, specs={ + { name="Headhunting", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Brutality", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Ancestry", roles={"MELEE","SUPPORT"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, + ["WITCHDOCTOR"] = { name="Witch Doctor", classId=13, specs={ + { name="Shadowhunting", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Voodoo", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Brewing", roles={"HEALER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Intellect=0.55 } }, + }}, + ["DEMONHUNTER"] = { name="Felsworn", classId=14, specs={ + { name="Slayer", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Infernal", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Tyrant", roles={"TANK"}, primaryStat="Agility", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Agility=0.4 } }, + }}, + ["WITCHHUNTER"] = { name="Witch Hunter", classId=15, specs={ + { name="Boltslinger", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Darkness", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Inquisition", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Black Knight", roles={"TANK"}, primaryStat="Agility", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Agility=0.4 } }, + }}, + ["STORMBRINGER"] = { name="Stormbringer", classId=16, specs={ + { name="Maelstrom", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Lightning", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Wind", roles={"CASTER","SUPPORT"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + }}, + ["FLESHWARDEN"] = { name="Knight of Xoroth", classId=17, specs={ + { name="Hellfire", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Defiance", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + { name="War", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, + ["GUARDIAN"] = { name="Guardian", classId=18, specs={ + { name="Gladiator", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Inspiration", roles={"MELEE","SUPPORT"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Vanguard", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + }}, + ["MONK"] = { name="Templar", classId=19, specs={ + { name="Oathkeeper", roles={"TANK"}, primaryStat="Agility", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Agility=0.4 } }, + { name="Zealot", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Crusader", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, + ["SONOFARUGAL"] = { name="Bloodmage", classId=20, specs={ + { name="Fleshweaver", roles={"SUPPORT"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Sanguine", roles={"CASTER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Accursed", roles={"MELEE","CASTER"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Eternal", roles={"TANK"}, primaryStat="Agility", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Agility=0.4 } }, + }}, + ["RANGER"] = { name="Ranger", classId=21, specs={ + { name="Archery", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Farstrider", roles={"RANGED","SUPPORT"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Brigand", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, + ["CHRONOMANCER"] = { name="Chronomancer", classId=22, specs={ + { name="Infinite", roles={"CASTER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Time", roles={"HEALER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Intellect=0.55 } }, + { name="Artificer", roles={"RANGED"}, primaryStat="Spirit", weights={ Spirit=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + }}, + ["NECROMANCER"] = { name="Necromancer", classId=23, specs={ + { name="Death", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Animation", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Rime", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + }}, + ["PYROMANCER"] = { name="Pyromancer", classId=24, specs={ + { name="Incineration", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Flameweaving", roles={"HEALER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Intellect=0.55 } }, + { name="Draconic", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + }}, + ["CULTIST"] = { name="Cultist", classId=25, specs={ + { name="Heretic", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + { name="Corruption", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Godblade", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Dreadnought", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + }}, + ["STARCALLER"] = { name="Starcaller", classId=26, specs={ + { name="Sentinel", roles={"RANGED"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Warden", roles={"MELEE"}, primaryStat="Intellect", weights={ Intellect=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Moon Priest", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + { name="Moon Guard", roles={"TANK"}, primaryStat="Intellect", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Intellect=0.4 } }, + }}, + ["SUNCLERIC"] = { name="Sun Cleric", classId=27, specs={ + { name="Piety", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Valkyrie", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Seraphim", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + { name="Blessings", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + }}, + ["TINKER"] = { name="Tinker", classId=28, specs={ + { name="Demolition", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Mechanics", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Invention", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + }}, + ["PROPHET"] = { name="Venomancer", classId=29, specs={ + { name="Fortitude", roles={"TANK"}, primaryStat="Intellect", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Intellect=0.4 } }, + { name="Stalking", roles={"MELEE"}, primaryStat="Intellect", weights={ Intellect=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Rot", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Vizier", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + }}, + ["REAPER"] = { name="Reaper", classId=30, specs={ + { name="Soul", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Harvest", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Domination", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + }}, + ["WILDWALKER"] = { name="Primalist", classId=31, specs={ + { name="Grovekeeper", roles={"SUPPORT"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Wildwalker", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Mountain King", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + { name="Geomancy", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + }}, + ["SPIRITMAGE"] = { name="Runemaster", classId=32, specs={ + { name="Engravement", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Glyphic", roles={"CASTER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Riftblade", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, +} + +CoAClassPrimaryStats = { + ["BARBARIAN"] = { "Agility" }, + ["WITCHDOCTOR"] = { "Agility", "Intellect", "Spirit" }, + ["DEMONHUNTER"] = { "Agility", "Intellect", "Stamina" }, + ["WITCHHUNTER"] = { "Agility", "Intellect", "Stamina" }, + ["STORMBRINGER"] = { "Intellect" }, + ["FLESHWARDEN"] = { "Strength", "Intellect", "Stamina" }, + ["GUARDIAN"] = { "Strength", "Stamina" }, + ["MONK"] = { "Agility", "Stamina" }, + ["SONOFARUGAL"] = { "Spirit", "Stamina", "Agility" }, + ["RANGER"] = { "Agility" }, + ["CHRONOMANCER"] = { "Spirit" }, + ["NECROMANCER"] = { "Intellect" }, + ["PYROMANCER"] = { "Intellect", "Spirit" }, + ["CULTIST"] = { "Intellect", "Strength", "Stamina" }, + ["STARCALLER"] = { "Intellect", "Stamina" }, + ["SUNCLERIC"] = { "Intellect", "Strength", "Stamina" }, + ["TINKER"] = { "Agility", "Intellect" }, + ["PROPHET"] = { "Intellect", "Stamina" }, + ["REAPER"] = { "Strength", "Stamina" }, + ["WILDWALKER"] = { "Strength", "Intellect", "Stamina" }, + ["SPIRITMAGE"] = { "Agility", "Spirit" }, +} + diff --git a/RatingBuster/RatingBuster.lua b/RatingBuster/RatingBuster.lua index 2feffa2..8ec59a9 100644 --- a/RatingBuster/RatingBuster.lua +++ b/RatingBuster/RatingBuster.lua @@ -558,6 +558,68 @@ elseif cls == "DEATHKNIGHT" then profileDefault.showAPFromArmor = true profileDefault.sumIgnorePlate = false end + +-- CoA custom classes: enable stat-summary defaults based on primary stats. +-- CoAClassPrimaryStats is defined in CoAClassSpecData.lua (loaded before this file). +if CoAClassPrimaryStats and CoAClassPrimaryStats[cls] then + local stats = CoAClassPrimaryStats[cls] + local hasAgi, hasStr, hasInt, hasSpi, hasSta = false, false, false, false, false + for _, stat in ipairs(stats) do + if stat == "Agility" then hasAgi = true end + if stat == "Strength" then hasStr = true end + if stat == "Intellect" then hasInt = true end + if stat == "Spirit" then hasSpi = true end + if stat == "Stamina" then hasSta = true end + end + -- Always: HP and resilience + profileDefault.sumHP = true + profileDefault.sumResilience = true + if hasAgi then + profileDefault.ratingPhysical = true + profileDefault.sumAgi = true + profileDefault.sumAP = true + profileDefault.sumHit = true + profileDefault.sumCrit = true + profileDefault.sumHaste = true + profileDefault.sumExpertise = true + profileDefault.sumArmorPenetration = true + end + if hasStr then + profileDefault.ratingPhysical = true + profileDefault.sumStr = true + profileDefault.sumAP = true + profileDefault.sumHit = true + profileDefault.sumCrit = true + profileDefault.sumHaste = true + profileDefault.sumExpertise = true + profileDefault.sumArmorPenetration = true + end + if hasInt then + profileDefault.ratingSpell = true + profileDefault.sumMP = true + profileDefault.sumInt = true + profileDefault.sumSpellDmg = true + profileDefault.sumSpellHit = true + profileDefault.sumSpellCrit = true + profileDefault.sumSpellHaste = true + profileDefault.sumHealing = true + profileDefault.sumMP5 = true + profileDefault.showSpellDmgFromInt = true + profileDefault.showMP5FromInt = true + end + if hasSpi then + profileDefault.ratingSpell = true + profileDefault.sumMP = true + profileDefault.sumSpi = true + profileDefault.sumHealing = true + profileDefault.sumMP5 = true + profileDefault.showMP5FromSpi = true + profileDefault.showHealingFromSpi = true + end + if hasSta then + profileDefault.sumSta = true + end +end end -- applyClassProfileDefaults local defaults = {} diff --git a/RatingBuster/RatingBuster.toc b/RatingBuster/RatingBuster.toc index b72b283..f45f994 100644 --- a/RatingBuster/RatingBuster.toc +++ b/RatingBuster/RatingBuster.toc @@ -36,5 +36,8 @@ RatingBuster-Locale-frFR.lua RatingBuster-Locale-koKR.lua RatingBuster-Locale-esES.lua +# CoA class/spec data (must load before RatingBuster.lua) # +CoAClassSpecData.lua + # Core # RatingBuster.lua \ No newline at end of file