DopingControl v0.6.1
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
-- DopingControl data/talenthit.lua
|
||||
-- The THIRD source of hit, next to gear and auras: TALENTS.
|
||||
--
|
||||
-- WHY ITS OWN FILE: gear hit is parsed from item tooltips, talent hit is
|
||||
-- looked up by talent NAME and rank. The two arrive over completely
|
||||
-- different paths -- GetTalentInfo for the own character, the server's
|
||||
-- inspect protocol (scan/talents.lua) for everyone else -- and only meet
|
||||
-- again in DC_Hit.TalentHit. Keeping the talent tables apart from
|
||||
-- data/hit.lua keeps that split visible in the file layout instead of
|
||||
-- hiding it inside one big table.
|
||||
--
|
||||
-- WHAT COUNTS AS SPELL HIT HERE: several talents are worded as "reduces
|
||||
-- the chance that the opponent can resist your <school> spells by X%".
|
||||
-- That is not a resistance mechanic -- it runs through the server's
|
||||
-- resist-miss spell modifier, i.e. it IS spell hit for that school, and it
|
||||
-- stacks with +hit from items. They are therefore modelled as
|
||||
-- school-specific spell hit and not as anything resistance-shaped.
|
||||
--
|
||||
-- BUCKETS -- an entry is
|
||||
-- { name = <talent name, EXACTLY as GetTalentInfo returns it>,
|
||||
-- tree = <talent tab name; documentation only, never matched on>,
|
||||
-- ranks = <max rank; the per-rank arrays must have this length>,
|
||||
-- melee = { <per rank> }, -- generic physical hit (melee column)
|
||||
-- ranged = { <per rank> }, -- generic ranged hit (ranged column)
|
||||
-- spell = { <per rank> }, -- GENERIC spell hit: every school
|
||||
-- offhand = { <per rank> }, -- OFF-HAND swings only, see below
|
||||
-- dwExtra = { <per rank> }, -- extra melee hit while DUAL WIELDING
|
||||
-- schools = { [<lowercase school id>] = { <per rank> } } }
|
||||
-- Every bucket is optional; an absent bucket contributes nothing. School
|
||||
-- ids are lowercase to match DC.SLOTS_HIT (core/const.lua); the
|
||||
-- CAPITALIZED tooltip spelling that gear parsing produces is bridged by
|
||||
-- DC.HIT_SCHOOL_KEY (data/hit.lua).
|
||||
--
|
||||
-- `offhand` is deliberately NOT part of the melee number. Off-hand hit
|
||||
-- applies to off-hand swings only, so adding it to the melee column would
|
||||
-- claim a main-hand hit chance the player does not have. It is carried so
|
||||
-- the cell tooltip can mention it.
|
||||
--
|
||||
-- MATCHING IS BY NAME: the reader (DC_Hit.ReadSelfTalents) hands in
|
||||
-- { [talent name] = rank }, because GetTalentInfo returns names, and
|
||||
-- tab/index positions shift whenever a tree is rebalanced while names
|
||||
-- almost never do. A talent this file does not list is ignored; a talent
|
||||
-- listed here that no longer exists simply never matches. Both directions
|
||||
-- degrade to "no talent hit counted", never to a wrong number.
|
||||
--
|
||||
-- English client assumed, like the tooltip patterns in data/hit.lua: on a
|
||||
-- localized client no name matches and the talent contribution reads 0.
|
||||
--
|
||||
-- WHAT IS DELIBERATELY EXCLUDED (each one grants "hit" in its tooltip text
|
||||
-- but not hit that belongs in any column of this tab):
|
||||
-- * PET hit -- hunter "Bestial Precision", warlock "Demonic Precision".
|
||||
-- They raise the PET's hit chance (and its weapon skill / inherited
|
||||
-- ratios); the player's own swings and casts are untouched.
|
||||
-- * ENEMY DEBUFFS -- rogue "Blinding Haze" LOWERS the hit chance of
|
||||
-- targets hit by Distract. It is the opposite sign and lands on
|
||||
-- someone else.
|
||||
-- * SINGLE-SPELL hit -- paladin "Improved Hand of Reckoning" buys hit
|
||||
-- for one ability only. A column that claimed it would overstate holy
|
||||
-- hit for every other spell the paladin casts.
|
||||
-- * WEAPON-TYPE hit -- mage "Wand Specialization" (wands) and priest
|
||||
-- "Wand Specialization" (wands and bows). Wand and bow attacks are
|
||||
-- neither generic spell hit nor -- for the priest -- the generic
|
||||
-- ranged-attack hit this tab's ranged column measures (that column
|
||||
-- only exists for a real ranged ATTACK weapon, see
|
||||
-- DC.RANGED_ATTACK_SUBTYPE), so counting them would misplace them.
|
||||
-- * TEMPORARY procs -- e.g. the second half of the shaman's Elemental
|
||||
-- Devastation, which grants spell hit for 10 sec after a melee crit.
|
||||
-- Only the permanent, always-on half is counted; a scan is a snapshot
|
||||
-- and a proc that happens to be up would make one row incomparable
|
||||
-- with the next.
|
||||
--
|
||||
-- Pure Lua 5.0, no WoW API -- dofile-loadable offline.
|
||||
|
||||
DopingControl = DopingControl or {}
|
||||
local DC = DopingControl
|
||||
|
||||
-- ------------------------------------------------------------------
|
||||
-- DC.TALENT_HIT -- [class token (UnitClass file token, e.g. "MAGE")] =
|
||||
-- array of talent entries. Classes with no hit talent at all are absent.
|
||||
-- ------------------------------------------------------------------
|
||||
DC.TALENT_HIT = {
|
||||
|
||||
-- Generic hit: melee AND every spell school, from ONE talent. The
|
||||
-- three entries below are the only talents in the game that raise
|
||||
-- both halves at once, which is why hybrids can be capped on both
|
||||
-- sides without spending a single item budget on it.
|
||||
DRUID = {
|
||||
{ name = "Natural Weapons", tree = "Balance", ranks = 3,
|
||||
melee = { 1, 2, 3 }, spell = { 1, 2, 3 } },
|
||||
},
|
||||
|
||||
PALADIN = {
|
||||
{ name = "Precision", tree = "Protection", ranks = 3,
|
||||
melee = { 1, 2, 3 }, spell = { 1, 2, 3 } },
|
||||
},
|
||||
|
||||
SHAMAN = {
|
||||
-- the talent's second half (melee crits grant 3/6/9% spell hit
|
||||
-- for 10 sec) is a TEMPORARY proc and is not counted -- see the
|
||||
-- exclusion list in the header
|
||||
{ name = "Elemental Devastation", tree = "Elemental", ranks = 3,
|
||||
melee = { 1, 2, 3 }, spell = { 1, 2, 3 } },
|
||||
},
|
||||
|
||||
-- Melee only.
|
||||
ROGUE = {
|
||||
-- "with melee weapons": no ranged half, even though rogues can
|
||||
-- carry a thrown weapon
|
||||
{ name = "Precision", tree = "Combat", ranks = 5,
|
||||
melee = { 1, 2, 3, 4, 5 } },
|
||||
},
|
||||
|
||||
HUNTER = {
|
||||
-- the talent says "hit chance" without naming a weapon, so the
|
||||
-- base half feeds the melee AND the ranged column.
|
||||
--
|
||||
-- dwExtra is the "and by an additional X% while dual wielding"
|
||||
-- half. The wording does not say which swings the EXTRA applies
|
||||
-- to; a dual-wield condition is a melee-build condition, so it is
|
||||
-- counted for MELEE ONLY. That is the reading that cannot
|
||||
-- overstate a hunter's ranged hit -- the number that decides
|
||||
-- whether the player is capped where it matters. Should the extra
|
||||
-- turn out to be generic, this under-reports ranged by up to 3%,
|
||||
-- which is the safe direction (same trade-off as the uncounted
|
||||
-- set bonuses in scan/hit.lua).
|
||||
{ name = "Surefooted", tree = "Survival", ranks = 3,
|
||||
melee = { 1, 2, 3 }, ranged = { 1, 2, 3 },
|
||||
dwExtra = { 1, 2, 3 } },
|
||||
},
|
||||
|
||||
-- Off-hand only.
|
||||
WARRIOR = {
|
||||
-- off-hand swings only: NOT added to the melee column, carried
|
||||
-- for the tooltip (see the `offhand` note in the header)
|
||||
{ name = "Dual Wield Specialization", tree = "Fury", ranks = 5,
|
||||
offhand = { 2, 4, 6, 8, 10 } },
|
||||
},
|
||||
|
||||
-- School-specific spell hit.
|
||||
MAGE = {
|
||||
{ name = "Arcane Focus", tree = "Arcane", ranks = 5,
|
||||
schools = { arcane = { 2, 4, 6, 8, 10 } } },
|
||||
-- one talent, two schools, full value in each: it is not split
|
||||
{ name = "Elemental Precision", tree = "Frost", ranks = 3,
|
||||
schools = { frost = { 2, 4, 6 }, fire = { 2, 4, 6 } } },
|
||||
},
|
||||
|
||||
PRIEST = {
|
||||
{ name = "Shadow Focus", tree = "Shadow", ranks = 5,
|
||||
schools = { shadow = { 2, 4, 6, 8, 10 } } },
|
||||
-- "your Holy and Discipline spells": Discipline is a SPELL LINE,
|
||||
-- not a magic school -- its damaging spells are holy school
|
||||
-- anyway, so the whole talent maps onto holy. There is no
|
||||
-- "discipline" column to put the other half in, and inventing one
|
||||
-- would be a school this client's damage model does not have.
|
||||
{ name = "Piercing Light", tree = "Discipline", ranks = 3,
|
||||
schools = { holy = { 2, 4, 6 } } },
|
||||
},
|
||||
|
||||
WARLOCK = {
|
||||
-- "your Affliction spells": another SPELL-LINE talent rather than
|
||||
-- a school talent. Affliction spells (Corruption, Curse of Agony,
|
||||
-- Drain Life, Siphon Life, Death Coil, ...) are shadow school, so
|
||||
-- the talent is mapped onto shadow. A warlock's fire spells
|
||||
-- (Immolate, Shadowburn's destruction siblings) get nothing from
|
||||
-- it, which is exactly why the fire and shadow columns of this tab
|
||||
-- can differ by 10% for the same character.
|
||||
{ name = "Suppression", tree = "Affliction", ranks = 5,
|
||||
schools = { shadow = { 2, 4, 6, 8, 10 } } },
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user